La compactación de Codex falla con "la protección de respuesta no está disponible": es la búsqueda web, no tu contexto

AIHubMix8 min de lectura
La compactación de Codex falla con "la protección de respuesta no está disponible": es la búsqueda web, no tu contexto

Desde el 8 de octubre de 2026, las largas sesiones de Codex han estado fallando en el momento en que intentan compactarse. El error dice stream disconnected before completion: response protection is unavailable, los reintentos no ayudan y la conversación no puede continuar. La mayoría de los informes involucran gpt-6.1-sol, pero gpt-6-astra y gpt-5.6-sol fallan de la misma manera. Aparece detrás de proxies autoalojados y también se presenta en la aplicación oficial de Codex con un inicio de sesión directo en ChatGPT.

La respuesta corta: el contexto no es demasiado grande y tu red no es el problema. El backend de Codex de ChatGPT ahora rechaza cualquier solicitud que reproduzca una búsqueda web anterior en su historial sin declarar también la herramienta de búsqueda web. La solicitud de compactación de Codex no declara ninguna herramienta en absoluto. Así que una sola búsqueda web al principio de una sesión es suficiente para hacer que cada compactación posterior falle.

Qué hacer ahora mismo:

  • Nuevas sesiones: establece web_search = "disabled" hasta que el backend o Codex cambien.
  • Sesiones atascadas: mueve el trabajo a una nueva sesión. La antigua no se compactará.
  • Si mantienes tu propio gateway frente a Codex: añade una declaración de búsqueda web cuando el historial contenga una búsqueda. El código está abajo.

El resto de esta publicación explica cómo se encontró el desencadenante, qué soluciones comunitarias no funcionan y cómo rescatar una sesión atascada.

Cómo se ve la falla

Verás uno de estos en Codex:

stream disconnected before completion: response protection is unavailable
Error running remote compact task: stream disconnected before completion: stream closed before response.completed

El segundo mensaje es la versión genérica. Codex no siempre muestra el error de upstream, así que una compactación que falla con "stream closed before response.completed" puede ser el mismo problema. El registro local de Codex a menudo tiene Failed to run pre-sampling compact junto a él.

Debajo, el upstream envía una de dos cosas. A veces es un HTTP 502 con este cuerpo, que un usuario de ChatGPT Plus en gpt-6.1-sol también publicó en el foro de desarrolladores de OpenAI:

{"message": "response protection is unavailable", "type": "internal_error"}

Otras veces es un HTTP 200 cuyo flujo termina en un evento response.failed con code: "upstream_error" y sin response.completed. Cualquier cosa que solo verifique el estado HTTP se pierde la segunda forma y la informa como un flujo que terminó antes.

El patrón es el mismo en todas partes:

  • Los turnos normales siguen funcionando. Solo la compactación falla.
  • Codex reintenta unas cinco veces y luego se rinde. En los registros de un gateway, cada intento fallido tomó de 2 a 13 segundos y registró cero tokens.
  • Reanudar la sesión se encuentra con la misma compactación, por lo que la sesión permanece atascada.
  • Una nueva sesión funciona hasta que alcanza las mismas condiciones.

El desencadenante: una búsqueda en el historial, sin herramienta de búsqueda en la solicitud

Codex tiene una herramienta de búsqueda web integrada. Cuando el modelo la usa, un elemento web_search_call va al historial de la conversación. Cada solicitud posterior envía ese historial de vuelta.

Los turnos normales declaran la herramienta en tools, por lo que el upstream acepta la búsqueda reproducida. Una solicitud de compactación es diferente. Codex envía todo el historial con tools: [], porque un resumen no necesita herramientas. Eso se aplica a la compactación local, que Codex ejecuta para proveedores personalizados, y a la compactación remota v2.

Alrededor del 6 de octubre, el backend de Codex de ChatGPT comenzó a rechazar solicitudes que reproducen un web_search_call pero no declaran web_search. Los desarrolladores que capturaron las solicitudes en bruto lo redujeron. Cambiar o eliminar el ID del elemento de búsqueda no hace ninguna diferencia. Declarar solo una herramienta de función sigue fallando. Declarar web_search hace que la misma solicitud tenga éxito.

El mismo resultado aparece con el codex-cli oficial y sin modificar iniciado sesión con una cuenta de ChatGPT. Un historial con tres elementos de búsqueda falló al compactarse. El mismo historial con solo esos elementos eliminados se compactó bien. Un segundo reportero en ese hilo capturó una solicitud de compactación con un web_search_call y tools: []. Agregar una declaración de web_search lo solucionó, al igual que eliminar el elemento de búsqueda.

