助手写代码看着不要钱,账单上不是:上下文、评测样本、整文件重写都在计费。
想知道这次超没超线,直接看额度线与超限后的三级动作。
随便挑一个已合并的变更,能不能说出它花了多少、贵在哪一步?
答「不能」,说明用量没有按变更归因,只看到一个月度总额。总额只能引发「省一点」的空讨论——把记录按变更名聚合,才知道该动哪一步。
下面四类消耗不会报错、不会让 make check 变红,只会让账单悄悄变大,同时让重要的几句话被淹在上下文里。
| 看不见的消耗 | 可识别的现象 | 后果 |
|---|---|---|
| 上下文膨胀 | 每次对话开头都贴一遍目录树或整个模块 | 贵,且真正重要的规则被淹掉,模型开始忽略约束 |
| 无谓重跑 | 同一任务重试超三次,每次不缩小范围 | 成本翻倍,结论还不可比——两次跑的不是同一件事 |
| 评测铺开 | 常规回归里随手把样本数从 40 加到 200 | 一次回归跑掉一周的额度,还没人看得完报告 |
| 大范围重写 | 为了改一个函数,助手重写整个文件 | 评审成本和计费一起涨,改动差异里噪音盖过信号 |
这条用量规范替上下文预算兜底:有了额度线,才会在贴整仓之前先想一下,该不该改成按路径生效的规则。
额度不是财务指标,是工程预算。它的作用是让团队在动手前先估一次「这次大概要花多少」,而不是事后看账单。下表是课程项目的起始参考值,先照抄,跑两周再按实际调整——调整要改文件并留一次记录,不能只在群里说。
| 额度项 | 参考上限 | 记在哪 |
|---|---|---|
| 单任务输入 token | ≤ 80k | docs/usage-budget.md |
| 单任务输出 token | ≤ 8k | docs/usage-budget.md |
| 单人单日输入 token | ≤ 200k | 用量报表 |
| 同一任务的提交前重跑次数 | ≤ 3 次 | 用量记录里的 tool_calls 与重试理由 |
| 常规评测样本 | core 集 40 题;全量 200 题另批 | eval/questions.yaml |
| 单条规则文件长度 | ≤ 200 行 | AGENTS.md 与 .claude/rules/ |
| 全组周额度 | 输入 ≤ 1.2M token | 周报 docs/metrics/ |
docs/usage/。拆不动,说明规约没把边界写清。超限时最该做的是缩小任务范围,不是调高上限。一次说不清的任务拆成三次,通常更便宜也更准。调高上限,只会在下一次以更大的幅度超限——超限的原因(任务边界不清)没被碰到。
只知道总数没用,要能回答「这个变更花了多少」「哪一类任务最贵」。三种统计维度能回答的问题不同,用错维度会把工程问题变成考勤问题。
| 统计维度 | 主键 | 能回答什么 | 答不了什么 | 记录方式 |
|---|---|---|---|---|
| 按变更 | openspec/ 目录名 | 这个变更花了多少、贵在实现还是贵在试探 | 谁上手最快 | 会话结束时追加一行 JSON 到 docs/usage/<变更名>.jsonl |
| 按人 | 提交者邮箱 | 新成员前两周的用量是否异常高 | 哪类任务贵;用久了就会滑向考勤表 | 只在新成员前 2 周记录,之后停用 |
| 按会话 | 会话 id + 时间戳 | 一次任务里试探了多少轮 | 产出了什么;会话本身不产出可合并的东西 | 工具侧日志,保留 30 天,不入仓库 |
一行一次会话,字段固定六项。费用不记在行里——单价会变,行里只记 token 数,费用在聚合时用当时的单价算。
{"ts":"2026-10-03T14:02Z","change":"class-isolation","actor":"zhang","tool":"claude-code","model":"主模型","in_tokens":48210,"out_tokens":3210,"tool_calls":27,"result":"merged"}
{"ts":"2026-10-04T09:11Z","change":"class-isolation","actor":"li","tool":"claude-code","model":"轻模型","in_tokens":12030,"out_tokens":880,"tool_calls":6,"result":"merged"}
费用 = 输入 token × 输入单价 + 输出 token × 输出单价;单价以模型厂商的官方定价页为准(Anthropic、OpenAI),不写死在仓库里。
jq -s 'group_by(.change)
| map({change: .[0].change,
in: (map(.in_tokens) | add),
out: (map(.out_tokens) | add),
calls: (map(.tool_calls) | add)})' docs/usage/*.jsonl
把记录落在仓库里,不要只留在某个平台的控制台里。控制台会换、会过期,历史不会。换工具时把 docs/usage/ 一起迁走,这一层才连续。
{"ts":"2026-10-03T14:02Z","actor":"zhang","tool":"claude-code",
"in_tokens":48210,"out_tokens":3210,"result":"merged"}
{"ts":"2026-10-04T09:11Z","actor":"li","tool":"claude-code",
"in_tokens":12030,"out_tokens":880,"result":"merged"}
认它的办法:随便挑一个已合并的变更,能不能说出它花了多少、贵在哪一步。上面每行都没有 change 字段,只能按人聚合——而按人聚合的下一步就是排名,排名之后这张表就成了考勤表,真正该问的「哪个变更最贵、贵在实现还是贵在试探」一句也答不了。缺一个字段,整层判据就失效了。
把总额除以产出,才有可比性。四个指标都和上一页的周报一起看。
| 指标 | 怎么算 | 看什么 |
|---|---|---|
| 单位成本 | 总成本 ÷ 已合并的变更数 | 趋势是不是在涨;涨了先看是不是变更拆得太细 |
| 单次请求成本 | 总成本 ÷ 请求量 | 是否随上下文膨胀而上升 |
| 返工成本 | 被返工的变更成本 ÷ 总成本 | 超过三成说明规约没写住,先补规约再加额度 |
| 评测成本 | 评测总成本 ÷ 回归次数 | 是否在为没有结论的回归付费 |
要和怎么知道生效了一起看:速度上去了但返工成本同步上去,等于没有净收益。这时该停的是改动方式,不是额度。
省成本要按顺序来。从前到后,每次只动一级;动完一级等一周,看哪个指标真的降了,再决定要不要动下一级。
tool_calls 超过 20。docs/usage/ 的原因字段。边界:这套顺序适用于「额度紧张」的常规情况。真正的例外只有一类——某个变更的安全问题(越权、密钥泄漏)需要立即加检查,这类不排队,直接加。
| # | 失败 | 真正的错在哪 | 改法 |
|---|---|---|---|
| 1 | 只看账单总额 | 没有产出做分母 | 按变更归因,再看单位成本 |
| 2 | 按人排名用量 | 把工程问题变成考勤 | 聚合到变更,不聚合到人 |
| 3 | 超限就一律加额度 | 任务拆得不够细,加额度只是把问题往后推 | 先拆任务或缩上下文,再谈额度 |
| 4 | 用量只留在平台控制台 | 换了工具历史就断了 | 落进 docs/usage/ 或流水线产物 |
| 5 | 省成本省到门禁上 | 省掉的是判据 | 门禁与回归不参与削减,要省先省试探性调用 |