这类问题我又碰上了一次。账号里有新人赠送额度,控制台显示剩余 0 之后接口仍然正常返回 200,团队以为还在免费期,跑了两周才发现已经在按量扣费,账单比预期多出三千多,扣费明细里全是超出赠送的部分。

第一反应是「赠送额度只覆盖部分模型,换模型后一直走付费」,验证下来不成立。

这类报错背后常见的原因有几处,逐个排除就行。额度耗尽后自动切到按量计费,接口层不会报错;用量页面按 UTC 结算,与本地时间差八小时,看起来还有余额;没有设预算告警,超支只能月底发现。

上来先确认当前额度与计费方式

curl -s https://api.example.com/v1/usage -H "Authorization: Bearer $KEY" | jq '{free: .free_quota, paid: .paid_usage}'

接着按模型拆开看哪些调用在收费

curl -s https://api.example.com/v1/usage -H "Authorization: Bearer $KEY" | jq '.by_model'

给账号设置预算上限与告警

curl -s -X POST https://api.example.com/v1/budget -H "Authorization: Bearer $KEY" -d '{"limit":500,"alert_at":0.8}' | jq '.status'

末了在代码里读取剩余额度做熔断

python -c "print({'stop_when_free_quota': 0})"

恢复的判定其实很直接。额度耗尽时业务侧能收到告警并按配置降级,账单不再出现意外超出,用量页面的时间口径与本地一致。

补一句。免费额度是营销手段不是保护机制,耗尽后静默转付费是通行做法,预算告警要提前配好而不是等对账。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189