三个团队共用一个模型网关账号,按调用次数平摊月账单。财务核对时发现 A 团队实际 token 占 62% 却只摊到 25%,两边差了 37%。网关只记了请求次数和状态码,没记 usage,缓存命中的请求同样按一次全价调用计入分摊。
一开始怀疑是「重试请求重复计数,但只有成功的才真正计费」,查了一圈,方向不对。
真正麻烦的地方在于,几个原因的现象几乎一样。调用次数和 token 量不成正比,长文本请求被平均掉了。也可能是缓存命中的应用单价不同,却和全价请求混在一起算。
还有一种情况,流式请求没记 usage,只能按字数估算补齐。
上来先把每次请求的 usage 完整落库
python -c "import json;print(json.load(open('usage.json'))['usage'])"
接着按租户汇总 token 而不是请求数
python cost_report.py --group tenant --metric tokens --month 2026-10
随后把缓存读写按各自单价拆开计算
python cost_report.py --split-cache --price-in 0.0025 --price-cache 0.00025
失败与重复请求单独标记不计入分摊
python cost_report.py --exclude-retry --out report.csv
别只看报错消失,验证要多做一步。三个团队的分摊比例与各自 token 占比偏差在 3% 以内,合计金额与账单一致,缓存部分能单独列出一行。
这里还有个坑。分摊粒度决定了结果可信度,按次数最省事也最容易失真;一开始就把 usage 和租户标识一起落库,后期不用重算。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
