Неуспех на компактиране на Codex с "защита на отговора не е налична": това е уеб търсенето, а не вашият контекст

AIHubMix8 мин четене
Неуспех на компактиране на Codex с "защита на отговора не е налична": това е уеб търсенето, а не вашият контекст

От 8 октомври 2026 г. дългите сесии на Codex умират в момента, в който се опитват да се компактират. Грешката гласи stream disconnected before completion: response protection is unavailable, повторните опити не помагат и разговорът не може да продължи. Повечето доклади включват gpt-6.1-sol, но gpt-6-astra и gpt-5.6-sol се провалят по същия начин. Тя се появява зад самостоятелно хоствани проксита и също така се появява в официалното приложение на Codex с директен вход в ChatGPT.

Краткият отговор: контекстът не е твърде голям и вашата мрежа не е проблемът. Задният край на Codex на ChatGPT сега отхвърля всяка заявка, която възпроизвежда предишно уеб търсене в историята си, без също да декларира инструмента за уеб търсене. Заявката за компактиране на Codex не декларира никакви инструменти. Така че едно единствено уеб търсене в началото на сесията е достатъчно, за да направи всяко по-късно компактиране неуспешно.

Какво да направите в момента:

  • Нови сесии: задайте web_search = "disabled", докато задният край или Codex не се променят.
  • Заседнали сесии: прехвърлете работата в нова сесия. Старата няма да се компактира.
  • Ако поддържате собствен шлюз пред Codex: добавете декларация за уеб търсене, когато историята съдържа търсене. Кодът е по-долу.

Останалата част от този пост обяснява как е намерен тригера, кои решения на общността не работят и как да се спаси заседнала сесия.

Как изглежда неуспехът

Ще видите едно от тези в Codex:

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

Второто съобщение е общата версия. Codex не винаги показва грешката от upstream, така че компактиране, което се проваля с "stream closed before response.completed", може да е същият проблем. Локалният лог на Codex често има Failed to run pre-sampling compact до него.

Отдолу, upstream изпраща едно от двете неща. Понякога е HTTP 502 с това тяло, което потребител на ChatGPT Plus на gpt-6.1-sol също публикува в форум на разработчиците на OpenAI:

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

Друг път е HTTP 200, чийто поток завършва с response.failed събитие с code: "upstream_error" и без response.completed. Всичко, което проверява само HTTP статуса, пропуска втората форма и я отчита като поток, който е приключил преждевременно.

Шаблонът е същият навсякъде:

  • Нормалните завъртания продължават да работят. Само компактирането се проваля.
  • Codex прави около пет опита, след което се отказва. В логовете на един шлюз всеки неуспешен опит е отнел от 2 до 13 секунди и е записал нула токена.
  • Възобновяването на сесията попада на същото компактиране, така че сесията остава заседнала.
  • Нова сесия работи, докато не достигне същите условия.

Тригера: търсене в историята, без инструмент за търсене в заявката

Codex има вграден инструмент за уеб търсене. Когато моделът го използва, елемент web_search_call влиза в историята на разговора. Всяка по-късна заявка изпраща тази история обратно.

Нормалните завъртания декларират инструмента в tools, така че upstream приема възпроизведеното търсене. Заявката за компактиране е различна. Codex изпраща цялата история с tools: [], защото резюмето не се нуждае от инструменти. Това важи за локалното компактиране, което Codex изпълнява за персонализирани доставчици, и за отдалечено компактиране v2.

Около 6 октомври, задният край на Codex на ChatGPT започна да отхвърля заявки, които възпроизвеждат web_search_call, но не декларират web_search. Разработчиците, които уловиха суровите заявки, стесниха проблема. Промяната или премахването на ID на търсенето не прави разлика. Декларирането само на инструмент функция все още се проваля. Декларирането на web_search прави същата заявка успешна.

Същият резултат се появява с официалния, немодифициран codex-cli, влязъл с акаунт на ChatGPT. История с три търсения не успя да се компактира. Същата история с премахнати само тези елементи се компактира добре. Втори докладчик в тази тема улови заявка за компактиране с един web_search_call и tools: []. Добавянето на декларация за web_search я поправи, както и премахването на елемента за търсене.

Това обяснява защо изглежда като проблем с размера на контекста. Компактирането се извършва само в дълги сесии, а дългите сесии са тези, които най-вероятно са използвали търсене в някакъв момент. Уеб търсенето също е включено по подразбиране в Codex (по подразбиране режимът е "cached"), така че сесия може да съдържа търсене, за което потребителят никога не е питал.

