Provider 架构重构设计
Issue: #283 Discussion: #122 Branch: feat/refactor-provider-by-protocol
1. 当前问题
1.1 配置结构问题
现状:每个 Provider 都需要在 ProvidersConfig 中预定义字段
type ProvidersConfig struct {
Anthropic ProviderConfig `json:"anthropic"`
OpenAI ProviderConfig `json:"openai"`
DeepSeek ProviderConfig `json:"deepseek"`
Qwen ProviderConfig `json:"qwen"`
Cerebras ProviderConfig `json:"cerebras"`
VolcEngine ProviderConfig `json:"volcengine"`
// ... 每增加一个新 Provider 都需要在这里修改
}
问题:
- 添加新 Provider 需要修改 Go 代码(结构体定义)
http_provider.go中的CreateProvider函数有 200+ 行 switch-case- 大多数 Provider 兼容 OpenAI 协议,但代码大量重复
1.2 代码膨胀趋势
近期 PR 说明了这个问题:
| PR | Provider | 代码变更 |
|---|---|---|
| #365 | Qwen | http_provider.go +17 行 |
| #333 | Cerebras | http_provider.go +17 行 |
| #368 | Volcengine | http_provider.go +18 行 |
每个 OpenAI 兼容 Provider 都需要:
- 修改
config.go添加配置字段 - 修改
http_provider.go添加 switch case - 更新文档
1.3 Agent 与 Provider 的耦合
{
"agents": {
"defaults": {
"provider": "deepseek", // 需要知道 provider 名称
"model": "deepseek-chat"
}
}
}
问题:Agent 需要同时知道 provider 和 model,增加了使用复杂度。
2. 新方案:model_list
2.1 核心原则
参考 LiteLLM 设计理念:
- 以模型为中心:用户关心的是模型,而不是提供商
- 协议前缀:使用
协议/模型名格式,如openai/gpt-5.2、anthropic/claude-sonnet-4.6 - 配置驱动:添加新 Provider 只需修改配置,无需改代码
2.2 新配置结构
{
"model_list": [
{
"model_name": "deepseek-chat",
"model": "openai/deepseek-chat",
"api_base": "https://api.deepseek.com/v1",
"api_key": "sk-xxx"
},
{
"model_name": "gpt-5.2",
"model": "openai/gpt-5.2",
"api_key": "sk-xxx"
},
{
"model_name": "claude-sonnet-4.6",
"model": "anthropic/claude-sonnet-4.6",
"api_key": "sk-xxx"
},
{
"model_name": "gemini-3-flash",
"model": "antigravity/gemini-3-flash",
"auth_method": "oauth"
},
{
"model_name": "my-company-llm",
"model": "openai/company-model-v1",
"api_base": "https://llm.company.com/v1",
"api_key": "xxx"
}
],
"agents": {
"defaults": {
"model": "deepseek-chat",
"max_tokens": 8192,
"temperature": 0.7
}
}
}
2.3 Go 结构体定义
type Config struct {
ModelList []ModelConfig `json:"model_list"` // 新
Providers ProvidersConfig `json:"providers"` // 旧,已废弃
Agents AgentsConfig `json:"agents"`
Channels ChannelsConfig `json:"channels"`
// ...
}
type ModelConfig struct {
// 必填
ModelName string `json:"model_name"` // 用户侧别名
Model string `json:"model"` // 协议/模型,如 openai/gpt-5.2
// 通用配置
APIBase string `json:"api_base,omitempty"`
APIKey string `json:"api_key,omitempty"`
Proxy string `json:"proxy,omitempty"`
// 特殊 Provider 配置
AuthMethod string `json:"auth_method,omitempty"` // oauth, token
ConnectMode string `json:"connect_mode,omitempty"` // stdio, grpc
// 可选优化
RPM int `json:"rpm,omitempty"` // 限速
MaxTokensField string `json:"max_tokens_field,omitempty"` // max_tokens 或 max_completion_tokens
}
2.4 协议识别
通过 model 字段中的前缀识别协议:
| 前缀 | 协议 | 说明 |
|---|---|---|
openai/ | OpenAI 兼容 | 最常用,包括 DeepSeek、Qwen、Groq 等 |
anthropic/ | Anthropic | Claude 系列专用 |
antigravity/ | Antigravity | Google Cloud Code Assist |
gemini/ | Gemini | Google Gemini 原生 API |
3. 设计合理性
3.1 解决的问题
| 问题 | 旧方案 | 新方案 |
|---|---|---|
| 添加 OpenAI 兼容 Provider | 需要改 3 处代码 | 只需添加一条配置 |
| Agent 指定模型 | 需要 provider + model | 只需 model |
| 代码重复 | 每个 Provider 重复逻辑 | 共享协议实现 |
| 多 Agent 支持 | 复杂 | 天然兼容 |