Skip to content

fix(llm): 保留缓存 token 明细并修正跨 Provider 的用量与费用结算 #217

Description

@NanaseInori

问题

当前 Provider 用量结构没有完整保留缓存输入明细,结算时将缓存读取 token 固定为 0。不同协议的输入计数含义不同,因此影响方向也不同:

  • Anthropic 的 input_tokens 不包含缓存读取和缓存创建用量,丢弃这两类字段会低估本地用量和费用。
  • OpenAI Chat/Responses 的输入总数包含缓存命中;丢弃命中细分后,如果配置了更低的缓存读取价格,本地费用会按普通输入价高估。

审查基准:0e15d1d104fe535965cf68df50bca6f106f20d52。这里影响的是针路簿账本和后续预算判断,不会修改供应商账单;未证明已经发生实际超支。

代码与协议依据

Anthropic 自定义 Provider 可通过 Advanced JSON 的 request_body.cache_control 启用缓存;OpenAI 返回缓存命中明细时同样会走上述解析与结算路径。

最小修复范围

在协议解析、统一 Usage、持久记录及金额结算之间保留明确的缓存用量语义。区分普通输入、缓存读取和缓存创建;按各供应商对总输入的定义归一化,避免重复相加。缓存创建的价格或 TTL 差异应明确建模;价格缺失时保留不确定性,不能默认按零费用处理。

复用现有价格快照、预算预留和幂等结算,不重建账务系统。不以这一项修改重试次数、执行权限或供应商实际计费规则。

验收条件

  • 流式和非流式夹具覆盖普通输入、缓存读取、缓存创建以及混合用量,原始字段和归一化结果可核对。
  • Anthropic 输入总量包含相应缓存类别;OpenAI 已含缓存命中的输入总量不被重复累计。
  • 如同时返回缓存创建汇总和细分类别,不重复计数;未知、缺失和实际为零有明确区别。
  • 根据固定价格快照核对结算金额、预留释放和剩余预算;缺少支持类别价格时返回明确状态。
  • 重复终态、重试、数据库重开和 Specialist/主代理结算不重复入账或漏计。
  • 未启用缓存的现有行为保持兼容;文档说明内部估算与供应商账单的边界。

证据边界

本项来自固定提交的源码与官方协议核对,未在本次审查中执行付费请求或新的运行时复现。上述夹具是待实现的验收,不是已通过的测试。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions