【ChatGPT】ChatGPT Desktop / CodexをAmazon Bedrock Runtime経由で使うまでにハマった話

スポンサーリンク
AWS
スポンサーリンク

東京リージョンのWindows EC2で、ChatGPT Desktop・Codexを使いたかった。ただ、OpenAIのアカウントにサインインして直接つなぐのではなく、Amazon Bedrock Runtime経由で使いたいという事情があった。EC2にはIAMロールを付与済みで、aws sts get-caller-identityでロールが取れることは確認できている。この状態から、Bedrock経由でCodexを動かすところまでの記録を残す。単に手順が成功した話ではなく、途中で出たエラーの原因を切り分けていく過程が今回の本題だ。

当初想定した構成はこうだ。

Windows EC2(東京)
    ↓
EC2 Instance Profile / IAM Role
    ↓
Codex / ChatGPT Desktop
    ↓
amazon-bedrock-runtime
    ↓
Amazon Bedrock Runtime
    ↓
global.openai.gpt-5.6-sol

最初に詰まったところ

ChatGPT Desktopをインストールして起動すると、最初はサインインを求められた。今回はOpenAIアカウントへのサインインを使わずに済ませたいので、ここでは進めずに一旦置いておく。

先にPowerShellでAWS CLIを使おうとしたところ、そもそも入っていなかった。

The term 'aws' is not recognized as the name of a cmdlet...

AWS CLIを使える状態にしたうえで、次を実行する。

aws sts get-caller-identity

EC2に割り当てているIAMロールが表示された。一方、次のコマンドは何も返さなかった。

aws configure get region

ただ今回はリージョンをCodexの設定側で明示するので、AWS CLIのデフォルトリージョンが空でも問題にはならなかった。

Codex CLIを導入する

ChatGPT Desktopを入れただけではcodexコマンドが通らなかったので、Codex CLIを別途インストールした。PowerShellで、一般的に案内されているインストールコマンドをそのまま実行しただけである。

powershell -ExecutionPolicy ByPass -c "irm https://chatgpt.com/codex/install.ps1 | iex"

最終的なバージョンは次の通り。

OpenAI Codex v0.155.0

インストール後、そのままcodexを起動してみたところ、ChatGPT Desktopのときと同じくサインインを求められた。ここでもサインインは使いたくないので、一旦Codexを閉じ、先にconfig.tomlをBedrock向けに書き換えることにした。

Bedrock Runtimeを使う設定

~/.codex/config.tomlの冒頭に次を設定した。

model = "global.openai.gpt-5.6-sol"
model_provider = "amazon-bedrock-runtime"

そして、リージョンの指定はファイルの最下部に次を追記した。

[model_providers.amazon-bedrock-runtime.aws]
region = "ap-northeast-1"

TOMLは[ ]で囲んだ行(テーブル)以降、次のテーブルが出てくるまでのkey = valueがすべてそのテーブルの中身として扱われる。今回のように既存のconfig.tomlに追記していく場合、今どのテーブルの中に書いているのかを把握しないまま最下部にそのまま追記すると、意図した場所とは違うテーブルの中に紛れ込んでしまうことがある。modelmodel_providerのようにトップレベルに置くべき設定と、[model_providers.amazon-bedrock-runtime.aws]のように特定のテーブルの中に置くべき設定を、位置がどこであっても混同しないようにする必要がある。

EC2のIAMロールを使うので、Access Key・Secret KeyやChatGPTのログイン情報は一切設定していない。Codexを起動して/statusを実行すると、次のように表示された。

Model:          global.openai.gpt-5.6-sol (reasoning low, summaries auto)
Model provider: amazon-bedrock-runtime
Codexの/statusコマンドの実行結果。Model provider がamazon-bedrock-runtimeになっている

この時点で、Codexがconfig.tomlを読み込んでBedrock Runtime providerとして起動できていることは確認できた。ここで安心してしまったのだが、実際にはまだ先があった。

最大のハマりポイント:/statusは正常なのに応答が返らない

Codexに向けて試しに「hello」と入力してみたところ、モデルから応答が返らず、次のエラーになった。

{
  "error": {
    "message": "Unsupported parameter: 'reasoning.summary' is not supported with the 'global.openai.gpt-5.6-sol' model.",
    "type": "invalid_request_error",
    "param": "reasoning.summary",
    "code": "unsupported_parameter"
  }
}
Codexで「hello」と入力した直後に表示されたreasoning.summaryのunsupported_parameterエラー

見るべきは"param":"reasoning.summary""code":"unsupported_parameter"の部分だ。IAMロールやネットワークの権限で拒否されたのではなく、リクエスト自体はBedrock側まで届いていて、そのうえでBedrock上のGPT-5.6 SolがCodexから渡されたreasoning.summaryというパラメータを拒否していた、と読める。つまり流れはこうだ。

Codex
  ↓
reasoning.summary を含めて送信
  ↓
Bedrock Runtime / GPT-5.6 Sol
  ↓
「このパラメータには対応していない」
  ↓
400 invalid_request_error
config.tomlと並べて表示したCodexの設定パネル。Model providerがamazon-bedrock-runtimeになっているが、helloに対して同じreasoning.summaryエラーが出ている

