先把当时的情况摆出来。绑定的卡扣款失败,组织状态变成 past_due,但接口没有立刻拒绝,仍然返回 200 正常出结果,三天后补缴时账单比冻结那一刻多了 800 美元。

这类报错背后常见的原因有几处,逐个排除就行。冻结只拦新建资源,不拦已经能跑的推理请求。也可能是宽限期内请求照常放行,账单继续累计。

还有一种情况,多个 key 里有一个走了另一条后付费通道。另外,缓存命中被当成免费,实际输出 token 照扣。

先确认订阅处于哪个状态

curl -s https://api.openai.com/v1/organization/subscription -H "Authorization: Bearer $ADMIN_KEY" | jq '{status:.status, grace:.grace_period_end}'

随后看用量曲线在冻结后是否还在涨

curl -s 'https://api.openai.com/v1/organization/usage/completions?start_time=1730000000&bucket_width=1h' -H "Authorization: Bearer $ADMIN_KEY" | jq -r '.data[].results[] | [.start_time,.num_model_requests] | @tsv' | tail -24

给每个项目加硬上限把损失截住

curl -X POST https://api.openai.com/v1/organization/projects/proj_a/rate_limits -H "Authorization: Bearer $ADMIN_KEY" -d '{"max_tokens_per_month":10000}'

剩下的就是用请求验证现在是否已被拦

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

恢复的判定其实很直接。请求开始返回 429 billing_hard_limit_reached,用量曲线在冻结时间点后走平,补缴金额与冻结时看到的欠款一致。

这里还有个坑。冻结不等于停服,宽限期里计费一直在走,卡扣款失败当天就该挂硬上限,别等对账时才发现多出来的那几天。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189