这个坑值得记一笔。月中所有请求突然全部 429,错误码 billing_hard_limit_reached,账户余额还有几百美元,控制台的月度预算被同事设成了 200 美元,实际已用 198。

刚开始盯着「预算按自然月重置,跨月之前会一直拒绝」,折腾了半个多小时,排掉了。

这类报错背后常见的原因有几处,逐个排除就行。组织设了 hard limit,达到阈值后直接拒请求而不只是发告警;项目级预算也有限额,两层同时存在时取更严格的那个;预付费额度耗尽后不会自动转后付,需要手动充值。

取错误体确认限制的具体类型

curl -s https://api.openai.com/v1/chat/completions -H "Authorization: Bearer $OPENAI_API_KEY" -H "Content-Type: application/json" -d '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"hi"}]}' | jq '.error.code,.error.message'

拉本月累计消费核对阈值

curl -s "https://api.openai.com/v1/organization/costs?start_time=$(date -d '-30 day' +%s)" -H "Authorization: Bearer $ADMIN_KEY" | jq '[.data[].results[].amount.value]|add'

随后列出项目状态排除被停用的项目

curl -s https://api.openai.com/v1/organization/projects -H "Authorization: Bearer $ADMIN_KEY" | jq '.data[]|{id,status}'

调整限额后用状态码快速验证是否恢复

curl -s -o /dev/null -w '%{http_code}\n' https://api.openai.com/v1/chat/completions -H "Authorization: Bearer $OPENAI_API_KEY" -H "Content-Type: application/json" -d '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"hi"}]}'

别只看报错消失,验证要多做一步。请求状态码回到 200,错误体里不再出现 billing_hard_limit_reached,控制台的用量进度条落回阈值以下,次日定时任务正常跑完。

提醒一点。hard limit 和余额是两套机制,余额充足也会被预算卡死,出现这个错误码时先看预算设置,别急着往账户里充钱。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189