Помилка стиснення Codex з повідомленням "захист відповіді недоступний": це веб-пошук, а не ваш контекст

AIHubMix8 хв читання
Помилка стиснення Codex з повідомленням "захист відповіді недоступний": це веб-пошук, а не ваш контекст

З 8 жовтня 2026 року довгі сесії Codex перестають працювати в момент, коли намагаються стиснутися. Помилка звучить як потік відключено до завершення: захист відповіді недоступний, повторні спроби не допомагають, і розмова не може продовжитися. Більшість звітів стосуються gpt-6.1-sol, але gpt-6-astra і gpt-5.6-sol зазнають тієї ж помилки. Це проявляється за самостійно розгорнутими проксі, а також у офіційному додатку Codex з прямим входом у ChatGPT.

Коротка відповідь: контекст не надто великий, і ваша мережа не є проблемою. Бекенд Codex ChatGPT тепер відхиляє будь-який запит, який відтворює попередній веб-пошук в його історії, не оголошуючи також інструмент веб-пошуку. Запит на стиснення Codex не оголошує жодних інструментів. Отже, один веб-пошук на початку сесії достатній, щоб зробити всі подальші стиснення невдалими.

Що робити прямо зараз:

  • Нові сесії: встановіть web_search = "disabled" до тих пір, поки бекенд або Codex не зміняться.
  • Застряглі сесії: перенесіть роботу в нову сесію. Стара не зможе стиснутися.
  • Якщо ви підтримуєте свій власний шлюз перед Codex: додайте оголошення веб-пошуку, коли історія містить пошук. Код наведено нижче.

У решті цього посту пояснюється, як було виявлено тригер, які виправлення спільноти не працюють і як врятувати застряглу сесію.

Як виглядає помилка

Ви побачите одне з цих повідомлень у Codex:

потік відключено до завершення: захист відповіді недоступний
Помилка при виконанні віддаленого завдання стиснення: потік відключено до завершення: потік закрито до завершення відповіді

Друге повідомлення є загальною версією. Codex не завжди показує помилку з верхнього рівня, тому стиснення, яке зазнає невдачі з "потік закрито до завершення відповіді", може бути тією ж проблемою. Локальний журнал Codex часто містить Не вдалося виконати попереднє стиснення поруч із ним.

Знизу верхній рівень надсилає одне з двох. Іноді це HTTP 502 з таким тілом, яке користувач ChatGPT Plus на gpt-6.1-sol також опублікував на форумі розробників OpenAI:

{"message": "захист відповіді недоступний", "type": "internal_error"}

Іншими разами це HTTP 200, чий потік закінчується подією response.failed з code: "upstream_error" і без response.completed. Усе, що перевіряє лише HTTP статус, пропускає другу форму і повідомляє про це як про потік, який закінчився раніше.

Шаблон однаковий скрізь:

  • Звичайні оберти продовжують працювати. Лише стиснення зазнає невдачі.
  • Codex повторює спроби близько п'яти разів, а потім здається. У журналах одного шлюзу кожна невдала спроба тривала від 2 до 13 секунд і зафіксувала нуль токенів.
  • Відновлення сесії стикається з тим же стисненням, тому сесія залишається застряглою.
  • Нова сесія працює, поки не натрапить на ті ж умови.

Тригер: пошук в історії, без інструмента пошуку в запиті

Codex має вбудований інструмент веб-пошуку. Коли модель його використовує, елемент web_search_call потрапляє в історію розмови. Кожен наступний запит надсилає цю історію назад.

Звичайні оберти оголошують інструмент у tools, тому верхній рівень приймає відтворений пошук. Запит на стиснення відрізняється. 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 Ні Помилка виникає з верхнього рівня
Перейти на WebSocket Ненадійно Тіло запиту однакове в обох випадках
Увійти в ChatGPT безпосередньо Ні Офіційний вхід також не працює
Нова сесія, передати контекст Тимчасове рішення Знову ламається після пошуку
Вимкнути веб-пошук Так, для нових сесій Без пошуку, без тригера
Оголосити web_search у запиті Так Задовольняє перевірку

Декілька з цих потребують додаткового пояснення.

Nginx і IP. Тайм-аути та бездіяльні з'єднання можуть викликати інші помилки "потік відключено", але вони не можуть викликати це повідомлення. Утримувачі проксі, які беруть участь, підтвердили, що повідомлення не генерується проксі; воно надходить від постачальника верхнього рівня. Якщо повідомлення є, мережа пройшла запит і повернулася.

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:
    """Дозволити верхньому рівню приймати відтворений 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 Responses з 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 встановлене на вимкнене.
  • Застрягла робота була перенесена в нову сесію з нотаткою про передачу.
  • Шлюз, який ви підтримуєте, додає оголошення веб-пошуку, коли історія містить пошук.
  • Nginx і налаштування мережі проксі залишилися незмінними. Вони не є причиною.

Часті запитання

Що означає "захист відповіді недоступний" у Codex?
Це помилка з бекенду Codex ChatGPT, а не з самого Codex або вашого проксі. З початку жовтня 2026 року вона з'являється, коли запит відтворює попередній веб-пошук, але не оголошує інструмент веб-пошуку, що саме і робить запит на стиснення.

Чи занадто великий мій контекст?
Ні. Тестери відтворили це з порогом стиснення 2000 токенів, а сесії того ж розміру без пошуку стиснулися нормально. Це виглядає пов'язаним з розміром лише тому, що стиснення відбувається лише в довгих сесіях.

Чи впливає це на офіційний додаток Codex з входом у ChatGPT?
Так. Користувачі настільного додатку та codex-cli повідомляють про це при прямому вході в ChatGPT без проксі. Станом на 10 жовтня 2026 року жоден реліз Codex не згадує про виправлення.

Як я можу дізнатися, чи сесія зіткнеться з цим?
Якщо сесія використовувала веб-пошук в будь-який момент, її наступне стиснення, найімовірніше, зазнає невдачі. Codex записує кожен пошук як елемент web_search_call у файлах сесії в папці .codex/sessions.

Чи виправить вимкнення веб-пошуку сесію, яка вже застрягла?
Мабуть, ні. Стара історія все ще містить пошук, і як тільки пошук вимкнено, звичайні оберти можуть перестати оголошувати інструмент і також зазнати невдачі. Використовуйте налаштування для нових сесій і перенесіть роботу.

Чи допомагає перехід на WebSocket або зміна nginx?
Ні. Тіло запиту однакове через будь-який транспорт, і помилка виникає з верхнього рівня, тому налаштування мережі не можуть її усунути. Інші помилки потоку можуть виникати через тайм-аути, але не ця.

Чи трапляється це, коли Codex використовує API-ключ замість підписки ChatGPT?
Усі звіти до цього часу стосуються підписного бекенду. Ніхто не повідомляв про це в публічному API Responses, хоча це не було протестовано безпосередньо.

Продовжуйте читати: серія GPT-6.1 Sol

Джерела