.NET C# Kernel 构建实战:多AI提供商统一接入方案
系列:.NET C# Semantic Kernel 集成深度解析 ②/6
难度:⭐⭐⭐(进阶源码,需.NET基础)
源码仓库:github.com/zongge0812/zonggeAgent
适用环境:.NET 9.0 + WPF
一、引言
一个桌面AI工作台要支持多个AI模型,最直接的挑战是:每个AI提供商的API签名、认证方式、连接器都不相同。
| 对接方式 | 问题 |
|---|---|
| 直接硬编码 | 每新增一个模型就要改一遍调用代码 |
| if-else 分支 | 6个Provider → 6个分支 → 代码膨胀不可维护 |
| 各自对接 | 流式/非流式逻辑重复实现 |
本项目的方案是工厂模式 + 模板方法模式的组合:
┌──────────────────────────────────────────────────────────────┐ │ IAIProviderService(接口契约:统一 SendMessageAsync) │ │ ↑ implements │ │ BaseAIProviderService(抽象基类:模板方法定义骨架) │ │ ↑ extends │ │ DeepSeek / OpenAI / Claude / Qwen / Ollama / Custom │ │ │ │ AIProviderFactory(工厂:根据类型返回对应Provider实例) │ │ IAIProviderFactory(工厂接口:CreateProvider + 注册) │ └──────────────────────────────────────────────────────────────┘二、统一接口契约:IAIProviderService
先从顶层接口看起。所有Provider都实现同一个接口:
// IAIProviderService.cspublicinterfaceIAIProviderService{AIProviderTypeProviderType{get;}stringDisplayName{get;}boolCanHandle(AIProviderConfigconfig);// 非流式调用Task<ChatMessage>SendMessageAsync(stringuserMessage,ChatHistorychatHistory,AIProviderConfigconfig,CancellationTokencancellationToken=default);Task<ChatMessage>SendMessageAsync(stringuserMessage,ChatHistorychatHistory,AIProviderConfigconfig,PromptExecutionSettings?executionSettings,CancellationTokencancellationToken=default);// 流式调用(IAsyncEnumerable)IAsyncEnumerable<ChatMessage>SendMessageStreamAsync(stringuserMessage,ChatHistorychatHistory,AIProviderConfigconfig,CancellationTokencancellationToken=default);IAsyncEnumerable<ChatMessage>SendMessageStreamAsync(stringuserMessage,ChatHistorychatHistory,AIProviderConfigconfig,PromptExecutionSettings?executionSettings,CancellationTokencancellationToken=default);}设计要点:
| 设计决策 | 理由 |
|---|---|
| 流式与非流式各提供2个重载 | 一个使用默认ExecutionSettings,一个支持自定义配置 |
参数传递AIProviderConfig | 统一配置对象包含 BaseUrl、ApiKey、ModelId、MaxTokens、Temperature |
返回ChatMessage(自定义模型) | 避免直接暴露SK的ChatMessageContent,解耦外部依赖 |
三、工厂模式:AIProviderFactory
工厂类的完整源码已在第①期提及,这里做逐行拆解:
3.1 工厂接口
publicinterfaceIAIProviderFactory{IAIProviderService?CreateProvider(AIProviderTypeproviderType);IAIProviderService?CreateProvider(AIProviderConfigconfig);IReadOnlyList<IAIProviderService>GetAvailableProviders();}三个方法的定位很清晰:
| 方法 | 用途 | 适用场景 |
|---|---|---|
CreateProvider(AIProviderType) | 按枚举类型创建 | 用户在UI下拉菜单选择了"DeepSeek" |
CreateProvider(AIProviderConfig) | 按配置自动匹配 | 从配置文件读取provider配置 |
GetAvailableProviders() | 获取所有可用Provider列表 | UI展示可用模型列表 |
3.2 工厂实现
// AIProviderFactory.cspublicclassAIProviderFactory:IAIProviderFactory{private