提供方特征与多提供方管理
提供方特征和多提供方管理
相关源文件
本章引用的主要源码文件:
crates/jcode-provider-core/src/lib.rscrates/jcode-provider-core/src/selection.rssrc/auth/lifecycle.rssrc/cli/commands/provider_setup.rssrc/message.rssrc/provider/accessors.rssrc/provider/anthropic.rssrc/provider/claude.rssrc/provider/copilot.rssrc/provider/dispatch.rssrc/provider/failover.rssrc/provider/fingerprint.rssrc/provider/mod.rssrc/provider/openai.rssrc/provider/selection.rssrc/provider/startup.rssrc/server/provider_control.rssrc/server/provider_control_tests.rs
jcode 大语言模型(LLM)子系统围绕一个灵活、异步的 Provider trait 构建,该 trait 抽象了各种大语言模型(LLM)后端(Anthropic、OpenAI、OpenRouter 等)。这些后端之间的编排由 MultiProvider 处理,它管理账户轮换、基于配额的故障切换和用户通知。
提供方特征
Provider trait 定义了所有大语言模型(LLM)后端的标准接口。它支持流式响应、用于优化缓存的分割系统提示词,以及原生模型能力(如压缩)。
关键方法
| 方法 | 描述 |
|---|---|
complete | 主要方法,用于发送 Message 和 ToolDefinition 以获取 EventStream crates/jcode-provider-core/src/lib.rs:52-58。 |
complete_split | 优化的补全方法,将 system_static(缓存内容)与 system_dynamic(易变内容)分离 crates/jcode-provider-core/src/lib.rs:61-72。 |
native_compaction_mode | 返回提供者支持的压缩策略(例如,OpenAI 的 "encrypted_content")crates/jcode-provider-core/src/lib.rs:201-203。 |
on_auth_changed | 生命周期钩子,用于在登录事件后刷新子提供者或凭证 crates/jcode-provider-core/src/lib.rs:157-157。 |
refresh_model_catalog | 强制刷新动态模型列表,并返回刷新前后的摘要 crates/jcode-provider-core/src/lib.rs:142-154。 |
model_routes | 返回 ModelRoute 对象列表,描述可用模型、定价和可用性 crates/jcode-provider-core/src/lib.rs:132-134。 |
提供方逻辑流程
此图展示了一个通用的 Provider 实现如何处理请求,重点在于用于缓存的系统提示词分割。
Provider 请求管线
来源: crates/jcode-provider-core/src/lib.rs:61-72,src/provider/anthropic.rs:71-87,src/provider/anthropic.rs:41-45。
多提供方管理和故障切换管线
MultiProvider 结构体(定义在 src/provider/mod.rs 中的 multi_provider 模块)充当所有可用后端的容器,并处理它们之间的切换逻辑 src/provider/mod.rs:16-16。
FailoverDecision 分类
当提供者请求失败时,系统(通过 failover.rs)使用 classify_failover_error_message 对错误进行分类,以确定下一步操作 src/provider/failover.rs:64-66。
- 瞬态错误:网络故障或 5xx 错误。触发指数退避重试(OpenAI 最多重试
MAX_RETRIES= 3 次)src/provider/openai.rs:35-36。 - 配额耗尽:429 错误或使用量跟踪表明已达到限制。触发账户轮换或故障切换
src/provider/failover.rs:13-19。 - 致命错误:认证失败或参数无效。需要通过
ProviderFailoverPrompt进行用户干预。
账户轮换
MultiProvider 支持对 Anthropic 和 OpenAI 等提供者进行账户轮换。account_usage_probe 获取利用率数据 src/provider/mod.rs:29-33。如果当前活跃账户已耗尽,same_provider_account_candidates 会在同一提供者系列中识别可轮换的候选账户 src/provider/mod.rs:29-33。
ProviderFailoverPrompt
当主提供者失败时,系统可以发出 ProviderFailoverPrompt src/provider/mod.rs:49-49。此通知会:
- 告知用户资源耗尽或失败。
- 建议备选的
to_provider和to_labelsrc/provider/failover.rs:32-49。 - 提供输入大小的估算值,帮助用户判断故障切换是否合适
src/provider/failover.rs:37-39。
实现细节:OpenAI 和 Copilot
OpenAI 持久化 WebSocket
OpenAIProvider 实现了 PersistentWsState,以在多次交互回合中保持连接 src/provider/openai.rs:172-181。
- 继续交互:保持连接活跃,以便每轮只发送新内容,而不是完整对话
src/provider/openai.rs:169-171。 - 健康检查:如果空闲时间超过 15 秒(
WEBSOCKET_PERSISTENT_HEALTHCHECK_IDLE_SECS),则发送轻量级 ping 以检测半关闭的连接src/provider/openai.rs:49-52。
Copilot 高级模式
CopilotApiProvider 通过 PremiumMode 管理 GitHub Copilot 的特定约束 src/provider/copilot.rs:10-10。它可以通过 JCODE_COPILOT_PREMIUM 配置为不同的模式(Normal、OnePerSession 或 Zero)运行 src/provider/copilot.rs:177-183。
自然语言到代码的映射
此图将高级提供者概念映射到 jcode 代码库中的具体实现。
系统架构图
来源: crates/jcode-provider-core/src/lib.rs:49-49,src/provider/mod.rs:16-16,crates/jcode-provider-core/src/lib.rs:16-19,src/provider/openai.rs:172-181。
认证生命周期和模型选择
当认证发生变化时(例如,在 /login 之后),系统会触发 post_auth_model_refresh src/provider/startup.rs:4-7。
| 函数 | 逻辑 |
|---|---|
on_auth_changed | 标准钩子,用于通知提供者其底层凭证可能已更新 crates/jcode-provider-core/src/lib.rs:157-157。 |
set_model_with_auth_refresh | 尝试设置模型;如果失败,则调用 on_auth_changed 并重试一次 src/provider/mod.rs:144-164。 |
validate_catalog_invariants | 检查所选模型在认证事件后是否在提供者的路由列表中可用 src/auth/lifecycle.rs:102-137。 |
认证刷新序列
来源: src/provider/startup.rs:4-43,src/server/provider_control.rs:185-206,src/server/provider_control_tests.rs:180-205。