Codex Compactie Fails Met "reactiebescherming is niet beschikbaar": Het is de Webzoek, Niet Je Context

AIHubMix8 min leestijd
Codex Compactie Fails Met "reactiebescherming is niet beschikbaar": Het is de Webzoek, Niet Je Context

Sinds 8 oktober 2026 sterven lange Codex-sessies op het moment dat ze proberen te compacten. De foutmelding luidt stream disconnected before completion: response protection is unavailable, herhalingen helpen niet, en het gesprek kan niet doorgaan. De meeste meldingen hebben betrekking op gpt-6.1-sol, maar gpt-6-astra en gpt-5.6-sol falen op dezelfde manier. Het verschijnt achter zelf-gehoste proxies, en het verschijnt ook in de officiële Codex-app met een directe ChatGPT-login.

Het korte antwoord: de context is niet te groot, en je netwerk is niet het probleem. De Codex-backend van ChatGPT weigert nu elke aanvraag die een eerdere webzoekopdracht in zijn geschiedenis herhaalt zonder ook het webzoektool te verklaren. De compactieverzoek van Codex verklaart helemaal geen tools. Dus een enkele webzoekopdracht vroeg in een sessie is voldoende om elke latere compactie te laten falen.

Wat nu te doen:

  • Nieuwe sessies: stel web_search = "disabled" in totdat de backend of Codex verandert.
  • Vastgelopen sessies: verplaats het werk naar een nieuwe sessie. De oude zal niet compacten.
  • Als je je eigen gateway onderhoudt voor Codex: voeg een webzoekverklaring toe wanneer de geschiedenis een zoekopdracht bevat. De code staat hieronder.

De rest van deze post legt uit hoe de trigger is gevonden, welke community-oplossingen niet werken, en hoe je een vastgelopen sessie kunt redden.

Hoe de fout eruitziet

Je zult een van deze in Codex zien:

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

Het tweede bericht is de generieke versie. Codex toont niet altijd de upstream-fout, dus een compactie die faalt met "stream closed before response.completed" kan hetzelfde probleem zijn. De lokale log van Codex heeft vaak Failed to run pre-sampling compact ernaast.

Daaronder stuurt de upstream een van de twee dingen. Soms is het een HTTP 502 met deze body, die een ChatGPT Plus-gebruiker op gpt-6.1-sol ook heeft gepost op OpenAI's ontwikkelaarsforum:

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

Andere keren is het een HTTP 200 waarvan de stream eindigt in een response.failed gebeurtenis met code: "upstream_error" en geen response.completed. Alles wat alleen de HTTP-status controleert, mist de tweede vorm en rapporteert het als een stream die vroeg eindigde.

Het patroon is overal hetzelfde:

  • Normale beurten blijven werken. Alleen de compactie faalt.
  • Codex probeert het ongeveer vijf keer, en geeft dan op. In de logs van een gateway duurde elke mislukte poging 2 tot 13 seconden en registreerde nul tokens.
  • Het hervatten van de sessie loopt tegen dezelfde compactie aan, waardoor de sessie vast blijft zitten.
  • Een nieuwe sessie werkt totdat deze dezelfde voorwaarden tegenkomt.

De trigger: een zoekopdracht in de geschiedenis, geen zoektool in de aanvraag

Codex heeft een ingebouwd webzoektool. Wanneer het model het gebruikt, gaat een web_search_call item in de gespreksgeschiedenis. Elke latere aanvraag stuurt die geschiedenis terug.

Normale beurten verklaren de tool in tools, zodat de upstream de herhaalde zoekopdracht accepteert. Een compactieverzoek is anders. Codex stuurt de hele geschiedenis met tools: [], omdat een samenvatting geen tools nodig heeft. Dat geldt voor lokale compactie, die Codex uitvoert voor aangepaste providers, en voor remote compactie v2.

Rond 6 oktober begon de Codex-backend van ChatGPT aanvragen te weigeren die een web_search_call herhalen maar web_search niet verklaren. Ontwikkelaars die de ruwe aanvragen vastlegden, hebben het verder beperkt. Het wijzigen of verwijderen van de ID van het zoekitem maakt geen verschil. Alleen een functietool verklaren faalt nog steeds. Het verklaren van web_search laat dezelfde aanvraag slagen.

Hetzelfde resultaat verschijnt met de officiële, ongewijzigde codex-cli ingelogd met een ChatGPT-account. Een geschiedenis met drie zoekitems faalde om te compacten. Dezelfde geschiedenis met alleen die items verwijderd compactte goed. Een tweede reporter in die thread legde een compactieverzoek vast met één web_search_call en tools: []. Het toevoegen van een web_search verklaring loste het op, en dat deed ook het verwijderen van het zoekitem.

Dat verklaart waarom het lijkt op een probleem met de contextgrootte. Compactie wordt alleen uitgevoerd op lange sessies, en lange sessies zijn de sessies die het meest waarschijnlijk op een bepaald moment zoekopdrachten hebben gebruikt. Webzoek is ook standaard ingeschakeld in Codex (de standaardmodus is "cached"), zodat een sessie een zoekopdracht kan bevatten die de gebruiker nooit heeft gevraagd.

