把本地 Ollama 当 OpenAI 兼容服务用,响应里 usage 全是 0,按 token 统计的成本报表完全失真,prompt_eval_count 字段在原生接口里却有值。

真正麻烦的地方在于,几个原因的现象几乎一样。兼容层不返回 usage 字段;原生接口的计数字段名与 OpenAI 不同;流式响应默认不带统计信息;多个模型共用一个服务,统计无法按模型拆分。

原生接口看两个计数字段是否返回

curl -s http://127.0.0.1:11434/api/chat -d '{"model":"qwen2.5:7b","messages":[{"role":"user","content":"hi"}],"stream":false}'

服务端开启统计并确认字段名

python -c "print({'prompt_eval_count':128,'eval_count':64})"

客户端自己按 tokenizer 估算并落盘

python -c "import tiktoken;e=tiktoken.get_encoding('cl100k_base');print(len(e.encode('hi')))"

末了按模型维度汇总请求数与估算 token

python report.py --group-by model --in local_calls.jsonl

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

中间停过一次,把已经改的东西回滚干净,再重新来一遍。

恢复的判定其实很直接。报表能按模型看到请求量与估算 token,原生接口的计数字段与估算值相差在一成以内。

提醒一点。本地推理的成本主要看卡时而不是 token,统计口径要提前定好,否则两套数字永远对不上。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189