
同一类毛病的两处:OpenRouter 的日限恢复时刻写在响应体里、v8.0.51 读不到,Claude 的刷新令牌过期措辞不在终局名单里——于是两边都在按退避阶梯一直重试。
Retry-After 响应头。1error.metadata.headers["X-RateLimit-Reset"] 里,单位是毫秒,作者的样例值是 1793404800000。这条样本是作者贴出的生产返回,本刊没有复现。openAICompatRetryAfter 只有两条路:读响应头 Retry-After,以及 TPM 超限时的 1 分钟兜底。两条都不命中,函数返回空。
internal/runtime/executor/openai_compat_executor.go 第 1187–1274 行,判定函数在第 1255–1271 行,TPM 的 1 分钟兜底在第 1208 行。free-models-per-day。models 白名单里摘掉,其余模型不受影响。二是按补丁自己改。X-RateLimit-Reset,要求剩余额度为 0 或缺失、时刻在未来、且距今不超过 7 天。命中就用它,否则仍走原来两路。响应头 Retry-After 优先。
openAICompatBodyRateLimitReset,fork 分支 internal/runtime/executor/openai_compat_executor.go 第 1276–1307 行,7 天上限在第 1278 行。refresh_token_reused、refresh_token_expired、refresh_token_invalidated、token_revoked、invalid_client。refresh token expired 这个说法不在里面。
sdk/cliproxy/auth/conductor_cooldown.go 第 2324–2365 行,五个子串在第 2325–2339 行,第 2360 行的 invalid_grant 兜底只对 provider 为 codex 的凭证生效。
sdk/cliproxy/auth/conductor_refresh.go 第 1470–1500 行,invalid grant (retrying) 在第 1484–1489 行与 NextRefreshAfter 同段写入。status 是 error,unavailable 是 true,status_message 是 invalid grant (retrying)。requires_sign_in 为 false,renewal_state 是 retry_scheduled。面板认为「还会再试」,不认为这张凭证已经废了。exp 之前。requires_sign_in 置真、next_refresh_after 清零不再排下次,status_message 变成 unauthorized (refresh token invalid)。| 补丁 | 改了什么 | 规模 | 状态 |
|---|---|---|---|
| #7190 | 429 响应体里补读重置时刻 | 2 文件 +77/−0 | open、mergeable clean、1 提交1 |
| #7191 | 终局名单补一个措辞 | 2 文件 +46/−0 | open、mergeable clean、1 提交3 |
free-models-per-day。Claude 那边看面板,出现 invalid grant (retrying) 且 requires_sign_in 为 false。invalid grant (retrying) 当成「过一会儿会好」。github.com
github.com
github.com
This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.