Het bewijs

Minstens vier groepen hebben onafhankelijk A/B-tests uitgevoerd en kregen hetzelfde resultaat. De rijen hieronder combineren tests die zijn gepost op de openai/codex-tracker en in de probleemtrackers van verschillende open-source gateway-projecten. OpenAI heeft de regel niet bevestigd of gereageerd in een van die threads.

Aanvraaggeschiedenis Verklaring van tools Resultaat
Berichten en redenering alleen Geen Compleet
Bevat uitvoer van functie-aanroep Geen Compleet
Bevat een web_search_call Geen Faalt
Bevat een web_search_call Alleen functietool Faalt
Bevat een web_search_call web_search Compleet
Zelfde, zoekitems verwijderd Geen Compleet

De tests sluiten grootte uit. Een tester stelde de auto-compactie drempel in op 2.000 tokens met -c model_auto_compact_token_limit=2000. Een sessie zonder toolgebruik compactte goed. Een sessie die eenmaal had gezocht faalde zes keer achter elkaar. Een andere tester ontdekte dat het verwijderen van redeneringsitems niet hielp, terwijl het verwijderen van het enkele zoekitem dat wel deed.

In één test voltooide de versie met web_search verklaard in 2,63 seconden en deed geen nieuwe zoekopdrachten. Het verklaren van de tool zorgt er niet voor dat het model opnieuw zoekt.

Wat de community heeft geprobeerd, en wat daadwerkelijk werkt

De LINUX DO-thread die deze post uitlokte, doorliep de meeste gebruikelijke gissingen:

Suggestie Helpt? Waarom
Verklein context, compacteer eerder Nee Grootte is niet de trigger
Verbind via IP, wijzig nginx Nee De fout komt van upstream
Schakel over naar WebSocket Onbetrouwbaar Dezelfde aanvraagbody in beide gevallen
Log in op ChatGPT direct Nee Officiële login faalt ook
Nieuwe sessie, geef context door Tussenoplossing Breekt opnieuw na een zoekopdracht
Schakel webzoek uit Ja, voor nieuwe sessies Geen zoekopdracht, geen trigger
Verklaar web_search in de aanvraag Ja Voldoet aan de controle

Een paar van deze hebben meer uitleg nodig.

Nginx en IP. Time-outs en inactieve verbindingen kunnen andere "stream disconnected" fouten veroorzaken, maar ze kunnen dit bericht niet genereren. Beheerders van de betrokken proxies bevestigden dat het bericht niet door de proxy wordt gegenereerd; het komt van de upstream-provider. Als het bericht er is, heeft het netwerk de aanvraag doorgestuurd en teruggekregen.

WebSocket. De gateway-patches die werkten, moesten zowel het WebSocket-pad als HTTP dekken, omdat WebSocket-aanvragen dezelfde body bevatten. Een sessie die "herstelde" na het overschakelen van transport had waarschijnlijk geen zoekopdracht in zijn geschiedenis.

Officiële login. Meldingen op de openai/codex-tracker omvatten de desktop-app en codex-cli die rechtstreeks zijn ingelogd met een ChatGPT-account, zonder proxy. Vanaf 10 oktober vermeldt geen enkele Codex-release een oplossing, en de problemen hebben geen reactie van de onderhouders.

Wat je nu kunt doen

Schakel webzoek uit voor nieuwe sessies

Schakel zoekopdracht uit in ~/.codex/config.toml:

web_search = "disabled"

De Codex-configuratiereferentie vermeldt vier waarden: disabled, cached (de standaard), indexed en live. Sessies die zijn gestart met --yolo of een andere sandbox met volledige toegang standaard op live, dus stel het expliciet in.

Pas dit toe op nieuwe sessies. Een oude sessie heeft al web_search_call items in zijn geschiedenis. Met zoekopdracht uitgeschakeld, stoppen normale beurten ook met het verklaren van de tool, zodat die beurten ook kunnen beginnen met falen. Dat volgt uit de regel hierboven, maar niemand heeft het nog getest.

De kosten zijn dat Codex niet op het web kan zoeken. Voor een sessie die zoekopdracht nodig heeft, open een aparte korte sessie, of laat het model bevindingen naar een bestand schrijven dat de lange sessie leest.

Red een vastgelopen sessie

Niets aan jouw kant zal een vastgelopen sessie laten compacten terwijl de backend zich zo gedraagt. Om het werk te behouden:

  1. Laat de vastgelopen sessie zoals deze is. De geschiedenis staat nog steeds op schijf onder ~/.codex/sessions/.
  2. Start een nieuwe sessie met webzoek uitgeschakeld.
  3. Verwijs naar het oude sessiebestand, of plak een korte overdracht: het doel, de gewijzigde bestanden, genomen beslissingen en wat er nog over is.
  4. Stop met het verzenden van prompts naar de oude sessie. Elke poging herhaalt de compactie en faalt opnieuw.

