Skip to content

fix(usage): 修正缓存输入重复计数与旧基线迁移#430

Open
liuyix wants to merge 1 commit into
deepcoldy:masterfrom
liuyix:fix/cache-token-semantics
Open

fix(usage): 修正缓存输入重复计数与旧基线迁移#430
liuyix wants to merge 1 commit into
deepcoldy:masterfrom
liuyix:fix/cache-token-semantics

Conversation

@liuyix

@liuyix liuyix commented Jul 10, 2026

Copy link
Copy Markdown

背景

Botmux v1 usage ledger 对 inputTokens 的缓存语义不明确。Codex、TraeX 和 Aiden 的原始 input token 已包含 cache read/create 子集,但 ledger 又把缓存写入独立字段,导致按互斥桶汇总的消费者把缓存输入重复计入 Total Token。

Kaboo 的真实现象是 Total Token 和成本虚高、缓存命中率偏低,并进一步抬高 tokens/codeLines 比率。Kaboo CLI 的历史兼容修复位于 seed/kaboo!552;本 PR 修复 Botmux 生产端,阻止新错误继续产生。

改动

  • 抽出统一的 cache-inclusive input 有界拆分:cache read 先占用 raw input,cache create 再占用剩余部分,最后得到 uncached input。
  • Codex、TraeX、Aiden 的 SessionTokenUsage.in 保留 raw input 供 dashboard 展示;accounting input/cache 字段保持互斥。
  • UsageLedgerRecord 升级为 v2,并显式写入 inputTokenSemantics: uncached。
  • v1 state 与 ledger crash-recovery baseline 在比较和差分前迁移,兼容 Codex、TraeX、Aiden 历史数据。
  • 显式 includes_cache 与 uncached 均按契约处理;未知显式 semantics 不会被误当成 legacy 再扣一次 cache。
  • 保持 append-first/state-after、epoch 与 deterministic recordId 去重行为不变。

影响范围

  • 公共路径:src/core/cost-calculator.ts、src/services/usage-ledger.ts。
  • 受影响 CLI:Codex、TraeX、Aiden;Claude Code、Seed、Relay 等原本互斥的计量路径保持不变。
  • 受影响会话:所有经 Botmux daemon 写 usage ledger 的会话;不修改 PTY/Tmux、IM 路由、卡片或 dashboard UI。
  • 未执行 switch:here、未重启 live daemon、未打 tag、未发布版本。

验证

  • 定向测试:3 files / 88 tests 全通过。
  • 串行全量测试:471 files / 7687 tests 全通过。
  • pnpm build 通过。
  • TypeScript 编译与 dashboard bundle 通过。
  • git diff --check 通过。

并行全量测试曾在既有 workflow-fanout 临时目录清理中出现 ENOENT;该文件单跑 6/6,通过串行全量得到 clean exit 0,未在本 PR 扩大范围处理该竞态。

@liuyix liuyix requested a review from deepcoldy as a code owner July 10, 2026 08:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant