Claude Code 升级后 Token 暴涨三倍?问题分析与解决方案
问题现象
近期使用 Claude Code 连接第三方模型(如 ccswitch 中转、OpenRouter 等)时,不少用户发现 token 消耗量突然翻了三倍。不是代码量变了,不是使用频率变了,而是每次请求的缓存全部失效。
原因分析
从 Claude Code 2.1.36 版本开始,每次 API 请求的系统提示词开头会被注入一段 x-anthropic-billing-header,其中包含一个随机生成的 5 位十六进制 cch 值——每次启动、每次请求,这个值都不一样。
对官方 API 无影响
Anthropic 官方后端有自己的缓存机制,不受提示词内容影响,所以官方用户感知不到变化。
第三方代理遭殃
但第三方代理和中转服务(如 OpenRouter、ccswitch 等)通常把提示词内容本身作为缓存 key 来计算 KV cache 命中率。cch 每次都在变 → 提示词哈希值永远在变 → 缓存命中率直接归零。
具体后果
- token 消耗暴涨:每次请求都要重新处理完整的系统提示词,预填充阶段无法复用缓存
- 推理速度变慢:无法复用前缀缓存,响应时间增加
- 成本直线上升:对于大量使用 Claude Code 的团队,缓存命中率归零意味着成本直接翻倍甚至三倍
解决方案
核心:设置环境变量
Anthropic 提供了一个环境变量来关闭 cch 字段的注入:
CLAUDE_CODE_ATTRIBUTION_HEADER=0
推荐的完整启动命令
三个措施叠加效果最佳:
CLAUDE_CODE_ATTRIBUTION_HEADER=0 claude \n --exclude-dynamic-system-prompt-sections \n --settings '{"includeGitInstructions":false}'
各参数作用:
| 参数 | 作用 |
|---|---|
CLAUDE_CODE_ATTRIBUTION_HEADER=0 |
去掉随机 cch 字段,核心解决 |
--exclude-dynamic-system-prompt-sections |
排除动态系统提示词段落,减少每次会话的变化 |
--settings '{"includeGitInstructions":false}' |
关闭 git 相关指令注入,进一步稳定提示词内容 |
Windows 用户操作步骤
如果你像我一样使用 ccswitch 连接第三方模型,需要在 Windows 系统层面设置环境变量:
- 按
Win + I打开设置 - 搜索 「环境变量」 → 点击 「编辑系统环境变量」
- 点击 「环境变量」 按钮
- 在 用户变量 区域,点 「新建」
- 变量名:
CLAUDE_CODE_ATTRIBUTION_HEADER,变量值:0 - 确定保存,重启 ccswitch 和 Claude Code
或者用 PowerShell 一行命令:
[Environment]::SetEnvironmentVariable("CLAUDE_CODE_ATTRIBUTION_HEADER", "0", "User")
本地模型用户(llama-server 等)
如果你使用本地模型,可以加上更多环境变量来进一步优化:
ANTHROPIC_BASE_URL=http://127.0.0.1:8080 \nANTHROPIC_API_KEY=no-key \nANTHROPIC_MODEL=your-model.gguf \nCLAUDE_CODE_ATTRIBUTION_HEADER=0 \nCLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 \nDISABLE_TELEMETRY=1 \nDISABLE_ERROR_REPORTING=1 \nclaude --bare \n --model your-model.gguf \n --exclude-dynamic-system-prompt-sections \n --settings '{"includeGitInstructions":false}'
验证是否生效
设置环境变量并重启后,可以通过以下方式验证:
- 在终端执行
echo $CLAUDE_CODE_ATTRIBUTION_HEADER(Linux/Mac)或echo $env:CLAUDE_CODE_ATTRIBUTION_HEADER(PowerShell),确认输出为0 - 观察接下来几次请求的 token 消耗量,如果恢复正常水平则说明已生效
小结
这个改动本身是 Anthropic 为了计费追踪加上的,没有恶意。但它没有考虑到第三方代理和本地模型用户的场景,直接导致缓存机制失效。如果你也在用第三方代理或本地模型,尽快加上 CLAUDE_CODE_ATTRIBUTION_HEADER=0,避免不必要的 token 浪费。