首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >API 账单怎么复算:先把缓存、重试和未知用量分开

API 账单怎么复算:先把缓存、重试和未知用量分开

原创
作者头像
用户9006099
修改于 2026-11-02 13:00:50
修改于 2026-11-02 13:00:50
1150
举报

​我是 NexoToken 的运营者。整理 API 接入与计费说明时,我觉得有件事比“每百万 Token 多少钱”更值得先说清楚:这张账单究竟是在算一次请求,还是一整个任务。

比如让编程工具改一个小功能,界面上只提交了一次需求,后面可能读文件、调用模型、执行工具,再带着工具结果继续请求。用户的一次操作,和账单里的一条模型调用,并不总是一回事。

下面用一组明确的示意数字复算费用。这不是任何平台的现行报价,也不是节省比例实测。

给每个数字写清楚口径

假设某个接口的账单明确把用量拆成三类:

用量类别

数量

假设单价,元 / 百万 Token

未缓存输入

80,000

8

缓存读取输入

320,000

0.8

输出

20,000

40

这组示例没有缓存写入、图片、音频或其他附加费用。费用是:

代码语言:plaintext
复制
未缓存输入: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 示例只在本地运行,不会请求模型:

代码语言: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 删除。

目录
  • 给每个数字写清楚口径
  • 用很短的代码检查算式
  • 重试另外记,未知用量也另外记
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档