Codex 这个重试退避设计也太离谱了:403 后越重试越像挂机

最近在用 Codex CLI 接一个不太稳定的上游时,踩到了一个很搞笑、但又很实际的问题。

Codex 现在把流式重连做成了硬编码的指数退避。前几次看起来还正常,但到了后面会膨胀得非常夸张:

  • 第 1 次大约 0.2 秒
  • 第 5 次大约 3.2 秒
  • 第 10 次已经到 1 分多钟
  • 再往后甚至会涨到十几分钟、几十分钟一次

问题在于,这种设计默认假设“失败越久,就应该越慢重试”。但现实里很多上游并不是这样:

  • 网关偶发抽风
  • 后端路由不稳定
  • 某些 OpenAI 兼容中转会短暂返回 403 / 额度状态未刷新
  • 实际上多试几次,很快就恢复了

也就是说,真正需要的是:

  • 用户自己决定重试频率
  • 至少允许固定间隔重试,比如每 500ms 一次
  • 而不是被一个写死的指数退避绑架

更离谱的是,Codex 现在给了用户 stream_max_retries,却不给重试间隔和退避策略的配置权。这就导致:
你可以把次数改到 100 次,但第 10 次以后,每次等待都开始长得不合理,完全背离了“多试几次就能通”的场景。

我已经把这个问题提到上游了:

我感觉这个问题本质上不只是参数选得差,而是设计上太自作主张,没有给用户自由选择。

如果能在 TOML 里显式支持类似下面这种配置,至少才算把选择权交还给用户:

[model_providers.custom]
stream_max_retries = 100
stream_retry_delay_ms = 500
stream_retry_backoff = "fixed"

这种需求其实非常常见:
“这个上游经常抽风,但连续快速试几次通常就恢复,请别给我自动拉成几十分钟一次。”