1. 账单是怎么从 400 涨起来的:先看清 Claude Code 的成本模型
上个月我把主力开发环境切到 Claude Code,第一周还没觉得有什么问题,直到月中的 API 账单出来:四百多块。我当时第一反应是“是不是哪次循环写炸了”,但查完用量明细后只能承认——每一笔都是我自己把 token 烧掉的。Claude Code 是一个能在终端里读懂项目、改代码、跑命令、写提交信息的 AI 编程工具,确实好用;可它背后全是对 API 的实时调用,输出、缓存、工具返回、失败重试,每一项都计费。这篇文章就是我这一个月的账单手术记录:从四百到八十,不是靠不用 Claude,而是靠搞清楚模型选择、上下文管理、缓存命中、权限收敛和用量监控这几件事。适合正在用 Claude Code、或者想用 API 做自动化又怕月底账单失控的朋友参考。
1.1 Claude API 的计费项到底有哪些
Claude API 的计费逻辑不复杂,但每一项都会让账单涨。它按 token 计费,输入和输出单价不一样,输出通常比输入贵不少;工具调用返回的代码、文件内容、搜索结果都会作为新的输入 token 重新计费;如果开了 prompt caching,缓存命中的读取会有明显折扣,但缓存写入本身也有一次成本;会话不清理的话,历史消息会反复发送,相当于同一段话每次付一次钱。还有失败重试:一次 401 或 429 可能在重试时继续消耗 token。
很多人容易忽略的一点是:同一套 Claude Code,用普通 200K 上下文版模型,和用 1M 上下文版模型,单价是不一样的。1M 版能装进更多 token,但不代表更省钱,因为每轮请求都会重新定价。上下文越大,单次请求的价格上限越高,一旦习惯性把整个项目塞进去,账单会成倍往上冲。
1.2 一个月 400 块的典型账单长什么样
我翻了一下账单,发现主要来自三类场景。第一种,是让 Claude Code 做全库重构:它先 Glob 找文件,再逐个 Read,一轮下来光输入就几十万 token;我上午试一个方案,下午换另一个方案,每个方案都从零开始扫一遍,等于同一批代码被我反复买了好几次。第二种,是长时间不清理会话:同一个会话里聊了两小时,中途改了七八个文件,后续每次请求都会带上这两小时的全部对话记录,上下文从一万 token 涨到十几万 token,而且越往后越贵。
第三种,是我后来最后悔的:让强模型去写文案、做格式整理、把 Markdown 转成 HTML 这类简单活。这就像用轿车跑快递,单价高还费油。账单里的峰值有一天接近一百三,而那天我大部分时间都在做体力活式的代码搬运。回头总结,四百块不是 Claude 太贵,是我把它当成一个不用管钱的 IDE 在用了。
2. 从 400 压到 80:我做的七个关键变更
把账单压下来之后往回看,真正起作用的就是七个方向。按我自己的经验,影响从大到小排:先控制上下文,再换模型,再管权限,然后是缓存和会话习惯。
2.1 把简单任务切给便宜模型:cc switch 接入 DeepSeek / Qwen / GLM
第一刀砍在最简单的场景上。我装了社区常用的 cc-switch,用来切换 Claude Code 背后的 provider。它里面预置了 DeepSeek、Qwen、GLM 等国产模型的接入配置,也可以自己填 base URL 和 key。切换之后,完整任务链保持不变,只是请求真正打到了便宜模型上。
我的使用原则是:架构设计、疑难 Bug、跨模块重构这些需要强推理的活,继续用 Claude Sonnet 或 Opus;改注释、写单元测试、格式化、简单变量改名,切到 DeepSeek 或 Qwen。切换时直接命令行操作:
ccswitch # 选择 deepseek / qwen / glm 等 provider # 如果服务商提供 Anthropic 兼容端点,也可以手动设置环境变量 export ANTHROPIC_BASE_URL="https://api.deepseek.com/anthropic" export ANTHROPIC_AUTH_TOKEN="sk-xxxxxx" export ANTHROPIC_MODEL="deepseek-chat"注意,不是所有模型的工具调用能力和 Claude 一样稳。遇到工具调用极其频繁的任务,便宜模型容易“想表现又表现不好”,反而多试错、多烧 token。所以切换的核心不是无脑选便宜,而是按任务难度分单。
2.2 每个任务一个会话:别让上下文无限膨胀
我过去习惯一个终端窗口开一整天,Claude Code 会保留整个对话历史。一个任务改完不清理,下一个任务继续问,prompt 里就拖着前一个任务的几百行代码。我做了个实验:同一个重构任务,上午直接做,花了大概 5 万 token;下午开了一整天会之后再做,同样的步骤花了 13 万 token。多出来的全是历史记录重复计费。
后来我强制自己:一个任务一个会话,做完立刻 /clear。如果中途思路乱了,用 /rewind 回到某个更早节点,而不是让它带着完整黑历史继续跑。遇到超长会话,先 /compact 把历史压缩成摘要。压缩之后细节会丢一些,所以重要上下文我会提前写进 CLAUDE.md,而不是指望对话记录永远重启。
2.3 善用提示缓存:重复的规则只买一次
Anthropic API 支持 prompt caching,Claude Code 也会对稳定系统提示做缓存处理。如果你自己接 API,可以在 system 里加 cache_control 字段,让同一份项目规则只在第一次请求时按完整价格计费,后面都走缓存读取。这个折扣非常明显。
我实际遇到的情况是:以前每次修改代码,Claude Code 都要重新把 CLAUDE.md、工具定义、历史消息拼一遍;现在把 CLAUDE.md 的正文控制在稳定状态,不频繁改动,缓存命中率就上来了。在日志里观察 cache_read_input_tokens 这个字段,命中量明显上升时,成本立刻降了。要记住一点:频繁修改 CLAUDE.md 等于频繁清空缓存,规则尽量沉淀到稳定后再写进去。
2.4 CLAUDE.md 瘦身:项目记忆不是移动硬盘
CLAUDE.md 是给模型的项目记忆,不是文档库。以前我把 README、接口设计、目录结构、部署流程全塞进去,导致每次启动都要读几千行,相当于还没干活就先交一笔入场费。后来我只保留四类内容:项目结构、常用命令、代码规范、开发约束,整体控制在 80 行以内。
大段说明性文档放进 docs 目录,需要时用 Read 工具按需读取。这一个动作让单次会话的固定输入 token 少了一半。我还养成了一个习惯:经常用 /context 查看当前上下文占用,看到数字异常膨胀就先 /compact,再继续干活。
2.5 收紧工具权限:禁止 Claude Code 在代码库里逛街
Claude Code 默认会自己 Read 文件、Glob 搜文件、Grep 定位关键词,这些工具很好用,但很费 token。尤其是它经常把整个文件内容读回来,遇到几千行的大文件,一次 Read 可能就是几万 token。这还没完,Read 进来的内容又会变成后续请求的上下文,等于一份文件反复计费。
我在项目级 settings.json 里把权限改成了只允许必要的操作,明确拒绝它读 node_modules、build、dist 这些目录。这样它想“逛街”也逛不了,只能老老实实看 src 下的代码。工具调用被收敛后,每轮请求的 token 明显下降,而且因为上下文里少了无关文件,回答准确率也高了。
2.6 本地模型兜底:LM Studio 处理机械活
本地模型不用按 token 付费,成本基本只剩电费。我在 LM Studio 里跑 Qwen2.5-Coder-7B,专门处理重复机械任务:修 lint 报错、补简单测试、格式化代码、批量改命名。通过本地转换层把 Claude Code 的请求转发到 localhost 的 OpenAI 兼容端口,就能让同一个 claude 命令在“本地模型”和“云端模型”之间切换。
本地模型能力有上限,复杂任务会越做越傻,所以我只把它当“穷人的批处理工人”。它最大的价值不是替代 Claude,而是把那些不需要推理的体力活从云端 API 上挪走,省下实实在在的费用。
2.7 建立成本监控:账单要能逐日回溯
没有监控,优化就是瞎忙。Anthropic 控制台里能看到每个请求的 token 和费用,也可以设置预算提醒,但我更常用的是本地脚本。Claude Code 会把会话记录存在 ~/.claude/projects 目录下,格式是 JSONL,我用一个小脚本每天扫一遍,按天聚合 input、output、cache tokens,再乘单价,生成每日成本表。某个项目烧钱太多,当天就能发现,而不是月末对着总额发愣。
我现在养成的习惯是:每天结束前看一眼费用表,超过日预算就检查是哪类任务超支,然后切换模型或收紧权限。这个习惯直接把第二周的账单压了一半。
3. 具体配置与命令:可以直接抄的省钱方案
前面是思路,这一节给配置。我把目前正在用的 settings.json、模型切换命令、缓存配置和本地模型接入都放出来,你可以直接参考。
3.1 项目级 settings.json 配置示例
在项目根目录放一个 .claude/settings.json,只对该项目生效。我的示例:
{ "model": "claude-sonnet-4-5", "max_turns": 20, "permissions": { "allow": [ "Read", "Glob", "Grep", "Bash(git status)" ], "deny": [ "Read(node_modules/**)", "Read(dist/**)", "Read(build/**)" ] }, "env": { "ANTHROPIC_MODEL": "claude-sonnet-4-5" } }这里解释一下几个字段:model 指定默认模型;max_turns 限制单次任务的循环次数,避免它为了“完成任务”反复横跳;permissions 控制工具访问范围,deny 是真正的省钱关键;env 里的 ANTHROPIC_MODEL 是给当前会话一个模型兜底。不同 Claude Code 版本对字段名的兼容性会有差异,以你安装版本为准,思路是一致的。
注意,不要在 settings.json 里硬编码 API key。key 放在 shell 的环境变量里,settings 里只引用,改配置时不会误提交密钥。
3.2 cc switch 切换模型供应商的实操记录
cc-switch 是一个社区工具,用于切换 Claude Code 背后的 provider。我当时先全局安装,然后按 README 的命令添加 provider:
# 以 DeppSeek 为例 ccswicth add-provider # 输入名字: deepseek # 输入 base URL: https://api.deepseek.com/anthropic # 输入 API key: sk-xxxxxx # 切换默认 provider ccswitch use deepseek接下来什么都不用改,直接运行claude就会走新的 provider。如果想切回 Claude,再执行ccswitch use anthropic就行。如果不想用第三方工具,也可以手动设置环境变量,把 base URL 指向兼容 Anthropic 协议的服务商。注意,不同服务商是否提供兼容端点要以官方文档为准;协议不兼容时,需要中间转换层,cc-switch 干的就是这件事。
我接 DeepSeek 后第一周出现过一次问题:便宜模型对 Claude Code 的部分工具调用支持不完整,导致它反复重试同一个操作。后来发现不是 cc-switch 坏了,而是模型本身对工具协议的理解弱一些。所以我的建议是:切换后先跑一个小任务验证工具调用,再上真实工作量。
3.3 提示缓存与上下文管理命令组合
如果你自己通过 API 调用 Claude,可以显式开启 prompt caching。下面这个 Python 示例展示我常用的写法:
from anthropic import Anthropic client = Anthropic(api_key="sk-...") response = client.messages.create( model="claude-sonnet-4-5", max_tokens=1024, system=[{ "type": "text", "text": system_prompt, "cache_control": {"type": "ephemeral"} }], messages=[{"role": "user", "content": "..."}] )通过 cache_control 标记后的系统提示,在后续请求中如果前缀一致,就会走缓存读取,而不是全价重新计费。在 Claude Code 里你不需要自己拼这些,但理解了机制之后,就会明白“保持 CLAUDE.md 稳定”这件事有多值钱。
我常用的上下文管理组合是:新任务开新会话;会话变长先 /compact;关键信息写进 CLAUDE.md;需要读取大文件时,让 Claude 用 Bash 执行 head/sed 只读关键片段,而不是直接 Read 整个文件。这套组合让单次请求从几万 token 降到了几千。
3.4 LM Studio 本地模型接入配置
本地模型的接入分三步。第一步,在 LM Studio 里加载模型并启动本地服务器,默认端口 1234;第二步,确认接口地址是http://localhost:1234/v1/chat/completions,这是 OpenAI 兼容格式;第三步,在 cc-switch 或你使用的转换层里新增 provider,把 base URL 指向本地端口。
{ "name": "local", "baseUrl": "http://localhost:1234/v1", "model": "qwen2.5-coder-7b-instruct", "apiKey": "not-needed" }Claude Code 原生走 Anthropic 协议,而 LM Studio 走 OpenAI 协议,所以中间需要一层转换。不同的转换层配置方式不同,但思路都是“把 Anthropic 格式的请求翻译成 OpenAI 格式发给本地端口”。本地模型适合处理预算充足但能力要求低的场景,我用它跑过批量文件重命名和简单测试生成,效果稳定,成本可以忽略不计。
4. 常见报错与排查技巧实录
这一个月里踩了不少坑,下面是几个高频问题,按出现频率排。
4.1 401 unauthorized:incorrect api key provided 排查
这个错误大概是接触 Claude Code 的人都会遇到。完整的提示是unexpected status 401 unauthorized: incorrect api key provided: sk-svcac****。我第一次看到时以为 key 错了,反复复制粘贴都没用,后来发现问题是 shell 里同时定义了ANTHROPIC_API_KEY和ANTHROPIC_AUTH_TOKEN,Claude Code 优先读取了旧变量。
排查步骤我整理成一套固定流程:
- 查看环境变量:
env | grep -i anthropic,看有没有残留 key; - 运行
claude config list,确认当前生效的配置; - 检查
~/.claude/settings.json和项目.claude/settings.json,看是否有硬编码 key; - 重新设置 key 后,开一个新终端,不要复用旧会话。
特别注意:错误里的sk-svcac...只是 key 的前缀,被系统截断了,不代表 key 本身有问题。重点永远是“当前进程读到了哪个变量”。
4.2 400 context length exceeded:1M 上下文也有边界
另一个常见报错是model's maximum context length is 1048576 tokens,这是 1M 上下文版本模型触顶了。一开始我觉得 1M 很宽裕,什么都往里塞,直到有一次把一个项目的历史 commit diff 全部粘进去,直接爆掉。这个报错说明两个问题:一是上下文确实满了,二是你已经给这次请求付了很多钱。
我的处理方式是:先用/compact压缩对话历史,再用 Grep 定位需要看的代码片段,最后才 Read 关键文件。如果真的需要分析超长文档,把 1M 模型留给“只看不改”的专项任务,常规开发切回 200K 版本。1M 模型的单价更高,塞满一次的经济代价远超你的直觉。
4.3 组织策略与订阅访问被禁用的几种情况
如果你的错误里出现your organization has disabled claude subscription access for claude code,一般不是 key 问题,而是组织账号权限没打开。这种情况常见于企业组织:管理员没有给 Claude Code 授权,或者账号走的是订阅授权而不是 API 按量付费。需要找管理员在控制台里打开 Claude Code 的访问权限。
另一种类似报错是organization has been disabled。这个词看起来吓人,但大多数时候是账号欠费、额度耗尽或组织被暂停。先登录 Anilith 控制台看余额和账号状态,再检查是不是有多个组织账号切错了上下文。我碰到过一次是因为充值后没有刷新 token,重新创建 API key 就好了。
4.4 模型接入与工具链的杂症速查表
| 场景 | 报错或现象 | 排查建议 |
|---|---|---|
| 模型切换 | no api key for provider route "deepseek-official" | provider 路由没生效,检查环境变量和服务商文档 |
| 文档处理 | unstructured api url is not configured for doc file processing | 在 Dify 里配置专门的 Unstructured API 地址 |
| 本地模型 | 连接 localhost 被拒绝 | 确认 LM Studio 本地服务器已启动、端口是否被占用 |
| 多模型混调 | 请求打到了错误的 base URL | 用claude config list和 `env |
| 第三方 API | 照搬 Claude 鉴权方式调 DeepSeek / 讯飞 / 百度 / 智谱 | 各家的鉴权签名算法不同,先看各自的官方文档 |
这张表不是标准故障库,是我踩坑之后的个人速查记录。遇到问题时先看是“鉴权类”还是“路由类”,再决定从哪一边查。
5. 写在最后:一个月的实操体会
一个月下来,最大的改变不是工具,而是习惯。我把“成本守则”写进了 CLAUDE.md 开头:简单任务先问自己能不能用便宜模型;一次只读取必要文件;优先用 Grep 而不是 Read;不重复粘贴代码;任务完成立刻清理会话。这些规则看起来不起眼,但它们把一次请求从几万 token 压到几千 token。现在月账单稳定在八十左右,复杂需求我还是用 Claude,简单事情就交给 DeepSeek 和本地模型,整体体验没降,钱包先稳了。
最后再分享一个踩坑后总结的小技巧:每次准备开新会话前,先花十秒想清楚这个任务要动哪些文件,把范围写在第一句话里,比如“只读 src/utils 下的文件,其他目录不要碰”。Claude 就会变得克制很多,不会上来就把整个项目扫一遍。这个习惯,比任何配置都省钱。