Eso explica por qué parece un problema de tamaño de contexto. La compactación solo se ejecuta en sesiones largas, y las sesiones largas son las más propensas a haber utilizado búsqueda en algún momento. La búsqueda web también está activada por defecto en Codex (el modo predeterminado es "cached"), por lo que una sesión puede contener una búsqueda que el usuario nunca solicitó.

La evidencia

Al menos cuatro grupos realizaron pruebas A/B de manera independiente y obtuvieron el mismo resultado. Las filas a continuación combinan pruebas publicadas en el rastreador openai/codex y en los rastreadores de problemas de varios proyectos de gateway de código abierto. OpenAI no ha confirmado la regla ni ha respondido en ninguno de esos hilos.

Historial de solicitudes Herramientas declaradas Resultado
Mensajes y razonamiento solamente Ninguna Completa
Incluye salida de llamada a función Ninguna Completa
Incluye un web_search_call Ninguna Falla
Incluye un web_search_call Solo herramienta de función Falla
Incluye un web_search_call web_search Completa
Lo mismo, elementos de búsqueda eliminados Ninguna Completa

Las pruebas descartan el tamaño. Un probador estableció el umbral de auto-compactación en 2,000 tokens con -c model_auto_compact_token_limit=2000. Una sesión sin uso de herramientas se compactó bien. Una sesión que había buscado una vez falló seis veces seguidas. Otro probador descubrió que eliminar elementos de razonamiento no ayudó, mientras que eliminar el único elemento de búsqueda sí.

En una prueba, la versión con web_search declarada completó en 2.63 segundos y no realizó nuevas llamadas de búsqueda. Declarar la herramienta no hace que el modelo busque de nuevo.

Lo que intentó la comunidad y lo que realmente funciona

El hilo de LINUX DO que provocó esta publicación pasó por la mayoría de las suposiciones habituales:

Sugerencia ¿Ayuda? Por qué
Reducir contexto, compactar antes No El tamaño no es el desencadenante
Conectar por IP, cambiar nginx No El error proviene de upstream
Cambiar a WebSocket Poco confiable El cuerpo de la solicitud es el mismo de cualquier manera
Iniciar sesión directamente en ChatGPT No El inicio de sesión oficial también falla
Nueva sesión, pasar contexto Solución temporal Se rompe de nuevo después de una búsqueda
Desactivar búsqueda web Sí, para nuevas sesiones Sin búsqueda, sin desencadenante
Declarar web_search en la solicitud Sí Satisface la verificación

Algunas de estas necesitan más explicación.

Nginx e IP. Los tiempos de espera y las conexiones inactivas pueden causar otros errores de "flujo desconectado", pero no pueden producir este mensaje. Los mantenedores de los proxies involucrados confirmaron que el mensaje no es generado por el proxy; proviene del proveedor upstream. Si el mensaje está ahí, la red logró enviar la solicitud y recibirla de vuelta.

WebSocket. Los parches de gateway que funcionaron tuvieron que cubrir el camino de WebSocket así como HTTP, porque las solicitudes de WebSocket llevan el mismo cuerpo. Una sesión que "se recuperó" después de cambiar de transporte probablemente no tenía búsqueda en su historial.

Inicio de sesión oficial. Los informes en el rastreador openai/codex incluyen la aplicación de escritorio y codex-cli iniciados directamente con una cuenta de ChatGPT, sin proxy involucrado. A partir del 10 de octubre, ni Codex 0.162.1 ni las alfas 0.163.0 mencionan una solución, y los problemas no tienen respuesta de los mantenedores.

Lo que puedes hacer ahora

Desactivar la búsqueda web para nuevas sesiones

Desactiva la búsqueda en ~/.codex/config.toml:

web_search = "disabled"

La referencia de configuración de Codex enumera cuatro valores: disabled, cached (el predeterminado), indexed y live. Las sesiones iniciadas con --yolo u otro acceso completo predeterminado son live, así que configúralo explícitamente.

Aplica esto a nuevas sesiones. Una sesión antigua ya tiene elementos web_search_call en su historial. Con la búsqueda desactivada, los turnos normales también dejan de declarar la herramienta, por lo que esos turnos también pueden comenzar a fallar. Eso sigue la regla anterior, pero nadie ha informado haberlo probado aún.

El costo es que Codex no puede buscar en la web. Para una sesión que necesita búsqueda, abre una corta por separado, o haz que el modelo escriba los hallazgos en un archivo que la sesión larga lea.

Rescatar una sesión atascada

Nada de tu lado hará que una sesión atascada se compacte mientras el backend se comporte de esta manera. Para mantener el trabajo:

  1. Deja la sesión atascada tal como está. Su historial aún está en disco bajo ~/.codex/sessions/.
  2. Inicia una nueva sesión con la búsqueda web desactivada.
  3. Apunta al archivo de la sesión antigua, o pega un breve traspaso: el objetivo, los archivos cambiados, decisiones tomadas y lo que queda.
  4. Deja de enviar mensajes a la sesión antigua. Cada intento reintenta la compactación y falla de nuevo.

