如何从AddAzureOpenAIChatCompletion注册中获取IChatClient实例以实现MCP客户端的采样能力?
如何从AddAzureOpenAIChatCompletion注册中获取IChatClient实例以实现MCP客户端的采样能力?
我之前碰到过类似的问题,其实你遇到的核心问题是AddAzureOpenAIChatCompletion默认注册的服务类型和你要的IChatClient不是直接对应的,我给你两种可行的解决方案:
方案一:直接构建AzureOpenAIClient实例(最简单直接)
既然你已经有了Azure OpenAI的endpoint和apiKey配置,完全可以直接实例化AzureOpenAIClient——它本身就实现了IChatClient接口,不需要从DI容器里去取。代码如下:
// 从配置中读取密钥和端点 var endpoint = builder.Configuration.GetValue<string>("AzureOpenAI:Endpoint"); var apiKey = builder.Configuration.GetValue<string>("AzureOpenAI:ApiKey"); // 直接创建AzureOpenAIClient,它就是IChatClient的实现 var azureOpenAIClient = new AzureOpenAIClient(new Uri(endpoint), new AzureKeyCredential(apiKey)); IChatClient samplingClient = azureOpenAIClient;
拿到samplingClient之后,就可以直接用它来创建你的采样处理器,集成到MCP客户端里了。
方案二:修改DI注册,让容器能直接提供IChatClient
如果你更倾向于依赖注入的方式,不想手动实例化,可以在调用AddAzureOpenAIChatCompletion之后,手动给DI容器注册IChatClient服务,代码如下:
builder.Services.AddAzureOpenAIChatCompletion( deploymentName: "gpt-4.1", endpoint: builder.Configuration.GetValue<string>("AzureOpenAI:Endpoint"), apiKey: builder.Configuration.GetValue<string>("AzureOpenAI:ApiKey") ); // 手动注册IChatClient,复用DI中已有的AzureOpenAIClient实例 builder.Services.AddSingleton<IChatClient>(sp => { var azureOpenAIClient = sp.GetRequiredService<AzureOpenAIClient>(); return azureOpenAIClient; });
之后你就可以通过app.Services.GetRequiredService<IChatClient>()顺利获取到实例了。
为什么你之前的尝试失败?
AddAzureOpenAIChatCompletion主要是为了注册IChatCompletionClient服务,方便你调用聊天补全接口;虽然AzureOpenAIClient确实会被注册到DI容器中,但它默认不会以IChatClient的类型暴露,所以直接用GetRequiredService<IChatClient>()是拿不到的,必须显式转换或者手动注册服务类型。
另外要注意,确保你的Azure.AI.OpenAI SDK版本是最新稳定版,不同版本的DI注册逻辑可能有细微差异,如果还是有问题,可以检查包版本是否正确。
内容来源于stack exchange
相关产品推荐
相关产品推荐

