一次请求的钱怎么算
计费只有两个乘数:输入 token 和输出 token,单位都是每百万 token 的美元价。定价页给的是 model_ratio,输入价 = model_ratio × 2 × 分组倍率,输出价 = 输入价 × completion_ratio。
claude-sonnet-5 的 model_ratio 是 1.5,completion_ratio 是 5。倍率 1 时输入 3 美元、输出 15 美元每百万 token。放进 Claude Max 分组(倍率 0.85),实付是输入 2.55 美元、输出 12.75 美元。同一条请求换个分组就是另一个价格,模型页和定价页都会标出可用分组。
常用型号可以先列成一张表,单位是美元每百万 token:
| 模型 | 分组 | 输入 | 输出 |
|---|---|---|---|
| claude-sonnet-5 | Claude Max(0.85) | 2.55 | 12.75 |
| claude-opus-5 | Claude Max(0.85) | 4.25 | 21.25 |
| glm-5.3-flash | 稳定国模(0.2) | 0.16 | 0.56 |
| gemini-3.8-flash | Gemini Antigravity(0.65) | 0.975 | 4.875 |
表里输入价最高和最低差了二十多倍,选型的第一步就是判断这个差距能不能用效果补回来。
用 usage 字段对账
账本在响应的 usage 里,不在你的字符数估算里。prompt_tokens 包含系统提示、历史消息、工具定义;completion_tokens 是模型写出来的部分。流式请求的用量在收尾的数据块里,有些实现要显式传 stream_options 才会带 usage。
下面这段把每次调用的花费算成美元,价格表按分组填:
PRICES = {
"claude-sonnet-5": {"in": 2.55, "out": 12.75}, # Claude Max 分组
"glm-5.3-flash": {"in": 0.16, "out": 0.56}, # 稳定国模分组
"gemini-3.8-flash": {"in": 0.975, "out": 4.875}, # Gemini Antigravity 分组
}
def cost(model: str, usage: dict) -> float:
p = PRICES[model]
return (
usage["prompt_tokens"] * p["in"]
+ usage["completion_tokens"] * p["out"]
) / 1_000_000
# 一次 claude-sonnet-5 调用:8000 输入 + 1200 输出
print(round(cost("claude-sonnet-5", {"prompt_tokens": 8000, "completion_tokens": 1200}), 6))
# 0.0357八千输入加一千二输出是 0.0357 美元。一天一千次同样的调用,账单 35.7 美元。
输入侧:先删再省
输入单价低,但量最大。三个动作最有效:
- 历史只带最近 N 轮,早期内容压成一句摘要。
- 工具定义只挂当前任务用得到的,二十个函数的 schema 经常比用户问题还长。
- 固定内容放最前面且不加时间戳,前缀稳定才能吃到缓存。
以 glm-5.3-flash 为例,稳定国模分组输入 0.16 美元每百万 token。一次塞 5 万 token 的文档是 0.008 美元,一天 2000 次就是 16 美元;把文档裁到 3000 token,同样的调用量降到 0.96 美元。
输出侧:把长度写死
max_tokens 是预算开关,不是建议值。不设它,模型会在该停的地方继续写。
- 要数据就让它输出 JSON,字段化能砍掉大半解释性文字。
- 分类、抽取这类批量任务交给便宜模型,贵的模型只处理疑难样本。
- 长文先要提纲,确认结构再展开,比整篇重写便宜。
- 把"请详细说明"换成"给出三条,每条不超过 20 字",输出能少一半。
- 输出价普遍是输入价的几倍。claude-opus-5 的
completion_ratio是 5,同样一百万 token,输出比输入贵五倍。
按业务算单位成本
总成本除以业务量,才知道贵不贵。一封客服邮件平均 1200 输入、400 输出:用 glm-5.3-flash 是 0.0004 美元,用 claude-sonnet-5(Claude Max 分组)是 0.0082 美元。一天一万封,前者 4 美元,后者 82 美元。
算出单位成本,再决定哪些环节必须用贵模型。分类、打标签、抽取字段这类任务,便宜型号的准确率通常够用;需要长链条推理的环节才值得上高价型号。预算按月倒推:日预算除以单次成本,就是每天能跑的次数,超过这个数就得排队、降级或者换模型。
把成本做成一个数
给请求封装加一层:每次调用记一条日志,字段包括模型、分组、prompt_tokens、completion_tokens 和算出来的 cost。跑一周,成本会集中在少数几个调用点上,优化那几处就够。
价格表从 定价页 抄,别写死在业务代码里;模型清单见 模型总览,claude-sonnet-5 的上下文长度和输出上限见 模型页,更多核算思路在 文章列表。
把 cost() 挂进请求封装,超过日预算直接抛异常。等到月底对账,钱已经花完了。