2.6 KiB
2.6 KiB
R2.2.20 任务报告
目标
快速缓解客户错误 #17440(request ID e5c08dde-9e60-4a14-9458-5574cec00b65),只使用 YAML-first 通用临时不可调度模板和受控 runtime CRUD,不修改 Sub2API 源码、账号容量、优先级、代理或凭据。
根因证据
- 原生 trace 显示请求先由账号 27(
https://sub.yjxm1221.top plus 0.025)返回 400,精确短语Input must be a list已命中既有 400 规则并触发第一次 failover。 - 第二跳账号 31(
https://sub2.pokexiao.com plus 0.03)等待约 60.6 秒后返回 504;响应 detail 仍为Input must be a list。 - 第二次 failover 已进入,但选号时客户 context 已取消,最终
reason=failover-attempted-no-candidate。因此客户可见 504 的直接原因是第二跳耗尽请求时间窗,而不是首跳 400 未切号。 - 账号 31 在此前 30 分钟有 75 次尝试、8 次失败、失败率 10.67%,该窗口唯一客户错误就是本请求;2 小时窗口质量仍为 B,故不据单次事件调整长期容量或优先级。
配置调优
owning YAML:config/platform-infra/sub2api-codex-pool.yaml。
在通用模板 codex-upstream-failover 的精确 504 规则中加入关键词 input must be a list,冷却时间保持 1 分钟。该规则只匹配实际 504 与稳定短语,不泛化到其他 4xx/5xx,也不涉及 auth 错误。
通过显式 selector 19,27,28,29,30,31,32,33,34 对 9 个非 lyon9801 OpenAI 账号执行:
- 批量 dry-run:selected=9、changed=9、failed=0。
- 批量 confirm:selected=9、succeeded=9、failed=0。
- 回读账号 31 和 27:504 规则均包含
input must be a list,模板匹配正常。 - 回读
lyon9801:临时不可调度仍为 disabled、0 条规则,例外未被改变。
下发后观察
下发后的近期 10 分钟原生 Ops 窗口:
- 请求 88;
- 客户错误 0,错误率 0.00%;
- failover 8 次,8 次均恢复成功;
- select failed 0;
- 临时不可调度命中 4 次;
- 当前排队 0。
该窗口尚未出现新的“504 + Input must be a list”样本,因此只能证明配置已实际生效且未见副作用,不能把短窗口零错误宣称为长期因果验证。
边界与剩余风险
本次规则会在同类 504 首次发生后短时摘除对应账号,减少连续客户请求重复命中;它无法挽救已经在第二跳耗尽 context 的当前请求。若同类首次错误仍频繁穿透,下一步应从 Sub2API 源码能力解决 failover 时间预算/每跳超时,而不是继续扩大关键词或盲目降低全池并发。