Skip to content

ChatGPT / Codex

~/.codex/auth.json を再利用して Claude Code の推論を ChatGPT/Codex サブスクリプションへルーティングする — 認証、モデルスラッグ、エフォート、コンテキストウィンドウ。

Updated View as Markdown

codex プロバイダーは、マッピングされたモデルの推論を、API キーではなくあなたの ChatGPT / Codex サブスクリプションへルーティングします。Codex CLI がすでに ~/.codex/auth.json に書き込んだ認証情報を再利用するため、貼り付けるものは何もなく、トークン単位の課金もありません — リクエストはあなたの ChatGPT アカウントとして認証され、codex CLI が話すのと同じバックエンドによって応答されます。

このページはエンドツーエンドのセットアップです。各トピックを繰り返すのではなく、より深いトピックページ(Effort & ContextModel DiscoveryProviders)へリンクします。

クイックスタート

コーディングエージェントにセットアップを任せることもできます。shunt add はこのプロバイダーのセットアップ用ブループリントを出力します(オフラインかつ読み取り専用で、設定を編集するのはエージェントです。このコマンド自体は編集しません)。

shunt add upstream codex --print | claude

または、以下の手順に沿って手動で設定してください。

仕組み

codex は組み込みの kind = "responses" プロバイダーです。shunt は Claude Code の Anthropic Messages リクエストを OpenAI Responses API へ変換し、ChatGPT アカウントの Codex バックエンドへ送信し、ストリーミングされる応答を変換して返します。これを単なる OpenAI ではなく「Codex」たらしめているのは、次の 3 点です。

側面
エンドポイント <base_url>/codex/responses
認証 ~/.codex/auth.json からの ChatGPT OAuth。自動リフレッシュ
Responses の方言 Chatgpt フレーバー — codex が決して送らないパラメータ(例 max_output_tokens)を落とし、store: false を送信し、暗号化された reasoning をラウンドトリップする

この方言はプロバイダー名ではなく auth = "chatgpt_oauth" によってキー付けされます。

Codex アカウントをプールすると、成功したバックエンド応答の x-codex-* レート制限ウィンドウが管理画面の Pool health にも表示されます。約 5 時間のウィンドウは 5h、約 7 日のウィンドウは 7d に表示され、日次・月次など未対応のウィンドウは無視されます。Codex には 7d_oi 相当はありません。記録されたウィンドウはクォータを考慮したプール選択にも供給されます — Codex マルチアカウントを参照してください。

1. ログイン

Codex CLI で一度ログインします。shunt は書き込まれたファイルを読み込み、リフレッシュします — Codex 用に独自のログインを実行することはありません

codex login

これにより ~/.codex/auth.json が作成されます。そのファイルが存在しないか、トークンがないか、リフレッシュトークンが失われている場合、shunt は authentication_error を返し、再度 codex login を実行するよう伝えます。

2. プロバイダーブロック(オプション)

codex は組み込みです — 宣言する必要はありません。以下が完全なデフォルトです。部分的なテーブルは、設定したキーだけをオーバーライドします(設定マップはディープマージします)。

[providers.codex]
kind = "responses"
base_url = "https://chatgpt.com/backend-api"   # shunt appends /codex/responses
auth = "chatgpt_oauth"                          # read + auto-refresh ~/.codex/auth.json
# effort = "high"                               # optional default reasoning effort (§4)
# count_tokens = "tiktoken"                      # default; "estimate" opts out

よくあるオーバーライド: すべての Codex トラフィックに対してデフォルトの effort を固定する、または count_tokens = "estimate" を設定する。api_key_env / api_key_headerchatgpt_oauth には適用されません — 認証情報は認証ファイルから来ます。すべてのキーについては Configuration Reference を参照してください。

3. モデルを codex へルーティングする

リクエストの model id がプロバイダーを選びます。優先順位: 一致する [models.upstream_model] エントリ → 厳密な [[routes]][[route_prefixes]]server.default_provider

[[routes]]
model = "gpt-5.6-sol"        # the id Claude Code sends (see §4 below)
provider = "codex"
# upstream_model = "gpt-5.6-sol"   # optional: forward a different slug upstream
# effort = "high"                  # optional: pin effort for this route

upstream_model により、Claude Code が送る id とバックエンドが受け取るスラッグを別にできます — これは discovery エイリアスの背後にある仕組みであり、Claude Code の環境に触れずに実際のスラッグを差し替える方法でもあります。

4. Claude Code でモデルを選択する

