Codexの圧縮が「レスポンス保護が利用できません」で失敗する:問題はコンテキストではなくWeb検索です

AIHubMix約 8 分で読めます
Codexの圧縮が「レスポンス保護が利用できません」で失敗する:問題はコンテキストではなくWeb検索です

2026年10月8日以降、長時間のCodexセッションは圧縮を試みるとすぐに死んでしまいます。エラーは stream disconnected before completion: response protection is unavailable と表示され、再試行しても効果がなく、会話を続けることができません。ほとんどの報告はgpt-6.1-solに関するもので、gpt-6-astraやgpt-5.6-solも同様に失敗します。これは自己ホスト型プロキシの背後でも発生し、公式の Codexアプリでも直接ChatGPTにログインすると表示されます。

短い答え:コンテキストは大きすぎず、ネットワークが問題ではありません。ChatGPTのCodexバックエンドは、履歴の中で以前のWeb検索を再生するリクエストを、Web検索ツールを宣言せずに拒否します。Codexの圧縮リクエストは、まったくツールを宣言しません。したがって、セッションの初期に行った単一のWeb検索が、以降のすべての圧縮を失敗させるのです。

今すぐできること:

  • 新しいセッション:バックエンドまたはCodexが変更されるまで web_search = "disabled" に設定します。
  • スタックしたセッション:作業を新しいセッションに移動します。古いセッションは圧縮できません。
  • Codexの前に独自のゲートウェイを維持している場合:履歴に検索が含まれている場合は、Web検索の宣言を追加します。コードは以下に示します。

この投稿の残りの部分では、トリガーがどのように発見されたか、コミュニティの修正がなぜ機能しないのか、スタックしたセッションを救う方法について説明します。

失敗の様子

Codexで次のようなメッセージが表示されます:

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

2つ目のメッセージは一般的なバージョンです。Codexは常に上流のエラーを表示するわけではないため、「stream closed before response.completed」で失敗する圧縮は同じ問題である可能性があります。Codexのローカルログには、しばしば Failed to run pre-sampling compact が表示されます。

その下で、上流は2つのもののいずれかを送信します。時々、これは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ステータスのみを確認するものは、2番目の形式を見逃し、早期に終了したストリームとして報告します。

パターンはどこでも同じです:

  • 通常のターンは引き続き機能します。圧縮のみが失敗します。
  • Codexは約5回再試行し、その後あきらめます。あるゲートウェイのログでは、各失敗した試行は2〜13秒かかり、トークンはゼロでした。
  • セッションを再開すると、同じ圧縮にぶつかるため、セッションはスタックしたままです。
  • 新しいセッションは、同じ条件に達するまで機能します。

トリガー:履歴内の検索、リクエスト内の検索ツールなし

Codexには組み込みのWeb検索ツールがあります。モデルがそれを使用すると、web_search_call アイテムが会話履歴に追加されます。以降のすべてのリクエストは、その履歴を返します。

通常のターンは tools でツールを宣言するため、上流は再生された検索を受け入れます。圧縮リクエストは異なります。Codexは、tools: [] で全履歴を送信します。なぜなら、要約にはツールが必要ないからです。これは、Codexがカスタムプロバイダーのために実行するローカル圧縮や、リモート圧縮v2にも当てはまります。

10月6日頃、ChatGPT Codexバックエンドは、web_search_call を再生するリクエストを拒否し始めましたが、web_search を宣言しません。生のリクエストをキャプチャした開発者たちは、これを絞り込みました。検索アイテムのIDを変更または削除しても違いはありません。関数ツールのみを宣言しても失敗します。web_search を宣言すると、同じリクエストが成功します。

同じ結果は、公式の修正されていないcodex-cliで、ChatGPTアカウントでサインインしても表示されます。3つの検索アイテムを含む履歴は圧縮に失敗しました。同じ履歴からそれらのアイテムを削除すると、正常に圧縮されました。そのスレッドの2番目の報告者は、1つの web_search_call と tools: [] を含む圧縮リクエストをキャプチャしました。web_search の宣言を追加すると修正され、検索アイテムを削除しても同様でした。

