脚本返回 402,提示 Insufficient Balance,控制台显示已充值但调用依旧失败,本地还缓存着上一次的错误响应,看起来像充值没到账。

一开始怀疑是「客户端把失败响应缓存住,重放时看到的还是旧错误」,查了一圈,方向不对。

这类报错背后常见的原因有几处,逐个排除就行。余额为 0 时返回 402 而不是 429。也可能是充值到账与接口额度刷新之间有延迟。

不容易想到的是,项目下多个 key 分属不同账户,充错了对象。

上来先查余额接口确认到账状态

curl https://api.deepseek.com/user/balance -H "Authorization: Bearer $DEEPSEEK_API_KEY"

再往下用最小请求验证额度是否恢复

curl https://api.deepseek.com/chat/completions -H "Content-Type: application/json" -H "Authorization: Bearer $DEEPSEEK_API_KEY" -d '{"model":"deepseek-chat","messages":[{"role":"user","content":"hi"}]}'

接着清掉本地失败缓存再重跑任务

python -c "import shutil;shutil.rmtree('.cache/llm', ignore_errors=True)"

等前面都确认过,再把 402 单独告警,别和限流混在一起

if code == 402: alert('balance')

恢复的判定其实很直接。余额接口返回正数且可用,对话请求返回 200,任务能继续跑下去,告警也自动恢复。

提醒一点。402 只表示账户余额问题,和密钥失效、模型下线无关,看到这个码不用去排查参数,先去账单页确认扣费主体是否一致。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189