/statusの表示が正常だったからといって、実際の推論リクエストまで問題ないとは限らない。プロバイダーとしての接続確認と、実際のモデル呼び出しの互換性は別物だということを、ここで思い知った。

最初に試してうまくいかなかったこと

reasoning summaryに対応していないモデルとして扱わせようとして、次の設定を試した。

model_supports_reasoning_summaries = false

しかし今回の環境では、同じreasoning.summaryのエラーが続いた。models.jsonを自分で作ってモデルカタログを上書きする案も検討したが、これは最終的に不要だった。

最終的に効いた設定

Codex側でreasoning summaryそのものを要求しないよう、次を設定することで解決した。

model_reasoning_summary = "none"

設定ファイルに書く前に、まずCLIオプションで動作確認した。

codex exec --ephemeral --skip-git-repo-check 
  --sandbox read-only 
  --model global.openai.gpt-5.6-sol 
  --config 'model_provider="amazon-bedrock-runtime"' 
  --config 'model_providers.amazon-bedrock-runtime.aws.region="ap-northeast-1"' 
  --config 'model_reasoning_summary="none"' 
  "ツールやファイルは使わず、OKとだけ返答してください。"

実行すると、まずCodex自身がこの実行の設定を次のように表示する。

model: global.openai.gpt-5.6-sol
provider: amazon-bedrock-runtime
reasoning effort: low
reasoning summaries: none

そのうえで、プロンプトに対するモデル自身の応答として

codex
OK

が返ってきた。設定の表示と、モデルからの実際の応答は別物なので分けて書いたが、実際の画面では次のように続けて表示される。

codex exec --config で reasoning summaryをnoneに指定して実行した結果。設定の表示のあとにcodexからOKという応答が返っている

ここで初めてBedrock Runtime経由の推論に成功した。

最終的なconfig.toml

動作確認できたので、config.tomlの冒頭(トップレベル)にmodel_reasoning_summaryを追加した。

model = "global.openai.gpt-5.6-sol"
model_provider = "amazon-bedrock-runtime"
model_reasoning_summary = "none"

ファイル最下部の[model_providers.amazon-bedrock-runtime.aws]テーブルは変更していない。

[model_providers.amazon-bedrock-runtime.aws]
region = "ap-northeast-1"

ここも、model_reasoning_summaryを書く位置がトップレベルなのか、どこかのテーブルの中なのかを取り違えないよう気をつけた部分だ。今回はトップレベルの設定なので、[model_providers...]のテーブルより前に書いても後に書いても意味は変わらないが、テーブルの中に紛れ込ませてしまうと効かなくなる。

その後、通常通りcodexでCodexを起動し、「hello」と入力すると、

Hello! What would you like to work on?
config.toml反映後にCodexで「hello」と入力し、「Hello! What would you like to work on?」と正常に返答が来た画面

と正常に返ってきた。ここで重要なのは、model_reasoning_summary = "none"は推論そのものをOFFにしているわけではないという点だ。実行画面には

reasoning effort: low
reasoning summaries: none

と表示されている。つまりreasoning自体は使いつつ、Bedrock側が対応していない「reasoning summaryを返してほしい」という要求だけを送らないようにしている、ということになる。

ChatGPT DesktopでもBedrockを認識した

CLI側で正常に動くことを確認した後、ChatGPT Desktopを再起動してみた。すると、Desktop側でも同じ設定が読み込まれ、モデルプロバイダーがBedrockになっていることを確認できた。つまり今回の環境では、~/.codex/config.tomlのBedrock設定を、Codex CLIだけでなくChatGPT Desktop側でも共有して使えている。結果として、ChatGPTアカウントにサインインしてOpenAI側のモデルを使うのではなく、AWS認証とAmazon Bedrock Runtimeをモデルプロバイダーとして使う形にできた。

ChatGPT Desktopアプリの新しいチャット画面。モデルが5.6 Sol(Global)、左下にamazon-bedrock-runtimeと表示されている

画面左下にamazon-bedrock-runtimeと表示されていて、モデル選択も5.6 Sol (Global)になっている。サインインせずに、Desktopアプリの方でもBedrock経由のモデルを使えている状態だ。

今回分かったこと

  • Codex CLI v0.155.0では、amazon-bedrock-runtimeをモデルプロバイダーとして使えた
  • EC2上では、Access Keyを直接保存せず、EC2 Instance Profile / IAM Roleをそのまま使えた
  • /statusでproviderが正しく表示されていても、実際の推論リクエストではモデル固有の互換性エラーが起きることがある
  • GPT-5.6 SolをBedrock Runtime経由でCodexから使った際、reasoning.summaryunsupported_parameterになった
  • model_reasoning_summary = "none"を設定すると解決した
  • Codex CLIで成功した設定を、ChatGPT Desktop側もそのまま読み込んでBedrock providerとして使えた

参考記事

この記事を書くにあたり、Codex / ChatGPT DesktopをBedrock経由で使う設定について、次の記事を参考にした。

コメント

タイトルとURLをコピーしました