用 AI 写代码的花销分两种计费模式:按 token 用多少付多少,和包月买一个额度池。它们的差别不只是价格高低,而是成本的可预测性——按量计费下你无法在开工前知道这次重构要花多少钱,而这种不确定性会实实在在地改变你的行为:该让 AI 读的文件不敢让它读,该开的并行任务不敢开。这篇拆开两种模式的成本结构,说明「token 焦虑」从哪来、什么情况下它是真问题,并给出几个可以自己动手验证的检查方法。
很多人对 AI 花销的直觉停留在「聊天」阶段:问一句答一句,几百 token,不心疼。
Claude Code、Codex CLI 这类 Agent 型工具的消耗结构完全不同:
你说一句「把用户模块的分页逻辑重构一下」
↓
它自己 grep 整个仓库找相关文件 ← 每个文件都进上下文
↓
读了 12 个文件,其中 3 个特别长 ← 上下文继续涨
↓
改 5 个文件,每改一次都带着完整上下文 ← 前面所有内容重复计费
↓
跑测试,失败,读报错,再改 ← 又是一轮关键在于:每一轮请求都要把之前的上下文重新发一遍。一次十几轮的重构任务,前面的内容会被重复计费十几次。
这就是为什么很多人第一次看 Agent 工具的账单会吃惊——不是单价贵,是调用次数和上下文长度的乘积远超预期。
Agent 工具内部会派生子任务(读文件、搜索、简单判断这类杂活)。如果不显式指定,子任务可能和主任务用同一个高价模型。
Claude Code 里可以分开指定:
export ANTHROPIC_MODEL="你的主力模型" # 主任务:难活
export CLAUDE_CODE_SUBAGENT_MODEL="你的轻量模型" # 子任务:杂活
export ANTHROPIC_DEFAULT_HAIKU_MODEL="你的轻量模型"这一条配置在重度使用下的差别是数倍量级的,而且很多人根本不知道有这个变量。按量计费的用户尤其应该检查一下自己有没有配。
按量计费本身没有问题——用多少付多少,逻辑上最公平。问题出在认知负担上。
具体表现是这样的:
你本该做的 | 焦虑状态下实际做的 | 代价 |
|---|---|---|
让 AI 读完整个模块再动手 | 只贴出「相关的那几个函数」 | 它看不到调用方,改出隐性破坏 |
遇到不确定就多问几轮 | 忍着,凭猜测往下走 | 返工,最后花的更多 |
开三个并行任务同时推进 | 只开一个,串行等 | 时间成本,而时间比 token 贵 |
大胆试错,不行就回滚 | 想清楚了再动手 | 但「想清楚」正是 AI 该帮你干的事 |
这里有个反直觉的地方:为省 token 而缩小上下文,往往会让总花销变高。因为上下文不足导致的错误修改,需要更多轮次去发现和纠正,而每一轮都要重新发送上下文。
所以「token 焦虑」不是矫情,它是一种会自我实现的成本:你越省,越容易返工;越返工,花得越多。
⚠️ 但要说清楚:这个问题只对高频重度使用者成立。如果你一个月只用几次 AI 写代码,按量计费明显更划算——不用为闲置的额度付钱。这里没有普适答案,只有强度匹配。
按 token 计费 | 包月额度池 | |
|---|---|---|
单次成本 | 精确到每次调用 | 不感知 |
月度总额 | 开月初无法预测 | 开月初就确定 |
用得越多 | 线性增长,无上限 | 触及额度上限后受限 |
心理负担 | 每次操作都在算账 | 只在接近上限时出现 |
闲置成本 | 零 | 有(没用完的额度) |
突发高峰 | 账单跟着突增 | 被限速窗口削平 |
适合谁 | 用量少、或用量需精确归集到项目 | 每天都在用、且希望放开手用 |
结构性差异在最后两行:按量把风险留给用户(账单不可控),包月把风险留给服务方(用户可能超用)。服务方要承担这个风险,就必须有限速机制——所以包月一定不是「无限量」,看到宣称无限量的要留个心眼。
既然包月必然有限制,那么关键就是限制说没说清楚。判断一个包月服务是否诚实,看三点:
这一条经常被含糊处理。
共享池对用户其实更实在——你可以把额度全花在真正需要的模型上。但前提是明确告诉你这是共享的,而不是让你以为买了 N 份。
正经的包月服务会有滚动窗口限速。要问清楚的是:
窗口周期多长? # 常见是 5 小时 / 7 天两个周期
从什么时候开始算? # 从该周期首次请求起算,还是自然时间对齐
到点是重置还是滑动? # 重置更好理解,滑动更平滑这些参数不写出来的,等于没有承诺。
包月套餐常会标「约可对话 N 次」。这个数字必然是估算——同样一次对话,读 3 个文件和读 30 个文件的消耗差一个量级。
诚实的写法是明确标注这是估算、以额度为准,就像流量包标「约可看 N 小时视频」一样。把估算写成承诺的,后面一定会有纠纷。
如果一份订阅能在多家模型之间自由切换,省钱的逻辑不是「便宜」,而是任务分流:
任务类型 | 该用什么 | 原因 |
|---|---|---|
跨文件大重构、架构决策 | 能力上限最高的那档 | 出错成本高,省这点钱不值 |
写测试、补注释、格式整理 | 轻量模型 | 任务明确,强模型是浪费 |
长文档/大仓库理解 | 长上下文模型 | 窗口比智商更重要 |
需要时效性信息 | 带联网能力的模型 | 训练语料有截止时间 |
算法推导、数学 | 推理型模型 | 各家差异在这类任务上最明显 |
这个分流在单模型订阅下做不到,你只能一直用同一个模型干所有活。要么杂活用贵模型(浪费),要么难活用便宜模型(返工)。
Claude Code 里切换模型只要一条命令:
/model它会列出当前可用的模型,选一个即可,不用退出会话。
这一节是实测出来的,而且影响非常大,但知道的人很少。
Claude Code 对它不认识的模型 ID,一律按 200K 上下文处理。如果你用的是 1M 窗口的模型,它会在 200K 就触发自动压缩——你白白损失了 5 倍上下文。
最麻烦的是它不报错,只是提前压缩了。你的感受是「这模型怎么老忘事」「聊两轮就压缩了」,然后你会去怪模型。
在 Claude Code 里输入:
/context看第一行的分母:
显示 | 含义 |
|---|---|
| 🔴 中招了,一直在按 200K 砍 |
| ✅ 正常 |
把模型 ID 改成带 [1m] 后缀的形式:
你的模型名[1m]三条实测出来的注意事项:
① [1m] 是纯客户端侧的标记,不是上游模型名。 把带后缀的名字直接发给模型厂商的 API,会报「模型不存在」。这个后缀必须由中间层处理掉,上游只能收到干净的模型名。
② 只给确认是 1M 窗口的模型加。 加之前查准官方文档的窗口值。
③ 标错比不标更糟。 不标,最坏是压缩得太早,你少用了点上下文——难受但不崩。标大了,客户端该压缩时不压缩,一路顶到上游真实窗口才撞墙,直接给你一个 API 报错,而这时候会话里已经堆了一堆东西。
⚠️ 顺带说一句:官方模型也是一样的,默认也是 200K,1M 需要显式选带标注的那一项。这不是第三方模型专属问题。
任何经过中间层的服务都有这个问题。先说一个不成立的方法:
🔴 问它「你是什么模型」——这个不能作为判据。 模型自述的身份可以被系统提示词改写,返回体里的 model 字段也是服务端自己填的,两者都证明不了背后真正调用的是什么。
比较有参考价值的是这几条:
① 看错误响应的结构。 用一个故意写错的 Key 发请求:
curl -s -X POST "$ANTHROPIC_BASE_URL/v1/messages" \
-H "x-api-key: sk-obviously-wrong" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{"model":"claude-sonnet-4-5-20250929","max_tokens":16,
"messages":[{"role":"user","content":"hi"}]}' | head -c 300正经实现会返回结构化的 JSON 错误体。返回 HTML、纯文本、或者干脆返回 200 的,说明中间那层根本没在转发。
② 看调用记录的粒度。 后台能不能分项显示输入 token / 输出 token / 缓存 token?只给一个模糊的「剩余额度」、不能逐条审计的,用量上动手脚的空间很大。
③ 用能力差异做交叉验证。 不同模型在特定任务上的行为是有指纹的。举个可操作的例子:有的模型会输出思考过程(thinking),有的不会;同一系列的相邻版本,这个行为可能刚好不同。拿这类行为差异去验证,比问它身份可靠得多。
④ 看长上下文是不是真的。 用第六节的 /context 看分母,再实际喂一个超过 200K 的输入,看会不会截断。窗口是最难伪造的一项。
写到这里应该说明立场:我们做了一个叫 Code2AI Flex(flex.code2ai.codes)的多模型网关,走的是包月路线。下面是它的实际设计,你可以拿上面几节的标准去对照。
模型清单(一个 Key 全部可切,套餐之间的差异只在额度):
厂商 | 定位 |
|---|---|
Claude 全系(含 Opus / Sonnet / Haiku 各档) | 攻坚难活、大型系统 |
GPT 全系 | 全能通用 |
Kimi K3 | 高性价比日常 |
GLM 系列 | 国产长程、编码 Agent |
DeepSeek | 深度推理、算法分析 |
Grok | 实时联网、时效性信息 |
按第四节的三条标准自查:
上下文这一项:模型菜单里已经预置好 [1m] 后缀,不用自己折腾。窗口没有可靠依据的模型故意没加——按第六节第三条,标错比不标更糟。
调用记录保留最近 30 天,可以逐条看。
接入是两个环境变量,和接任何 Anthropic 兼容端点一样:
export ANTHROPIC_BASE_URL=https://flex-api.code2ai.codes
export ANTHROPIC_AUTH_TOKEN=你的key写进 ~/.bashrc 或 ~/.zshrc 后 source 生效。两项缺一不可。
也有一键脚本和一个自检命令:
flex doctor # 检查环境变量、端点连通性、代理干扰它不适合谁,说在前面:
Q:包月和按量,到底怎么选?
看使用频率,不看价格。每天都在用、且经常因为怕花钱而缩手的,包月能解决的是那个「缩手」的问题。一周用不了几次的,按量。
Q:ANTHROPIC_API_KEY 和 ANTHROPIC_AUTH_TOKEN 有什么区别?
不同版本、不同接入方式下要求不同。一个不行就试另一个,或者两个都设成同一个值。这是最常见的配置失败原因之一。
Q:改了环境变量不生效?
三个常见原因:写进了 ~/.bashrc 但用的是 zsh(macOS 默认);写完没 source;~/.claude/settings.json 里有残留的旧值在覆盖。先用 echo $ANTHROPIC_BASE_URL 确认变量真的生效了。
Q:本机开了代理,请求一直失败?
报 Failed to connect to 127.0.0.1 port xxxxx 就是代理干扰。要么临时 unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY,要么把网关域名加进 NO_PROXY。
Q:怎么知道我这个月还剩多少额度?
正经服务都应该有控制台能查,而且应该能看到输入/输出/缓存的分项。查不到分项的,参考第七节第二条。
/context,看看你的上下文窗口是不是一直在按 200K 被砍。这一条和计费模式无关,但影响可能比选哪种计费方式更大原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。