LLM 提供商模块概览
本文档描述 Elftia 中 LLM 提供商子系统的整体架构。该子系统负责管理多 LLM 提供商配置、API 密钥池、模型发现、请求路由和 Completion 调用链。
文件位置
| 模块 | 路径 |
|---|---|
| CompletionService | packages/desktop/app/main/services/capabilities/llm/completion/CompletionService.ts |
| ApiKeyPoolService | packages/desktop/app/main/services/capabilities/llm/completion/ApiKeyPoolService.ts |
| LLMConfigService | packages/desktop/app/main/services/capabilities/llm/config-service/LLMConfigService.ts |
| ProviderManager | packages/desktop/app/main/services/capabilities/llm/config-service/ProviderManager.ts |
| ModelDiscoveryManager | packages/desktop/app/main/services/capabilities/llm/config-service/ModelDiscoveryManager.ts |
| ConfigIOManager | packages/desktop/app/main/services/capabilities/llm/config-service/ConfigIOManager.ts |
| AgentModelsManager | packages/desktop/app/main/services/capabilities/llm/config-service/AgentModelsManager.ts |
| ThinkingResolver | packages/desktop/app/main/services/capabilities/llm/completion/ThinkingResolver.ts |
| StreamHandler | packages/desktop/app/main/services/capabilities/llm/completion/StreamHandler.ts |
| DirectApiHandler | packages/desktop/app/main/services/capabilities/llm/completion/DirectApiHandler.ts |
| ToolHandler | packages/desktop/app/main/services/capabilities/llm/completion/ToolHandler.ts |
| TransformerHandler | packages/desktop/app/main/services/capabilities/llm/completion/TransformerHandler.ts |
| ProviderSearchInjector | packages/desktop/app/main/services/capabilities/llm/completion/ProviderSearchInjector.ts |
| NativeSearchInjector | packages/desktop/app/main/services/capabilities/llm/completion/NativeSearchInjector.ts |
| URL Builder | packages/desktop/app/main/services/capabilities/llm/completion/url-builder.ts |
| Header Builder | packages/desktop/app/main/services/capabilities/llm/completion/header-builder.ts |
| Message Converter | packages/desktop/app/main/services/capabilities/llm/completion/message-converter.ts |
| Provider Presets | packages/desktop/app/shared/provider-presets.ts |
| IPC Routers | packages/desktop/app/main/services/routers/llm/ |
架构上下文
graph TB
subgraph 前端 ["前端 (Renderer)"]
UI[Provider Settings UI]
ChatUI[Chat Interface]
end
subgraph IPC层
PR[ProviderRouter]
AKR[ApiKeyRouter]
CR[CompletionRouter]
RCR[RouterConfigRouter]
TR[TransformerRouter]
MPR[ModelParametersRouter]
end
subgraph LLMConfigService ["LLMConfigService (委托模式)"]
PM[ProviderManager]
MDM[ModelDiscoveryManager]
CIOM[ConfigIOManager]
AMM[AgentModelsManager]
end
subgraph CompletionService ["CompletionService (门面模式)"]
DAH[DirectApiHandler]
SH[StreamHandler]
TH[ToolHandler]
THR[TransformerHandler]
TR2[ThinkingResolver]
end
AKPS[ApiKeyPoolService]
subgraph 外部API
OpenAI[OpenAI API]
Anthropic[Anthropic API]
Gemini[Gemini API]
Azure[Azure OpenAI API]
Others[其他提供商...]
end
subgraph 存储
SQLite[(SQLite)]
JSON[(llms-config.json)]
end
UI --> PR
UI --> AKR
ChatUI --> CR
PR --> PM
AKR --> AKPS
CR --> CompletionService
PM --> SQLite
PM --> JSON
MDM --> SQLite
MDM --> JSON
CompletionService --> AKPS
CompletionService --> LLMConfigService
DAH --> OpenAI
DAH --> Anthropic
DAH --> Gemini
DAH --> Azure
SH --> OpenAI
SH --> Anthropic
SH --> Gemini
SH --> Azure
数据结构
核心类型
// API 格式枚举
type ApiFormat = 'openai' | 'anthropic' | 'google' | 'azure-openai' | 'openai-response';
// LLM 提供商
interface LLMProvider {
id: string; // 唯一标识
name: string; // 显示名称
apiFormat?: ApiFormat; // API 格式(首选字段)
chatApiFormat?: ApiFormat; // 遗留 API 格式字段
apiType?: string; // 遗留类型字段
api_base_url?: string; // API 基础 URL
api_key: string; // 单密钥(遗留)
models: string[]; // 模型 ID 列表
modelConfigs?: ModelConfig[]; // 模型详细配置
modelGroups?: ModelGroup[]; // 模型分组
modelsEndpoint?: string; // 模型发现端点
enabled: boolean; // 是否启用
transformer?: TransformerConfig; // 转换链配置
icon?: string; // 图标
website?: string; // 官网
docsUrl?: string; // 文档链接
defaultSettings?: CompletionSettings; // 默认补全参数
codingPlan?: CodingPlanConfig; // Coding Plan 配置
isSystem?: boolean; // 系统内置提供商
presetId?: string; // 预设模板 ID
createdAt: string;
updatedAt: string;
}
// Completion 请求选项
interface CompletionOptions {
providerId: string; // 提供商 ID
model: string; // 模型 ID
messages: SimpleChatMessage[]; // 消息列表
maxTokens?: number; // 最大 Token 数
temperature?: number; // 温度
stream?: boolean; // 是否流式
thinkLevel?: ThinkLevel; // 思考级别
nativeSearchAugmentation?: NativeSearchAugmentation; // 原生搜索增强
sessionId?: string; // 会话 ID(用于 API Key Pool 亲和性)
}
// API 密钥池条目
interface ApiKeyEntry {
id: string; // 唯一 ID
providerId: string; // 所属提供商
label?: string; // 显示标签
apiKey: string; // 密钥值
enabled: boolean; // 是否启用
weight: number; // 权重 (1-100)
}
数据流概览
Completion 请求管线
sequenceDiagram
participant Frontend as 前端
participant CS as CompletionService
participant LLC as LLMConfigService
participant AKP as ApiKeyPoolService
participant Handler as API Handler
participant API as Provider API
Frontend->>CS: complete() / completeStream()
CS->>LLC: resolveRoutedModel(providerId, model)
LLC-->>CS: actualProviderId + actualModel
CS->>LLC: getProvider(actualProviderId)
LLC-->>CS: provider config
CS->>CS: resolveApiKeyForRequest()
Note right of CS: 优先级: codingPlan > pool > legacy
CS->>AKP: getKeyForSession(providerId, sessionId)
AKP-->>CS: resolved API key
CS->>CS: resolveApiFormat(provider)
CS->>Handler: callDirectHandler / callStreamHandler
Handler->>API: HTTP request
API-->>Handler: response / SSE stream
Handler-->>CS: CompletionResult
alt 429/529 错误
CS->>AKP: reportError(providerId, sessionId, status)
AKP-->>CS: new key
CS->>Handler: retry with new key
end
CS->>AKP: reportSuccess(sessionId)
CS-->>Frontend: result
模块边界与职责
| 模块 | 职责 | 不负责 |
|---|---|---|
| CompletionService | 请求管线编排、格式分发、重试、Vision 回退 | Provider CRUD、密钥存储 |
| ApiKeyPoolService | 多密钥负载均衡、会话亲和性、冷却退避 | 密钥持久化(委托给 DB) |
| LLMConfigService | Provider 配置管理、模型发现、路由、Transformer 链 | API 调用 |
| ProviderManager | Provider CRUD、模板/预设系统、SQLite 持久化 | 模型发现、路由配置 |
| ModelDiscoveryManager | 模型列表发现、缓存(SQLite + 文件) | Provider CRUD |
| ConfigIOManager | 配置导入/导出、JSON 文件 I/O | 数据库操作 |
| AgentModelsManager | 路由配置、Transformer 管理、全局参数 | Provider CRUD |
| ThinkingResolver | max_tokens 解析、思考预算计算 | 请求发送 |
| StreamHandler | SSE 流式处理(OpenAI/Anthropic/Gemini) | 非流式请求 |
| DirectApiHandler | 非流式 API 调用 | 流式请求 |
| ToolHandler | Agent 工具调用循环 | 普通 Completion |
| TransformerHandler | Transformer 链 Completion | 直接 API 调用 |
IPC 集成表
| IPC 通道 | 方向 | Router | 说明 |
|---|---|---|---|
llmConfig:getProviders | Renderer -> Main | ProviderRouter | 获取所有提供商 |
llmConfig:getProvider | Renderer -> Main | ProviderRouter | 获取单个提供商 |
llmConfig:addProvider | Renderer -> Main | ProviderRouter | 添加提供商 |
llmConfig:updateProvider | Renderer -> Main | ProviderRouter | 更新提供商 |
llmConfig:deleteProvider | Renderer -> Main | ProviderRouter | 删除提供商 |
llmConfig:toggleProvider | Renderer -> Main | ProviderRouter | 启用/禁用提供商 |
llmConfig:discoverModels | Renderer -> Main | ProviderRouter | 发现模型列表 |
llmConfig:getProviderPresets | Renderer -> Main | ProviderRouter | 获取预设模板 |
llmConfig:addFromPreset | Renderer -> Main | ProviderRouter | 从预设添加提供商 |
llmConfig:exportConfig | Renderer -> Main | ProviderRouter | 导出配置 |
llmConfig:importConfig | Renderer -> Main | ProviderRouter | 导入配置 |
llmConfig:getApiKeys | Renderer -> Main | ApiKeyRouter | 获取密钥列表 |
llmConfig:addApiKey | Renderer -> Main | ApiKeyRouter | 添加密钥 |
llmConfig:updateApiKey | Renderer -> Main | ApiKeyRouter | 更新密钥 |
llmConfig:deleteApiKey | Renderer -> Main | ApiKeyRouter | 删除密钥 |
llmConfig:toggleApiKey | Renderer -> Main | ApiKeyRouter | 启用/禁用密钥 |
扩展点
- 新增 API 格式:在
url-builder.ts添加 URL 构建函数,在DirectApiHandler.ts/StreamHandler.ts添加处理函数,在CompletionService的 switch 中注册 - 新增提供商预设:在
provider-presets.ts的PROVIDER_PRESETS数组中添加模板 - 新增搜索配置:在
provider-presets.ts的PROVIDER_SEARCH_CONFIGS中添加条目 - 自定义 Transformer:通过
AgentModelsManager注册新的 Transformer 链
关联文件表
| 文件 | 用途 |
|---|---|
packages/desktop/app/shared/llm-config.ts | LLM 配置共享类型定义 |
packages/desktop/app/shared/completion-types.ts | Completion 类型定义 |
packages/desktop/app/shared/thinking-config.ts | 思考配置与预算计算 |
packages/desktop/app/shared/provider-presets.ts | 提供商预设模板与搜索配置 |
packages/desktop/app/main/services/routers/llm/schemas.ts | IPC 请求 Zod 验证 Schema |
packages/desktop/app/main/services/capabilities/llm/config-service/schemas.ts | 配置服务内部 Zod Schema |
packages/desktop/app/main/services/infra/utils/sse-parser.ts | SSE 流解析工具 |
packages/desktop/app/main/workers/db/apiKeys.ts | API 密钥数据库操作 |
packages/desktop/app/main/workers/DbClient.ts | 数据库客户端 |
packages/desktop/app/preload/index.ts | Preload API 暴露 |