仕組み
Codex は OpenAI Responses API を使います。opencodex は HTTP と Server-Sent Events で届く
POST /v1/responses リクエストを受け付け、同じパスの WebSocket upgrade もオプションでサポートします。
リクエストはプロバイダーの wire フォーマットに、レスポンスは再び Responses イベントに変換されるため、Codex 側は
非 OpenAI モデルと通信していることを知る必要はありません。
┌──────────────────────────── opencodex ────────────────────────────┐ │ │ Codex ──▶ │ parser ──▶ router ──▶ [vision] ──▶ adapter ──▶ provider │ ──▶ Codex (/v1/ │ │ │ │ │ │ │ (SSE / WS) responses)│ OcxParsed provider describe buildRequest parseStream │ │ Request +adapter images + fetch AdapterEvent[] │ │ │ │ │ │ [web-search loop] bridge ─▶ SSE │ └─────────────────────────────────────────────────────────────────────┘Codex 認証アカウントの選択
Section titled “Codex 認証アカウントの選択”選択されたプロバイダーが ChatGPT/Codex パススルーのとき、opencodex は上流に転送する前に保存された プールアカウントを選べます。ルールは意図的に 2 つに分かれています。
- 既存 thread ID は同じアカウントを維持します。 thread は開始時に選択されたアカウント世代に 紐付きます。そのため SSH、tmux、モバイル接続に続く長い Codex セッションは会話の途中で別アカウントに 再配分されません。
- 新規セッションは再配分できます。 新しい thread では 5 時間、週間、30 日クォータの既知の 使用量を比較し、再認証が必要またはクールダウン中のアカウントをスキップした上で、アクティブアカウントが設定した しきい値を超えると使用量のより少ない健全なアカウントに切り替えられます。
- クォータと失敗シグナルがルーティングに反映されます。 ダッシュボードは
GET /api/codex-auth/accounts?refresh=1でクォータを強制再照会できます。成功した上流 応答はクォータヘッダーを保存し、429 はアカウントをクールダウンに置き、401/403 は再認証必要状態としてマークします。
サブエージェントモデルの選択
Section titled “サブエージェントモデルの選択”新規インストールすると subagentModels のデフォルトで gpt-5.5、GPT-5.6 Sol/Terra/Luna の 3 モデル、
gpt-5.4-mini が Codex のサブエージェントピッカーに表示されます。ダッシュボードでネイティブモデルとルーティング
モデルを合わせて最大 5 つまで並び替えや入れ替えができます。v1 コラボリクエストではオプションの
injectionModel と injectionEffort を開発者メッセージに追加し、spawn_agent が使うモデルと
推論負荷を伝えます。v2 リクエストは Codex が提供するマルチエージェントガイダンスをそのまま使います。
ライフサイクル
Section titled “ライフサイクル”-
Parse —
responses/parser.tsが Zod スキーマ(responses/schema.ts)でリクエストを検証し、 これを内部OcxParsedRequestに変換します: システムプロンプト、正規化されたメッセージ一覧 (テキスト、画像、ツール呼び出し、ツール結果)、ツール定義、生成オプション、そして_webSearch(ホスト型ウェブ検索が要求された)や_structuredOutput(JSON スキーマ / JSON-objecttext.formatが設定された)のような機能フラグ。画像は実際のコンテンツパートとして保存され、 base64 テキストとしてインライン化されることはありません。 -
Route —
router.tsが固定の優先順位に従って要求されたモデル ID を設定されたプロバイダーに マッピングします: 明示的provider/model→ プロバイダーのdefaultModel→ 組み込みプレフィックスパターン (claude-、gpt-、o1-/o3-/o4-、llama-/mixtral-/gemma-) → プロバイダーのmodels[]→defaultProviderフォールバック。モデルルーティングを参照してください。 -
Authenticate —
oauthプロバイダーの場合、opencodex が新しく自動更新された access トークンを bearer キーに差し替えるため、既存のアダプターは変更なく認証されます。ChatGPT/Codex プール アカウントではcodex/auth-context.tsがまずアカウントを解決し、必要なプール認証情報がない場合は パススルーアダプターは進みません。 -
Vision サイドカー(任意) — ルーティングされたモデルが
provider.noVisionModelsに列挙されており リクエストに画像が含まれる場合、opencodex は設定された ChatGPT vision サイドカーで各画像を説明した 後テキストに置き換えます。これによりテキスト専用モデルでも該当画像を推論できます。 サイドカーを参照してください。 -
パススルーの高速経路 — Responses パススルーアダプター(
openai-responsesまたはazure-openai)では Responses 本体を維持しつつルーティングと互換性に必要な部分だけ修正します。 プロバイダー応答はAdapterEventに変換せずそのまま渡します。 -
ウェブ検索サイドカー(任意) — Codex がホスト型
web_searchを有効化したがルーティングされたモデルが OpenAI ではない場合、opencodex は合成web_searchfunction tool を公開し、モデルを小さな エージェントループで実行しながら、デフォルトのgpt-5.6-lunaを ChatGPT ログインで呼び出して実際の検索を行い、 その結果をツール結果として再注入します。 -
Compact(要求時) — Codex v1 は
POST /v1/responses/compactを呼び出し、v2 は Responses turn にcompaction_triggerを追加します。ネイティブパススルーでは上流にそのまま渡し、 ルーティングモデルではツールなしで要約を実行し Codex が要求する代替会話履歴形式を返します。 -
Adapt — それ以外の場合、選ばれたアダプターの
buildRequest()がプロバイダーのネイティブ フォーマットで上流 HTTP リクエスト(URL、ヘッダー、本体)を生成し、opencodex がこれをfetchします。 -
Bridge — アダプターの
parseStream()(またはparseResponse())が内部AdapterEventを 生成します(テキスト、推論、ツール呼び出し start/delta/end、done、error)。bridge.tsはそのストリームを 再び Responses SSE イベントに変換します —response.output_text.delta、response.reasoning_summary_text.delta、response.function_call_arguments.delta、response.completedなど。WebSocket をオンにした場合も同じイベント payload が text frame として送信されます。
なぜ Codex フォークではなくプロキシなのか?
Section titled “なぜ Codex フォークではなくプロキシなのか?”Codex は Responses API をハードコーディングしています。opencodex はプロトコル境界で変換を行うことで
Codex CLI、App、SDK を変更なくそのままサポートし、Codex の更新の影響を受けず、
Codex 自体を触らずにリクエストごとにプロバイダーを切り替えられます。この変換は双方向で
ストリーミングに忠実です: 推論要約、MCP ツール名前空間、自由形式(apply_patch)ツール、
tool_search ディスカバリがすべて正確に往復します。イベントごとのマッピングはアーキテクチャリファレンスを
参照してください。

