# R2.2.2 任务报告

## 目标

执行三项客户错误调优：

1. 处理 `gpt-5.4-nano` 无候选。
2. 为 429 临时不可调度规则加入真实上游关键词 `upstream rate limit exceeded`。
3. 增加仅匹配 `concurrency limit exceeded` 与 `upstream service temporarily unavailable` 的 504 规则。

同时按用户追加要求增强精准批量 runtime API。

## 模型能力结论

通过 Sub2API 原生账号接口 `GET /api/v1/admin/accounts/:id/models` 和 `POST /api/v1/admin/accounts/:id/models/sync-upstream` 检查账号 15、19、27-34：

- 所有账号当前 `model_mapping` 均不包含 `gpt-5.4-nano`。
- 可实时同步的账号 19、27、28、32、33、34 的上游模型列表均不包含该模型。
- 账号 29、30、31 的上游模型同步返回 HTTP 403，不能据此声明支持。
- `lyon9801` 为 OAuth 账号，Sub2API 原生同步接口明确不支持该类型，当前映射也不包含该模型。

因此没有创建虚假的 `nano -> mini` 或同名映射。当前池的 `/v1/models` 不宣称支持 `gpt-5.4-nano`，直接请求继续快速返回无候选 404。后续只有真实上游模型列表或实测请求证明支持时，才通过显式 model-mapping CRUD 加入。

## 配置调优

YAML 模板 `codex-upstream-failover` 保持一分钟冷却，并累计为六条状态规则：

- 429：`concurrency limit exceeded`、`upstream rate limit exceeded`。
- 500：`failed to validate api key`、`do request failed`。
- 502、503、524：保留前序已验证的上游不可用、过载和并发关键词。
- 504：仅 `concurrency limit exceeded`、`upstream service temporarily unavailable`。

通过受控 runtime CLI 对账号 19、27-34 dry-run 后确认下发。逐账号回读均为 `ruleCount=6`、状态码 `429/500/502/503/504/524`，且匹配模板。账号 15 `lyon9801` 保持 `ruleCount=0`，没有应用临时不可调度。

## CLI 增强

新增：

- `runtime models --account <id>`：同时显示脱敏 `model_mapping`、配置模型和原生上游实时模型。
- `runtime apply|delete --kind model-mapping`：显式单账号模型映射 CRUD，默认 dry-run。
- `runtime apply|delete --accounts <id-or-name,...>`：一次受控作业内按显式账号集合顺序执行，拒绝隐式 all、重复账号和非 API-key 账号。
- 批量默认输出压缩为账号 ID、名称、change、mode、mutation 和汇总计数；`--full/--raw` 保留完整计划。

批量验收命令精确选择账号 `19,27,28,29,30,31,32,33,34`，结果为 `requestedCount=9`、`succeededCount=9`、`mutatedCount=0`，全部 noop，且未包含账号 15。

## 即时观察

调优后拉取 20 分钟 runtime 错误窗口：

- 匹配 12 个日志事件。
- 结构化上游状态为 502 一次、524 六次。
- 账号 27 仍出现四次并发限制文本，但该窗口跨越配置下发时刻，不能用于评价新规则最终效果。
- 账号 33 有一次 `gpt-5.6-sol` 与 ChatGPT Codex 账号不兼容的 400，属于独立模型路由问题。
- 未观察到配置写入造成的新类型异常。

父任务 R2.2 继续用后续完整窗口观察客户可见错误率、切号和冷却命中效果。

## 验证

- `bun --check scripts/src/platform-infra-sub2api-codex/runtime.ts`：通过。
- `git diff --check`：通过。
- 九账号 runtime dry-run、confirm、逐账号 get：通过。
- 精准批量 dry-run：通过。
- 20 分钟 runtime errors：通过。
