OpenAI 兼容 API 503 “no available accounts” 排错
503 “no available accounts” 表示请求到达了中转层,但上游账号池中没有可用账号——状态、模型白名单或速率预算不允许任何账号接这次请求。它与 401、429、504 是不同的失败模式,恢复方式也不同。
这个错误到底意味着什么
中转层返回 HTTP 503 与结构化 JSON 响应体。错误短语 no available accounts 出现在上游日志条目 openai_chat_completions.account_select_failed 的 error 字段。RFC 9110 §15.6.4 规定 503 用于服务端当前无法处理请求的场景——包括反向代理后面的账号池耗尽。
失败发生在选号阶段,尚未真正打到任何上游服务商。/v1/models 仍返回 200,因为模型列表路由根本不需要选号;/v1/chat/completions 返回 503,是因为每个候选账号都没通过预检。
中转层日志的实际样貌
以下两条日志来自 2026-08-08T13:25–13:26+08:00,在 monkeytheme.com 上对 /v1/chat/completions 接口、模型 gpt-5.6-sol 调用时记录:
{"service":"sub2api","env":"production","component":"http","request_id":"05217724-bffa-43c7-9904-8ee9a3545057","path":"/v1/chat/completions","method":"POST","component":"handler.openai_gateway.chat_completions","user_id":1,"api_key_id":53,"group_id":9,"model":"gpt-5.6-sol","stream":true,"error":"no available accounts","excluded_account_count":1}{"service":"sub2api","env":"production","component":"http","request_id":"607353af-0bd0-4a7e-aecd-558db4daf4de","path":"/v1/chat/completions","method":"POST","component":"handler.openai_gateway.chat_completions","user_id":1,"api_key_id":53,"group_id":9,"model":"gpt-5.6-sol","stream":true,"error":"no available accounts","excluded_account_count":0}
excluded_account_count 字段是最关键的信号:
| 计数值 | 含义 |
|---|---|
0 | 根本没尝试切号——选号前账号池就是空的。 |
1 或以上 | 已经走完切换,每个账号都被排除(速率、状态、模型白名单)。 |
当 excluded_account_count 为 0,运维应直接排查账号池健康;当 ≥ 1,应查看本条之前记录的每个账号的具体排除原因。
与 401 / 429 / 504 的差别
| 失败模式 | 发生层 | 客户端第一时间应该做的 |
|---|---|---|
| 401 invalid token | 鉴权层 | 修正 Authorization: Bearer 头 |
| 404 model not found | 路由 / 模型列表 | 拉一次 /v1/models,复制准确 Model ID |
| 429 rate limit | 健康账号命中速率限制 | 按 Retry-After 等待,降低并发,使用有上限的退避 |
| 504 gateway timeout | 上游未在超时前返回 | 单次重试,记录 request_id,持续则升级 |
| 503 no available accounts | 选号层(尚未到上游) | 短暂等待,降低并发;持续则换模型 |
不要把它们笼统当成“接口报错”。每一类都指向不同层,处置方式也不同。
保存一份完整且脱敏的失败证据
curl -sS -D /tmp/headers.txt -o /tmp/body.json \
https://monkeytheme.com/v1/chat/completions \
-H "Authorization: Bearer ***" \
-H "Content-Type: application/json" \
-d '{"model":"你的_MODEL_ID","messages":[{"role":"user","content":"Reply with OK"}],"max_completion_tokens":16}'
sed -n '1,20p' /tmp/headers.txt
python3 -m json.tool /tmp/body.json
记录 HTTP 状态、JSON error 字符串、(如存在的)request_id 响应头、时间戳、接口与脱敏后的请求结构。工单或截图中不要出现 Bearer Token。如果中转层返回 503,运维可以用你的 request_id 匹配到对应的 account_select_failed 日志条目,进而判断是否走完了切换。
no available accounts。上面展示的两条日志是正常流量窗口内,运维侧日志的脱敏片段,不是合成探测。如果你自己的 Key 也看到这个错误,请把真实的 request_id 一并提交,这是最有用的证据。调用方的恢复清单
- 确认 Base URL 是
https://monkeytheme.com/v1,且 Key 以sk-开头。 - 用同 Key 拉一次
/v1/models。返回 200 即可排除 401 与路由问题。 - 把并发至少砍半,等待 10–15 秒后再发起一次探针。
- 用
stream: false发送一条小请求,确保只收到一条 503 响应和一个干净的request_id。 - 如果同一
request_id在 60 秒后仍返回 503,换一个已知健康池的模型(用/v1/models比对)。 - 若错误仅出现在某模型且持续,向支持人员提供时间、模型名、脱敏响应体与
request_id。
与官方 SDK 的交互
OpenAI 官方 Python 与 Node.js SDK 当前默认对符合条件的 429 和连接错误重试两次。它们当前并不会对 no available accounts 这类 503 重试,因为 503 是网关在说“换上游或等待”,不是 SDK 认为“瞬时传输错误”。紧密的应用层重试循环只会把流量打到一个已经空的账号池上。诊断时把 max_retries 临时设为 0,先拿到一条干净的失败,再恢复有上限的重试策略。
本文没有作出的承诺
/v1/models 成功不能证明任一具体模型的生成容量可用。一次 no available accounts 的 503 并不意味着中转层宕机——中转是健康的,是上游账号池耗尽了。如果同一时间大量模型都返回 503 且均为 excluded_account_count: 0,这才是需要运维介入的池级容量信号。
官方资料与相关教程
- RFC 9110 §15.6.4:503 Service Unavailable。
- RFC 6585 §4:HTTP 429 与 Retry-After 语义。
- OpenAI API 错误代码:当前 4xx/5xx 分类与重试建议。
- OpenAI 速率限制与 Retry-After。
- openai-python 重试说明:官方 SDK 重试行为。
- sub2api 上游:本文所围绕的
account_select_failed日志条目来源。
常见问题
“no available accounts” 在 OpenAI 兼容 API 中是什么意思?
表示中转层已经选了 Key 和路由,但当前上游账号池中没有任何账号能够满足模型白名单、状态和速率预算。请求到达了网关,不是 Key 或提示词的问题。
这是 503 还是 401?
MonkeyAI 返回 503 和结构化 JSON。RFC 9110 §15.6.4 规定,当服务端暂时无法处理请求时,无论上游原因如何,都应使用 503。失败模式要读响应体,单看 HTTP 状态不够。
它和 429、504 的区别是什么?
429 表示在健康账号上命中了请求或 Token 速率限制;504 表示上游未在超时前返回;“no available accounts” 表示根本没有账号能接这次请求。失败发生在选号层,尚未真正打到上游。
为什么 /v1/models 还能成功?
模型列表和 Key 信息接口不需要选号。它们只能证明 Key、Base URL 和路由可用,不能证明当前存在能服务目标模型的推理账号。
是否应该立即重试?
不应该。账号池耗尽通常是暂时性的,紧密重试只会加重压力。等待几秒、降低并发后再发一次探针;如果错误持续超过 1 分钟,应更换模型或向运维提供 request_id。
是否能在服务端确认?
可以。中转层会输出 openai_chat_completions.account_select_failed,error 字段为 “no available accounts”。excluded_account_count 是关键信号:0 表示根本没有尝试切号;≥1 表示切换已尝试但全部被排除。
故障在客户端还是在网关?
故障在中转层的账号池。Key、Header、Base URL 均正常——/v1/models 返回 200,/v1/chat/completions 返回 503。应作为临时容量问题处理,而不是配置错误。
相关教程
ChatGPT Plus 5 小时 OAuth 账号池耗尽
OpenAI ChatGPT Plus OAuth 账号池上大多数 503 的具体根因 — 在重试前先看上游 401 和滚动 5 小时窗口。
打开页面