# 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 账号执行: 1. 批量 dry-run:selected=9、changed=9、failed=0。 2. 批量 confirm:selected=9、succeeded=9、failed=0。 3. 回读账号 31 和 27:504 规则均包含 `input must be a list`,模板匹配正常。 4. 回读 `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 时间预算/每跳超时,而不是继续扩大关键词或盲目降低全池并发。