API 缓存怎么计费?缓存读取、写入与账单核对
提示词缓存会复用相同输入前缀的计算结果。费用需要区分普通输入、缓存读取、缓存写入与输出。不同模型、协议、分组的价格和 usage 字段可能不同,不能把“有缓存”直接理解为免费,也不能把相同的 Token 重复计费。
资料核对:。数字为演算示例;实际报价见星桥模型价格页,模型厂商规则见文末来源。
普通输入、缓存读取与写入有什么区别?
| 类别 | 含义 | 核对重点 |
|---|---|---|
| 普通输入 | 本次按普通输入规则处理的内容。 | 是否已扣除采用其他费率的缓存部分。 |
| 缓存读取 | 复用已经保存且仍有效的输入前缀。 | 实际命中量,而不是本次发送的全部输入。 |
| 缓存写入 | 建立后续可复用的缓存。 | 是否单独计价,以及相应保留时间。 |
| 输出 | 本次生成的内容。 | 输出单价及模型可能包含的其他用量类别。 |
输入总量是否包含缓存部分,要以协议字段定义为准。有的字段是总数、有的字段是互斥的独立类别。仅凭字段名包含 input 或 cache,不能确定可以相加还是需要先相减。
如何避免把缓存 Token 算两遍?
先把原始 usage 转换成互不重叠的计费类别,再乘单价。只有在确认“输入总量包含缓存读取、且本例没有缓存写入”时,才能使用下面的减法。
假设一次请求的输入总量为 20,000,其中缓存读取 15,000,输出 2,000。假设普通输入、缓存读取、输出单价分别为每百万 2 元、0.2 元、8 元:
普通输入 = 20,000 - 15,000 = 5,000 Token
输入费用 = 5,000 / 1,000,000 × 2 = 0.010 元
读取费用 = 15,000 / 1,000,000 × 0.2 = 0.003 元
输出费用 = 2,000 / 1,000,000 × 8 = 0.016 元
合计 = 0.029 元
如果先用 20,000 乘普通输入单价,再加缓存读取费用,就把同一部分输入算了两次。反过来,如果某协议的 input 已经排除了缓存,再减一次也会算错。有写入用量时,要先确认它是否已经包含在总输入中,再独立分配费用。
缓存写入为什么可能比普通输入贵?
模型可能对建立缓存和延长保留时间采用不同单价。读取优惠、写入价格和有效期需要一起比较。OpenAI 官方文档也按模型区分缓存行为,并说明采用缓存写入费率的输入不应再叠加普通输入费用;不能把某一代模型的规则套到所有模型。
价格表中的“1 小时缓存写入”等项目是特定规则,不代表所有提供商都使用相同有效期。如果客户端发送了上游不支持的缓存参数,可能报错、忽略或按其他规则处理,需要核对实际请求、返回 usage 和控制台记录。
为什么发了同样的问题仍然没有缓存命中?
- 系统指令、工具定义或历史消息发生变化,公共前缀不再一致。
- 请求长度未满足该模型的缓存条件,或缓存已经失效。
- 实际路由或模型发生变化,目标服务没有同一份缓存。
- 客户端重排、压缩了历史上下文,或使用了不同缓存设置。
先固定模型、分组、工具和输入前缀,用小规模测试核对命中量。不要为了追求缓存命中反复发送长请求;建立缓存本身也可能产生费用。
怎样核对中转 API 的缓存账单?
- 保存测试时间、模型 ID、密钥分组和本次适用的价格,隐藏密钥。
- 记录普通输入、缓存读取、写入、保留时间和输出的原始用量;流式请求要看结束时的用量。
- 确认字段是否重叠,把用量换成互斥类别,再使用同一币种和单位计算。
- 与控制台本次实际结算比较,有差异时提供请求标识和脱敏后的 usage。
常见问题
没有标缓存价格,是不是不收费?
不能单凭未标价判断免费。需要确认平台当前规则、该模型是否支持缓存、是否产生缓存用量及实际结算。也不能用其他模型的缓存单价替代本次报价。
同一个模型换分组,缓存价格会一样吗?
不一定。分组可能关联不同渠道和计费规则。应使用当前密钥实际分组的最终售价核算,不能只看统一基价或另一个分组的价格。
参考来源
OpenAI 官方:Prompt caching、模型差异与缓存计费。更多费用比较见倍率与实际成本换算;字段与客户端说明见星桥接入文档。
星桥