Als je je eigen gateway onderhoudt

De oplossing die werkt volgt één regel. Als input een web_search_call bevat en er geen web_search* tool is verklaard, voeg er dan een toe. Als de aanroeper geen tools heeft verklaard, stel dan tool_choice in op "none" zodat de tool niet kan draaien. Laat input met rust.

def declare_replayed_web_search(body: dict) -> dict:
    """Laat de upstream een herhaalde web_search_call in een tool-loze aanvraag accepteren."""
    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)
    # Alleen gecachte index: de verklaring bestaat om de controle te voldoen, niet om te zoeken.
    body["tools"] = tools + [{"type": "web_search", "external_web_access": False}]
    if not caller_had_tools:
        body["tool_choice"] = "none"
    return body

Responses Lite-aanvragen zijn een uitzondering. Ze retourneren een 400 als web_search in de top-level tools staat. De werkende patches plaatsen het in het eerste additional_tools inputitem in plaats daarvan, en houden eventuele achterblijvende compaction_trigger als laatste. Het alternatief, het verwijderen van zoekitems uit compactieverzoeken, werkt ook, maar de samenvatting verliest dan wat de zoekopdracht heeft gevonden.

Als je liever niet afhankelijk bent van de abonnementsbackend

Elke melding die we hebben gevonden gaat via de abonnementsbackend van ChatGPT, het eindpunt dat Codex gebruikt met een ChatGPT-login. De regels zijn niet gedocumenteerd, en deze is zonder kennisgeving veranderd.

Codex kan ook de openbare Responses API gebruiken met een API-sleutel. We hebben nog geen melding van deze fout op dat pad gezien, maar we hebben de reproductie daar ook niet zelf uitgevoerd, dus beschouw dat als een observatie, niet als een garantie. Om Codex op te zetten met een AIHubMix-sleutel, volg de Codex CLI-tutorial:

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"

API-prijzen zijn per token, niet per abonnement. Tarieven staan op de gpt-6.1-sol modelpagina.

Checklist

  • De fouttekst bevat "response protection is unavailable", of compactie faalt met "stream closed before response.completed".
  • Normale beurten werken nog steeds en alleen de compactie faalt.
  • De sessie heeft op een bepaald moment webzoek gebruikt, mogelijk zonder dat erom is gevraagd.
  • Nieuwe sessies hebben web_search ingesteld op disabled.
  • Vastgelopen werk is verplaatst naar een nieuwe sessie met een overdrachtsnotitie.
  • Een gateway die je onderhoudt voegt een web_search-verklaring toe wanneer de geschiedenis een zoekopdracht bevat.
  • Nginx- en proxy-netwerkinstellingen zijn met rust gelaten. Ze zijn niet de oorzaak.

FAQ

Wat betekent "response protection is unavailable" in Codex?
Het is een fout van de Codex-backend van ChatGPT, niet van Codex zelf of je proxy. Sinds begin oktober 2026 verschijnt het wanneer een aanvraag een eerdere webzoekopdracht herhaalt maar het webzoektool niet verklaart, wat precies is wat een compactieverzoek doet.

Is mijn contextvenster te groot?
Nee. Testers reproduceerden het met een compactiedrempel van 2.000 tokens, en sessies van dezelfde grootte zonder een zoekopdracht compacten normaal. Het lijkt alleen gerelateerd aan de grootte omdat compactie alleen wordt uitgevoerd in lange sessies.

Heeft het invloed op de officiële Codex-app met een ChatGPT-login?
Ja. Gebruikers van de desktop-app en codex-cli melden het bij directe ChatGPT-logins zonder proxy. Vanaf 10 oktober 2026 vermeldt geen enkele Codex-release een oplossing.

Hoe kan ik zien of een sessie het zal tegenkomen?
Als de sessie op enig moment webzoek heeft gebruikt, zal de volgende compactie waarschijnlijk falen. Codex registreert elke zoekopdracht als een web_search_call item in de sessiebestanden onder de .codex/sessions map.

Zal het uitschakelen van webzoek een sessie die al vastzit oplossen?
Waarschijnlijk niet. De oude geschiedenis bevat nog steeds de zoekopdracht, en zodra de zoekopdracht is uitgeschakeld, kunnen normale beurten stoppen met het verklaren van de tool en ook falen. Gebruik de instelling voor nieuwe sessies en verplaats het werk.

Helpt het overschakelen naar WebSocket of het wijzigen van nginx?
Nee. De aanvraagbody is hetzelfde over beide transporten, en de fout komt van upstream, dus netwerkinstellingen kunnen het niet verwijderen. Andere streamfouten kunnen voortkomen uit time-outs, maar niet deze.

Gebeuren deze fouten wanneer Codex een API-sleutel gebruikt in plaats van een ChatGPT-abonnement?
Alle meldingen tot nu toe hebben betrekking op de abonnementsbackend. Niemand heeft het gerapporteerd op de openbare Responses API, hoewel dat niet rechtstreeks is getest.

Blijf lezen: de GPT-6.1 Sol-serie

Bronnen