Si mantienes tu propio gateway

La solución que funciona sigue una regla. Si input contiene un web_search_call y no se declara ninguna herramienta web_search*, añade una. Si el llamador no declaró herramientas, establece tool_choice en "none" para que la herramienta no pueda ejecutarse. Deja input como está.

def declare_replayed_web_search(body: dict) -> dict:
    """Permite que el upstream acepte un web_search_call reproducido en una solicitud sin herramientas."""
    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)
    # Solo índice en caché: la declaración existe para satisfacer la verificación, no para buscar.
    body["tools"] = tools + [{"type": "web_search", "external_web_access": False}]
    if not caller_had_tools:
        body["tool_choice"] = "none"
    return body

Las solicitudes de Responses Lite son una excepción. Devuelven un 400 si web_search está en tools de nivel superior. Los parches que funcionan lo colocan en el primer elemento de additional_tools en la entrada, y mantienen cualquier compaction_trigger final. La alternativa, eliminar elementos de búsqueda de las solicitudes de compactación, también funciona, pero el resumen pierde lo que encontró la búsqueda.

Si prefieres no depender del backend de suscripción

Todos los informes que encontramos pasan por el backend de suscripción de ChatGPT, el punto final que Codex utiliza con un inicio de sesión de ChatGPT. Sus reglas no están documentadas, y esta cambió sin previo aviso.

Codex también puede usar la API pública de Responses con una clave API. No hemos visto un informe de este error en ese camino, pero tampoco lo hemos reproducido allí, así que trata eso como una observación, no como una garantía. Para configurar Codex con una clave de AIHubMix, sigue el tutorial de integración de Codex CLI + AIHubMix:

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"

Los precios de la API se aplican por token, no por suscripción. Las tarifas están en la página del modelo gpt-6.1-sol.

Lista de verificación

  • El texto del error contiene "la protección de respuesta no está disponible", o la compactación falla con "stream closed before response.completed".
  • Los turnos normales siguen funcionando y solo falla la compactación.
  • La sesión utilizó búsqueda web en algún momento, posiblemente sin haberlo solicitado.
  • Nuevas sesiones tienen web_search configurado como deshabilitado.
  • El trabajo atascado se ha movido a una nueva sesión con una nota de traspaso.
  • Un gateway que mantienes añade una declaración de búsqueda web cuando el historial contiene una búsqueda.
  • Las configuraciones de red de Nginx y proxy se han dejado solas. No son la causa.

Preguntas frecuentes

¿Qué significa "la protección de respuesta no está disponible" en Codex?
Es un error del backend de Codex de ChatGPT, no de Codex en sí o de tu proxy. Desde principios de octubre de 2026 aparece cuando una solicitud reproduce una búsqueda web anterior pero no declara la herramienta de búsqueda web, que es exactamente lo que hace una solicitud de compactación.

¿Es mi ventana de contexto demasiado grande?
No. Los probadores lo reprodujeron con un umbral de compactación de 2,000 tokens, y sesiones del mismo tamaño sin búsqueda se compactan normalmente. Solo parece relacionado con el tamaño porque la compactación solo se ejecuta en sesiones largas.

¿Afecta a la aplicación oficial de Codex con un inicio de sesión de ChatGPT?
Sí. Los usuarios de la aplicación de escritorio y codex-cli lo informan en inicios de sesión directos de ChatGPT sin proxy. A partir del 10 de octubre de 2026, ninguna versión de Codex menciona una solución.

¿Cómo puedo saber si una sesión lo enfrentará?
Si la sesión utilizó búsqueda web en algún momento, su próxima compactación probablemente fallará. Codex registra cada búsqueda como un elemento web_search_call en los archivos de sesión bajo la carpeta .codex/sessions.

¿Desactivar la búsqueda web solucionará una sesión que ya está atascada?
Probablemente no. El historial antiguo aún contiene la búsqueda, y una vez que la búsqueda está desactivada, los turnos normales pueden dejar de declarar la herramienta y también fallar. Usa la configuración para nuevas sesiones y mueve el trabajo.

¿Ayuda cambiar a WebSocket o cambiar nginx?
No. El cuerpo de la solicitud es el mismo a través de cualquier transporte, y el error proviene de upstream, por lo que las configuraciones de red no pueden eliminarlo. Otros errores de flujo pueden provenir de tiempos de espera, pero no este.

¿Sucede cuando Codex utiliza una clave API en lugar de una suscripción de ChatGPT?
Todos los informes hasta ahora involucran el backend de suscripción. Nadie lo ha informado en la API pública de Responses, aunque eso no se ha probado directamente.

Sigue leyendo: la serie GPT-6.1 Sol

Fuentes