模型与价格
所有模型的每类 token 都按官方标价五折计费:输入、输出、缓存读取和缓存写入。了解每次调用的扣费算法,并查询模型列表与价格。
计价规则一句话就能说清:所有模型、每一个 token,都按官方标价的一半收费。未缓存输入、输出(含思考和推理)、缓存读取、缓存写入,一律五折。
价格以美元计,单位是每百万 token。每次调用按模型自己在响应里报告的 token 数计费,调用结束几秒内从预付余额中扣除。
逐类 token 五折#
以 claude-sonnet-5.5 为例,每百万 token:
| token 类型 | 官方标价 | 你支付 |
|---|---|---|
| 未缓存输入 | $2.00 | $1.00 |
| 输出 | $10.00 | $5.00 |
| 缓存读取 | $0.10 | $0.05 |
| 缓存写入 | $2.50 | $1.25 |
同样的 ×0.50 系数适用于所有 Claude、GPT 和 Gemini 模型,不论哪个渠道分组、哪种 API 格式。当前模型见本页底部的实时价格表。
计费公式#
一次调用的用量分为四类 token,各有单价。它们在各 API 中的字段如下:
| token 类型 | Anthropic usage | OpenAI usage | Gemini usage |
|---|---|---|---|
| 未缓存输入 | input_tokens | prompt_tokens 减去 cached_tokens | promptTokenCount 减去 cachedContentTokenCount |
| 缓存读取 | cache_read_input_tokens | prompt_tokens_details.cached_tokens | cachedContentTokenCount |
| 缓存写入 | cache_creation_input_tokens | 不报告 | 不报告 |
| 输出 | output_tokens(含思考) | completion_tokens(含推理) | candidatesTokenCount + thoughtsTokenCount |
合起来是:
charge = ( uncached_input × input_price
+ cache_read × cache_read_price
+ cache_write × cache_write_price
+ output × output_price ) ÷ 1,000,000 × multiplier公式里的单价是模型的官方标价,倍率(multiplier)取自实际响应的渠道分组,该分组会写在响应头 x-halfoff-group 中。三个分组的倍率都是 ×0.50,五折就是这么来的。每笔扣费向上取整到 $0.000001。
GPT 和 Gemini 模型不报告缓存写入,所以对它们而言公式里只有三项。
算一笔账#
在 claude-sonnet-5.5 上进行一段很长的编程对话,其中一轮的大部分历史都命中了缓存:
| token 类型 | token 数 | 你支付(每百万) | 费用 |
|---|---|---|---|
| 未缓存输入 | 3,000 | $1.00 | $0.003000 |
| 缓存读取 | 50,000 | $0.05 | $0.002500 |
| 缓存写入 | 1,500 | $1.25 | $0.001875 |
| 输出 | 1,200 | $5.00 | $0.006000 |
| 合计 | $0.013375 |
如果这 54,500 个输入 token 一个都没命中缓存,光输入部分就要 $0.054500,而不是 $0.007375。缓存和五折可以叠加,提高命中率的方法见提示缓存。
查询模型和价格#
GET /v1/models 返回你当前能调用的所有模型,包括上下文长度、你的价格(官方标价的一半),以及为其提供服务的分组。它不需要密钥,OpenAI 和 Anthropic 的 SDK 都可以用 client.models.list() 读取。
curl https://halfoff.dev/v1/models节选的响应:
{
"object": "list",
"data": [
{
"id": "gemini-3.1-pro",
"object": "model",
"type": "model",
"display_name": "Gemini 3.1 Pro",
"created": 1700000000,
"created_at": "2025-01-01T00:00:00Z",
"owned_by": "Google",
"context_length": 1048576,
"pricing": {
"input": 1,
"output": 6,
"cache_read": 0.1,
"cache_write": 0.1875,
"unit": "USD per 1M tokens"
},
"groups": ["gemini-value"]
},
{
"id": "claude-sonnet-5.5",
"object": "model",
"type": "model",
"display_name": "Claude Sonnet 5.5",
"created": 1700000000,
"created_at": "2025-01-01T00:00:00Z",
"owned_by": "Anthropic",
"context_length": 1000000,
"pricing": {
"input": 1,
"output": 5,
"cache_read": 0.05,
"cache_write": 1.25,
"unit": "USD per 1M tokens"
},
"groups": ["claude-value"]
}
],
"has_more": false,
"first_id": "claude-fable-5.1",
"last_id": "gpt-5.6-luna"
}| 字段 | 含义 |
|---|---|
id | 请求时使用的 ID。其他写法也能解析,见模型 ID。 |
owned_by | 厂商:Anthropic、OpenAI 或 Google。 |
context_length | 最大上下文窗口,单位 token。 |
pricing.input | 未缓存输入 token 的单价。 |
pricing.output | 输出 token 的单价,含思考和推理 token。 |
pricing.cache_read | 从提示缓存读取的输入 token 的单价。 |
pricing.cache_write | 写入缓存的输入 token 的单价。null 表示缓存写入按普通输入计费。 |
pricing.unit | 固定为 USD per 1M tokens。 |
groups | 为该模型提供服务的渠道分组。 |
created、created_at | 固定占位值,用于兼容 SDK。 |
pricing 中的数字已经是你的实际单价:官方标价 × ×0.50。GET /v1beta/models 以 Gemini 的格式返回同样的模型,不含价格。
不收费的情况#
- 在到达模型之前就被拒绝的请求:密钥无效、模型不在允许范围、余额不足、触发限流、JSON 格式错误。
- 在所有渠道上都失败的请求,以及失败后改由其他渠道重试的那几次尝试。只有最终给出响应的那次尝试计费。
POST /v1/messages/count_tokens和 Gemini 的:countTokens。- 查询模型列表。
取消或中断的流#
提前关闭流时,只按截至那一刻已生成的内容计费,同样是五折单价。输入按流中已报告的数量计;若未报告,按你的请求约每四个字符一个 token 估算。输出取「已报告的数量」与「已发送给你的文本约每四个字符一个 token」两者中的较大值。
模型长时间无响应、被网关切断的流,计费方式相同:按你实际收到的内容计费。见流式输出。
在哪里查看扣费#
日志列出每次调用的 token 数和费用。模型广场显示每个模型在各分组下已乘倍率的价格,以及实时可用状态。余额与充值见账单,用量报表见用量。
实时价格表#
下表实时读取 GET /v1/models,显示的是你在每百万 token 上的实际单价,即官方标价的一半。
| 模型 | 上下文 | 输入 | 输出 | 缓存读取 | 缓存写入 |
|---|---|---|---|---|---|
实时数据来自 GET /v1/models · 每百万 token 美元价格