Codex Compaction Fallisce Con "la protezione della risposta non è disponibile": È la Ricerca Web, Non il Tuo Contesto

AIHubMix8 min di lettura
Codex Compaction Fallisce Con "la protezione della risposta non è disponibile": È la Ricerca Web, Non il Tuo Contesto

Dal 8 ottobre 2026, le lunghe sessioni di Codex si interrompono nel momento in cui cercano di compattarsi. L'errore riporta stream disconnected before completion: response protection is unavailable, i tentativi di ripetizione non aiutano e la conversazione non può continuare. La maggior parte dei rapporti coinvolge gpt-6.1-sol, ma anche gpt-6-astra e gpt-5.6-sol falliscono allo stesso modo. Si manifesta dietro proxy auto-ospitati e appare anche nell'app ufficiale di Codex con un accesso diretto a ChatGPT.

La risposta breve: il contesto non è troppo grande e la tua rete non è il problema. Il backend di Codex di ChatGPT ora rifiuta qualsiasi richiesta che riproduce una ricerca web precedente nella sua cronologia senza dichiarare anche lo strumento di ricerca web. La richiesta di compattazione di Codex non dichiara alcuno strumento. Quindi, una singola ricerca web all'inizio di una sessione è sufficiente per far fallire ogni successiva compattazione.

Cosa fare subito:

  • Nuove sessioni: imposta web_search = "disabled" fino a quando il backend o Codex non cambiano.
  • Sessioni bloccate: sposta il lavoro in una nuova sessione. Quella vecchia non si compatterà.
  • Se gestisci il tuo gateway davanti a Codex: aggiungi una dichiarazione di ricerca web quando la cronologia contiene una ricerca. Il codice è qui sotto.

Il resto di questo post spiega come è stato trovato il trigger, quali soluzioni della comunità non funzionano e come recuperare una sessione bloccata.

Come appare il fallimento

Vedrai uno di questi in Codex:

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

Il secondo messaggio è la versione generica. Codex non mostra sempre l'errore upstream, quindi una compattazione che fallisce con "stream closed before response.completed" può essere lo stesso problema. Il log locale di Codex spesso ha Failed to run pre-sampling compact accanto ad esso.

Sotto, l'upstream invia una delle due cose. A volte è un HTTP 502 con questo corpo, che un utente di ChatGPT Plus su gpt-6.1-sol ha anche postato nel forum degli sviluppatori di OpenAI:

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

Altre volte è un HTTP 200 il cui stream termina in un evento response.failed con code: "upstream_error" e senza response.completed. Qualsiasi cosa che controlli solo lo stato HTTP perde la seconda forma e la riporta come uno stream che è terminato prematuramente.

Il modello è lo stesso ovunque:

  • I turni normali continuano a funzionare. Solo la compattazione fallisce.
  • Codex ripete circa cinque volte, poi si arrende. Nei log di un gateway, ogni tentativo fallito ha impiegato da 2 a 13 secondi e ha registrato zero token.
  • Riprendere la sessione incontra la stessa compattazione, quindi la sessione rimane bloccata.
  • Una nuova sessione funziona fino a quando non incontra le stesse condizioni.

Il trigger: una ricerca nella cronologia, nessuno strumento di ricerca nella richiesta

Codex ha uno strumento di ricerca web integrato. Quando il modello lo utilizza, un elemento web_search_call va nella cronologia della conversazione. Ogni richiesta successiva invia di nuovo quella cronologia.

I turni normali dichiarano lo strumento in tools, quindi l'upstream accetta la ricerca riprodotta. Una richiesta di compattazione è diversa. Codex invia l'intera cronologia con tools: [], perché un riassunto non ha bisogno di strumenti. Questo si applica alla compattazione locale, che Codex esegue per fornitori personalizzati, e alla compattazione remota v2.

Intorno al 6 ottobre, il backend di Codex di ChatGPT ha iniziato a rifiutare le richieste che riproducono un web_search_call ma non dichiarano web_search. Gli sviluppatori che hanno catturato le richieste grezze l'hanno ristretto. Cambiare o rimuovere l'ID dell'elemento di ricerca non fa differenza. Dichiarare solo uno strumento funzione fallisce ancora. Dichiarare web_search fa sì che la stessa richiesta abbia successo.

Lo stesso risultato appare con il codex-cli ufficiale e non modificato effettuando l'accesso con un account ChatGPT. Una cronologia con tre elementi di ricerca non si è compattata. La stessa cronologia con solo quegli elementi rimossi si è compattata bene. Un secondo reporter in quel thread ha catturato una richiesta di compattazione con un web_search_call e tools: []. Aggiungere una dichiarazione web_search l'ha risolta, così come rimuovere l'elemento di ricerca.

Questo spiega perché sembra un problema di dimensione del contesto. La compattazione si esegue solo su lunghe sessioni, e le lunghe sessioni sono quelle più propense ad aver utilizzato la ricerca a un certo punto. La ricerca web è anche attivata per impostazione predefinita in Codex (la modalità predefinita è "cached"), quindi una sessione può contenere una ricerca che l'utente non ha mai richiesto.