Claude Code の /model ピッカーは claude/anthropic で始まる discovery id のみを尊重するため、生の gpt-* id には 2 つのパスのいずれかが必要です — それらは claude- プレフィックスで分かれ、重複しません。

claude-… discovery エイリアス claude- id(gpt-5.6-sol
discovery 経由の /model ピッカー ✅ 自動リスト、多数のモデル ❌ Claude Code が落とす
ANTHROPIC_CUSTOM_MODEL_OPTION ❌ 尊重されない ✅ ピッカーに追加(1 つの id)
CLAUDE_CODE_MAX_CONTEXT_TOKENS ウィンドウ ❌ 無視 → 200k ✅ 実際のウィンドウ

主なパス — スラッグをピッカーに直接追加する:

export ANTHROPIC_CUSTOM_MODEL_OPTION="gpt-5.6-sol"

その id はまさに shunt がルーティングに使うものなので、一致する [models.upstream_model] エントリ、[[routes]]、または [[route_prefixes]] ルールで解決される必要があります。これが推奨パスです — 正確なコンテキストウィンドウも設定できる唯一のパスです。代わりに複数の Codex モデルをピッカーに自動リストするには、claude- 命名の discovery エイリアスを使います(200k ウィンドウのトレードオフを受け入れる)。

サブエージェントを Codex スラッグに乗せる

サブエージェントは、メインセッションが Claude のまま残る一方で、Codex スラッグ上で走れます。model: フロントマターフィールドは任意の文字列を受け入れます(Agent/Task ツールの model パラメータとは異なり、後者は組み込みエイリアスのみを取ります)。既存のサブエージェントを gpt-5.6-sol に向けるには、その .claude/agents/<name>.md を編集し model: を設定します。

---
name: researcher
description: Deep research agent.
model: gpt-5.6-sol        # was: sonnet (or absent → inherited)
---

<the agent's system prompt — unchanged>

model オーバーライドなしでスポーンします(ツールパラメータがフロントマターより優先されます)。解決順序: CLAUDE_CODE_SUBAGENT_MODEL > ツールの model > フロントマター > inheritすべてのサブエージェントを 1 つのスラッグに強制するには、export CLAUDE_CODE_SUBAGENT_MODEL="gpt-5.6-sol" を設定します。

いずれの場合も、スラッグは一致する [models.upstream_model] エントリ、[[routes]]、または [[route_prefixes]] ルールによる明示的なルーティングが必要で、非 claude- であるため CLAUDE_CODE_ALWAYS_ENABLE_EFFORT=1CLAUDE_CODE_MAX_CONTEXT_TOKENS に従います — ウィンドウは id に自動的に追随します。

tier エイリアスを Codex へリマップする

1 つのカスタム id を追加する代わりに、Claude Code の組み込み tier エイリアスを Codex スラッグへ再度向けることで、セッション全体の tier システムをあなたの ChatGPT サブスクリプションへ解決させます (model-config 環境変数)。

環境変数 制御対象
ANTHROPIC_DEFAULT_HAIKU_MODEL haiku エイリアスとバックグラウンドの「small-fast」モデル
ANTHROPIC_DEFAULT_SONNET_MODEL sonnet エイリアス
ANTHROPIC_DEFAULT_OPUS_MODEL / ANTHROPIC_DEFAULT_FABLE_MODEL opus / fable エイリアス

2 段階のセットアップ — haiku → gpt-5.6-lunasonnet → gpt-5.6-sol:

export ANTHROPIC_DEFAULT_HAIKU_MODEL="gpt-5.6-luna"
export ANTHROPIC_DEFAULT_SONNET_MODEL="gpt-5.6-sol"

# nicer picker labels (the _NAME/_DESCRIPTION companions work on a gateway)
export ANTHROPIC_DEFAULT_SONNET_MODEL_NAME="GPT-5.6-Sol"
export ANTHROPIC_DEFAULT_SONNET_MODEL_DESCRIPTION="ChatGPT/Codex Sol via shunt"
export ANTHROPIC_DEFAULT_HAIKU_MODEL_NAME="GPT-5.6-Luna"
export ANTHROPIC_DEFAULT_HAIKU_MODEL_DESCRIPTION="ChatGPT/Codex Luna via shunt (background tier)"
# shunt.toml — both resolved ids need a route
[[routes]]
model = "gpt-5.6-luna"
provider = "codex"

[[routes]]
model = "gpt-5.6-sol"
provider = "codex"

/modelSonnet を選ぶと Codex 経由で gpt-5.6-sol が走り、すべてのバックグラウンド/haiku タスクは gpt-5.6-luna が走ります — 解決された id はまさに shunt がルーティングに使うものなので、 ANTHROPIC_CUSTOM_MODEL_OPTION は不要です。

5. 推論エフォート

エフォートは Claude Code の通常のコントロール(/effort/model のスライダー、--effort)で設定します。shunt はそれを Responses の reasoning.effort へマッピングし、max をサポートしないスラッグでは max → xhigh に折りたたみます(サポートするのは gpt-5.6 ファミリーのみ)。

完全な優先順位とエフォートの表: Effort & Context

6. コンテキストウィンドウ

Claude Code はマッピングされた id に対して、コンテキストバーを固定の 200k でサイズします。gpt-5.6-sol の実際のウィンドウは 372k です(gpt-5.5 は 272k)。したがって、非 claude- id にはこれを引き上げてください。

export CLAUDE_CODE_MAX_CONTEXT_TOKENS=372000

これはグローバル(セッションごとに 1 つの値)で、実際のウィンドウより大きく設定すると prompt is too long のオーバーフローによる無駄なやり取りが発生します — マッピングされたモデルのうち最も小さい実ウィンドウに合わせてください。shunt はそのオーバーフローを書き換えて Claude Code が自動コンパクトして再試行するようにしますが、各ラウンドトリップは無駄なレイテンシです。詳細、ライブ検証された境界、count_tokens の挙動: Effort & Context

完全な例

shunt.toml:

[server]
bind = "127.0.0.1:3001"
default_provider = "anthropic"

[providers.codex]
effort = "high"     # optional: pin high effort for all Codex traffic

[[routes]]
model = "gpt-5.6-sol"
provider = "codex"

シェル(shunt と Claude Code の両方をこれらで実行します):

codex login                                          # one-time
./target/release/shunt run                           # start the gateway

export ANTHROPIC_BASE_URL=http://127.0.0.1:3001
export ANTHROPIC_CUSTOM_MODEL_OPTION="gpt-5.6-sol"   # add to /model picker
export CLAUDE_CODE_ALWAYS_ENABLE_EFFORT=1            # let the effort slider reach Codex
export CLAUDE_CODE_MAX_CONTEXT_TOKENS=372000         # gpt-5.6-sol's real window

/model から gpt-5.6-sol を選びます。セッション内のそれ以外のすべては引き続き変更なしで Anthropic へ流れます。マッピングされたモデルの推論だけが、あなたの ChatGPT/Codex サブスクリプションによって応答されます。

ウェブ検索

Claude Code の組み込み ウェブ検索 は、追加設定なしで Codex 経路で動作します。有効にすると Claude Code はホスト型の web_search_20250305 ツールを送り、shunt はそれを Responses API のホスト型 web_search ツールとして登録します。そのため検索は、未処理のツール呼び出しとして返されるのではなく、 バックエンドで実際に実行されます。

  • ドメインフィルターはそのまま引き継がれます — Claude Code の allowed_domains / blocked_domains が Responses web_searchfilters になります。
  • codex(ChatGPT)および openai(標準 Responses)プロバイダーに適用されます。
  • xAI / Grok ルートは非対応 — Grok の Responses API は関数ツールのみを受け付けるため、shunt は ホスト型ウェブ検索ツールを削除します。ウェブ検索には codex または openai ルートを使ってください。

ツール検索

Claude Code の ツール検索 — MCP / LSP のツールスキーマを遅延させ、ToolSearch ツールで必要なときだけ 明らかにすることで、呼び出さないツールにコンテキストを使わせない機能 — も Codex 経路で動作しますが、shunt の背後では デフォルトで無効 です。有効化するには:

export ENABLE_TOOL_SEARCH=true

Claude Code は base URL がファーストパーティの Anthropic ホストでない場合、楽観的なツール検索を無効化します。 shunt はそれに該当しません。したがってこのフラグがないと、最初のターンからすべてのツールの完全なスキーマが アップストリームへ送られ、機能が無意味になります(動作はしますが、何も削減されません)。クライアント自身の 規約は、プロキシが tool_reference ブロックを転送するなら ENABLE_TOOL_SEARCH=true を設定せよ、 というものであり、shunt はこれを転送します。

有効にすると、Claude Code は遅延可能なツールをプロンプトに 名前 だけ列挙し、スキーマは保留します。shunt は まだロードされていないこれらのツールを、モデルが ToolSearch でロードするまでアップストリームのツール集合から 除外し、その結果生成される tool_reference が当該ツールの完全なスキーマを必要なときに明らかにします。これに より、遅延したスキーマが最初のターンから占有していたはずのコンテキストウィンドウを取り戻します — ツール検索の 本来の目的です。

  • shunt.toml の変更は不要です — 純粋に Claude Code の環境変数です。
  • codex(ChatGPT)および openai(標準 Responses)プロバイダーに適用されます。
  • 遅延しないツール(および上記のホスト型 web_search ツール)は常に転送されます。段階的に明らかにされるのは 遅延可能なツールだけです。

オプトインのネイティブプロトコル

上のシムは tool_reference をスキーマのテキストとしてレンダリングすることで動作します — アップストリーム のコンテキストは何も削減されず、完全なスキーマを送るタイミングを遅らせているだけです。オプトインの代替 (issue #82)として、shunt はツール検索を OpenAI Responses API 自身の ネイティブなクライアント実行 tool_search プロトコルへマッピングできます。Claude Code の ToolSearch ツールは tool_searchexecution: "client")ツールになり、その tool_usetool_search_call になり、tool_reference の結果はロードされたツールの完全なスキーマを構造化 JSON として運ぶ tool_search_output アイテムになり ます — スキーマをテキストへ折り込む代わりに、実際のツールロードのセマンティクスとキャッシュの挙動を保持 します。プロバイダーごとに有効化します:

[providers.codex]
tool_search = true

要件 — 非対応の組み合わせはエラーにならず、静かに #43 のシムのままになります:

  • アップストリームは標準の OpenAI または ChatGPT/Codex 系の Responses バックエンドである必要があります。 xAI / Grok ルートは常にシムのままです。
  • ルーティング先のモデルは gpt-5.4 以降gpt-5.4gpt-5.5、または gpt-5.6 ファミリー)である 必要があります。それより前のスラッグ(gpt-5.2 以下)は tool_search = true を設定していてもシムに フォールバックします。
  • Claude Code 側で ENABLE_TOOL_SEARCH=true は引き続き必要です — このフラグは shunt がその機能をどう アップストリームへ変換するかだけを変えるもので、Claude Code がそもそもツールを遅延させるかどうかは 変えません。

tool_search はデフォルトで false です。ネイティブな形状は、特定のバックエンドがそれを受け入れることを ライブプローブで確認するまでこのフラグの背後にゲートされているため、shunt がすべての Codex/OpenAI ルート を自動的に切り替えるのではなく、プロバイダーごとの明示的なオプトインになっています。

トラブルシューティング

症状 原因 / 対処
ChatGPT auth not found; run codex login ~/.codex/auth.json がない(または $CODEX_AUTH_FILE が違う)。codex login を実行。
ChatGPT auth tokens missing 認証ファイルが ApiKey モード — それは openai プロバイダーです。ChatGPT アカウントで再度 codex login
400 … not supported when using Codex with a ChatGPT account gpt-*-codex スラッグを使った。entitle された非 -codex スラッグを使う。
Model not found <slug> クライアントバージョンのゲーティングか entitle されていないスラッグ — models.json で確認。
gpt-* id でエフォートスライダーが無視される CLAUDE_CODE_ALWAYS_ENABLE_EFFORT=1 を設定する。または route/provider の effort オーバーライドが優先されている。
コンテキストバーが過大報告 / 早期にコンパクト CLAUDE_CODE_MAX_CONTEXT_TOKENS を設定する。discovery エイリアスはこれを取れない — 非 claude- id を使う。
Grok ルートでウェブ検索が何も返さない xAI/Grok の Responses API はウェブ検索に非対応で、shunt がツールを削除します。ウェブ検索には codex または openai ルートを使う。
ツール検索が効かない / 毎ターン全ツールのスキーマが送られる ENABLE_TOOL_SEARCH=true を設定。Claude Code はファーストパーティでない base URL の背後ではツール検索をデフォルトで無効化します。shunt は tool_reference ブロックを転送し、遅延スキーマを必要なときに明らかにします。
ツール検索を遅延だけでなく実際にコンテキスト削減したい ネイティブプロトコルのため [providers.codex]tool_search = true を設定する — 標準 OpenAI/ChatGPT-Codex 系と gpt-5.4 以降のモデルが必要。上記の ツール検索 → オプトインのネイティブプロトコル を参照。

さらに詳しくは完全な Troubleshooting リファレンスを参照してください。

Navigation

Type to search…

↑↓ navigate↵ selectEsc close