用量跟踪与模型目录
用量追踪与模型目录
相关源文件
本章引用的主要源码文件:
src/auth/claude.rssrc/auth/codex.rssrc/auth/copilot.rssrc/auth/cursor.rssrc/auth/cursor_tests.rssrc/auth/gemini.rssrc/auth/google.rssrc/auth/oauth.rssrc/storage.rssrc/tui/app/misc_ui.rssrc/tui/app/model_context.rssrc/tui/info_widget_git.rssrc/tui/info_widget_usage.rssrc/usage.rssrc/usage/cache.rssrc/usage/display.rssrc/usage/model.rssrc/usage/openai_helpers.rssrc/usage/provider_fetch.rssrc/usage/tests.rssrc/usage_display.rssrc/usage_openai.rssrc/usage_tests.rs
jcode 系统包含一个复杂的子系统,用于跨多个提供商追踪大语言模型(LLM)用量、管理动态模型目录以及处理配额耗尽情况。这确保了智能体可以根据可用性、成本和剩余订阅限制智能地选择模型。
用量追踪与配额检测
用量追踪集中在 src/usage.rs 中,该文件提供了一个统一接口,用于从 Anthropic 和 OpenAI(ChatGPT)端点获取使用数据。
AccountUsageProbe 与 fetch_all_provider_usage
系统使用 AccountUsageProbe src/usage.rs:241-248(定义在 src/usage/model.rs 中)来表示特定账户的用量状态。核心函数 fetch_all_provider_usage src/usage.rs:135-137 会聚合所有已配置账户在支持的提供商上的数据。
- Anthropic 追踪:从 OAuth 用量端点
https://api.anthropic.com/api/oauth/usagesrc/usage.rs:29-30获取数据。它会追踪 5 小时和 7 天的时间窗口,包括特定的 Opus 层级使用情况src/usage.rs:99-123。 - OpenAI 追踪:从 ChatGPT 的 "wham" 端点
https://chatgpt.com/backend-api/wham/usagesrc/usage.rs:32-32获取数据。它会追踪 5 小时、7 天以及 "spark"(GPT-4o)限制src/usage/openai_helpers.rs:178-182。 - 渐进式更新:
fetch_all_provider_usage_progressivesrc/usage.rs:143-146允许终端用户界面(TUI)在实时刷新进行时立即显示缓存数据。
配额耗尽检测
UsageData 结构体 src/usage.rs:99-127 包含判断提供商配额是否即将耗尽的逻辑。
- Anthropic:
AnthropicProvider会根据重置窗口检查用量。如果重置时间已过,则通过is_stale()src/usage/tests.rs:48-60将数据视为过期。 - OpenAI:检测通过
OpenAIUsageData进行,该结构体会追踪hard_limit_reached标志src/usage/tests.rs:114-114。 - 故障切换逻辑:当某个提供商因配额或错误而不可用时,
App会处理ProviderFailoverPromptsrc/tui/app/model_context.rs:99-100。它可以在 3 秒倒计时后自动切换提供商src/tui/app/model_context.rs:123-139。
用量数据流
下图展示了用量数据如何被轮询并传播到用户界面和提供商逻辑中。
用量数据同步
来源:src/usage.rs:135-146、src/usage.rs:241-248、src/tui/app/misc_ui.rs:59-63、src/usage/openai_helpers.rs:32-32
模型目录与订阅管理
jcode 维护着一个动态的模型目录,特别是针对像 OpenRouter 这样拥有大量且不断变化库存的提供商。
提供商目录与模型发现
系统通过 jcode-provider-metadata 和特定于提供商的发现逻辑来管理模型的元数据。
- OpenRouter 发现:从其 API 动态获取并缓存模型列表。它使用具有特定 TTL 的缓存来避免触发速率限制
src/usage.rs:44-45。 - Gemini 发现:支持原生 OAuth,并且可以从官方的 Google Gemini CLI 导入凭证
src/auth/gemini.rs:9-16。它会在~/.gemini/oauth_creds.jsonsrc/auth/gemini.rs:123-125中查找凭证。 - Cursor 发现:探测 Cursor IDE 的 SQLite 数据库
state.vscdb,以提取机器 ID 和访问令牌src/auth/cursor.rs:203-218。
订阅与认证目录
系统使用标准化的账户存储来管理每个提供商的多个账户。
- Claude 账户:在
auth.json中管理,支持多个命名账户(例如claude-1、claude-2)src/auth/claude.rs:64-73。 - OpenAI 账户:类似地在
openai-auth.jsonsrc/auth/codex.rs:36-41中管理。 - 外部来源:
jcode可以"信任"外部认证来源,如Claude Code、OpenCode或Cursorsrc/auth/claude.rs:10-13、src/auth/cursor.rs:18-22。
模型选择与定价
模型选择由特定于提供商的的路由和定价逻辑控制。
成本计算
对于基于 API 密钥的提供商,jcode 会在 TUI 中本地计算成本。
- 默认定价:如果 API 未提供,则默认输入 Token 价格为每百万 15 美元,输出 Token 价格为每百万 60 美元
src/tui/app/misc_ui.rs:96-97。 - 轮次计算:
update_cost_implsrc/tui/app/misc_ui.rs:77-104根据streaming_input_tokens和streaming_output_tokens计算每个轮次的成本。 - OAuth 豁免:对于基于 OAuth 的订阅(如 Claude Pro),会跳过成本计算,因为用量是通过用量 API 追踪的,而非按 Token 计费
src/tui/app/misc_ui.rs:88-93。
模型目录实现
下图映射了提供商实现与元数据目录之间的关系。
模型元数据与路由
来源:src/tui/app/model_context.rs:153-164、src/auth/claude.rs:188-198、src/auth/codex.rs:165-173
关键函数与类
| 实体 | 文件 | 描述 |
|---|---|---|
UsageData | src/usage.rs:99-127 | 包含使用百分比和重置时间的容器。 |
AccountUsageProbe | src/usage/model.rs:1-10 | 用于探测特定提供商类型用量的逻辑。 |
fetch_all_provider_usage | src/usage.rs:135-137 | 异步聚合器,查询所有已配置的账户。 |
JcodeAuthFile | src/auth/claude.rs:64-73 | Anthropic/Claude 凭证的多账户存储格式。 |
ExternalCursorAuthSource | src/auth/cursor.rs:18-22 | 定义 Cursor 特定凭证位置(vscdb 与 auth.json)的枚举。 |
ProviderFailoverPrompt | src/tui/app/model_context.rs:99-100 | 当配额达到时触发自动模型切换的 UI 触发器。 |
来源:src/usage.rs:99-127、src/auth/claude.rs:64-73、src/auth/cursor.rs:18-22、src/tui/app/model_context.rs:99-100、src/tui/app/misc_ui.rs:77-104