agentic_huge_data_base / wiki
页面 jcode · 4.4 用量跟踪与模型目录·DeepWiki 中文全文译文

4.4 · 用量跟踪与模型目录(Usage Tracking and Model Catalog)

代理式研究运行时 · 聚焦本章的模块关系、源码依据与实现要点。

项目jcode 章节4.4 状态全文译文 模块模型调用与提供方适配、测试、发布与运维、存储与持久化、界面与交互
源码线索
  • src/auth/claude.rs
  • src/auth/codex.rs
  • src/auth/copilot.rs
  • src/auth/cursor.rs
  • src/auth/cursor_tests.rs
  • src/auth/gemini.rs
  • src/auth/google.rs
  • src/auth/oauth.rs
  • src/storage.rs
  • src/tui/app/misc_ui.rs
模块标签
  • 模型调用与提供方适配
  • 测试、发布与运维
  • 存储与持久化
  • 界面与交互
  • 认证、权限与安全

章节正文

用量跟踪与模型目录

用量追踪与模型目录

相关源文件

本章引用的主要源码文件:

  • src/auth/claude.rs
  • src/auth/codex.rs
  • src/auth/copilot.rs
  • src/auth/cursor.rs
  • src/auth/cursor_tests.rs
  • src/auth/gemini.rs
  • src/auth/google.rs
  • src/auth/oauth.rs
  • src/storage.rs
  • src/tui/app/misc_ui.rs
  • src/tui/app/model_context.rs
  • src/tui/info_widget_git.rs
  • src/tui/info_widget_usage.rs
  • src/usage.rs
  • src/usage/cache.rs
  • src/usage/display.rs
  • src/usage/model.rs
  • src/usage/openai_helpers.rs
  • src/usage/provider_fetch.rs
  • src/usage/tests.rs
  • src/usage_display.rs
  • src/usage_openai.rs
  • src/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/usage src/usage.rs:29-30 获取数据。它会追踪 5 小时和 7 天的时间窗口,包括特定的 Opus 层级使用情况 src/usage.rs:99-123
  • OpenAI 追踪:从 ChatGPT 的 "wham" 端点 https://chatgpt.com/backend-api/wham/usage src/usage.rs:32-32 获取数据。它会追踪 5 小时、7 天以及 "spark"(GPT-4o)限制 src/usage/openai_helpers.rs:178-182
  • 渐进式更新fetch_all_provider_usage_progressive src/usage.rs:143-146 允许终端用户界面(TUI)在实时刷新进行时立即显示缓存数据。
配额耗尽检测

UsageData 结构体 src/usage.rs:99-127 包含判断提供商配额是否即将耗尽的逻辑。

  • AnthropicAnthropicProvider 会根据重置窗口检查用量。如果重置时间已过,则通过 is_stale() src/usage/tests.rs:48-60 将数据视为过期。
  • OpenAI:检测通过 OpenAIUsageData 进行,该结构体会追踪 hard_limit_reached 标志 src/usage/tests.rs:114-114
  • 故障切换逻辑:当某个提供商因配额或错误而不可用时,App 会处理 ProviderFailoverPrompt src/tui/app/model_context.rs:99-100。它可以在 3 秒倒计时后自动切换提供商 src/tui/app/model_context.rs:123-139
用量数据流

下图展示了用量数据如何被轮询并传播到用户界面和提供商逻辑中。

用量数据同步

jcode · 用量数据流 · 图 1
jcode · 用量数据流 · 图 1

来源:src/usage.rs:135-146src/usage.rs:241-248src/tui/app/misc_ui.rs:59-63src/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.json src/auth/gemini.rs:123-125 中查找凭证。
  • Cursor 发现:探测 Cursor IDE 的 SQLite 数据库 state.vscdb,以提取机器 ID 和访问令牌 src/auth/cursor.rs:203-218
订阅与认证目录

系统使用标准化的账户存储来管理每个提供商的多个账户。

  • Claude 账户:在 auth.json 中管理,支持多个命名账户(例如 claude-1claude-2src/auth/claude.rs:64-73
  • OpenAI 账户:类似地在 openai-auth.json src/auth/codex.rs:36-41 中管理。
  • 外部来源jcode 可以"信任"外部认证来源,如 Claude CodeOpenCodeCursor src/auth/claude.rs:10-13src/auth/cursor.rs:18-22

模型选择与定价

模型选择由特定于提供商的的路由和定价逻辑控制。

成本计算

对于基于 API 密钥的提供商,jcode 会在 TUI 中本地计算成本。

  • 默认定价:如果 API 未提供,则默认输入 Token 价格为每百万 15 美元,输出 Token 价格为每百万 60 美元 src/tui/app/misc_ui.rs:96-97
  • 轮次计算update_cost_impl src/tui/app/misc_ui.rs:77-104 根据 streaming_input_tokensstreaming_output_tokens 计算每个轮次的成本。
  • OAuth 豁免:对于基于 OAuth 的订阅(如 Claude Pro),会跳过成本计算,因为用量是通过用量 API 追踪的,而非按 Token 计费 src/tui/app/misc_ui.rs:88-93
模型目录实现

下图映射了提供商实现与元数据目录之间的关系。

模型元数据与路由

jcode · 模型目录实现 · 图 2
jcode · 模型目录实现 · 图 2

来源:src/tui/app/model_context.rs:153-164src/auth/claude.rs:188-198src/auth/codex.rs:165-173

关键函数与类

实体文件描述
UsageDatasrc/usage.rs:99-127包含使用百分比和重置时间的容器。
AccountUsageProbesrc/usage/model.rs:1-10用于探测特定提供商类型用量的逻辑。
fetch_all_provider_usagesrc/usage.rs:135-137异步聚合器,查询所有已配置的账户。
JcodeAuthFilesrc/auth/claude.rs:64-73Anthropic/Claude 凭证的多账户存储格式。
ExternalCursorAuthSourcesrc/auth/cursor.rs:18-22定义 Cursor 特定凭证位置(vscdb 与 auth.json)的枚举。
ProviderFailoverPromptsrc/tui/app/model_context.rs:99-100当配额达到时触发自动模型切换的 UI 触发器。

来源:src/usage.rs:99-127src/auth/claude.rs:64-73src/auth/cursor.rs:18-22src/tui/app/model_context.rs:99-100src/tui/app/misc_ui.rs:77-104