Desde 8 de outubro de 2026, longas sessões do Codex têm falhado no momento em que tentam compactar. O erro diz stream disconnected before completion: response protection is unavailable, as tentativas de repetição não ajudam e a conversa não pode continuar. A maioria dos relatos envolve gpt-6.1-sol, mas gpt-6-astra e gpt-5.6-sol falham da mesma forma. Isso aparece atrás de proxies auto-hospedados e também aparece no aplicativo oficial do Codex com um login direto do ChatGPT.
A resposta curta: o contexto não é muito grande, e sua rede não é o problema. O backend do Codex do ChatGPT agora rejeita qualquer solicitação que reproduza uma busca na web anterior em seu histórico sem também declarar a ferramenta de busca na web. A solicitação de compactação do Codex não declara ferramentas. Portanto, uma única busca na web no início de uma sessão é suficiente para fazer com que todas as compactações posteriores falhem.
O que fazer agora:
- Novas sessões: defina
web_search = "disabled"até que o backend ou o Codex mudem. - Sessões travadas: mova o trabalho para uma nova sessão. A antiga não compactará.
- Se você mantiver seu próprio gateway na frente do Codex: adicione uma declaração de busca na web quando o histórico contiver uma busca. O código está abaixo.
O restante deste post explica como o gatilho foi encontrado, quais correções da comunidade não funcionam e como resgatar uma sessão travada.
Como a falha se apresenta
Você verá uma destas mensagens no Codex:
stream disconnected before completion: response protection is unavailable
Error running remote compact task: stream disconnected before completion: stream closed before response.completed
A segunda mensagem é a versão genérica. O Codex nem sempre mostra o erro upstream, então uma compactação que falha com "stream closed before response.completed" pode ser o mesmo problema. O log local do Codex frequentemente tem Failed to run pre-sampling compact ao lado.
Abaixo, o upstream envia uma das duas coisas. Às vezes, é um HTTP 502 com este corpo, que um usuário do ChatGPT Plus no gpt-6.1-sol também postou no fórum de desenvolvedores da OpenAI:
{"message": "response protection is unavailable", "type": "internal_error"}
Outras vezes, é um HTTP 200 cujo stream termina em um evento response.failed com code: "upstream_error" e sem response.completed. Qualquer coisa que apenas verifique o status HTTP perde a segunda forma e a relata como um stream que terminou cedo.
O padrão é o mesmo em todos os lugares:
- Turnos normais continuam funcionando. Apenas a compactação falha.
- O Codex tenta cerca de cinco vezes, depois desiste. Nos logs de um gateway, cada tentativa falhada levou de 2 a 13 segundos e registrou zero tokens.
- Retomar a sessão encontra a mesma compactação, então a sessão permanece travada.
- Uma nova sessão funciona até atingir as mesmas condições.
O gatilho: uma busca no histórico, sem ferramenta de busca na solicitação
O Codex tem uma ferramenta de busca na web embutida. Quando o modelo a usa, um item web_search_call vai para o histórico da conversa. Cada solicitação posterior envia esse histórico de volta.
Turnos normais declaram a ferramenta em tools, então o upstream aceita a busca reproduzida. Uma solicitação de compactação é diferente. O Codex envia todo o histórico com tools: [], porque um resumo não precisa de ferramentas. Isso se aplica à compactação local, que o Codex executa para provedores personalizados, e à compactação remota v2.
Por volta de 6 de outubro, o backend do Codex do ChatGPT começou a rejeitar solicitações que reproduzem um web_search_call mas não declaram web_search. Desenvolvedores que capturaram as solicitações brutas restringiram isso. Mudar ou remover o ID do item de busca não faz diferença. Declarar apenas uma ferramenta de função ainda falha. Declarar web_search faz a mesma solicitação ter sucesso.
O mesmo resultado aparece com o codex-cli oficial, não modificado logado com uma conta do ChatGPT. Um histórico com três itens de busca falhou ao compactar. O mesmo histórico com apenas esses itens removidos compactou bem. Um segundo repórter naquele tópico capturou uma solicitação de compactação com um web_search_call e tools: []. Adicionar uma declaração de web_search corrigiu o problema, assim como remover o item de busca.
Isso explica por que parece um problema de tamanho de contexto. A compactação só é executada em longas sessões, e longas sessões são as mais propensas a ter usado busca em algum momento. A busca na web também está ativada por padrão no Codex (o modo padrão é "cached"), então uma sessão pode conter uma busca que o usuário nunca pediu.
As evidências
Pelo menos quatro grupos realizaram testes A/B de forma independente e obtiveram o mesmo resultado. As linhas abaixo combinam testes postados no rastreador openai/codex e nos rastreadores de problemas de vários projetos de gateway de código aberto. A OpenAI não confirmou a regra nem respondeu em nenhum desses tópicos.
| Histórico de solicitações | Ferramentas declaradas | Resultado |
|---|---|---|
| Mensagens e raciocínio apenas | Nenhuma | Completa |
| Inclui saída de chamada de função | Nenhuma | Completa |
| Inclui um web_search_call | Nenhuma | Falha |
| Inclui um web_search_call | Apenas ferramenta de função | Falha |
| Inclui um web_search_call | web_search | Completa |
| O mesmo, itens de busca removidos | Nenhuma | Completa |
Os testes descartam o tamanho. Um testador definiu o limite de compactação automática para 2.000 tokens com -c model_auto_compact_token_limit=2000. Uma sessão sem uso de ferramentas compactou bem. Uma sessão que havia pesquisado uma vez falhou seis vezes seguidas. Outro testador descobriu que remover itens de raciocínio não ajudou, enquanto remover o único item de busca ajudou.
Em um teste, a versão com web_search declarada completou em 2,63 segundos e não fez novas chamadas de busca. Declarar a ferramenta não faz o modelo pesquisar novamente.
O que a comunidade tentou e o que realmente funciona
O tópico LINUX DO que levou a este post passou pela maioria dos palpites habituais:
| Sugestão | Ajuda? | Por quê |
|---|---|---|
| Reduzir contexto, compactar mais cedo | Não | O tamanho não é o gatilho |
| Conectar por IP, mudar nginx | Não | O erro vem do upstream |
| Mudar para WebSocket | Não confiável | O corpo da solicitação é o mesmo de qualquer forma |
| Fazer login diretamente no ChatGPT | Não | O login oficial também falha |
| Nova sessão, transferir contexto | Solução temporária | Quebra novamente após uma busca |
| Desativar busca na web | Sim, para novas sessões | Sem busca, sem gatilho |
| Declarar web_search na solicitação | Sim | Satisfaz a verificação |
Algumas dessas precisam de mais explicação.
Nginx e IP. Timeouts e conexões ociosas podem causar outros erros de "stream disconnected", mas não podem produzir esta mensagem. Os mantenedores dos proxies envolvidos confirmaram que a mensagem não é gerada pelo proxy; ela vem do provedor upstream. Se a mensagem está lá, a rede conseguiu enviar a solicitação e recebê-la de volta.
WebSocket. Os patches do gateway que funcionaram tiveram que cobrir o caminho do WebSocket, assim como o HTTP, porque as solicitações do WebSocket carregam o mesmo corpo. Uma sessão que "se recuperou" após mudar de transporte provavelmente não tinha busca em seu histórico.
Login oficial. Relatos no rastreador openai/codex incluem o aplicativo desktop e codex-cli logados diretamente com uma conta do ChatGPT, sem proxy envolvido. Até 10 de outubro, nem o Codex 0.162.1 nem os alphas 0.163.0 mencionam uma correção, e os problemas não têm resposta dos mantenedores.
O que você pode fazer agora
Desativar busca na web para novas sessões
Desative a busca em ~/.codex/config.toml:
web_search = "disabled"
A referência de configuração do Codex lista quatro valores: disabled, cached (o padrão), indexed e live. Sessões iniciadas com --yolo ou outro acesso total padrão são definidas como live, então defina explicitamente.
Aplicar isso a novas sessões. Uma sessão antiga já tem itens web_search_call em seu histórico. Com a busca desativada, turnos normais também param de declarar a ferramenta, então esses turnos podem começar a falhar também. Isso segue a regra acima, mas ninguém relatou testá-la ainda.
O custo é que o Codex não pode pesquisar na web. Para uma sessão que precisa de busca, abra uma nova sessão curta separada ou faça com que o modelo escreva as descobertas em um arquivo que a sessão longa lê.
Resgatar uma sessão travada
Nada do seu lado fará uma sessão travada compactar enquanto o backend se comportar dessa forma. Para manter o trabalho:
- Deixe a sessão travada como está. Seu histórico ainda está no disco em
~/.codex/sessions/. - Inicie uma nova sessão com a busca na web desativada.
- Apontar para o arquivo da sessão antiga ou colar uma breve transferência: o objetivo, os arquivos alterados, as decisões tomadas e o que falta.
- Pare de enviar prompts para a sessão antiga. Cada tentativa tenta repetir a compactação e falha novamente.
Se você mantiver seu próprio gateway
A correção que funciona segue uma regra. Se input contém um web_search_call e nenhuma ferramenta web_search* é declarada, adicione uma. Se o chamador não declarou ferramentas, defina tool_choice como "none" para que a ferramenta não possa ser executada. Deixe input inalterado.
def declare_replayed_web_search(body: dict) -> dict:
"""Permita que o upstream aceite um web_search_call reproduzido em uma solicitação sem ferramentas."""
items = body.get("input")
if not isinstance(items, list):
return body
if not any(isinstance(i, dict) and i.get("type") == "web_search_call" for i in items):
return body
tools = body.get("tools") or []
if any(isinstance(t, dict) and str(t.get("type", "")).startswith("web_search") for t in tools):
return body
caller_had_tools = bool(tools)
# Índice em cache apenas: a declaração existe para satisfazer a verificação, não para pesquisar.
body["tools"] = tools + [{"type": "web_search", "external_web_access": False}]
if not caller_had_tools:
body["tool_choice"] = "none"
return body
As solicitações Lite de respostas são uma exceção. Elas retornam um 400 se web_search estiver na tools de nível superior. Os patches que funcionam o colocam no primeiro item de additional_tools em vez disso, e mantêm qualquer compaction_trigger final. A alternativa, remover itens de busca das solicitações de compactação, também funciona, mas o resumo então perde o que a busca encontrou.
Se você preferir não depender do backend de assinatura
Todos os relatos que encontramos passam pelo backend de assinatura do ChatGPT, o endpoint que o Codex usa com um login do ChatGPT. Suas regras não estão documentadas, e esta mudou sem aviso.
O Codex também pode usar a API pública de Respostas com uma chave de API. Não vimos um relato desse erro nesse caminho, mas também não executamos a reprodução lá, então trate isso como uma observação, não uma garantia. Para configurar o Codex com uma chave AIHubMix, siga o tutorial de integração do Codex CLI:
model = "gpt-6.1-sol"
model_provider = "aihubmix"
[model_providers.aihubmix]
name = "AIHubMix"
base_url = "https://aihubmix.com/v1"
wire_api = "responses"
env_key = "AIHUBMIX_API_KEY"
Os preços da API se aplicam por token, não por assinatura. As taxas estão na página do modelo gpt-6.1-sol.
Lista de verificação
- O texto do erro contém "response protection is unavailable", ou a compactação falha com "stream closed before response.completed".
- Turnos normais ainda funcionam e apenas a compactação falha.
- A sessão usou busca na web em algum momento, possivelmente sem ser solicitado.
- Novas sessões têm web_search definido como desativado.
- Trabalho travado foi movido para uma nova sessão com uma nota de transferência.
- Um gateway que você mantém adiciona uma declaração de web_search quando o histórico contém uma busca.
- As configurações de rede do Nginx e do proxy foram deixadas em paz. Elas não são a causa.
FAQ
O que significa "response protection is unavailable" no Codex?
É um erro do backend do Codex do ChatGPT, não do próprio Codex ou do seu proxy. Desde o início de outubro de 2026, aparece quando uma solicitação reproduz uma busca na web anterior, mas não declara a ferramenta de busca na web, que é exatamente o que uma solicitação de compactação faz.
Meu tamanho de contexto é muito grande?
Não. Testadores reproduziram isso com um limite de compactação de 2.000 tokens, e sessões do mesmo tamanho sem uma busca compactam normalmente. Apenas parece relacionado ao tamanho porque a compactação só é executada em longas sessões.
Isso afeta o aplicativo oficial do Codex com um login do ChatGPT?
Sim. Usuários do aplicativo desktop e codex-cli relatam isso em logins diretos do ChatGPT sem proxy. Até 10 de outubro de 2026, nenhuma versão do Codex menciona uma correção.
Como posso saber se uma sessão vai encontrar isso?
Se a sessão usou busca na web em algum momento, sua próxima compactação provavelmente falhará. O Codex registra cada busca como um item web_search_call nos arquivos de sessão na pasta .codex/sessions.
Desativar a busca na web consertará uma sessão que já está travada?
Provavelmente não. O histórico antigo ainda contém a busca, e uma vez que a busca é desativada, turnos normais podem parar de declarar a ferramenta e falhar também. Use a configuração para novas sessões e mova o trabalho.
Mudar para WebSocket ou alterar o nginx ajuda?
Não. O corpo da solicitação é o mesmo em qualquer transporte, e o erro vem do upstream, então as configurações de rede não podem removê-lo. Outros erros de stream podem vir de timeouts, mas não este.
Acontece quando o Codex usa uma chave de API em vez de uma assinatura do ChatGPT?
Todos os relatos até agora envolvem o backend de assinatura. Ninguém relatou isso na API pública de Respostas, embora isso não tenha sido testado diretamente.
Continue lendo: a série GPT-6.1 Sol
- Se esse erro apareceu logo após você mudar o Codex para GPT-6.1 Sol, o guia de migração cobre as outras mudanças que podem quebrar uma configuração: Migrando para GPT-6.1 Sol: 9 Coisas que Podem Dar Errado
- Sessões longas de agentes são onde as configurações de esforço importam mais, para velocidade e para quão rápido você se aproxima da compactação: Escolhendo um Esforço de Raciocínio para GPT-6.1 Sol: baixo a máximo
Fontes
- Windows Codex Desktop: a compactação de contexto sempre falha (openai/codex)
- A compactação remota falha após retomar o histórico de web_search_call hospedado (openai/codex)
- A compactação remota do Codex falha com 502 "proteção de resposta indisponível" (Comunidade de Desenvolvedores da OpenAI)
- Referência de configuração do Codex (OpenAI)
- Tutorial de integração do Codex CLI + AIHubMix (AIHubMix)



