.NET: Fix DI for ChatClientAgent (#973)

* fix di for chat client agent so ai funcitons dependencies can be resolved from di container

* merge with latest main
This commit is contained in:
SergeyMenshykh
2025-09-30 09:40:03 +01:00
committed by GitHub
Unverified
parent 77e5f527c4
commit 3dc8e1e025
2 changed files with 10 additions and 6 deletions
@@ -35,7 +35,8 @@ public sealed class ChatClientAgent : AIAgent
/// <param name="description">Optional description for the agent.</param>
/// <param name="tools">Optional list of tools that the agent can use during invocation.</param>
/// <param name="loggerFactory">Optional logger factory to use for logging.</param>
public ChatClientAgent(IChatClient chatClient, string? instructions = null, string? name = null, string? description = null, IList<AITool>? tools = null, ILoggerFactory? loggerFactory = null)
/// <param name="functionInvocationServices">An optional <see cref="IServiceProvider"/> to use for resolving services required by the <see cref="AIFunction"/> instances being invoked.</param>
public ChatClientAgent(IChatClient chatClient, string? instructions = null, string? name = null, string? description = null, IList<AITool>? tools = null, ILoggerFactory? loggerFactory = null, IServiceProvider? functionInvocationServices = null)
: this(
chatClient,
new ChatClientAgentOptions
@@ -48,7 +49,8 @@ public sealed class ChatClientAgent : AIAgent
Tools = tools,
}
},
loggerFactory)
loggerFactory,
functionInvocationServices)
{
}
@@ -58,7 +60,8 @@ public sealed class ChatClientAgent : AIAgent
/// <param name="chatClient">The chat client to use for invoking the agent.</param>
/// <param name="options">Full set of options to configure the agent.</param>
/// <param name="loggerFactory">Optional logger factory to use for logging.</param>
public ChatClientAgent(IChatClient chatClient, ChatClientAgentOptions? options, ILoggerFactory? loggerFactory = null)
/// <param name="functionInvocationServices">An optional <see cref="IServiceProvider"/> to use for resolving services required by the <see cref="AIFunction"/> instances being invoked.</param>
public ChatClientAgent(IChatClient chatClient, ChatClientAgentOptions? options, ILoggerFactory? loggerFactory = null, IServiceProvider? functionInvocationServices = null)
{
_ = Throw.IfNull(chatClient);
@@ -71,7 +74,7 @@ public sealed class ChatClientAgent : AIAgent
this._chatClientType = chatClient.GetType();
// If the user has not opted out of using our default decorators, we wrap the chat client.
this.ChatClient = options?.UseProvidedChatClientAsIs is true ? chatClient : chatClient.WithDefaultAgentMiddleware(options);
this.ChatClient = options?.UseProvidedChatClientAsIs is true ? chatClient : chatClient.WithDefaultAgentMiddleware(options, functionInvocationServices);
this._logger = (loggerFactory ?? chatClient.GetService<ILoggerFactory>() ?? NullLoggerFactory.Instance).CreateLogger<ChatClientAgent>();
}
@@ -1,5 +1,6 @@
// Copyright (c) Microsoft. All rights reserved.
using System;
using System.Diagnostics;
using Microsoft.Agents.AI;
using Microsoft.Extensions.AI;
@@ -10,7 +11,7 @@ namespace Microsoft.Extensions.AI;
internal static class ChatClientExtensions
{
internal static IChatClient WithDefaultAgentMiddleware(this IChatClient chatClient, ChatClientAgentOptions? options)
internal static IChatClient WithDefaultAgentMiddleware(this IChatClient chatClient, ChatClientAgentOptions? options, IServiceProvider? functionInvocationServices = null)
{
var chatBuilder = chatClient.AsBuilder();
@@ -24,7 +25,7 @@ internal static class ChatClientExtensions
});
}
var agentChatClient = chatBuilder.Build();
var agentChatClient = chatBuilder.Build(functionInvocationServices);
if (options?.ChatOptions?.Tools is { Count: > 0 })
{