导读:最近掘金上有篇"AI 编程工具一年烧掉两台 MacBook"挺火,知乎"如何降低 Claude Code 的使用费用"也有 20 万浏览。省钱的建议网上很多,但很少有人拿同一个任务把几种设置的花费摆在一起比。我在本机用一个 Java 订单金额计算的修 bug 任务,跑了 6 种设置,每次都用 10 个隐藏用例验收,再按官方价格表把花费拆开。结论有点反直觉:这种小任务里,钱大半花在"写缓存"上,不在模型输出。
一、先说清楚:Claude Code 的钱花在哪
Claude Code 每发一次请求,都要把系统提示词、工具定义、你的 CLAUDE.md、整段对话历史一起发给模型。模型本身不记事,所以每一轮都是"从头再读一遍"。为了不重复收全价,API 有个提示词缓存:第一次读到的内容写进缓存(贵一点),之后再读同样的开头就按缓存价收(便宜很多)。
所以一次任务的账单分四块:
| 部分 | 是什么 | Opus 5.5 标价(每百万 token) |
|---|---|---|
| 输入 | 没命中缓存的新内容 | 4 美元 |
| 写缓存 | 第一次读到、存进缓存的内容 | 5 美元(5 分钟有效)/ 8 美元(1 小时有效) |
| 读缓存 | 命中缓存的历史内容 | 0.2 美元 |
| 输出 | 模型写出来的字,包括思考过程 | 20 美元 |
不管它会怎样?用订阅(Pro、Max)的话,钱不会多扣,但会更快撞到用量上限,提示"You've hit your session limit";用 API Key 的话就是直接多花钱。什么时候值得调:经常撞上限、团队按 token 付费、或者要在 CI 里批量跑 claude -p。
⚠️ 本文的美元数字是 Claude Code 在
claude -p --output-format json里报的total_cost_usd,它按标价在本地算出来。我是 claude.ai 订阅登录,官方文档说订阅用户这个数字和账单无关。订阅额度怎么折算 token,官方没公开,所以下面只能说"哪种设置用的 token 少",不能换算成"省了多少额度"。
二、测试方法
| 项目 | 版本 / 设置 |
|---|---|
| Claude Code | 2.1.299,claude.ai 订阅登录 |
| 任务项目 | Spring Boot 3.5.5 父 POM + JUnit 5,JDK 17.0.12,Maven 离线 |
| 每组运行方式 | claude -p,--output-format json,权限 acceptEdits,只放行 Bash(mvn:*)、Read、Edit、Write、Glob、Grep |
| 验收 | 跑完后放进 10 个模型看不到的隐藏用例 |
任务是一个订单金额计算类 PriceCalculator,规则写在 TASK.md 里:商品小计、VIP 打 95 折、按折后金额判断满减门槛并自动选减得最多的券、HALF_UP 四舍五入到分、最低 0.01 元、不满 99 元加 10 元运费。原实现故意埋了 6 个 bug:用 double 算钱、向下取整、先加运费再打折、门槛按折前判断、遇到第一张券就用、没有最低金额。
每组用的提示词完全一样:
text
这是一个订单金额计算模块,计算规则写在 TASK.md。现在的 PriceCalculator 实现有 bug,现有单测会失败。
请按 TASK.md 修好 src/main/java/demo/price/PriceCalculator.java,并补充你认为需要的单元测试。
不要修改 TASK.md,也不要改现有测试的断言。
用这条命令跑测试验证(离线,不要联网):mvn -o -q -s <临时 settings.xml> test
完成后用两三句话说明你改了什么。
每组的命令形如下面这样,只改 --model、--effort 和环境变量:
bash
# 在任务项目目录执行;结果 JSON 里有 total_cost_usd、usage、num_turns
claude -p "$(cat prompt.txt)" --model sonnet --effort medium \
--output-format json --permission-mode acceptEdits \
--allowedTools "Bash(mvn:*)" "Read" "Edit" "Write" "Glob" "Grep" > sonnet_medium.json
隐藏用例里有一条是 0.10×3 + 0.20×3 必须等于 10.90(含运费),专门抓 double 精度;还有"95 元商品加运费不能凑满 100 元门槛"这种只有认真读规则才能写对的。
三、6 组实测结果
| # | 设置 | 花费(美元,按标价) | 轮数 | 写缓存 token | 读缓存 token | 输出 token | 隐藏验收 | 它自己补的测试 |
|---|---|---|---|---|---|---|---|---|
| 1 | Opus 5.5,medium(我本机默认) | 0.694 | 13 | 61,565 | 458,446 | 5,470 | 10/10 | 9 个 |
| 2 | Sonnet 5.5,medium | 0.349 | 11 | 61,555 | 395,243 | 6,305 | 10/10 | 8 个 |
| 3 | Haiku 5.5,medium | 0.021 | 10 | 64,494 | 416,719 | 8,625 | 10/10 | 8 个 |
| 4 | Opus 5.5,low | 0.410 | 8 | 33,901 | 293,592 | 3,997 | 10/10 | 7 个 |
| 5 | Opus 5.5,medium,--safe-mode |
0.249 | 9 | 12,767 | 224,014 | 5,105 | 10/10 | 0 个 |
| 6 | Opus 5.5,medium,缓存强制 5 分钟 | 0.525 | 14 | 62,475 | 525,315 | 5,379 | 10/10 | 8 个 |
每组只跑了一次,任务也小,数字会有波动,适合看量级,不适合当精确的倍数。用时都在 45~62 秒之间,第 2~4 组是同时跑的,用时没有可比性,表里就没列。
几件事:
1. 这个任务上,6 种设置全部做对了。 连 Haiku 都把 6 个 bug 修完、10 个隐藏用例全过。Haiku 写出来的 PriceCalculator 和 Opus 的几乎一样:BigDecimal、HALF_UP、按折后金额选最大券、最低 0.01。说明规则写清楚、有测试可跑的小任务,用不着最贵的模型。
2. 钱主要花在写缓存。 拿第 1 组按官方价格表拆一下:
| 部分 | token | 单价(每百万) | 金额 |
|---|---|---|---|
| 写缓存(1 小时) | 61,565 | 8 美元 | 0.493 |
| 读缓存 | 458,446 | 0.2 美元 | 0.092 |
| 输出 | 5,470 | 20 美元 | 0.109 |
| 合计 | 0.694 |
和 Claude Code 报的 0.6937 对得上。写缓存占了 71%。读了 45 万 token 的历史,才花 9 分钱;写进缓存的 6 万 token 却花了近 5 毛。
3. 那 6 万 token 里,有一大半是我自己的配置。 第 5 组加了 --safe-mode(关掉 CLAUDE.md、Skills、插件、hooks、MCP),写缓存从 61,565 降到 12,767。看最后一轮请求的上下文:默认约 6.2 万 token,safe-mode 约 3.6 万。我本机装了不少 Skills、插件和 MCP,全局和项目里各有一份 CLAUDE.md,加起来每次请求多带约 2.5 万 token。不过要说明:第 5 组这次没补测试,少干了活,花费低一部分是这个原因。
4. effort 调低,轮数少了。 第 4 组 low 只用了 8 轮,补的测试也最少(7 个),花费比 medium 少 4 成,结果照样全对。
5. 缓存有效期不同,同样的活花费不同。 订阅用户的主对话默认用 1 小时缓存,写入价 8 美元;第 6 组用 FORCE_PROMPT_CACHING_5M=1 强制 5 分钟,写入价 5 美元,花费从 0.694 降到 0.525。API Key 用户默认就是 5 分钟,所以同样的任务,API 用户看到的数字会比订阅用户低。
四、按实测结果整理的省钱做法
4.1 小任务换 Sonnet 或 Haiku
这次 Sonnet 花了 Opus 的一半,Haiku 花了 Opus 的 3%,结果都对。官方文档的建议也是 Sonnet 处理大多数编码任务,Opus 留给复杂的架构决策和多步推理。
bash
# 会话中途切换模型
/model sonnet
# 一次性的命令行任务直接指定
claude -p "修复 PriceCalculator 的 bug" --model haiku
⚠️ 官方文档说每个模型有自己的缓存,会话中途切模型,下一轮要把整段历史重新处理一遍。所以最好在会话开始时就选好,不要一个任务里来回切。
4.2 effort 先用 medium,简单活用 low
bash
# 在交互会话里调整(Opus 5.5、Sonnet 5.5、Haiku 5.5 上,据文档换 effort 不会丢缓存)
/effort low
effort 越低,模型想得越少、工具调用越少。这次 low 少了 5 轮。复杂的跨模块改动我还是建议 medium 起步,效果不好再往上调。
4.3 给 CLAUDE.md 和插件瘦身
每次请求都带着它们,上下文越大,写缓存越多。可以这样查:
bash
# 交互会话里看上下文被什么占用(本文没有截图验证,命令据官方文档)
/context
# 关掉暂时不用的 MCP 服务器
/mcp
官方建议 CLAUDE.md 控制在 200 行以内,把只在特定场景用的长说明挪到 Skill 里,Skill 只在用到时才加载。想知道自己的配置占了多少,最简单的办法就是像第 5 组那样,用 --safe-mode 跑一次同样的任务,比一比 cache_creation_input_tokens。
4.4 不相关的任务之间用 /clear
上下文会一直累积,每一轮都要读一遍。换任务时 /clear 重开,官方文档说 /clear 不花钱,/compact 本身要发一次请求去做总结。
4.5 放行规则写宽一点,少一轮重试
这次 6 组里每组都有 1~3 条命令被拒,看 JSON 里的 permission_denials,被拒的基本是这种:
text
mvn -o -q -s .../settings.xml test; echo EXIT=$?
mvn -o -q -s .../settings.xml test 2>&1 | tail -30; echo exit=$?
我只放行了 Bash(mvn:*),模型在后面接了 ; echo 或 | tail,整条命令就不算 mvn 了,被拒后模型换成不带尾巴的写法重试。每被拒一次,就多一轮请求、多读一遍上下文。在 CI 里批量跑 claude -p 时,可以把 echo、tail 这类只读命令也加进放行列表。这一条我没有单独做对照实验,是根据 permission_denials 记录推断的。
4.6 给批量任务设预算上限
bash
# 只在 -p 模式生效:花费估算超过 1 美元就停
claude -p "$(cat prompt.txt)" --max-budget-usd 1
这个参数在 claude --help 里写的是"only works with --print"。本文没有测它超额时的具体行为。
五、怎么查自己花了多少
| 方法 | 看到什么 | 适合谁 |
|---|---|---|
claude -p ... --output-format json |
total_cost_usd、usage 里各类 token、num_turns、permission_denials |
脚本和 CI,本文就是用它 |
交互会话里 /usage |
Session 区块的总花费和各模型 token;订阅用户还有额度条和"哪些 Skill、插件、MCP 占了多少" | 日常使用 |
/insights |
分析最近的会话,生成一份 HTML 报告 | 想看自己的使用习惯 |
/usage 和 /insights 的说明据官方文档,本文没在交互会话里截图验证。文档还提到 2.1.305 起 /usage 里能按 f 让 Claude Code 自动执行它给出的省钱建议,我本机是 2.1.299,用不了。
确认自己用的是哪种缓存有效期,可以看 JSON 里的 usage.cache_creation:
json
{
"ephemeral_1h_input_tokens": 61565,
"ephemeral_5m_input_tokens": 0
}
这是第 1 组的输出,说明订阅登录时主对话写的是 1 小时缓存。
六、速查表
| 想省的地方 | 做法 | 本次实测效果 |
|---|---|---|
| 模型 | 小任务用 --model sonnet / haiku |
0.694 → 0.349 / 0.021 美元 |
| 思考深度 | --effort low 或 /effort low |
0.694 → 0.410 美元,13 轮 → 8 轮 |
| 底座上下文 | 精简 CLAUDE.md、Skills、插件、MCP | --safe-mode 时写缓存 6.2 万 → 1.3 万 token |
| 缓存有效期 | API 用户默认 5 分钟;订阅默认 1 小时 | 强制 5 分钟:0.694 → 0.525 美元 |
| 被拒重试 | 放行规则覆盖常见的管道命令 | 每组被拒 1~3 次(未做对照) |
| 失控保护 | -p 模式加 --max-budget-usd |
未测 |
七、常见问题
Q:订阅用户看 total_cost_usd 有意义吗?
不能当账单看,但能当"用了多少 token"的相对指标。同一个任务,这个数字低的设置,用的 token 就少,撞上限会晚一点。订阅额度和 token 怎么折算,官方没公开,我也没法验证。
Q:Haiku 这么便宜,为什么不全用 Haiku?
这次任务规则写得很清楚,还有现成的测试命令可以跑,这是对小模型最友好的情况。需求模糊、要跨很多文件、要自己设计方案的任务,本文没有测,不能拿这个结果外推。我的建议是先用 Sonnet,跑几次觉得不够再换 Opus。
Q:为什么 1 小时缓存反而更贵?
1 小时缓存的写入单价更高(Opus 5.5 是 8 美元对 5 美元),好处是你离开一会儿再回来,不用重新处理整段上下文。像这次 1 分钟就结束的任务,用不上长有效期,就白付了差价。官方文档的说法也是:短时间的连续工作,1 小时缓存更贵。
Q:Claude Code 的 /cost 命令去哪了?
现在的官方成本文档里讲的是 /usage,没有再提 /cost。本机 2.1.299 我没在交互会话里试 /cost,不确定它是否还能用。
参考链接
- Claude Code 官方文档 Manage costs effectively:code.claude.com/docs/en/cos...
- Claude Code 官方文档 How Claude Code uses prompt caching:code.claude.com/docs/en/pro...
- Claude API 价格表:platform.claude.com/docs/en/abo...
- 知乎问题:如何降低claude code的使用费用?:www.zhihu.com/question/19...
你平时主力用的是 Opus 还是 Sonnet?有没有试过把 effort 调到 low 干活?评论区说说你的模型、effort 和一般做什么任务,我挑几种补测一下花费。
觉得有用的话点个赞、收个藏,下次撞上限时翻得到。