AI 用量统计
每次 AI 调用都在 ai_usage 里留一行,/sources/ai-usage 把它们按时间范围汇总。本篇说明记什么、怎么算、怎么用,以及要加的配置。
每次请求模型(含输出不合格后的重试、超时和报错)一行;被取消的、被路由跳过的(冷却、关闭、超预算)不算调用,不记。
| 列 | 含义 |
|---|---|
model / model_source |
回复里报的模型名;call = 调用报告或我们指定;cli_default = codex 没指定模型,按 models.yaml 里标 cli_default 的那个认定;assumed = 旧版本给旧记录认定的模型。旧记录和未知模型为空 |
tokens_in / tokens_out |
全部输入 / 输出(输入含缓存读写,输出含推理);空 = 服务商没报告,不是 0 |
tokens_in_cached / tokens_in_cache_write / tokens_out_reasoning |
上面两个数的子集;空 = 没细分 |
duration_ms |
一次模型调用的耗时 |
outcome / error_kind |
ok / invalid_output / failed;失败行有错误种类(超时、限流、登录失效、网络、服务商报错…)。不存错误原文 |
cost_estimate |
实际开支:API 按 price,订阅 = 0;月预算只加这一列 |
equivalent_cost_usd |
折合 API 费用:同样的 token 按 API 价目表要付多少。API 调用 = 实际开支;订阅 CLI = 按 equivalent_price;没有单价或 token 未知 = 空 |
job_id |
打分、信号、翻译调用对应的岗位(岗位删除后置空) |
两种费用都在写入时按当时的 models.yaml 算好存下;以后改价格不会改写历史。迁移前的旧行新列都是空(页面上叫“旧记录”)。
价格:price 和 equivalent_price
Section titled “价格:price 和 equivalent_price”price:只给 API 服务商,真实计费,参与月预算。可加cached_input_per_mtok(缓存命中的输入)、cache_write_per_mtok(写入缓存的输入);不写就按input_per_mtok算(和以前一样偏保守)。equivalent_price:只给订阅 CLI(claude-cli / codex-cli),只用于统计,永远不参与预算。键同price,另外必须写source(出处和日期)。API 模型写它会被pnpm config:check拒绝。- 计价:
(输入 − 缓存读 − 缓存写) × 输入价 + 缓存读 × 缓存读价 + 缓存写 × 缓存写价 + 输出 × 输出价。 - 不用 CLI 自己估的费用(claude 的
total_cost_usd)当折合费用,口径统一用目录里的equivalent_price;可以拿claude -p --output-format json输出里的total_cost_usd核对单价是否填对。 - 所有金额是美元,不换算其他货币。
页面 /sources/ai-usage
Section titled “页面 /sources/ai-usage”只读、不发起任何 AI 调用。时间范围(今天 / 7 天 / 30 天 / 本月 / 自定义,按 schedule.yaml 的时区,含今天)、筛选(点三张明细表的行,标签上 ✕ 移除)、指标、页码都在 URL 里,刷新和分享链接都保留。
- 汇总:折合 API 费用、实际开支、节省(折合 − 实际,只算有折合费用的调用)、调用、Token。没有 token 数或没有折合单价的调用不计入合计,并在块下写明有多少次。
- 按天堆叠图(按服务商)、按模型 / 服务商 / 任务三张表、单次调用明细(岗位标题链到
/jobs/<id>)。 - 缓存 / 推理 token 是未知(旧记录没有这两列)时不写 0:汇总和明细表写“已知合计 + N 次未知”,全部未知时写“未知”;金额一律写
$(中英文页面相同);点“自定义”时日期框预填页面当前的时间窗口;折合费用缺失的脚注把“模型未知”和“模型没有折合单价”分开。 - “导出 CSV”:当前范围和筛选下的明细,最多
csv_max_rows行(最新的优先),UTF-8 带 BOM,未知值是空单元格。 - 设置在
data/config/ui.yaml的ai_usage块(默认范围、自定义最长天数、明细每页行数、CSV 上限);文件里没有这块也能运行。
严格 schema 的旧代码不认识 equivalent_price、缓存单价和 ui.yaml 的 ai_usage:如果文件里已经有这些新键、但能识别它们的代码还没在运行,ai-worker 会读不了目录(API 服务商被跳过)、设置页报错。顺序:升级并部署新代码(scripts/ops/deploy.sh)→ 把下面两块加进文件 → pnpm config:check → 单独提交这次配置改动。回退时先撤这个配置改动。
data/config/models.yaml(在对应模型条目里加 equivalent_price,其余不动)
Section titled “data/config/models.yaml(在对应模型条目里加 equivalent_price,其余不动)”单价已在 2026-10-08 对照官方价目表核对:Anthropic(https://platform.claude.com/docs/en/about-claude/pricing);OpenAI(`gpt-6.1-sol` 标准价,来自 OpenAI 的模型页 / 定价页,经搜索结果核对)。注意:Sonnet 5.5 的缓存读是 $0.10(输入价的 0.05 倍,不是 Sonnet 5 的 $0.20)。
claude-cli: label: Claude Code CLI models: - id: claude-haiku-4-5 label: Claude Haiku 4.5 equivalent_price: { input_per_mtok: 1, output_per_mtok: 5, cached_input_per_mtok: 0.1, cache_write_per_mtok: 1.25, source: "Anthropic API pricing (5 min cache write), platform.claude.com, checked 2026-10-08" } - id: claude-sonnet-5-5 label: Claude Sonnet 5.5 equivalent_price: { input_per_mtok: 2, output_per_mtok: 10, cached_input_per_mtok: 0.1, cache_write_per_mtok: 2.5, source: "Anthropic API pricing (5 min cache write), platform.claude.com, checked 2026-10-08" } - id: claude-opus-5-5 label: Claude Opus 5.5 equivalent_price: { input_per_mtok: 4, output_per_mtok: 20, cached_input_per_mtok: 0.2, cache_write_per_mtok: 5, source: "Anthropic API pricing (5 min cache write), platform.claude.com, checked 2026-10-08" } codex-cli: label: Codex CLI models: - id: gpt-6.1-sol label: GPT-6.1 Sol cli_default: true equivalent_price: { input_per_mtok: 2, output_per_mtok: 10, cached_input_per_mtok: 0.1, cache_write_per_mtok: 2.5, source: "OpenAI API pricing, standard tier (prompts up to 272K), openai.com / developers.openai.com, checked 2026-10-08" }可选:给 anthropic 两个模型的 price 补缓存单价(现在的 anthropic 调用没开缓存,补不补结果一样):Haiku 4.5 cached_input_per_mtok: 0.1, cache_write_per_mtok: 1.25;Sonnet 5.5 cached_input_per_mtok: 0.1, cache_write_per_mtok: 2.5(按 config/models.yaml 里实际写的模型核对;改的是你的副本 data/config/models.yaml,要先复制发布的文件,它会整份替换发布的列表)。
data/config/ui.yaml(文件末尾加)
Section titled “data/config/ui.yaml(文件末尾加)”# AI 用量页(/sources/ai-usage):只影响这个页面的显示ai_usage: # 打开页面时默认的时间范围:today | 7d | 30d | month(本月) default_range: 30d # 自定义范围最多多少天 custom_max_days: 366 # 调用明细每页多少行 log_page_size: 50 # "导出 CSV" 最多导出多少行(超出时只导出最新的这么多行) csv_max_rows: 20000- 汇总里“N 次调用没有 token 数”:CLI 的回复里没带用量(格式变了或该模型不报),按设计记为未知;升级 CLI 后重录
tests/fixtures/ai/下的夹具。 - “N 次调用的模型没有折合单价”:在
models.yaml给这个模型补equivalent_price。它只对新的调用生效,旧行保持空值。 pnpm ai:probe每行会多打印缓存 / 推理 token、耗时、折合费用(equiv≈)。
本页同步自产品库 Joevonlong/job-radar@2947f47 的 docs/。Job Radar 与任何招聘网站均无关联。代码采用 AGPL-3.0-only 许可。