用好 CoreCode
缓存与计费
Claude Code 每一轮都会把系统提示、工具定义和整段对话重新发一遍。命中提示缓存时,这部分按缓存读取计费,价格只有正常输入的 2.5%~10%,Opus 5.5 和 Sonnet 5.5 是 5%。所以缓存命中率基本决定了你的花费。缓存以外的省钱做法见 省钱指南。
CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS,每次调用工具前都会多发一次几乎不命中缓存的检查请求,在使用日志里显示为「非流」。这部分可能占到总花费的一半以上。见 auto 模式的开销。缓存怎么计费
Anthropic 的提示缓存按前缀匹配:这次请求的开头和之前缓存过的内容一字不差,才能读到缓存。一次请求的输入分三部分计费:
| 部分 | 含义 | 相对正常输入价 |
|---|---|---|
| 缓存读取 | 和之前缓存的前缀相同的部分 | Opus 5.5、Sonnet 5.5 为 0.05 倍;Haiku 5.5 为 0.1 倍;Fable 5.1 为 0.025 倍 |
| 缓存写入 | 这次新写进缓存的部分。5 分钟缓存和 1 小时缓存价格不同 | 5 分钟约 1.25 倍,1 小时约 2 倍 |
| 输入 | 不进缓存的部分,Claude Code 里通常只有几个 token | 1 倍 |
具体单价以 模型价格 页为准。正常的 Claude Code 会话里,每一轮只有新增的几百到几千 token 需要写入,其余几十万 token 都是缓存读取。一旦前缀变了,整段上下文就要按写入价重来一遍,一次可能就是几十万 token。
CoreCode 做了什么
- 原生透传:
/v1/messages不做协议转换。cache_control标记和anthropic-beta请求头原样到达 Anthropic,1 小时缓存也能用。 - 会话粘性:同一个 Claude Code 会话(按会话 ID 和模型区分)固定在同一个上游账号,不会因为换号导致缓存失效;服务重启后绑定也会恢复。
- 按官方口径计价:输入、输出、缓存读取、5 分钟和 1 小时缓存写入分开计费,每条记录都能在 使用日志 里查到。
缓存在什么时候失效,取决于客户端发出去的内容。下面这些情况是 Claude Code 自己的行为,换任何中转或直连官方都一样。
auto 模式的开销
Claude Code 的 auto 权限模式会自己决定能不能执行一个操作,不再逐个问你。每个要检查的操作,都需要有人判断能不能放行。Claude Code v2.1.278 起,请求经过网关或代理时,它会先请服务端在正常的模型请求里一并审查,不再另发请求。CoreCode 原样透传这部分请求和审查结果:2026 年 10 月 30 日实测,auto 模式下 Opus 5.5 和 Sonnet 5.5 都由服务端审查,只有主对话请求,没有额外开销。
服务端不审查时,Claude Code 会退回老办法:每次调用工具前,另起一个分类器请求,把部分对话记录和待执行的操作发给模型,由模型判断要不要放行。官方文档说明,用 API key 或中转的账号,这些分类器请求都计入 token 用量。在 CoreCode 上会退回这种方式的,几乎都是设置了 CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS 的会话:这个变量会顺带关掉服务端审查。设置 CLAUDE_CODE_AUTO_MODE_SERVER=0 也一样。
这些检查请求还可能被拒:检查请求把一段对话记录交给模型,要它先写出推理再给结论。CoreCode 上多次看到 Anthropic 的安全分类器把这类请求当作套取推理过程(reasoning_extraction)拒绝。被拒的是 Claude Code 自己发的检查,不是你写的内容,CoreCode 不会因此处罚你的账户,但同一个检查不会再转给上游,重发会被拦下(见 403)。删掉 CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS,交给服务端审查,就不会再单独发这类请求。
退回时分类器用哪个模型:官方默认是 Claude Sonnet 5。CoreCode 提供的是 Sonnet 5.5、Opus 5.5、Haiku 5.5 和 Fable 5.1,没有 Sonnet 5;按官方规则,这时 Claude Code 改用你当前会话的模型。所以用 Opus 写代码时,每次检查也按 Opus 计费。
退回到单独的分类器请求时,开销是这样的。
问题在于,这个检查请求只有开头一小段能命中缓存。剩下的几万 token 每次都要重新写入,而且下一次检查也用不上这次写的缓存。在一个真实案例里:
- 主对话命中率超过 95%,每轮读取二三十万 token 的缓存,没有问题。
- 每次工具调用前多出一条检查请求:缓存只读了一两万,新写入约 6.5 万,输出只有几十个 token。
- 这些检查请求只占请求数的三分之一,却花掉了 60% 的额度。
怎么认出来
- 使用日志的「流」一列显示「非流」。Claude Code 的主对话都是流式的,非流请求基本是这类检查。
- 它通常出现在一条流式请求后几秒内;缓存读取少,缓存写入几万,输出很短。
- 控制台会把它标成「未命中」。鼠标移上去,提示里会写明多半是 auto 模式的检查。概览页的提醒也会在这类请求占多数时单独说明。
怎么确认开了 auto 模式
- Claude Code v2.1.283 起,终端和 VS Code 里的新会话默认就从 auto 开始,不需要你做任何设置。状态栏显示
⏵⏵ auto mode on。 - 启动命令带了
--permission-mode auto。 - 在会话里按 Shift+Tab 切换过权限模式,输入框下方显示当前是 auto。
怎么处理
- 删掉
CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS:检查~/.claude/settings.json的env、项目的.claude/settings.json和 shell 配置,把它删掉;有CLAUDE_CODE_AUTO_MODE_SERVER=0的也一起删。CoreCode 不需要这两个变量,删掉后开一个新会话,auto 模式改由服务端审查,单独的检查请求就没有了。/status里Auto mode server显示Enabled说明已经生效。 - 不需要无人值守时,关掉 auto:按 Shift+Tab 切到 Manual 或「自动接受编辑」模式,这类检查请求就不会再发。想让以后每个会话都从 Manual 开始,在
~/.claude/settings.json里写:
想默认自动接受编辑,把{ "permissions": { "defaultMode": "default" } }default换成acceptEdits。 - 换一个便宜的分类器模型:Claude Code v2.1.302 起可以用环境变量
CLAUDE_CODE_AUTO_MODE_MODEL指定分类器模型,填完整的模型 ID。用 Opus 写代码时,设成claude-sonnet-5-5,检查就按 Sonnet 计费:
分类器负责判断操作是否安全,换小模型会降低判断质量,请自己权衡。{ "env": { "CLAUDE_CODE_AUTO_MODE_MODEL": "claude-sonnet-5-5" } } - 接受这部分开销:auto 模式换来的是不用逐个确认。如果你需要它,这部分花费是正常的,不是中转出了问题。
其他未命中原因
以下情况会让 Claude Code 发出的前缀发生变化,下一轮整段重写缓存:
| 情况 | 说明 |
|---|---|
| 会话中途切换模型 | 缓存按模型区分,切到别的模型等于从零开始。切回来时,原模型的缓存可能已经过期。 |
切换思考强度或 /fast | effort 和 fast 模式也会改变请求,同样会让缓存失效。 |
| 停顿超过 5 分钟 | 默认缓存只保留 5 分钟,喝杯咖啡回来,第一轮就会整段重写。经常长时间停顿的话见 1 小时缓存。 |
| MCP 服务连接或断开 | 工具定义在请求最前面,工具列表一变,整个前缀都会变。保持 Claude Code 默认的 MCP 工具搜索开启可以避免这种情况,不要设置 ENABLE_TOOL_SEARCH=false。 |
| 启用或停用插件 | 插件带有 MCP 服务时,效果和上一条一样。 |
/compact | 压缩会改写历史,压缩后的第一轮需要重新写入,之后会话变短、开销更低。 |
| 升级 Claude Code | 新版本的系统提示不同,升级后第一轮会重写。 |
新开会话、/clear、隔很久后再 --resume | 新会话要从头写一遍缓存。恢复旧会话时,原来的缓存多半已经过期。 |
编辑 CLAUDE.md 不会马上让缓存失效,但也不会马上生效,要等到 /clear、/compact 或重启之后。怎么写好它见 CLAUDE.md 怎么写。
想多命中缓存:一个任务尽量在同一个会话里一口气做完,不要在中途切模型和思考强度;上下文太长时用 /compact 压缩,不要新开会话重新铺一遍上下文。
1 小时缓存
如果你经常停下来想五到六十分钟再继续,可以让 Claude Code 写 1 小时缓存。在 ~/.claude/settings.json 的 env 里加一行(需要 Claude Code v2.1.242 或更高):
"CLAUDE_CODE_PROMPT_CACHE_TTL": "1h"
1 小时缓存的写入价约为正常输入的 2 倍,5 分钟缓存约为 1.25 倍。停顿少的话,每次写入反而更贵;停顿多的话,省下的整段重写要多得多。CoreCode 原样转发 1 小时缓存需要的请求头,不需要额外设置。
在日志里排查
打开 使用日志,按时间看一个会话里的连续几条请求:
- 缓存读取持续增长,缓存写入只有几百到几千:正常,每轮只写新增的部分。
- 某一条缓存读取突然变成 0 或很小,缓存写入接近整段上下文:前缀变了,对照上面的表看那段时间做过什么。如果这条前面停顿了五分钟以上,就是缓存过期。
- 穿插着「非流」请求,每条写入几万:auto 模式的检查,见 auto 模式的开销。
在 Claude Code 里输入 /usage(也可以用 /cost)可以看本会话的 token 用量和费用,/context 可以看上下文被什么占满了。
对着日志还是看不出原因,把使用日志里那几条请求的时间发给我们,我们可以查上游账号和路由。
账单里的其他模型
只用 Opus 写代码,账单里也可能出现 Haiku 或 Sonnet,通常是这几种情况:
- 后台任务:Claude Code 会用小模型做对话摘要、生成标题之类的后台工作,每次只花一点点。
- 子代理:子代理可以单独指定 Sonnet 或 Haiku。
- auto 模式的分类器:默认用 Sonnet,见上文。
在使用日志里按时间找到对应记录,就能看到每条用的是什么模型、花了多少钱。