O backoff de retry do Codex é absurdo: depois de um 403, quanto mais tenta, mais parece um bot

Recentemente, ao usar o Codex CLI com um upstream não muito estável, acabei esbarrando num problema bem engraçado — mas também bem prático.

O Codex agora transformou a reconexão em streaming numa lógica de backoff exponencial hardcoded. Nas primeiras tentativas parece normal, mas depois isso infla de um jeito absurdo:

  • Na 1ª vez, cerca de 0,2 s
  • Na 5ª vez, cerca de 3,2 s
  • Na 10ª vez, já passa de 1 minuto
  • Depois disso, chega a subir para uma tentativa a cada dezenas de minutos, até dezenas de minutos / horas

O problema é que esse design assume por padrão: “quanto mais tempo falhar, mais devagar deve tentar de novo”. Mas na prática muitos upstreams não funcionam assim:

  • gateway dando pane ocasional
  • roteamento do backend instável
  • alguns proxies intermediários compatíveis com OpenAI retornando 403 por pouco tempo / estado de cota ainda não atualizado
  • na prática, tentar mais algumas vezes e logo volta ao normal

Ou seja, o que realmente se precisa é:

  • o usuário decidir a frequência de retry
  • pelo menos permitir retry em intervalo fixo, por exemplo a cada 500 ms
  • e não ficar refém de um backoff exponencial escrito na pedra

Mais absurdo ainda: o Codex hoje dá ao usuário stream_max_retries, mas não dá controle sobre o intervalo de retry e a estratégia de backoff. Isso acaba levando a:

você pode aumentar as tentativas para 100, mas depois da 10ª, cada espera começa a ficar longa demais, totalmente fora do cenário de “tentar mais algumas vezes e funciona”.

Eu já levei esse problema para o upstream:

Tenho a sensação de que, no fundo, o problema não é só um parâmetro mal escolhido, mas um design autoritário demais, que não deixa o usuário escolher.

Se no TOML desse para suportar explicitamente algo como a configuração abaixo, pelo menos aí a escolha voltaria para as mãos do usuário:

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

Esse tipo de necessidade é bem comum:
“esse upstream vive dando pane, mas algumas tentativas rápidas em sequência normalmente resolvem — por favor, não puxe automaticamente para uma vez a cada dezenas de minutos.”