关于 cost-diff
cost-diff 是用于比较两份成本摘要快照的回归检测技能,可在 PR 流程中检查支出变化。它按层级和模型列出变动,并支持总额、百分比及令牌类别阈值告警。
主要功能
- 01比较基线与当前快照
- 02按层级和模型计算差异
- 03按绝对差额排序结果
- 04支持总额与百分比告警
- 05检查令牌类别增长阈值
适用场景
- 01在 PR 检查中检测成本回归
- 02比较 main 与分支的成本快照
- 03发现缓存写入等令牌类别增长
- 04使用百分比和金额阈值设置门禁
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ ruvnet/ ruflo --skill cost-diff安装后在 Claude Code 中输入/cost-diff确认已加载。
详细介绍
PR 级成本回归检测。cost-counterfactual 会与假设基线(始终使用 haiku/sonnet/opus)进行比较,cost-burn 会将最新时间段与之前的均值进行比较,而 cost-diff 会比较两个特定的已知良好快照。
| 问题 | 技能 |
|---|---|
| “如果始终使用 X,我们会花多少钱?” | cost-counterfactual |
| “每日消耗是否比之前的均值增长得更快?” | cost-burn |
| “这个 PR 是否比 main 增加了支出?” | cost-diff ← 就是这个 |
算法
实现:scripts/diff.mjs。使用 cost summary --format json 提供的稳定 JSON 契约。
- 加载
--baseline和--currentJSON 快照。 - 合理性检查:两者都必须包含
total_cost_usd和sessionCount(cost-summary 结构)。 - 按键计算差值:
byTier(haiku/sonnet/opus)和byModel(每个模型)。 - 根据基线/当前值是否为零,为每个条目标记
added/removed/changed。 - 按
|delta|降序排列表格,让变化最大的条目位于顶部。 --alert-on-pct N:当total_pct > N时以状态码 1 退出。--alert-on-usd N:当total_delta_usd > N时以状态码 1 退出。 两者可以同时设置;先触发的条件优先。
PR 门禁工作流
# Capture baseline (e.g. on main, via the cost-tracker-smoke CI workflow)
cost summary --format json > baseline.json
# On the PR branch, capture current state
cost summary --format json > current.json
# Compare; fail the PR if total spend grew >10% OR >$5
cost diff --baseline baseline.json --current current.json \
--alert-on-pct 10 --alert-on-usd 5.00
同时使用这两个标志可以捕捉以下情况:
- 仅百分比触发:绝对变化较小,但变化幅度显著 (例如从 $0.10 翻倍到 $0.20,达到 +100%,但只增加了 +$0.10)。
- 仅 USD 触发:绝对变化较大,但百分比较小 (例如从 $100 增长到 $110,仅增长 +10%,但增加了 +$10)。
任一信号都可以独立导致 PR 检查失败——两者是 OR 关系。
--alert-on-class-pct(迭代 86)
上面的两个 USD 级阈值会漏掉一种回归:当某一种 token 类型增长过快,而总支出仅小幅增长时。例如,某个 PR 引入了冗长的上下文缓存模式,总支出只增长了 10%(低于 --alert-on-pct 50),但 cache_write token 增长了 900%。迭代 82 的驱动因素被 USD 信号掩盖了。
当 cache_write token 从基线到当前增长超过 50% 时,--alert-on-class-pct cache_write:50 会以状态码 1 退出。可在一个标志中检查多个类别(以逗号分隔):
cost diff --baseline baseline.json --current current.json \
--alert-on-class-pct cache_write:50,output:25
第一个超出阈值的类别优先。有效类别:input | output | cache_write | cache_read。
推荐的 PR 门禁三项组合:
cost diff --baseline ... --current ... \
--alert-on-pct 25 \
--alert-on-usd 5.00 \
--alert-on-class-pct cache_write:100
三个相互正交的信号——pct(总量增长)、usd(绝对增幅较大)、class-pct(构成发生变化)。每个信号都能捕捉其他信号遗漏的情况;OR 关系的 AND 语义意味着任一信号触发都会导致 PR 检查失败。
冒烟测试记录(合成的基线与当前快照)
| Total spend | $1.000000 | $1.500000 | +$0.500000 | 50.00% |
| Sessions | 10 | 13 | +3 | 30.00% |
## By tier
| opus | $0 | $0.60 | +$0.600000 | new | added |
| sonnet | $0.70 | $0.50 | -$0.200000 | -28.57% | changed |
| haiku | $0.30 | $0.40 | +$0.100000 | 33.33% | changed |
注意,表格按绝对差值而非字母顺序排序——变化最大的条目(新添加的 opus)会排在最前面。操作人员从上往下查看,就能首先看到“影响最大的事项”。
退出码
| 退出码 | 含义 |
|---|---|
| 0 | 未触发警报,或未设置阈值 |
| 1 | 超出 --alert-on-pct 或 --alert-on-usd 阈值 |
| 2 | 配置错误(文件缺失、JSON 无效、快照格式错误) |
状态列
| 状态 | 含义 |
|---|---|
added | 此 tier/model 在基线中为 $0,在当前快照中大于 $0 |
removed | 此 tier/model 在基线中大于 $0,在当前快照中为 $0 |
changed | 基线和当前快照都大于 $0;差值即为两者之差 |
baseline === 0 && current === 0 的条目会被删除(无需报告)。
与 cost-summary 的配合
cost-diff 是由 cost-summary 奠定的契约的后半部分:即 cost summary --format json 提供的稳定 JSON 结构。两部分都已冻结——可以向 summary 添加字段,但不能重命名或删除字段。
如果你在其他地方使用快照(仪表板、警报),同样的结构也适用——cost-diff 只是其中一个使用方。