これが、コンテキストサイズの問題のように見える理由です。圧縮は長いセッションでのみ実行され、長いセッションは、どこかの時点で検索を使用した可能性が最も高いからです。Web検索はCodexでデフォルトでオンになっているため(デフォルトモードは "cached")、セッションにはユーザーが要求していない検索が含まれている可能性があります。

証拠

少なくとも4つのグループが独立してA/Bテストを実施し、同じ結果を得ました。以下の行は、openai/codexトラッカーといくつかのオープンソースゲートウェイプロジェクトの問題トラッカーに投稿されたテストを組み合わせたものです。OpenAIはこのルールを確認しておらず、これらのスレッドには応答していません。

リクエスト履歴 宣言されたツール 結果
メッセージと推論のみ なし 完了
関数呼び出しの出力を含む なし 完了
web_search_callを含む なし 失敗
web_search_callを含む 関数ツールのみ 失敗
web_search_callを含む web_search 完了
同じ、検索アイテムを削除 なし 完了

これらのテストはサイズを除外します。あるテスターは自動圧縮の閾値を2,000トークンに設定し、-c model_auto_compact_token_limit=2000 を使用しました。ツールを使用していないセッションは正常に圧縮されました。1回検索を行ったセッションは、6回連続で失敗しました。別のテスターは、推論アイテムを削除しても効果がないことを発見しましたが、単一の検索アイテムを削除すると効果がありました。

あるテストでは、web_search を宣言したバージョンが2.63秒で完了し、新しい検索呼び出しはゼロでした。ツールを宣言することは、モデルが再度検索することを意味しません。

コミュニティが試したことと実際に機能すること

この投稿を促したLINUX DOスレッドは、ほとんどの一般的な推測を通過しました:

提案 役に立つ? 理由
コンテキストを縮小し、早めに圧縮する いいえ サイズがトリガーではありません
IPで接続し、nginxを変更する いいえ エラーは上流から来ています
WebSocketに切り替える 信頼性がない リクエストボディはどちらでも同じです
ChatGPTに直接ログインする いいえ 公式ログインも失敗します
新しいセッションを作成し、コンテキストを引き継ぐ 一時的な対策 検索後に再び壊れます
Web検索を無効にする はい、新しいセッションに対して 検索がなければ、トリガーもありません
リクエスト内でweb_searchを宣言する はい チェックを満たします

これらのいくつかは、さらに説明が必要です。

NginxとIP。 タイムアウトやアイドル接続は他の「ストリームが切断されました」エラーを引き起こす可能性がありますが、このメッセージを生成することはできません。関与するプロキシの管理者は、このメッセージがプロキシによって生成されていないことを確認しました。リクエストが通過し、戻ってきた場合、このメッセージが表示されます。

WebSocket。 機能したゲートウェイパッチは、HTTPだけでなくWebSocketパスもカバーする必要がありました。なぜなら、WebSocketリクエストは同じボディを持つからです。「回復」したセッションは、履歴に検索がなかった可能性が高いです。

公式ログイン。 openai/codexトラッカーの報告には、プロキシを介さずにChatGPTアカウントで直接サインインしたデスクトップアプリとcodex-cliが含まれています。2026年10月10日現在、Codex 0.162.1や0.163.0アルファには修正が言及されておらず、問題には管理者の応答がありません。

今できること

新しいセッションのためにWeb検索を無効にする

~/.codex/config.toml で検索をオフにします:

web_search = "disabled"

Codex設定リファレンスには、4つの値がリストされています:disabled、cached(デフォルト)、indexed、live。--yoloや他のフルアクセスサンドボックスで開始されたセッションはデフォルトでliveになりますので、明示的に設定してください。

これは新しいセッションに適用します。古いセッションにはすでにweb_search_callアイテムが履歴に含まれています。検索が無効になると、通常のターンもツールを宣言しなくなるため、それらのターンも失敗する可能性があります。これは上記のルールに従いますが、まだ誰もそれをテストしたという報告はありません。

代償は、CodexがWebを検索できなくなることです。検索が必要なセッションの場合は、別の短いセッションを開くか、モデルに結果をファイルに書き込ませて、長いセッションがそれを読み取るようにします。

