批量调用后想统计成本,发现响应里没有 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 的计数方式不同,本地估算只能做趋势参考,涉及结算时以接口返回为准。报错文案容易误导,真正的原因往往在相邻那一层的日志里。