Le prove

Almeno quattro gruppi hanno eseguito test A/B in modo indipendente e hanno ottenuto lo stesso risultato. Le righe qui sotto combinano test pubblicati nel tracker openai/codex e nei tracker dei problemi di diversi progetti di gateway open-source. OpenAI non ha confermato la regola né ha risposto in nessuno di quei thread.

Cronologia delle richieste Strumenti dichiarati Risultato
Messaggi e ragionamenti solo Nessuno Completa
Include output di chiamata funzione Nessuno Completa
Include un web_search_call Nessuno Fallisce
Include un web_search_call Solo strumento funzione Fallisce
Include un web_search_call web_search Completa
Stesso, elementi di ricerca rimossi Nessuno Completa

I test escludono la dimensione. Un tester ha impostato la soglia di auto-compattazione a 2.000 token con -c model_auto_compact_token_limit=2000. Una sessione senza utilizzo di strumenti si è compattata bene. Una sessione che aveva cercato una volta ha fallito sei volte di seguito. Un altro tester ha scoperto che rimuovere gli elementi di ragionamento non ha aiutato, mentre rimuovere l'unico elemento di ricerca sì.

In un test, la versione con web_search dichiarato si è completata in 2,63 secondi e non ha effettuato nuove chiamate di ricerca. Dichiarare lo strumento non fa sì che il modello cerchi di nuovo.

Cosa ha provato la comunità e cosa funziona realmente

Il thread LINUX DO che ha dato origine a questo post ha attraversato la maggior parte delle solite ipotesi:

Suggerimento Aiuta? Perché
Riduci il contesto, compatta prima No La dimensione non è il trigger
Connettiti tramite IP, cambia nginx No L'errore proviene dall'upstream
Passa a WebSocket Inaffidabile Lo stesso corpo della richiesta in entrambi i casi
Accedi direttamente a ChatGPT No Anche l'accesso ufficiale fallisce
Nuova sessione, trasferisci il contesto Soluzione temporanea Si rompe di nuovo dopo una ricerca
Disabilita la ricerca web Sì, per nuove sessioni Nessuna ricerca, nessun trigger
Dichiara web_search nella richiesta Sì Soddisfa il controllo

Alcuni di questi necessitano di ulteriori spiegazioni.

Nginx e IP. I timeout e le connessioni inattive possono causare altri errori "stream disconnected", ma non possono produrre questo messaggio. I manutentori dei proxy coinvolti hanno confermato che il messaggio non è generato dal proxy; proviene dal fornitore upstream. Se il messaggio è presente, la rete ha ricevuto la richiesta e l'ha restituita.

WebSocket. Le patch del gateway che hanno funzionato dovevano coprire sia il percorso WebSocket che HTTP, perché le richieste WebSocket portano lo stesso corpo. Una sessione che "si è ripresa" dopo aver cambiato trasporto molto probabilmente non aveva alcuna ricerca nella sua cronologia.

Accesso ufficiale. I rapporti nel tracker openai/codex includono l'app desktop e codex-cli effettuando l'accesso direttamente con un account ChatGPT, senza proxy coinvolto. A partire dal 10 ottobre, né Codex 0.162.1 né le alpha 0.163.0 menzionano una correzione, e le questioni non hanno risposta da parte dei manutentori.

Cosa puoi fare ora

Disabilita la ricerca web per nuove sessioni

Disattiva la ricerca in ~/.codex/config.toml:

web_search = "disabled"

Il riferimento alla configurazione di Codex elenca quattro valori: disabled, cached (il predefinito), indexed e live. Le sessioni avviate con --yolo o un altro accesso completo predefinito sono impostate su live, quindi impostalo esplicitamente.

Applica questo a nuove sessioni. Una vecchia sessione ha già elementi web_search_call nella sua cronologia. Con la ricerca disabilitata, i turni normali smettono di dichiarare lo strumento, quindi anche quei turni potrebbero iniziare a fallire. Questo segue dalla regola sopra, ma nessuno ha ancora riportato di averlo testato.

Il costo è che Codex non può cercare sul web. Per una sessione che ha bisogno di ricerca, apri una breve sessione separata, oppure fai scrivere al modello i risultati in un file che la lunga sessione legge.

Recupera una sessione bloccata

Niente dalla tua parte farà compattare una sessione bloccata mentre il backend si comporta in questo modo. Per mantenere il lavoro:

  1. Lascia la sessione bloccata così com'è. La sua cronologia è ancora su disco sotto ~/.codex/sessions/.
  2. Avvia una nuova sessione con la ricerca web disabilitata.
  3. Puntala al file della vecchia sessione, o incolla un breve passaggio di consegne: l'obiettivo, i file modificati, le decisioni prese e cosa rimane.
  4. Non inviare più prompt alla vecchia sessione. Ogni tentativo ripete la compattazione e fallisce di nuovo.

