AIFreeAPI Logo

Codexを外部モデルAPIにつなぐ:MCPではなくproviderを設定する

A
8 min readAI開発ツール

外部API連携には2種類あります。モデルの通信先を変えるならMCPではなくcustom providerが対象で、Responses互換性を先に確認する必要があります。

CodexがMCPではなくprovider設定で外部モデルのResponses APIへ安全に接続する図

Codexでいう「外部API連携」は、目的を先に分ける必要があります。GitHub、データベース、社内サービスなどを道具として追加するならMCPです。一方、Codexが推論に使うモデルそのものを外部サービスへ切り替えるなら、設定するのは custom model provider です。

このページが扱うのは後者です。必要なのはAPIキーだけではありません。外部サービスがResponses APIを実装していること、その経路に実在するモデルIDを使うこと、認証方式が合うこと、ストリームが最後までCodexの期待する形式で返ることが必要です。

「OpenAI互換」という表記だけでは判定できません。/v1/chat/completionsだけを実装したサービスも同じ表現を使えますが、OpenAIの現行Configuration Referenceでは、Codexのwire_apiに指定できるのはresponsesだけです。サービス側の一次資料にResponses endpointがなければ、URLに/responsesを足して試すのではなく、提供元へ確認します。

MCPとcustom model providerを目的で分け、安全な設定、経路証明、障害切り分けまで示す全体図
MCPとcustom model providerを目的で分け、安全な設定、経路証明、障害切り分けまで示す全体図

既存環境を壊さずに試す

日常利用のOpenAIルートを残したい場合、主設定を直接置き換えるより、専用profileを作る方が戻しやすくなります。現在のAdvanced Configurationでは、~/.codex/名前.config.toml--profile 名前で重ねられます。

~/.codex/third-party.config.tomlを作り、サービス固有の値だけを入れます。

toml
model = "provider-model-id" model_provider = "acme" [model_providers.acme] name = "Acme Model API" base_url = "https://api.example.com/v1" env_key = "ACME_API_KEY" wire_api = "responses"

provider-model-idとURLは説明用です。利用するサービスのResponses文書にある値へ置き換えてください。acmeはローカルで決めるIDですが、上のmodel_providerとテーブル名を一致させます。openaiollamalmstudioは予約済みなので、custom provider名として上書きできません。

このブロックをrepository内の.codex/config.tomlへ置かない点も重要です。providerと認証はmachine-local設定であり、Codexはproject設定にあるmodel_providermodel_providersを無視します。チームへ共有すべきなのは「どのproviderを使うか」という秘密付き設定ではなく、必要なら公開可能なセットアップ説明と適用条件です。

APIキーは値ではなく参照先を書く

env_key = "ACME_API_KEY"は、Codexがその名前の環境変数からキーを読む指定です。TOMLへ本物のキーを書く行ではありません。

macOS、Linux、WSLでは同じshellから起動します。

bash
export ACME_API_KEY="実際のキー" codex --profile third-party

PowerShellの現在のセッションなら次の形です。

powershell
$env:ACME_API_KEY = "実際のキー" codex --profile third-party

公式リファレンスにはexperimental_bearer_tokenもありますが、直接tokenを置く方法は非推奨で、env_keyが案内されています。キーをdotfiles repository、サンプル.env、画面共有、エラーログへ残さないでください。

CLIでは動くのにDesktopやIDE extensionではキーが見つからない場合、URLより先に起動環境を確認します。Dockやスタートメニューから起動したprocessは、別のterminalで一時的にexportした値を引き継がないことがあります。独自headerやquery parameterが必要なproviderでは、その一次資料に従ってenv_http_headershttp_headersquery_paramsを使い、他社の認証例を流用しません。

成功判定は画面とprovider側の両方で行う

MCPとproviderの目的分岐、Responses互換性の一次資料確認、両端の証拠をまとめた最短判断フロー
MCPとproviderの目的分岐、Responses互換性の一次資料確認、両端の証拠をまとめた最短判断フロー

起動時に外部モデル名が表示されても、それはprofileを読めた証拠にすぎません。通信先の証拠にはなりません。最初は機密ファイルのない空directoryで起動し、ファイル操作やtoolを必要としない固定の短文だけを返させます。

次の3点が一致したときに、基本ルートが成立したと判断できます。

  • Codexの現在sessionが意図したモデルIDを示す。
  • 短い応答がstream errorや再接続なしで完了する。
  • providerまたはgatewayのdashboardに、同時刻・同モデルのrequest、status、usageが現れる。

request IDがある場合は時刻と一緒に記録します。キーや不要なprompt本文は記録しません。providerがモデルaliasを書き換える場合もあるため、Codex側の表示とprovider側の実績を照合することに意味があります。

たとえばDeepSeekは、現在の公式Codex接続文書でResponses形式のネイティブ対応と自社モデル設定を説明しています。これはDeepSeek経路の根拠です。別のgatewayが同じ「OpenAI互換」を掲げていても、同等の証明にはなりません。

エラーを変更箇所へ戻す

症状まず疑う境界確認すること
設定keyが不明、TOML parse errorCodex versionまたは構文codex --version、table名、引用符、現行reference
環境変数がない起動process同じshellからの起動、Desktop/IDEの環境変数
401 / 403key、header、account/project権限provider consoleのkey状態とモデル権限
404 / model not foundbase URLまたはモデル対応Responsesの正確なpathとprovider model ID
接続後すぐparse errorresponse形式Chat Completions-only endpointを止める
途中で停止、reconnectを繰り返すSSE、proxy timeout、upstream切断時刻とrequest IDを両側logで照合
429provider、gateway、モデル上限statusを返した系統の残高・rate limit

429が確定した場合はCodex 429の診断、長く止まる場合はCodexタイムアウトの切り分けを使えます。設定が反映されない場合はconfig.tomlの優先順位と境界を確認します。

短いtextが成功しても、機能が同等とは限りません。custom providerのstandalone web searchは既定でfalseで、flagだけではprovider endpoint、model、runtime、policyの不足を補えません。画像入力、tool call、reasoning summary、WebSocket、plugin、cloud機能も、実際に必要なものだけ個別に確認します。

第三者routeの請求、rate limit、保存方針、地域、supportはそのproviderが所有します。ChatGPTの契約残量は第三者の残量を示しません。元へ戻すときはcustom sessionを終了し、--profile third-partyを付けずに起動します。主設定へコピーした場合も、追加したmodelmodel_provider、該当provider tableだけを削除します。~/.codex全体を消すと、無関係な認証、MCP、rules、historyまで失われます。