事情本身不复杂,线索都在日志里。自建计费脚本按 prompt_tokens 乘单价,没区分 cached_tokens,实际账单比自算低 25%,财务对账对不上。
第一反应是「日志只存了总量,没存 usage 的明细结构」,验证下来不成立。
这类报错背后常见的原因有几处,逐个排除就行。cached_tokens 是 prompt_tokens 的子集,混在一起就重复计价。还有一种是缓存部分单价是标准价的十分之一,不能同价。
另外,不同模型折扣不同,脚本用了统一单价。
动手时先把 usage 明细完整落库
python -c "from openai import OpenAI;r=OpenAI().chat.completions.create(model='gpt-4o-mini',messages=[{'role':'user','content':'hi'}]);print(r.usage.model_dump())"
随后按缓存与未缓存分开计价
python -c "print(round(0.15/1e6*1800+2.5/1e6*200,6))"
再往下按模型维度汇总再与账单比
python -c "import pandas as pd;print(pd.read_csv('usage.csv').groupby('model').cost.sum())"
取账单接口做日对账
curl -s "https://api.openai.com/v1/organization/costs?start_time=1730000000" -H "Authorization: Bearer $OPENAI_API_KEY" | jq '.data[].results[] | .amount.value'
怎么算真的好了,看的是同一批现象。日对账差额在 1% 以内,日志里 cached_tokens 与 prompt_tokens 都有值,模型维度的小计与账单分项一致。
这里还有个坑。缓存折扣只影响输入侧且按分钟级失效,月中突然对不上往往是命中率变了而不是单价变了。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
