Claude Code Token 基础课——读懂你的 token 账单:从 input_tokens 到 thinking 的计费拆解)
1. 为什么你的 Claude Code 账单总比预期高刚把 Claude Code 接进项目那几天我盯着控制台里滚出来的一串数字发愣input_tokens: 48690、cache_read_input_tokens: 2048、output_tokens: 590。明明只是让它改一个按钮的样式怎么输入就快五万了哪个数字才是我这次真正掏钱的算成本时到底该拿哪个字段乘单价如果你也有同样的困惑这篇就是写给你的。Claude Code 的 token 账单不是「一个数字」而是由input_tokens、output_tokens、cache_creation_input_tokens、cache_read_input_tokens以及 thinking 这几条线共同构成的。它们单价不同、计费逻辑不同混在一起看必然算不清。搞懂这五个字段你就能回答三个最实际的问题这次请求花了多少、钱花在哪、下次怎么省。这篇面向刚接触 Claude Code 的开发者交付一份可复制的 token 用量记录配置、一张账单字段对照表并演示如何用 API 返回的usage字段逐项验证。读完你能建立一套「成本可观测」的日常习惯而不是每次月底看账单才后知后觉。先说结论方便你带着框架往下读input_tokens是你这次真正送进去的上下文总量全额计费output_tokens是模型吐出来的内容单价通常是输入的数倍cache_creation_input_tokens是「为未来省钱预付的写入成本」cache_read_input_tokens是「已经赚到的便宜」单价极低thinking 是看不见但同样按输出价计费的部分。五个字段五种角色。2. 接入前的准备拿到可观测的调用入口要读懂账单前提是你能拿到结构化的usage返回而不是只靠控制台里一行行滚动的日志。Claude Code 本身会打印用量但如果你想做长期记录、按会话归档、甚至写脚本统计最稳的方式是走一个兼容 Anthropic 协议的 API 入口自己发请求、自己收usage。我这边日常用的是 TaoToken 的 API 入口它兼容 Anthropic 的消息格式返回体里带完整的usage字段正好适合做账单拆解练习。官网在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 基址是 https://taotoken.net/api 这个地址不加 UTM 参数配置时直接用。准备工作分三步都不复杂第一步拿到 API Key。登录后进控制台在 API Keys 页面创建一个新 Key。建议按用途分开建比如「本地调试」「CI 脚本」各一个方便后面按 Key 维度统计消耗。创建入口在 https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。第二步确认你要用的模型 ID。不同模型的单价差别很大账单拆解时必须知道自己在用哪个。模型列表和对话测试可以在 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 里看先跑通一次对话确认 Key 和模型都对。第三步想清楚你要观测什么。如果只是偶尔看看控制台日志够了如果你想建立习惯建议把每次请求的usage落盘成 JSONL一天一个文件后面用几行脚本就能算出当天各字段的累计值。这一步是「成本可观测」的核心别跳过。这里要提醒一句不要把生产数据库的直连凭据、真实用户数据塞进调试请求里。做账单练习用脱敏的示例文本就够了观测的是 token 结构不是内容本身。3. 可复制的配置让每次请求都吐出 usage这一节给你可以直接抄的配置。核心目标只有一个每次调用都能拿到完整的usage对象并且把关键字段记下来。先看最小可用的请求配置。下面是一个settings.json风格的片段用于把 Claude Code 指向兼容入口。路径按你本机的实际配置目录来字段名保持一致{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: sk-你的Key, ANTHROPIC_MODEL: claude-sonnet-4-5 } }三件套要记牢Base URL 填https://taotoken.net/apiKey 填你刚创建的那串Model ID 填模型列表里确认过的名字。三者缺一请求要么 401要么模型找不到。如果你更习惯用 TOML 管理配置等价写法是这样[anthropic] base_url https://taotoken.net/api auth_token sk-你的Key model claude-sonnet-4-5 [logging] usage_log ./logs/usage.jsonl接下来是重点怎么把usage记下来。下面这段 Python 演示了发一次请求并把用量追加到 JSONL 文件字段名和 API 返回保持一致方便你后面直接对照import json, time, requests API https://taotoken.net/api/v1/messages KEY sk-你的Key def ask(prompt, modelclaude-sonnet-4-5): resp requests.post( API, headers{ x-api-key: KEY, anthropic-version: 2023-06-01, content-type: application/json, }, json{ model: model, max_tokens: 1024, messages: [{role: user, content: prompt}], }, timeout120, ) data resp.json() usage data.get(usage, {}) record { ts: time.strftime(%Y-%m-%dT%H:%M:%S), model: model, input_tokens: usage.get(input_tokens, 0), output_tokens: usage.get(output_tokens, 0), cache_creation_input_tokens: usage.get(cache_creation_input_tokens, 0), cache_read_input_tokens: usage.get(cache_read_input_tokens, 0), } with open(./logs/usage.jsonl, a, encodingutf-8) as f: f.write(json.dumps(record, ensure_asciiFalse) \n) return record print(ask(用一句话说明什么是 token))跑一次你会在logs/usage.jsonl里看到一行结构化记录。这就是你账单观测的原始数据。字段对照表如下建议存下来字段含义计费角色单价量级input_tokens本次送入模型的上下文总量全额计费基准价output_tokens模型生成的内容全额计费约 5× 基准cache_creation_input_tokens写入缓存供后续复用预付写入约 1.25× 基准cache_read_input_tokens从缓存读取复用已省下的部分约 0.1× 基准thinking思考过程 token按输出价计费同 output注意cache_read_input_tokens常常远大于input_tokens这不是写错了而是累计命中缓存的量。看到几十万别慌那是之前省下来的。配置里还有一个容易忽略的点system prompt 和工具定义要保持稳定。如果你每次请求都往 system prompt 里塞时间戳、随机 ID缓存前缀每次都变cache_creation_input_tokens会一直涨而cache_read_input_tokens永远是 0等于白付写入成本。固定前缀是让缓存真正省钱的前提。4. 验证请求用 usage 字段逐项核对账单配置好了接下来验证。发一次真实请求把返回的usage打印出来逐项对照上一节的表。先看一个典型返回{ usage: { input_tokens: 48690, cache_creation_input_tokens: 0, cache_read_input_tokens: 2048, output_tokens: 590 } }怎么读这组数字input_tokens: 48690是这次真正送进去的上下文包括对话历史、system prompt、工具定义、读入的文件内容、Git status 等自动加载项。全额计费所以它是账单里最该盯的一项。一个原型生成请求输入在 5k 到 15k 算正常如果每次都 30k 以上说明背景加载太多得瘦身。output_tokens: 590是模型这次吐出来的内容单价通常是输入的 5 倍。一段完整代码实现可能 2k 到 5k一个简单描述 200 到 500。如果 output 异常大而 input 很小多半是 prompt 在引导模型长篇大论。cache_read_input_tokens: 2048是从缓存读出来的部分单价约 0.1 倍非常便宜。它大于 0 且数值稳定说明缓存机制在正常工作。如果每个新会话都从 0 开始去查 system prompt 里有没有动态内容。cache_creation_input_tokens: 0说明这次没有写入新缓存。如果你希望后续请求能命中缓存第一轮应该看到它有值第二轮它才会转化成便宜的cache_read。验证方法很简单连续发两次相同前缀的请求观察第二次的cache_read_input_tokens是否上升、cache_creation_input_tokens是否下降。如果第二次缓存读取还是 0说明前缀不稳定回去检查配置。再验证 thinking。在支持显式控制的模型上你可以对比开启和关闭两种情况的output_tokens差异。开启 thinking 时思考 token 会体现在输出侧计费里虽然不出现在回答文本中。简单任务可以试低 effort复杂代码生成建议保留因为关掉后模型可能写出不执行的工具调用重发一次反而更贵。把每次请求的这组数字落盘后你可以用几行脚本算当天累计import json from collections import defaultdict totals defaultdict(int) with open(./logs/usage.jsonl, encodingutf-8) as f: for line in f: r json.loads(line) for k in (input_tokens, output_tokens, cache_creation_input_tokens, cache_read_input_tokens): totals[k] r.get(k, 0) for k, v in totals.items(): print(f{k}: {v})跑完你就有了一张按天汇总的账单底稿。坚持记一周你会清楚自己的钱主要花在输入还是输出、缓存有没有生效。5. 常见报错排查401、proxy failed 与空 choices做账单观测的路上报错比数字更先到。这一节把几个高频问题对照真实报错说清楚。401 Unauthorized。最常见的原因是 Key 没配对或者 Base URL 和 Key 不属于同一环境。检查三件套Base URL 是不是https://taotoken.net/apiKey 是不是从对应控制台创建的Model ID 是不是模型列表里存在的。三者任一错位都会 401。另外注意别把 Key 写进会被提交到 Git 的文件里。local proxy failed / connection refused。这类报错通常出在本地网络层而不是 API 本身。先确认你的请求地址拼写正确再确认本机没有残留的代理环境变量干扰。如果你在 CI 里跑检查 runner 的出网策略。这类问题跟具体服务无关属于本地链路排查。返回体里 reading choices 为空 / choices 字段缺失。这多半是你把 Anthropic 格式的请求发到了 OpenAI 格式的端点或者反过来。Anthropic 的返回是content数组加usage不是choices。确认你调的是/v1/messages而不是/v1/chat/completions字段结构对不上就会读不到内容。OAuth 相关报错。如果你用的是需要 OAuth 的客户端token 过期后会报鉴权失败。重新走一次授权流程即可。注意区分「API Key 鉴权」和「OAuth 鉴权」两套体系别混用。usage 字段为空。请求成功了但usage是空的通常是流式响应没读完整或者你读的是中间事件而不是最终消息。流式模式下用量一般在最后一个事件里确保你把流读到底再取usage。排查顺序建议固定下来先看状态码401 查三件套403 查权限再看返回体结构字段对不上查端点格式最后看本地链路连接类报错查网络配置。按这个顺序走大部分问题五分钟内能定位。6. 把成本观测变成日常习惯读懂账单不是一次性任务而是一个习惯。我的做法是每天收工前花两分钟看一眼当天的usage.jsonl汇总重点看三个信号input_tokens有没有异常膨胀、cache_read_input_tokens是不是稳定大于 0、output_tokens有没有失控。如果输入持续偏大就去精简 system prompt、减少一次性读入的大文件、只加载必要的技能包。如果缓存读取一直是 0就去固定前缀、稳定工具定义顺序。如果输出偏大就在 system prompt 里明确要求简洁输出别用「请详细解释」这类引导长文本的词。想长期做编码和 Agent 任务的话可以了解下 Coding Plan把用量和额度统一管理https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。需要随时验证模型行为、对比不同模型用量时用模型对话页快速试https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 。接入细节和字段说明查文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。Key 管理回到 API Keys 页https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。最后分享一句我踩过坑才明白的话token 账单不是天文数字游戏你塞进什么就付什么钱你重用什么就省什么钱。把input_tokens、output_tokens、cache_creation_input_tokens、cache_read_input_tokens和 thinking 这五个字段记熟每次请求都落一份记录一周之后你对成本的判断会比看任何账单都准。