Доказателствата

Най-малко четири групи проведоха A/B тестове независимо и получиха същия резултат. Редовете по-долу комбинират тестове, публикувани в openai/codex тракера и в проблемните тракери на няколко проекта с отворен код за шлюзове. OpenAI не е потвърдил правилото или не е отговорил в нито една от тези теми.

История на заявките Декларирани инструменти Резултат
Съобщения и разсъждения само Няма Завършва
Включва изход от функция Няма Завършва
Включва web_search_call Няма Неуспех
Включва web_search_call Само инструмент функция Неуспех
Включва web_search_call web_search Завършва
Същото, елементите за търсене премахнати Няма Завършва

Тестовете отхвърлят размера. Един тестер зададе прага за автоматично компактиране на 2000 токена с -c model_auto_compact_token_limit=2000. Сесия без използване на инструменти се компактира добре. Сесия, която е търсила веднъж, се провали шест пъти подред. Друг тестер установи, че премахването на елементи за разсъждения не помага, докато премахването на единствения елемент за търсене помогна.

В един тест версията с деклариран web_search завърши за 2.63 секунди и не направи нови търсения. Декларирането на инструмента не кара модела да търси отново.

Какво опита общността и какво всъщност работи

Темата LINUX DO, която предизвика този пост, премина през повечето обичайни предположения:

Предложение Помага? Защо
Скъсете контекста, компактирайте по-рано Не Размерът не е тригера
Свържете се по IP, променете nginx Не Грешката идва от upstream
Преминете на WebSocket Ненадеждно Същото тяло на заявката и в двата случая
Влезте директно в ChatGPT Не Официалният вход също не работи
Нова сесия, предайте контекста Временен Отново се проваля след търсене
Деактивирайте уеб търсенето Да, за нови сесии Без търсене, без тригер
Декларирайте web_search в заявката Да Удовлетворява проверката

Някои от тези нуждаят от повече обяснение.

Nginx и IP. Таймаутите и неактивните връзки могат да причинят други грешки "потокът е прекъснат", но не могат да произведат това съобщение. Поддръжниците на участващите проксита потвърдиха, че съобщението не се генерира от проксито; то идва от upstream доставчика. Ако съобщението е там, мрежата е преминала заявката.

WebSocket. Поправките на шлюза, които работеха, трябваше да покрият пътя на WebSocket, както и HTTP, защото заявките на WebSocket носят същото тяло. Сесия, която "възстанови" след смяна на транспорта, най-вероятно не е имала търсене в историята си.

Официален вход. Докладите в openai/codex тракера включват настолното приложение и codex-cli, влезли директно с акаунт на ChatGPT, без участие на прокси. Към 10 октомври, нито Codex 0.162.1, нито 0.163.0 алфите споменават поправка, а проблемите нямат отговор от поддръжка.

Какво можете да направите сега

Деактивирайте уеб търсенето за нови сесии

Изключете търсенето в ~/.codex/config.toml:

web_search = "disabled"

Референцията за конфигурация на Codex изброява четири стойности: disabled, cached (по подразбиране), indexed и live. Сесиите, стартирани с --yolo или друг режим с пълен достъп, по подразбиране са live, така че задайте го изрично.

Прилагането на това за нови сесии. Стара сесия вече има елементи web_search_call в историята си. С деактивирано търсене нормалните завъртания също спират да декларират инструмента, така че тези завъртания също могат да започнат да се провалят. Това следва от правилото по-горе, но никой не е докладвал, че е тествал това.

Цената е, че Codex не може да търси в мрежата. За сесия, която се нуждае от търсене, отворете отделна кратка сесия или накарайте модела да запише находките в файл, който дългата сесия да прочете.

Спасете заседнала сесия

Нищо от ваша страна няма да накара заседнала сесия да се компактира, докато задният край се държи по този начин. За да запазите работата:

  1. Оставете заседналата сесия така, както е. Историята й все още е на диска под ~/.codex/sessions/.
  2. Започнете нова сесия с деактивирано уеб търсене.
  3. Насочете я към файла на старата сесия или поставете кратко предаване: целта, променените файлове, взетите решения и какво остава.
  4. Спратете да изпращате подканяния към старата сесия. Всеки опит повтаря компактирането и отново се проваля.

