
sub2api v0.2.17 把上游 5xx 的换号只开给 API Key 类型的账号,OAuth 号会直接收到本地改写的 502;同一张单里那条没生效的自定义规则,卡在账号开关、状态码逐字相等与流内路径三道门上。
unexpected status 502 Bad Gateway: Upstream service temporarily unavailable。/v1/responses 流里的 response.failed,在到达规则匹配器之前就被截住。Upstream service temporarily unavailable。2
backend/internal/service/openai_gateway_passthrough.go 第 847–862 行:401 与 403 各换一句文案,其余 ≥500 一律落到第 858–859 行那句 Upstream service temporarily unavailable;写给客户端的状态码是 502,不跟随上游。shouldFailoverOpenAIPassthroughResponse 是透传侧唯一的换号判定。4if account == nil || account.Type != AccountTypeAPIKey { return false }。6
handleErrorResponsePassthrough:账号状态照常更新,然后把那个 502 写给客户端,这一份请求不再换号。3[401, 403, 429, 502, 503],5xx 就进了「先同账号重试、用尽再切号」那条路:同账号最多 3 次,间隔 500ms、1s、2s。11gateway.max_account_switches 管着,默认 10。12temp_unschedulable_enabled 不为 true,规则整段不参与匹配。13if rule.ErrorCode != statusCode || len(rule.Keywords) == 0 { continue },关键词在它之后才去 body 的前 64 KiB 里找。1415
backend/internal/service/ratelimit_service.go 第 2686–2700 行:第 2693 行要求 rule.ErrorCode 与传进来的状态码完全相等,不等就跳过;关键词匹配只对前 64 KiB 的 body 做。response.failed 或 error 帧的状态先由 openAIStreamFailureStatus 算。401/403/429/529 原样返回,其余一律归 502。server is overloaded、servers are overloaded、servers are currently overloaded 三句之一,它才被保留。1617handleOpenAIStreamTerminalAccountSideEffects,switch 里只有 403 与 401/429/529 两档,default 直接 return statusCode, false。18
handleOpenAIAccountUpstreamError 的地方;第 1661–1662 行的 default 让其余状态码原地返回。规则匹配器就挂在那条被跳过的路上。stream_failed,属流内路径,改规则这一侧就到此为止。scope: account。22account_wide 的 PR #7545 今天 10:20 由作者自己关了。他的原话是 0.2.16–0.2.17 已经用 scope(account/model)加三态选择器实现了同一件事。他说:「这个 PR 已经过时」。23AccountWide 是零命中,那个键在这个版本里并不存在。inlineLocalRefsForClean,注释写明「清洗器后面会删掉 $defs 与 definitions,所以每条路由都必须在这里展开引用」。25$defs 与 definitions 整段会被删掉,28 于是 See: Value 指向的那个定义,在发出去的体里已经不存在。模型拿到的是一个空对象,加一句找不到出处的提示。d946c4fb、Go 1.26.10、macOS arm64)上,缩小复现都还在。3132{"user":"v"} 配一个 {"type":"object","properties":{}} 的声明,两个 cleanup 入口都回 {},ClaudeToolIsParameterless 对它仍返回 true。32oauthSessionTTL 超时;写盘卡住,会话到点就自己结束。37| 处境 | 今天做什么 | 依据 |
|---|---|---|
| 用 OAuth 号跑多账号,指望上游 5xx 自动换号 | 默认按原样回 502。池模式下把 502/503 写进「同账号重试状态码」,先接受同账号重试三次 | passthrough.go |
| 自定义规则写了 503 却不生效 | 先看日志的「上游状态码」:是 502 就把规则改成 502;是 stream_failed 就改不动 | ratelimit_service.go |
| 规则命中了,账号却还在被选 | 规则粒度默认模型级;要整号停调,把 scope 选成账号级 | account.go |
还在等 #7545 的 account_wide | 作者已关单,直接用 scope | #7545 |
| 工具用递归 schema,走 Gemini、Vertex、Antigravity | 现在的降级会给一句指向已删定义的提示;等 #6900 或自己打补丁 | #6900 |
| 想在面板里点按钮做 Codex 设备码登录 | v8.0.40 没有这个接口;等 #6715 合入 | #6715 |
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
status.openai.com
status.claude.com
status.cloud.google.com
codex-reset.com
opentherank.com
This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.