スタックしたセッションを救う

バックエンドがこのように動作している間、スタックしたセッションを圧縮するためにあなたの側でできることはありません。作業を保持するために:

  1. スタックしたセッションをそのままにします。その履歴はまだ~/.codex/sessions/のディスク上にあります。
  2. Web検索を無効にした新しいセッションを開始します。
  3. 古いセッションファイルを指し示すか、短い引き継ぎを貼り付けます:目標、変更されたファイル、決定されたこと、残っていること。
  4. 古いセッションにプロンプトを送信するのをやめます。すべての試みは圧縮を再試行し、再び失敗します。

独自のゲートウェイを維持している場合

機能する修正は1つのルールに従います。input に web_search_call が含まれ、web_search* ツールが宣言されていない場合は、1つ追加します。呼び出し元がツールを宣言していない場合は、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

Responses Liteリクエストは例外です。web_search がトップレベルの tools にあると400を返します。機能するパッチは、最初の additional_tools 入力アイテムにそれを置き、最後にトリガーを保持します。代替手段として、圧縮リクエストから検索アイテムを削除することも機能しますが、その場合、要約は検索で見つかったものを失います。

サブスクリプションバックエンドに依存したくない場合

見つかったすべての報告は、ChatGPTのサブスクリプションバックエンドを通過しており、CodexがChatGPTログインで使用するエンドポイントです。そのルールは文書化されておらず、このルールは通知なしに変更されました。

Codexは、APIキーを使用して公開Responses APIも利用できます。このエラーがその経路で報告されたことはありませんが、私たちもそこで再現を行っていないため、観察として扱ってください。AIHubMixキーでCodexを設定するには、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検索を使用しましたが、要求されていない可能性があります。
  • 新しいセッションはweb_searchが無効に設定されています。
  • スタックした作業は、引き継ぎノートを持つ新しいセッションに移動されました。
  • 維持しているゲートウェイは、履歴に検索が含まれている場合にweb_search宣言を追加します。
  • Nginxとプロキシのネットワーク設定はそのままにされています。原因ではありません。

FAQ

Codexで「レスポンス保護が利用できません」とはどういう意味ですか?
これはChatGPTのCodexバックエンドからのエラーであり、Codex自体やあなたのプロキシからのものではありません。2026年10月初旬以降、以前のWeb検索を再生するリクエストがWeb検索ツールを宣言しない場合に表示されます。これは圧縮リクエストが行うことです。

私のコンテキストウィンドウは大きすぎますか?
いいえ。テスターは2,000トークンの圧縮閾値で再現し、検索なしの同じサイズのセッションは通常圧縮されます。圧縮が長いセッションでのみ実行されるため、サイズに関連しているように見えるだけです。

公式CodexアプリにChatGPTログインが影響しますか?
はい。デスクトップアプリとcodex-cliのユーザーは、プロキシなしで直接ChatGPTにログインした場合に報告しています。2026年10月10日現在、Codexのリリースには修正が言及されていません。

セッションがそれに当たるかどうかはどうやって判断できますか?
セッションがどこかの時点でWeb検索を使用した場合、次の圧縮はおそらく失敗します。Codexは各検索をセッションファイルの中の.codex/sessionsフォルダーにweb_search_callアイテムとして記録します。

すでにスタックしたセッションを無効にすることで修正できますか?
おそらく無理です。古い履歴にはまだ検索が含まれており、検索が無効になると通常のターンもツールを宣言しなくなり、失敗する可能性があります。この設定は新しいセッションに使用し、作業を移動してください。

WebSocketに切り替えることやnginxを変更することは役に立ちますか?
いいえ。リクエストボディはどちらのトランスポートでも同じで、エラーは上流から来ているため、ネットワーク設定では取り除けません。他のストリームエラーはタイムアウトから来ることがありますが、このエラーではありません。

CodexがChatGPTのサブスクリプションの代わりにAPIキーを使用する場合に発生しますか?
これまでの報告はすべてサブスクリプションバックエンドに関するものです。公開Responses APIでの報告はありませんが、直接テストされていないため、観察として扱ってください。

読み続ける:GPT-6.1 Solシリーズ

出典