Ако поддържате собствен шлюз

Поправката, която работи, следва едно правило. Ако input съдържа web_search_call и не е деклариран инструмент web_search*, добавете един. Ако извикващият не е декларирал инструменти, задайте tool_choice на "none", така че инструментът да не може да работи. Оставете input непроменен.

def declare_replayed_web_search(body: dict) -> dict:
    """Нека upstream приеме възпроизведен web_search_call в заявка без инструменти."""
    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)
    # Само кеширан индекс: декларацията съществува, за да задоволи проверката, а не да търси.
    body["tools"] = tools + [{"type": "web_search", "external_web_access": False}]
    if not caller_had_tools:
        body["tool_choice"] = "none"
    return body

Отговорите на Lite заявки са изключение. Те връщат 400, ако web_search е в горния ниво tools. Работещите поправки го поставят в първия елемент additional_tools на входа, а всяко последващо compaction_trigger остава последно. Алтернативата, премахването на елементите за търсене от заявките за компактиране, също работи, но резюмето след това губи каквото е намерило търсенето.

Ако предпочитате да не зависите от задния край на абонамента

Всеки доклад, който намерихме, преминава през задния край на абонамента на ChatGPT, крайна точка, която Codex използва с вход в ChatGPT. Неговите правила не са документирани и това се промени без предизвестие.

Codex може също да използва публичния API за отговори с API ключ. Не сме виждали доклад за тази грешка по този път, но не сме провеждали възпроизвеждане там сами, така че третирайте това като наблюдение, а не като гаранция. За да настроите Codex с ключ AIHubMix, следвайте урока за 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"

Цените на API важат на токен, а не на абонамент. Цените са на страницата на модела gpt-6.1-sol.

Списък за проверка

  • Текстът на грешката съдържа "защита на отговора не е налична", или компактирането се проваля с "потокът е затворен преди завършване на отговора".
  • Нормалните завъртания все още работят и само компактирането се проваля.
  • Сесията е използвала уеб търсене в някакъв момент, възможно без да бъде питана.
  • Новите сесии имат web_search зададено на деактивирано.
  • Заседналата работа е преместена в нова сесия с бележка за предаване.
  • Шлюз, който поддържате, добавя декларация за web_search, когато историята съдържа търсене.
  • Nginx и настройки на прокси мрежата са оставени сами. Те не са причината.

Често задавани въпроси

Какво означава "защита на отговора не е налична" в Codex?
Това е грешка от задния край на Codex на ChatGPT, а не от самия Codex или вашия прокси. От началото на октомври 2026 г. се появява, когато заявка възпроизвежда предишно уеб търсене, но не декларира инструмента за уеб търсене, което е точно това, което прави заявката за компактиране.

Дали контекстният ми прозорец е твърде голям?
Не. Тестерите го възпроизведоха с праг за компактиране от 2000 токена, а сесиите със същия размер без търсене се компактират нормално. Изглежда свързано с размера, защото компактирането се извършва само в дълги сесии.

Влияе ли на официалното приложение на Codex с вход в ChatGPT?
Да. Потребителите на настолното приложение и codex-cli съобщават за него при директни входове в ChatGPT без прокси. Към 10 октомври 2026 г. нито един релиз на Codex не споменава поправка.

Как мога да разбера дали една сесия ще го удари?
Ако сесията е използвала уеб търсене в някакъв момент, следващото й компактиране най-вероятно ще се провали. Codex записва всяко търсене като елемент web_search_call в файловете на сесията под папката .codex/sessions.

Ще деактивирането на уеб търсенето поправи сесия, която вече е заседнала?
Вероятно не. Старата история все още съдържа търсенето и след като търсенето е деактивирано, нормалните завъртания може да спрат да декларират инструмента и също да се провалят. Използвайте настройката за нови сесии и прехвърлете работата.

Помага ли смяната на WebSocket или промяната на nginx?
Не. Тялото на заявката е същото и при двата транспорта, а грешката идва от upstream, така че настройките на мрежата не могат да я премахнат. Други грешки на потока могат да идват от таймаути, но не и тази.

Случва ли се, когато Codex използва API ключ вместо абонамент на ChatGPT?
Всички доклади досега включват задния край на абонамента. Никой не е съобщил за него в публичния API за отговори, въпреки че това не е тествано директно.

Продължете да четете: серията GPT-6.1 Sol

Източници