HTML正文:

Claude Code的额度总比预期先见底,可用量计数器只告诉你用了多少,不告诉你花在哪。好在它本来就把每次会话的完整记录存在磁盘上,路径是 ~/.claude/projects。我借一个AI代理写了个小工具,把这些文件读出来做汇总,然后跑了一遍自己的历史记录。

打开网易新闻 查看精彩图片

跑的是208次会话,数据做了匿名和取整处理。先说一个前提:缓存读取占了原始token的98%,但这不等于它吃掉98%的配额。缓存读取按token算很便宜,而Anthropic并没有公开每种token类型在套餐限额里怎么计。这些只是原始token计数,想诚实地衡量某个改动有没有用,唯一办法是对比改动前后的 /usage。

三个我原本搞错的地方

这三点在官方文档《How Claude Code uses prompt caching》里都有说明。

第一,缓存存活时间不总是5分钟。在Claude订阅套餐内,主对话的缓存能撑1小时;子代理、压缩和其他请求则是5分钟。用API key、用量额度或云服务商时,全部都是5分钟。而一旦超出套餐限额、开始动用用量额度,主对话也降到5分钟。

第二,长时间中断之后,/compact 是最贵的选择。缓存一旦过期,下一个请求就要重算完整上下文。而 /compact 背后的摘要请求会把整段历史无缓存地重新处理一遍,文档原话是"这就是为什么在恢复旧会话时 /compact 代价最高"。我离开超过一小时后再回来接着干,触发了280次这样的重建,正好是这个模式。

第三,会话中途切 /model 会把所有内容重读一遍。每个模型有各自的缓存,切完之后下一个请求要无缓存命中地重读整段历史。我这么干了37次。在多数模型上,中途改effort等级也是同样效果。

我改掉的几个习惯

中断时间超过缓存存活期再回来,直接开新会话,粘一段简短的进度摘要进去;如果是要放弃某条路径,就用 /rewind 回到更早、已经进过缓存的点。别一上来就 /compact。

要压缩就趁缓存还热的时候压。缓存热着时,/compact 从缓存里读前缀,相对便宜。挑任务之间的自然断点执行,而不是等任务中途自动压缩。/recap 只给摘要,不替换历史。

一个会话只干一件事,不相关的任务之间用 /clear 隔开。一个跑了9,849轮的会话,每一轮都在重发大量上下文。

模型和effort等级在会话开头就定好,别干到一半再改。

CLAUDE.md 保持精简,它出现在每一个请求里,我的目标是控制在约1,500 token以内。中途编辑它不会破坏缓存,但改动要等 /clear、/compact 或重启才生效。想看清到底加载了什么,在新会话里跑 /context。

工具输出保持小体积:读文件带偏移和上限,先grep再读,命令管道接 head、tail 或 grep。

子代理要有意识地用。每个子代理会自建上下文,走的是5分钟存活期,提示词要窄,要求的输出要短。

最后,盯一下命中率。/usage 会显示主对话的prompt cache命中比例(v2.1.251及以上版本)。

在自己的日志上跑一遍

这个工具叫 cc-quota-doctor,MIT协议,纯标准库Python(3.9+),Windows、macOS、Linux都能跑,不发起任何网络请求,也不上传任何东西。

  • --top 10:列出更多项目和会话
  • --json:输出机器可读结果
  • --idle-minutes 5:按API key或用量额度的5分钟存活期计算

它会报告每个项目、每个会话的token量,子代理占比,启动上下文大小,加载了哪些CLAUDE.md文件,两种存活期下各自的空闲缓存重建次数,模型切换和压缩次数,最大的工具输出,以及针对你自己用量给出的前三项修复建议。

它做不到的事也得说清楚:不绕过、不重置、不提高任何限额,也看不到你的套餐百分比。会话记录格式没有公开文档,随时可能变,部分体积是估算值(字符数除以4)。数字看着不对,去开个issue。

工具是跟AI代理一起写的,我做了审查,再跑在自己的历史记录上。v0.2 是对照官方文档做了一轮QA之后修正的,上面那些存活期细节就是主要改动点。

我挺好奇:你自己的日志里,空闲重建有多少次?