批量调用后想统计成本,发现响应里没有 usage 字段,日志里也看不到 token 数量。

一开始怀疑是「部分兼容接口本身不返回用量」,查了一圈,方向不对。

原因不止一个,得分开看。调用方式经过封装,返回的已经是纯文本。少数情况下是没有挂载用量回调,信息在中间层被丢弃。

少数情况下是流式模式下用量在最后一个块才出现。

上来先在调用时传入回调收集用量

cb = UsageCallback(); llm.invoke(p, config={'callbacks': [cb]})

随后把累计值写进日志

print(cb.total_tokens)

流式场景在结束后再读取

python -c "print(resp.usage_metadata)"

末了对比接口侧账单做校准

python -c "print(bill_tokens, local_tokens)"

中途换过一次思路,把范围缩到最小的那一层,反而快了。

别只看报错消失,验证要多做一步。每次调用都能拿到输入输出 token 数,累计成本与账单口径接近,成本报表可以使用。

补一句。不同厂商对 token 的计数方式不同,本地估算只能做趋势参考,涉及结算时以接口返回为准。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189