
sub2api v0.2.19 里显式配好的 503 模型级冷却被三层判断挡在执行之前、一次都没跑过,附现场判据与今晚的处置边界;CLIProxyAPI 的 Kimi include 400 给出不用等发版的配置绕法。
POST /v1/responses、stream: true。规则配得很标准:错误码 503、关键词 overloaded、5 分钟、作用范围「模型级」5。{"type":"error","error":{"code":"server_is_overloaded","type":"service_unavailable_error",
"message":"Our servers are currently overloaded. Please try again later.",
"headers":{"retry-after":"328","retry-after-ms":"328000"}}}same_account_retry,retry_delay 全是 8000。accounts.extra.model_rate_limits 没有这条模型的冷却记录。sched:acc:<account_id> 里也没有。account_model_temp_unschedulable。ac1b8f12,并写明没在官方镜像上复核过。openAIStreamFailureStatus 里,容量降载事件单独一支返回 StatusServiceUnavailable。handleOpenAIStreamTerminalAccountSideEffects,switch 只有两个 case:403,和 401, 429, 529。503 落 default: return statusCode, false6。
backend/internal/service/openai_gateway_passthrough.go 第 1645–1678 行。第 1653 行先算出 statusCode,第 1655 行只接 403、第 1660 行接 401/429/529,503 在第 1676 行落 default 直接返回,第 1675 行的账号侧处理一次都不会跑6handleOpenAIAccountUpstreamError 开头就有一段。注释写「容量让渡说的是这一次请求,不是账号健康」,紧接着 isOpenAIRequestScopedCapacityShed 命中就 return false。HandleTempUnschedulable,排在这个返回之后7。
HandleTempUnschedulable:顺序决定了只要认成「容量让渡」,规则永远轮不到7error.code = server_is_overloaded,和流式非流式无关,所以换成非流式接口不会绕过去。
backend/internal/service/gateway_service.go 第 755–770 行。第 761–763 行遇到 RequestScopedTransient 直接返回,后面的 400 / 502 封禁分支走不到。这一层是「重试用尽后的最后兜底」,而它也被同一个判断挡住了8SetModelRateLimit 并打一条 account_model_temp_unschedulable,日志里带账号、模型、到期时刻、规则序号和作用范围9。所以「搜不到这条日志」本身就是判定,不必再猜日志级别。HandleTempUnschedulable 开头有一句:池模式且没启用自定义错误码时直接返回 false10。这条件只对 APIKey 类账号成立,OAuth 号不受它影响——也就是说,这条报障不是「门槛设计如此」,而是「前面的判断把它挡在门槛之外」。openAIRequestScopedRetryDelay 会依次读 Retry-After、Retry-After-Ms,以及 body 里的 error.headers.retry-after。openAIRequestScopedRetryMaxDelay 封顶,那个常量是 8 秒11。328 秒被压成 8000 毫秒,日志里三行一样的数字就是这么来的。maxSameAccountRetries 是 312。一次首试加三次重试,正好四行失败。| 距首次失败 | 同号重试 | 换号首试 |
|---|---|---|
| 10–20 秒 | 34% | 47% |
| 20–40 秒 | 28% | 37% |
| 60–120 秒 | 11% | 26% |
gateway.max_capacity_shed_same_account_retries(0 表示沿用账号设置)和 gateway.max_capacity_shed_attempts(0 表示不限),两者默认 0,也就是维持现行为。output.encrypted_content 发到 Kimi 的 Responses 接口,上游回 400,补丁在流式与非流式两条路上把这个值从 include 里删掉15。output.encrypted_content,Kimi 执行器的两条路径都是先归一化 tools 和 temperature,然后直接把 body 交给 payload 规则16。
internal/runtime/executor/kimi_executor.go 第 466–478 行(非流式路径)。第 471–472 行只归一化 tools 与 temperature,第 475 行直接进 ApplyPayloadConfigWithRequest;流式路径在第 609–613 行是同一形状,两处都没有 include 相关处理16normalizeKimiResponsesIncludes,倒序遍历 include 数组,只删等于 output.encrypted_content 的那几项。\",payload 不是合法 JSON。payload:
override-raw:
- models:
- name: "kimi-*"
params:
include: '["reasoning.encrypted_content"]'include 整个换成一个 Kimi 认识的值。另一种是整条删掉: filter:
- models:
- name: "kimi-*"
params:
- "include"SetRawBytes 写入、filter 用 DeleteBytes 删除17,配置样例在同版本的 payload 注释段18。openai-response,不在注释列出的那五个可选项里19。只写模型通配,规则才会命中。main、v8.0.51 标签和远端 HEAD 指向同一个提交 7cad1cb7。dev 停在 06ec5eac,还是上一期那个合并提交带来的位置。newest_post_at 落在 11 月 2 日 15:08,但那是两条闲聊,不算承诺。signal.active 是 false24。所以别把它读成今晚会有重置。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.anthropic.com
status.cloud.google.com
codex-reset.com
This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.