Claude学院

Claude API Token 怎么计算?附在线估算方法

Claude API 的 Token 由模型自带的分词器(tokenizer)切分文本得到,计费分为输入 Token(你发送的 system、messages、tools 等全部内容)和输出 Token(模型生成的回复)两部分,两者单价不同、分别累加。想在调用前精确知道一段内容是多少 Token,最可靠的方法是调用官方的 POST /v1/messages/count_tokens 接口,而不是用 OpenAI 的 tiktoken 之类工具去估——那对 Claude 会偏差 15% 以上。

Token 到底是什么

Token 是模型处理文本的最小单位,它既不是字也不是词。对中文来说,一个常见汉字大致对应 1 个 Token,但生僻字、标点、表情符号可能拆成多个;对英文,一个 Token 约等于 4 个字符或 0.75 个单词。代码、JSON、非英文字符通常比纯英文更"费" Token。

关键认知:每次 API 请求的输入 Token 不止是你写的那句问话,而是整个请求体里所有会进入上下文的内容——system 提示词、历史多轮对话、工具定义、图片、文档,全部计入输入。这也是多轮对话越聊越贵的原因,具体的上下文管理可以参考 Claude API 多轮对话怎么实现?上下文管理详解

输入和输出分别怎么计费

2026 年当前主力模型 Claude Opus 4.8、Claude Sonnet 4.6、Claude Haiku 4.5 的计费都遵循同一逻辑:

  • 输入 Token:单价较低,按整个请求的 prompt 总量计。
  • 输出 Token:单价显著高于输入(通常是输入的数倍),按模型实际生成的内容计。
  • 缓存命中:开启 Prompt Caching 后,命中缓存的输入部分以极低折扣计价(缓存读取约为基础输入价的 0.1 倍)。

不同模型的具体单价以 Anthropic 官网为准,各模型的横向对比和省钱思路见 Claude API 价格详解:各模型计费方式与省钱对比。要注意一个易踩的坑:不同代际模型的分词器可能不同,同一段文本在不同模型上算出的 Token 数会有差异,所以估算时一定要传你实际要用的那个模型 ID。

在线估算:用 count_tokens 接口

Anthropic 官方提供了一个专门只数 Token、不产生模型生成、不计推理费用的端点:POST /v1/messages/count_tokens。它接收的参数结构和正式调用 /v1/messages 几乎一样,返回里只有一个字段 input_tokens。这是目前最准确的"在线估算"方式。

Python 示例(anthropic 官方 SDK)

先安装 SDK:pip install anthropic,并配置好 ANTHROPIC_API_KEY 环境变量(不清楚怎么拿 Key 见 Claude API Key 怎么获取?2026 最新申请流程)。

from anthropic import Anthropic

client = Anthropic()

resp = client.messages.count_tokens(
    model="claude-opus-4-8",
    system="你是一个简洁的中文技术助手。",
    messages=[
        {"role": "user", "content": "用一句话解释什么是 Token。"},
    ],
)

print("输入 Token 数:", resp.input_tokens)

运行后会打印出这次请求的输入 Token 总数。要估算一整个文件占多少 Token,把文件内容直接塞进 content 即可:

text = open("CLAUDE.md", encoding="utf-8").read()
resp = client.messages.count_tokens(
    model="claude-opus-4-8",
    messages=[{"role": "user", "content": text}],
)
print(resp.input_tokens)

Node.js 示例(@anthropic-ai/sdk)

安装:npm install @anthropic-ai/sdk

import Anthropic from "@anthropic-ai/sdk";

const client = new Anthropic();

const resp = await client.messages.countTokens({
  model: "claude-sonnet-4-6",
  system: "你是一个简洁的中文技术助手。",
  messages: [
    { role: "user", content: "用一句话解释什么是 Token。" },
  ],
});

console.log("输入 Token 数:", resp.input_tokens);

Node 端方法名是驼峰式的 countTokens,返回字段同样是 input_tokens。SDK 的安装与鉴权细节可参考 Anthropic Python SDK 安装与配置完整教程Claude API Node.js 调用示例:从安装到流式输出

预估输出 Token 与总成本

count_tokens 只能数输入,输出 Token 在生成完成前无法预知。实践中有两种办法把握总量:

  1. max_tokens 给输出设上限。它是硬性截断阈值——一旦生成到这个数就停止,所以既能控成本,也要留够余量避免回答被截断。
  2. 调用结束后读取响应里的 usage 对象,它会精确返回本次实际消耗:input_tokensoutput_tokens,以及缓存相关的 cache_creation_input_tokenscache_read_input_tokens
message = client.messages.create(
    model="claude-opus-4-8",
    max_tokens=1024,
    messages=[{"role": "user", "content": "写一首关于秋天的五言绝句。"}],
)
u = message.usage
print(f"输入 {u.input_tokens},输出 {u.output_tokens}")

input_tokens × 输入单价 + output_tokens × 输出单价 相加,就是这次调用的实际花费。如果你的应用复用同一段长 system 提示词,强烈建议开启 Prompt Caching,命中后输入侧成本能降一个数量级,更多技巧见 Claude API 怎么省钱?5 个降低 Token 成本的方法

特殊内容的 Token 占用

内容类型Token 占用说明
图片输入按图片分辨率折算,越大占用越多。count_tokens 同样能算图片,把 image 块放进 messages 即可。多模态调用见对应教程。
工具定义(Tool Use)每个工具的 name、description、input_schema 都计入输入 Token,工具越多、描述越长越费。
文档 / PDF解析后的文本全部计入输入,长文档很容易吃掉大量上下文。
思考(thinking)Opus 4.8 等模型的自适应思考过程按输出 Token 计费,即使在 "omitted" 模式下不返回内容也照常计费。

图片怎么传可看 Claude API 图片输入怎么传?多模态调用教程,工具调用的完整写法见 Claude Tool Use 工具调用怎么用?完整代码实战。如果还没跑通第一个请求,建议先看 Claude API Python 示例代码:10 分钟跑通第一个程序

常见问题

count_tokens 接口会扣费吗?

count_tokens 不触发模型生成,本身不产生输入/输出推理费用,可以放心在调用前频繁用它做预算。但它仍是一次 API 请求,会占用账户的请求频率配额,具体限额以 Anthropic 官网为准。

为什么同一段文本算出来的 Token 数不一样?

因为不同模型可能使用不同的分词器。例如 Opus 4.8 与较旧的 Opus 4.6 分词方式有差异,同样的中文内容算出的 Token 数会不同。所以估算时务必传入你真正要调用的模型 ID,不要拿一个模型的结果套用到另一个模型上。

能不能用 tiktoken 在本地离线估算?

不建议。tiktoken 是 OpenAI 的分词器,对 Claude 会系统性偏低,在代码和中文等内容上误差更大。要离线快速估个量级可以用"中文约 1 字 1 Token、英文约 4 字符 1 Token"做粗算,但凡涉及成本核算、上下文是否超限的判断,请以 count_tokens 的返回为准。

Claude API 开发