我是 NexoToken 的运营者。整理 API 接入与计费说明时,我觉得有件事比“每百万 Token 多少钱”更值得先说清楚:这张账单究竟是在算一次请求,还是一整个任务。
比如让编程工具改一个小功能,界面上只提交了一次需求,后面可能读文件、调用模型、执行工具,再带着工具结果继续请求。用户的一次操作,和账单里的一条模型调用,并不总是一回事。
下面用一组明确的示意数字复算费用。这不是任何平台的现行报价,也不是节省比例实测。
假设某个接口的账单明确把用量拆成三类:
用量类别 | 数量 | 假设单价,元 / 百万 Token |
|---|---|---|
未缓存输入 | 80,000 | 8 |
缓存读取输入 | 320,000 | 0.8 |
输出 | 20,000 | 40 |
这组示例没有缓存写入、图片、音频或其他附加费用。费用是:
未缓存输入:80,000 ÷ 1,000,000 × 8 = 0.64 元
缓存读取:320,000 ÷ 1,000,000 × 0.8 = 0.256 元
输出:20,000 ÷ 1,000,000 × 40 = 0.8 元
合计:1.696 元这里最容易出错的是把“总输入”再算一遍。如果接口返回的输入总量已经包含缓存命中的部分,就不能先对总输入收一次普通输入费用,再把缓存费用直接叠上去。
但各接口的字段定义不一定一样。处理账单前,要核对缓存是包含在输入总量里,还是独立给出的类别;缓存写入是否另计;单价的币种与单位是什么。先按文档归一到互不重复的费用项,再加总。
金额复算可以用十进制数,避免二进制浮点在小数运算里带来的表示误差。下面的 Python 示例只在本地运行,不会请求模型:
from decimal import Decimal
million = Decimal("1000000")
items = {
"uncached_input": (80000, "8"),
"cache_read": (320000, "0.8"),
"output": (20000, "40"),
}
total = Decimal("0")
for name, (tokens, price) in items.items():
cost = Decimal(tokens) / million * Decimal(price)
total += cost
print(f"{name}: {cost}")
print(f"total: {total}") # 1.696正式对账还要遵守服务方公布的舍入规则:是每条请求舍入,还是汇总后舍入;展示金额的小数位和结算金额是否相同。不要拿页面四舍五入后的几行数字,直接反推服务端一定算错。
如果一次任务发了三条请求,就先保留三条请求明细,再按任务 ID 汇总。重试次数也应该能对上对应的尝试记录,不能只在任务旁边写一个“重试过”。
尤其是流式回答中途断开:客户端可能没收到最终 usage,但已经收到部分输出。这时 usage 缺失表示“客户端暂时不知道”,不应直接补成 0,也不能据此断言一定收了费。要结合服务端可查到的请求记录和实际账单确认。
我会把这种情况保留为“待核对”,而不是混进已经复算成功的记录。缺少用量、计价规则不明、金额对不上,是三种不同的问题,后续补材料的方式也不一样。
如果你只想判断一个任务花得值不值,最终可以看“完成这件事的总费用”;但要查清为什么多花了钱,仍然需要回到每次请求的输入、缓存、输出、重试和结果状态。把这两层记录连起来,才知道该优化的是提示词、缓存、客户端重试,还是任务本身的步骤。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。