Prompt Cache 实战避坑

越靠左越要锁死,左边动一下右边全废
tools
所有工具定义
含MCP
system
Claude Code身份+行为准则
启动参数注入
CLAUDE.md / skills
+ hooks / MCP指南
启动时注入 messages
messages
对话历史+工具调用
+你刚刚发的那句
← 一动全塌 · · · · 一动只伤自己 →
为什么
把请求想成一根从左到右的链条:tools → system → CLAUDE.md/skills → messages。Anthropic的cache系统按这个顺序逐段算hash。改了链条中间某一段,从这段往右所有cache跟着失效,左边的保住。所以越靠左的段,改一次代价越大。
session中途不要 /model缓存按模型隔离
Opus的缓存
已缓存 100,000 tokens
/model →
Sonnet的缓存
缓存 0 tokens
为什么
每个模型有独立的缓存,跨模型完全隔离。Opus写的缓存,Sonnet看不见。跟Opus聊了10万token再切Sonnet,等于从零开始重建——账单瞬间从0.1×基础价跳回1.25×基础价
装新MCP后别 /resume,tools变了缓存全废
tools 数组(原本29个工具)
Read
Edit
Bash
Grep
Task
...
↓ 装一个新MCP
tools 数组变了(30个)
Read
Edit
Bash
Grep
Task
...
+ 新MCP
为什么
装新 MCP 动到 tools 层(链条最左边),hash 一变,下面 system 和 messages 跟着失效——三层一起重建。好在 MCP 只在 Claude Code 启动时读一次:session 跑着装新 MCP,当前 session 不受影响。

怎么办:启动前一次装好。装完别 /resume 也别 /reload-plugins——这两个命令会让 Claude Code 重读配置,tools 数组重新组装,cache prefix 对不上,之前的 cache 全丢。开新 session 而不是 /resume。
改CLAUDE.md或装新skill后别 /resume

messages 层 · 改 CLAUDE.md 或装新 skill

hooks 注入
MCP 指南
skills 列表 ✏
CLAUDE.md ✏
你的输入
CLAUDE.md 和 skill 列表都注入在 messages 层:CLAUDE.md 是 block[3],skill 列表是 block[2]。两个都只在 Claude Code 启动时读一次——所以 session 内改文件或装新 skill,当前 session 看不到。但你 /resume 回来,Claude Code 重读、重新组装 messages[0],block 内容变了,跟之前的 cache 对不上,messages 整段重建。
别让cache闲置超过5分钟,过期直接删
5分钟内
02:18
距离上次请求
✓ cache条目还在
✓ 新请求 cache_read 命中
✓ TTL自动续期5分钟
→ 几乎不花钱
超过5分钟
07:42
距离上次请求
× 服务器删除cache条目
× 新请求 cache_read = 0
× cache_creation 重新写整段
→ 整段重建成本
为什么
官方默认TTL是5分钟,超过这个时间没新请求,cache条目直接被删——不是hash对不上,是服务器主动清掉。回来再发消息,整段从头重新写入。

怎么办:启动 Claude Code 之前先 export ENABLE_PROMPT_CACHING_1H=1,cache 闲置 1 小时才过期。写入略贵,长会话命中一次就回本。