成本追踪:辅助产品定价、配额决策

每天营业结束时,你的餐厅会打印一份日结报表——今天总营业额多少、各类菜品售出数量、食材成本,存档备查,下次交班可以翻出来对比。

Claude Code 的成本追踪器做的是同样的事。从代码上看,src/cost-tracker.ts 在每次会话结束时把费用数据写入项目配置文件,下次启动时可以恢复:

// src/cost-tracker.ts
export function saveCurrentSessionCosts(fpsMetrics?: FpsMetrics): void {
  saveCurrentProjectConfig(current => ({
    ...current,
    lastCost: getTotalCostUSD(),              // 这次花了多少美元
    lastAPIDuration: getTotalAPIDuration(),   // API 调用总耗时
    lastToolDuration: getTotalToolDuration(), // 工具执行总耗时
    lastLinesAdded: getTotalLinesAdded(),     // 新增了多少行代码
    lastLinesRemoved: getTotalLinesRemoved(), // 删除了多少行代码
    lastTotalInputTokens: getTotalInputTokens(),   // 输入给 Claude 的 token 数
    lastTotalOutputTokens: getTotalOutputTokens(), // Claude 输出的 token 数
    lastTotalCacheReadInputTokens: ...,  // 从缓存读取的 token(比新生成的便宜很多)
    lastTotalCacheCreationInputTokens: ..., // 写入缓存的 token
    lastSessionId: getSessionId(),
  }))
}

这份数据用于两个地方:

  1. 用户界面:会话结束时显示 Total cost: $0.23,Added 150 lines,Removed 42 lines
  2. 产品分析:产品团队用这份数据回答"某个功能平均让用户多花多少钱",为定价和配额决策提供依据

成本按模型分组追踪,因为 Claude Code 可能在一次会话里混用多个模型(主 Agent 用 Sonnet,子 Agent 用 Haiku)——就像日结报表要区分"堂食"和"外卖"分开算,混在一起就看不出各自的利润率了。

还有一个有意思的字段:lastFpsAverage(平均帧率)和 lastFpsLow1Pct(最低 1% 帧率)——追踪 CLI 界面的渲染流畅程度,相当于日结报表里的"顾客平均等餐时长",帮助工程师发现"哪个版本让界面变卡了"。