问题出现得很突然,日志倒是留得挺全。一次请求带 4 张 1024x1024 的商品图做对比描述,账单显示输入 token 接近 5000,而同样的文字描述只有 600 多 token,客户质疑计费口径。
刚开始盯着「4 张图各带一份 base64 元数据被计入输入」,折腾了半个多小时,排掉了。
这类报错背后常见的原因有几处,逐个排除就行。图片按 512 像素切 tile,每块单独计价。另一种情况是detail 设为 high 会额外加一段固定 token。
不容易想到的是,图片尺寸不是 512 整数倍,边缘 tile 被整块计费。
上来先按官方规则手算一次图片 token
python -c "import math;w=h=1024;print(int(math.ceil(w/512)*math.ceil(h/512)*170+85), 'per image')"
接着把长边压到 768 再请求并对比用量
ffmpeg -i item.png -vf scale=768:-1 item768.png
从响应 usage 里读出实际输入 token
curl -s https://api.openai.com/v1/chat/completions -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" -d @req.json | jq '.usage'
等前面都确认过,再把图片与文字分开计费写进成本报表
python cost_report.py --image 4 --text 600 --out daily.csv
怎么算真的好了,看的是同一批现象。压到 768 后同样 4 张图的输入 token 降到 1600 左右,手算值与 usage 误差在 5% 以内,成本报表能按图与文分开归集。
补一句。图片计费按 tile 加固定基准,不是按文件大小,压分辨率或用 low 细节是唯一可控的降本手段,改提示词没有用。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