Se gestisci il tuo gateway

La correzione che funziona segue una regola. Se input contiene un web_search_call e non è dichiarato alcuno strumento web_search*, aggiungine uno. Se il chiamante non ha dichiarato strumenti, imposta tool_choice su "none" in modo che lo strumento non possa essere eseguito. Lascia input com'è.

def declare_replayed_web_search(body: dict) -> dict:
    """Consenti all'upstream di accettare un web_search_call riprodotto in una richiesta senza strumenti."""
    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)
    # Indice cache solo: la dichiarazione esiste per soddisfare il controllo, non per cercare.
    body["tools"] = tools + [{"type": "web_search", "external_web_access": False}]
    if not caller_had_tools:
        body["tool_choice"] = "none"
    return body

Le richieste Lite delle risposte sono un'eccezione. Restituiscono un 400 se web_search si trova nei tools di primo livello. Le patch funzionanti lo mettono nel primo elemento di input additional_tools invece, e mantengono qualsiasi compaction_trigger finale. L'alternativa, rimuovere gli elementi di ricerca dalle richieste di compattazione, funziona anche, ma il riassunto perde tutto ciò che la ricerca ha trovato.

Se preferisci non dipendere dal backend in abbonamento

Tutti i rapporti che abbiamo trovato passano attraverso il backend in abbonamento di ChatGPT, l'endpoint che Codex utilizza con un accesso a ChatGPT. Le sue regole non sono documentate, e questa è cambiata senza preavviso.

Codex può anche utilizzare l'API pubblica delle Risposte con una chiave API. Non abbiamo visto rapporti di questo errore su quel percorso, ma non abbiamo nemmeno eseguito la riproduzione lì, quindi trattalo come un'osservazione, non come una garanzia. Per configurare Codex con una chiave AIHubMix, segui il tutorial di integrazione 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"

I prezzi dell'API si applicano per token, non per abbonamento. Le tariffe sono sulla pagina del modello gpt-6.1-sol.

Lista di controllo

  • Il testo dell'errore contiene "response protection is unavailable", o la compattazione fallisce con "stream closed before response.completed".
  • I turni normali funzionano ancora e solo la compattazione fallisce.
  • La sessione ha utilizzato la ricerca web a un certo punto, possibilmente senza essere stata richiesta.
  • Le nuove sessioni hanno web_search impostato su disabilitato.
  • Il lavoro bloccato è stato spostato in una nuova sessione con una nota di passaggio.
  • Un gateway che gestisci aggiunge una dichiarazione di web_search quando la cronologia contiene una ricerca.
  • Le impostazioni di rete di Nginx e proxy sono state lasciate inalterate. Non sono la causa.

FAQ

Cosa significa "response protection is unavailable" in Codex?
È un errore dal backend di Codex di ChatGPT, non da Codex stesso o dal tuo proxy. Dall'inizio di ottobre 2026 appare quando una richiesta riproduce una ricerca web precedente ma non dichiara lo strumento di ricerca web, che è esattamente ciò che fa una richiesta di compattazione.

Il mio contesto è troppo grande?
No. I tester l'hanno riprodotto con una soglia di compattazione di 2.000 token, e sessioni della stessa dimensione senza una ricerca si compattano normalmente. Sembra solo correlato alla dimensione perché la compattazione si esegue solo in lunghe sessioni.

Influisce sull'app ufficiale di Codex con un accesso a ChatGPT?
Sì. Gli utenti dell'app desktop e di codex-cli lo segnalano su accessi diretti a ChatGPT senza proxy. A partire dal 10 ottobre 2026, nessuna versione di Codex menziona una correzione.

Come posso sapere se una sessione colpirà questo problema?
Se la sessione ha utilizzato la ricerca web a un certo punto, la sua prossima compattazione fallirà molto probabilmente. Codex registra ogni ricerca come un elemento web_search_call nei file di sessione sotto la cartella .codex/sessions.

Disabilitare la ricerca web risolverà una sessione già bloccata?
Probabilmente no. La vecchia cronologia contiene ancora la ricerca, e una volta disabilitata la ricerca, i turni normali potrebbero smettere di dichiarare lo strumento e fallire anch'essi. Usa l'impostazione per nuove sessioni e sposta il lavoro.

Passare a WebSocket o cambiare nginx aiuta?
No. Il corpo della richiesta è lo stesso su entrambi i trasporti, e l'errore proviene dall'upstream, quindi le impostazioni di rete non possono rimuoverlo. Altri errori di stream possono derivare da timeout, ma non questo.

Si verifica quando Codex utilizza una chiave API invece di un abbonamento a ChatGPT?
Tutti i rapporti finora coinvolgono il backend in abbonamento. Nessuno ha segnalato questo problema sull'API pubblica delle Risposte, anche se non è stata testata direttamente.

Continua a leggere: la serie GPT-6.1 Sol

Fonti