You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 11:34:51