shaw
e1b76e2245
fix(codex): normalize load-shed originators to avoid upstream capacity shedding
上游 /backend-api/codex 按 Originator 头分桶调度容量:落在降载桶的请求即使返回
HTTP 200,也会立刻推 SSE `event: error`(code=server_is_overloaded)并以
response.failed 收尾。2026-07-29 起 codex-tui 落入降载桶,codex_cli_rs 正常——
判定因子是 originator 而非 User-Agent(codex_cli_rs 配 curl UA 亦可正常返回)。
网关会把该错误判定为瞬时上游故障并冷却账号,对外表现为 Codex 账号频繁过载不可用:
server_is_overloaded → isOpenAITransientProcessingError →
shouldCooldownOpenAITransientUpstreamError → 账号冷却 → 客户端 503。
本项目有三处降载身份来源:浏览器 UA 兜底的默认 UA、客户端透传的真实 TUI 身份、
以及指纹缓存注入探针的 UA。
修复收口在 enforceCodexIdentityHeaders——HTTP / 透传 / WS 握手 / compat 桥接 /
探针 / PAT / 模型列表 / alpha-search 八条出站路径共用的唯一纯函数收口点:
- 新增 NormalizeCodexClientIdentityToCLI,把降载桶身份改写为 codex_cli_rs,
只替换身份段并裁掉尾部 (name; version) 客户端标识组,保留版本 / OS / 架构 /
终端指纹;改写后 originator 与 UA 首段仍然配套,不破坏 #3901 的配对不变式,
且改写幂等。
- DefaultOpenAICodexUserAgent 从 TUI 身份改为 CLI 身份(浏览器兜底路径上最大的
降载身份来源)。
- 管理端 Codex UA 的 placeholder / hint 原本在把管理员往降载桶引导,一并修正。
新增 gateway.disable_codex_originator_normalization(默认 false,即归一化开启),
供上游调整分桶后回滚。该开关经 NewOpenAIGatewayService 发布为进程级快照,故必须
保持反义命名:正向命名的 Go 零值 false 会让未经 viper 加载而手工构造的 Config
静默关掉全局保护,viper.SetDefault 救不了这条路径。已加用例钉住该属性。
降载桶集合是上游容量策略快照而非协议常量,上游调整分桶后需同步修订。
2026-08-02 23:00:12 +08:00
..
2026-07-01 11:32:22 +08:00
2026-07-27 15:20:03 +00:00
2026-07-31 19:36:47 +08:00
2026-07-26 19:20:11 +08:00
2026-07-23 09:20:18 +08:00
2026-02-28 15:01:20 +08:00
2026-05-20 09:28:46 +08:00
2026-05-20 09:28:46 +08:00
2026-02-05 20:17:53 +08:00
2026-07-14 01:29:30 +08:00
2026-07-09 11:15:52 +08:00
2026-07-20 00:08:36 +08:00
2026-07-18 00:11:18 +08:00
2026-03-28 00:55:55 +08:00
2026-08-02 23:00:12 +08:00
2026-05-14 11:46:24 +08:00
2026-07-13 11:35:46 +08:00
2026-03-02 16:04:20 +08:00
2026-03-02 16:04:20 +08:00
2026-03-16 20:22:10 +08:00
2026-07-15 00:23:27 +08:00
2026-01-04 19:28:20 +08:00
2026-07-02 16:11:07 +08:00
2026-07-16 09:51:41 +08:00
2026-07-26 00:53:13 +08:00
2026-04-14 12:19:44 +08:00
2026-07-31 16:11:45 +08:00