diff --git a/src/Libraries/Microsoft.Extensions.AI/ChatCompletion/ChatClientBuilder.cs b/src/Libraries/Microsoft.Extensions.AI/ChatCompletion/ChatClientBuilder.cs index dc902c8407a..e816101b4e1 100644 --- a/src/Libraries/Microsoft.Extensions.AI/ChatCompletion/ChatClientBuilder.cs +++ b/src/Libraries/Microsoft.Extensions.AI/ChatCompletion/ChatClientBuilder.cs @@ -13,7 +13,7 @@ public sealed class ChatClientBuilder private readonly Func _innerClientFactory; /// The registered client factory instances. - private List>? _clientFactories; + private List>? _clientFactories; /// Initializes a new instance of the class. /// The inner that represents the underlying backend. @@ -46,7 +46,7 @@ public IChatClient Build(IServiceProvider? services = null) { for (var i = _clientFactories.Count - 1; i >= 0; i--) { - chatClient = _clientFactories[i](services, chatClient) ?? + chatClient = _clientFactories[i](chatClient, services) ?? throw new InvalidOperationException( $"The {nameof(ChatClientBuilder)} entry at index {i} returned null. " + $"Ensure that the callbacks passed to {nameof(Use)} return non-null {nameof(IChatClient)} instances."); @@ -63,13 +63,13 @@ public ChatClientBuilder Use(Func clientFactory) { _ = Throw.IfNull(clientFactory); - return Use((_, innerClient) => clientFactory(innerClient)); + return Use((innerClient, _) => clientFactory(innerClient)); } /// Adds a factory for an intermediate chat client to the chat client pipeline. /// The client factory function. /// The updated instance. - public ChatClientBuilder Use(Func clientFactory) + public ChatClientBuilder Use(Func clientFactory) { _ = Throw.IfNull(clientFactory); diff --git a/src/Libraries/Microsoft.Extensions.AI/ChatCompletion/DistributedCachingChatClientBuilderExtensions.cs b/src/Libraries/Microsoft.Extensions.AI/ChatCompletion/DistributedCachingChatClientBuilderExtensions.cs index d465161e1e4..6396459c09c 100644 --- a/src/Libraries/Microsoft.Extensions.AI/ChatCompletion/DistributedCachingChatClientBuilderExtensions.cs +++ b/src/Libraries/Microsoft.Extensions.AI/ChatCompletion/DistributedCachingChatClientBuilderExtensions.cs @@ -25,7 +25,7 @@ public static class DistributedCachingChatClientBuilderExtensions public static ChatClientBuilder UseDistributedCache(this ChatClientBuilder builder, IDistributedCache? storage = null, Action? configure = null) { _ = Throw.IfNull(builder); - return builder.Use((services, innerClient) => + return builder.Use((innerClient, services) => { storage ??= services.GetRequiredService(); var chatClient = new DistributedCachingChatClient(innerClient, storage); diff --git a/src/Libraries/Microsoft.Extensions.AI/ChatCompletion/FunctionInvokingChatClientBuilderExtensions.cs b/src/Libraries/Microsoft.Extensions.AI/ChatCompletion/FunctionInvokingChatClientBuilderExtensions.cs index fa64bcedc78..0d2d6f8bc9b 100644 --- a/src/Libraries/Microsoft.Extensions.AI/ChatCompletion/FunctionInvokingChatClientBuilderExtensions.cs +++ b/src/Libraries/Microsoft.Extensions.AI/ChatCompletion/FunctionInvokingChatClientBuilderExtensions.cs @@ -28,7 +28,7 @@ public static ChatClientBuilder UseFunctionInvocation( { _ = Throw.IfNull(builder); - return builder.Use((services, innerClient) => + return builder.Use((innerClient, services) => { loggerFactory ??= services.GetService(); diff --git a/src/Libraries/Microsoft.Extensions.AI/ChatCompletion/LoggingChatClientBuilderExtensions.cs b/src/Libraries/Microsoft.Extensions.AI/ChatCompletion/LoggingChatClientBuilderExtensions.cs index 056ba5401fc..508617ba708 100644 --- a/src/Libraries/Microsoft.Extensions.AI/ChatCompletion/LoggingChatClientBuilderExtensions.cs +++ b/src/Libraries/Microsoft.Extensions.AI/ChatCompletion/LoggingChatClientBuilderExtensions.cs @@ -23,7 +23,7 @@ public static ChatClientBuilder UseLogging( { _ = Throw.IfNull(builder); - return builder.Use((services, innerClient) => + return builder.Use((innerClient, services) => { logger ??= services.GetRequiredService().CreateLogger(nameof(LoggingChatClient)); var chatClient = new LoggingChatClient(innerClient, logger); diff --git a/src/Libraries/Microsoft.Extensions.AI/ChatCompletion/OpenTelemetryChatClientBuilderExtensions.cs b/src/Libraries/Microsoft.Extensions.AI/ChatCompletion/OpenTelemetryChatClientBuilderExtensions.cs index 59c5c81a84d..28149a5fed2 100644 --- a/src/Libraries/Microsoft.Extensions.AI/ChatCompletion/OpenTelemetryChatClientBuilderExtensions.cs +++ b/src/Libraries/Microsoft.Extensions.AI/ChatCompletion/OpenTelemetryChatClientBuilderExtensions.cs @@ -28,7 +28,7 @@ public static ChatClientBuilder UseOpenTelemetry( ILoggerFactory? loggerFactory = null, string? sourceName = null, Action? configure = null) => - Throw.IfNull(builder).Use((services, innerClient) => + Throw.IfNull(builder).Use((innerClient, services) => { loggerFactory ??= services.GetService(); diff --git a/src/Libraries/Microsoft.Extensions.AI/Embeddings/DistributedCachingEmbeddingGeneratorBuilderExtensions.cs b/src/Libraries/Microsoft.Extensions.AI/Embeddings/DistributedCachingEmbeddingGeneratorBuilderExtensions.cs index 77aaa30e05d..7d42407d930 100644 --- a/src/Libraries/Microsoft.Extensions.AI/Embeddings/DistributedCachingEmbeddingGeneratorBuilderExtensions.cs +++ b/src/Libraries/Microsoft.Extensions.AI/Embeddings/DistributedCachingEmbeddingGeneratorBuilderExtensions.cs @@ -32,7 +32,7 @@ public static EmbeddingGeneratorBuilder UseDistributedCache< where TEmbedding : Embedding { _ = Throw.IfNull(builder); - return builder.Use((services, innerGenerator) => + return builder.Use((innerGenerator, services) => { storage ??= services.GetRequiredService(); var result = new DistributedCachingEmbeddingGenerator(innerGenerator, storage); diff --git a/src/Libraries/Microsoft.Extensions.AI/Embeddings/EmbeddingGeneratorBuilder.cs b/src/Libraries/Microsoft.Extensions.AI/Embeddings/EmbeddingGeneratorBuilder.cs index 7983ca495bf..0e1620f748d 100644 --- a/src/Libraries/Microsoft.Extensions.AI/Embeddings/EmbeddingGeneratorBuilder.cs +++ b/src/Libraries/Microsoft.Extensions.AI/Embeddings/EmbeddingGeneratorBuilder.cs @@ -16,7 +16,7 @@ public sealed class EmbeddingGeneratorBuilder private readonly Func> _innerGeneratorFactory; /// The registered client factory instances. - private List, IEmbeddingGenerator>>? _generatorFactories; + private List, IServiceProvider, IEmbeddingGenerator>>? _generatorFactories; /// Initializes a new instance of the class. /// The inner that represents the underlying backend. @@ -51,7 +51,7 @@ public IEmbeddingGenerator Build(IServiceProvider? services { for (var i = _generatorFactories.Count - 1; i >= 0; i--) { - embeddingGenerator = _generatorFactories[i](services, embeddingGenerator) ?? + embeddingGenerator = _generatorFactories[i](embeddingGenerator, services) ?? throw new InvalidOperationException( $"The {nameof(IEmbeddingGenerator)} entry at index {i} returned null. " + $"Ensure that the callbacks passed to {nameof(Use)} return non-null {nameof(IEmbeddingGenerator)} instances."); @@ -68,13 +68,13 @@ public EmbeddingGeneratorBuilder Use(Func generatorFactory(innerGenerator)); + return Use((innerGenerator, _) => generatorFactory(innerGenerator)); } /// Adds a factory for an intermediate embedding generator to the embedding generator pipeline. /// The generator factory function. /// The updated instance. - public EmbeddingGeneratorBuilder Use(Func, IEmbeddingGenerator> generatorFactory) + public EmbeddingGeneratorBuilder Use(Func, IServiceProvider, IEmbeddingGenerator> generatorFactory) { _ = Throw.IfNull(generatorFactory); diff --git a/src/Libraries/Microsoft.Extensions.AI/Embeddings/LoggingEmbeddingGeneratorBuilderExtensions.cs b/src/Libraries/Microsoft.Extensions.AI/Embeddings/LoggingEmbeddingGeneratorBuilderExtensions.cs index 1335a3fd8d3..a83c1885ec6 100644 --- a/src/Libraries/Microsoft.Extensions.AI/Embeddings/LoggingEmbeddingGeneratorBuilderExtensions.cs +++ b/src/Libraries/Microsoft.Extensions.AI/Embeddings/LoggingEmbeddingGeneratorBuilderExtensions.cs @@ -26,7 +26,7 @@ public static EmbeddingGeneratorBuilder UseLogging + return builder.Use((innerGenerator, services) => { logger ??= services.GetRequiredService().CreateLogger(nameof(LoggingEmbeddingGenerator)); var generator = new LoggingEmbeddingGenerator(innerGenerator, logger); diff --git a/src/Libraries/Microsoft.Extensions.AI/Embeddings/OpenTelemetryEmbeddingGeneratorBuilderExtensions.cs b/src/Libraries/Microsoft.Extensions.AI/Embeddings/OpenTelemetryEmbeddingGeneratorBuilderExtensions.cs index 5f40f884bc4..3e9c36f6596 100644 --- a/src/Libraries/Microsoft.Extensions.AI/Embeddings/OpenTelemetryEmbeddingGeneratorBuilderExtensions.cs +++ b/src/Libraries/Microsoft.Extensions.AI/Embeddings/OpenTelemetryEmbeddingGeneratorBuilderExtensions.cs @@ -31,7 +31,7 @@ public static EmbeddingGeneratorBuilder UseOpenTelemetry>? configure = null) where TEmbedding : Embedding => - Throw.IfNull(builder).Use((services, innerGenerator) => + Throw.IfNull(builder).Use((innerGenerator, services) => { loggerFactory ??= services.GetService(); diff --git a/test/Libraries/Microsoft.Extensions.AI.Tests/ChatCompletion/ChatClientBuilderTest.cs b/test/Libraries/Microsoft.Extensions.AI.Tests/ChatCompletion/ChatClientBuilderTest.cs index 1567545800e..c9d09db9836 100644 --- a/test/Libraries/Microsoft.Extensions.AI.Tests/ChatCompletion/ChatClientBuilderTest.cs +++ b/test/Libraries/Microsoft.Extensions.AI.Tests/ChatCompletion/ChatClientBuilderTest.cs @@ -22,7 +22,7 @@ public void PassesServiceProviderToFactories() return expectedInnerClient; }); - builder.Use((serviceProvider, innerClient) => + builder.Use((innerClient, serviceProvider) => { Assert.Same(expectedServiceProvider, serviceProvider); Assert.Same(expectedInnerClient, innerClient); diff --git a/test/Libraries/Microsoft.Extensions.AI.Tests/ChatCompletion/DependencyInjectionPatterns.cs b/test/Libraries/Microsoft.Extensions.AI.Tests/ChatCompletion/DependencyInjectionPatterns.cs index 54c5011b103..c99d4511f75 100644 --- a/test/Libraries/Microsoft.Extensions.AI.Tests/ChatCompletion/DependencyInjectionPatterns.cs +++ b/test/Libraries/Microsoft.Extensions.AI.Tests/ChatCompletion/DependencyInjectionPatterns.cs @@ -109,7 +109,7 @@ public void CanRegisterKeyedSingletonUsingSharedInstance() Assert.IsType(instance.InnerClient); } - public class SingletonMiddleware(IServiceProvider services, IChatClient inner) : DelegatingChatClient(inner) + public class SingletonMiddleware(IChatClient inner, IServiceProvider services) : DelegatingChatClient(inner) { public new IChatClient InnerClient => base.InnerClient; public IServiceProvider Services => services; diff --git a/test/Libraries/Microsoft.Extensions.AI.Tests/ChatCompletion/SingletonChatClientExtensions.cs b/test/Libraries/Microsoft.Extensions.AI.Tests/ChatCompletion/SingletonChatClientExtensions.cs index e971a0ad322..5e636321b71 100644 --- a/test/Libraries/Microsoft.Extensions.AI.Tests/ChatCompletion/SingletonChatClientExtensions.cs +++ b/test/Libraries/Microsoft.Extensions.AI.Tests/ChatCompletion/SingletonChatClientExtensions.cs @@ -6,6 +6,6 @@ namespace Microsoft.Extensions.AI; public static class SingletonChatClientExtensions { public static ChatClientBuilder UseSingletonMiddleware(this ChatClientBuilder builder) - => builder.Use((services, inner) - => new DependencyInjectionPatterns.SingletonMiddleware(services, inner)); + => builder.Use((inner, services) + => new DependencyInjectionPatterns.SingletonMiddleware(inner, services)); } diff --git a/test/Libraries/Microsoft.Extensions.AI.Tests/Embeddings/EmbeddingGeneratorBuilderTests.cs b/test/Libraries/Microsoft.Extensions.AI.Tests/Embeddings/EmbeddingGeneratorBuilderTests.cs index 932df54b6d7..bc4814d06d7 100644 --- a/test/Libraries/Microsoft.Extensions.AI.Tests/Embeddings/EmbeddingGeneratorBuilderTests.cs +++ b/test/Libraries/Microsoft.Extensions.AI.Tests/Embeddings/EmbeddingGeneratorBuilderTests.cs @@ -22,7 +22,7 @@ public void PassesServiceProviderToFactories() return expectedInnerGenerator; }); - builder.Use((services, innerClient) => + builder.Use((innerClient, services) => { Assert.Same(expectedServiceProvider, services); return expectedOuterGenerator;