一次长任务刚跑完,你说不清它是贵还是慢:是模型的问题,还是你花了 40 分钟读输出才回复。命令 /cost 用一个文本块回答这两个问题,不需要仪表盘,也不需要额外集成。
它从早期继承版本里就存在,但很少有人打开:多数人以为那行美元数字就是套餐账单,看完就关掉。它不是。弄懂数字从哪里来,这条输出才有用。
/cost 命令会显示什么?
它打印五个部分:总成本、API 时长、实际经过时长、代码行数变化,以及按模型拆分的用量。这是当前会话的摘要,不是整月的统计。
| 输出行 | 它测量什么 |
|---|---|
Total cost | 按 token 在本地估算的美元成本。 |
Total duration (API) | 模型调用时间之和,包含成功调用和重试。 |
Total duration (wall) | 从进程启动或切换会话开始的真实时钟时间,包含你阅读输出等待的时间。 |
Total code changes | 本次会话中智能体编辑增加与删除的行数。 |
Usage by model | 每个模型的输入、输出、缓存读取、缓存写入 token,以及各自成本。 |
会话还没有任何调用时,最后一行显示 Usage: 0 input, 0 output。这是整个文本块唯一的空状态。
怎么运行 /cost?
在交互会话中单独输入命令,然后回车:
/cost
它也能在无界面模式运行,因为该命令声明支持非交互执行。适合测量你在 CI 里跑的脚本:
verboo -p "/cost"
Total cost 的数字从哪里来?
这个数字在你的机器上算出,用会话 token 乘以编译进二进制的价格表。生成这一行时不会发生任何计费请求。
计算公式,单位为美元每百万 token:
cost = 输入 / 1M * 输入单价
+ 输出 / 1M * 输出单价
+ 缓存读取 / 1M * 缓存读取单价
+ 缓存写入 / 1M * 缓存写入单价
+ 联网搜索次数 * 0.01
0.15.41 版本二进制价格表里各档位的价格:
| 价格表中的档位 | 输入 | 输出 | 缓存读取 | 缓存写入 |
|---|---|---|---|---|
| Haiku 3.5 | 0.80 | 4 | 0.08 | 1 |
| Haiku 4.5 | 1 | 5 | 0.10 | 1.25 |
| Sonnet 4.x | 3 | 15 | 0.30 | 3.75 |
| Opus 4.5 至 4.7 | 5 | 25 | 0.50 | 6.25 |
| Opus 4 与 4.1 | 15 | 75 | 1.50 | 18.75 |
| Opus 4.6 快速模式 | 30 | 150 | 3 | 37.50 |
数值单位为美元每百万 token,与 src/utils/modelCost.ts 中一致。如果你的供应商收费不同,Total cost 仍然是二进制的算法,不是供应商的账单。
两个实际后果:
- 缓存改变数量级。在 Sonnet 上,缓存读取 0.30,干净的输入 3.00,相差十倍。复用上下文的会话,实际开销远低于 token 总量给人的印象。
- 价格表里没有的模型会让读数失真。模型没有登记价格时,二进制退回默认模型的价格,并附加
(costs may be inaccurate due to usage of unknown models)提示。看到这个提示,就把数字当作数量级估计。
超过半美元时显示两位小数,低于半美元时显示四位小数。看到 $0.0312 不代表按分计费,只代表会话很短。
为什么 API 时长比实际经过时长短?
因为实际经过时长统计的是整个时钟,包含智能体停下等你回复的时间。API 时长只统计模型调用内部的时间。
这个差值是这个命令最便宜的诊断。实际经过 2 小时、API 只有 9 分钟,说明瓶颈是你的阅读,不是推理。实际经过 40 分钟、API 有 35 分钟,说明相反:智能体几乎全程在工作,下一步该看模型选择和上下文大小。
怎么看 Usage by model 那一行?
它按模型拆分消耗,回答会话里哪一部分更重。缓存读取、缓存写入和联网搜索只在大于零时出现,所以行很短说明这次会话基本没有复用。
典型读法:如果 80% 的成本压在最贵的模型上,而任务只是改文件名,解决办法不是写更好的提示词,而是用 /model 在机械环节切到便宜模型,只在难的部分切回来。按模型的表格给出的是差距的大小,而不只是感觉。
/cost 和 /usage 有什么区别?
/cost 测量这次会话消耗了什么。/usage 显示套餐额度和重置时间。两者回答不同问题,不能互相替代。
| 问题 | 命令 | 回答什么 |
|---|---|---|
| 这次会话消耗了多少? | /cost | 成本、时长、行数和各模型 token。 |
| 我的套餐还剩多少? | /usage | 额度上限与重置窗口。 |
| 上下文在哪里占得最多? | /context | 按类别拆分的上下文分布。 |
如果问题是额度为什么掉得快,先用 /usage 看消耗,再用 /context 找出占窗口的东西。/cost 用在之后,用来横向比较会话。
怎么看每次请求的成本,而不只是总数?
摘要会聚合整个会话。要按请求看,二进制会读取一个界面上不显示的环境变量,把每次调用写成一行 JSON 输出到 stderr。
VERBOO_LOG_TOKEN_USAGE=verbose verboo -p "你的提示词" 2> usage.jsonl
每行包含模型、输入与输出 token、缓存、缓存命中率和这次调用的 cost_usd。拿到这个文件后,用一行 jq 就能按模型求和:
jq -s 'group_by(.model) | map({model: .[0].model, usd: (map(.cost_usd) | add)})' usage.jsonl
这是调试用的开关,不是稳定接口:如果哪天变量改名,用 grep 在 src/cost-tracker.ts 里搜 VERBOO_LOG_TOKEN_USAGE 就能找到。
30 秒读完一次会话的清单
- 运行
/cost。 - 对比 API 时长与实际经过时长。差值大,说明等待主要来自人。
- 看
Usage by model,找出成本集中的模型。 - 出现未知模型提示时,把数值当作估算。
- 如果问题关于额度,改用
/usage。
测量会话,是为了决定下一次尝试把力气花在哪里。当套餐不按 token 计费时,/cost 的数字就不再是账单,而是工作量与模型选择的信号。
想在更强的模型上做同样的测量,又不用数 token?/cost 在 Verboo Code 里一直可用,会话之间的比较就变成时间和质量的问题。



