はじめに
あまり明確な目的があったわけではないのですが、OCIのGenerative AIではOpenAI互換APIをサポートしていて、「Codexで使えるんじゃ」、「どこかで使い所はあるかも」というゆる〜い理由で試してみました。
結論!
以下のモデルでとりあえず動くことは確認できました。
- grok 4.2 (
xai.grok-4.20-0309-reasoning) - grok 4.3 (
xai.grok-4.3) - grok 4.6 (
xai.grok-4.6) - grok 4.7 (
xai.grok-4.7)
またGeminiについては動かすことができませんでした。
環境のイメージ
VMは東京リージョンに作成して、Generative AIはシカゴリージョンを使います。
※Grokをサポートしているリージョンであるため
OCI GenAIでOpenAI互換APIを使う設定
VMへcodexのインストール
OSは何でも良いのですが、デフォルトであるOracle Linux 9を利用します。
起動したら以下でcodexをインストールします。
sudo dnf install nodejs -y
sudo npm install -g @openai/codex
インストールが完了したらcodexを起動します。
codex
APIキーを求められるので、先ほど生成したキーをとりあえず入力します。

1を選択し、enterを入力する。codex cliの画面になるのでctrl+dで一旦終了させます。

config.tomlファイルを編集します。
vi ~/.codex/config.toml
以下の様に内容を書き換えます。
model = "xai.grok-4.7"
model_provider = "oci"
model_reasoning_effort = "xhigh"
web_search = "disabled"
[features]
multi_agent = false
daemon_auto_start = false
[model_providers.oci]
name = "OCI Generative AI"
base_url = "https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/v1"
env_key = "OCI_GENAI_API_KEY"
wire_api = "responses"
これで下準備は完了です。
codexの起動
改めてcodexを起動していきます。
まずOCI_GENAI_API_KEY環境変数に取得したAPIキーをセットします。
export OCI_GENAI_API_KEY=sk-*********eB
すでに起動しているサーバーデーモンを停止します。
codex app-server daemon stop
codexを起動します。
codex
grokが選択されていることを確認し、helloと問いかけて応答が返ってくるかを確認します。

本当にOCI GenAIを使っているのか確認する
OpenAI側を使う設定はしていないのですが、念の為、確認しておきます。
tcpdumpでOCI Generative AIへアクセスを確認
VMに対して新たにSSHでログインし、codexで生成しているところでtcpdumpを実行し、エンドポイント(inference.generativeai.us-chicago-1.oci.oraclecloud.com)にアクセスが行っていることを確認します。
HOST=inference.generativeai.us-chicago-1.oci.oraclecloud.com
getent ahosts "$HOST"
sudo tcpdump -i any -nn -tttt "host $HOST and tcp port 443"
結果の確認。64.181.150.234がエンドポイントのIPで、そことやり取りが発生していることが確認できます。
[opc@codex ~]$ HOST=inference.generativeai.us-chicago-1.oci.oraclecloud.com
[opc@codex ~]$ getent ahosts "$HOST"
64.181.150.234 STREAM inference.generativeai.us-chicago-1.oci.oraclecloud.com
64.181.150.234 DGRAM
64.181.150.234 RAW
[opc@codex ~]$ sudo tcpdump -i any -nn -tttt "host $HOST and tcp port 443"
tcpdump: data link type LINUX_SLL2
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
2026-09-27 07:33:28.982448 enp0s5 In IP 64.181.150.234.443 > 10.0.0.117.35150: Flags [P.], seq 863186597:863186921, ack 3081417031, win 732, options [nop,nop,TS val 553038360 ecr 3593109099], length 324
2026-09-27 07:33:28.982462 enp0s5 Out IP 10.0.0.117.35150 > 64.181.150.234.443: Flags [.], ack 324, win 2846, options [nop,nop,TS val 3593113678 ecr 553038360], length 0
2026-09-27 07:33:29.368663 enp0s5 In IP 64.181.150.234.443 > 10.0.0.117.35150: Flags [P.], seq 324:648, ack 1, win 732, options [nop,nop,TS val 553038747 ecr 3593113678], length 324
2026-09-27 07:33:29.368681 enp0s5 Out IP 10.0.0.117.35150 > 64.181.150.234.443: Flags [.], ack 648, win 2846, options [nop,nop,TS val 3593114064 ecr 553038747], length 0
2026-09-27 07:33:33.627708 enp0s5 In IP 64.181.150.234.443 > 10.0.0.117.35150: Flags [P.], seq 648:972, ack 1, win 732, options [nop,nop,TS val 553043006 ecr 3593114064], length 324
2026-09-27 07:33:33.627739 enp0s5 Out IP 10.0.0.117.35150 > 64.181.150.234.443: Flags [.], ack 972, win 2846, options [nop,nop,TS val 3593118323 ecr 553043006], length 0
2026-09-27 07:33:33.996098 enp0s5 In IP 64.181.150.234.443 > 10.0.0.117.35150: Flags [P.], seq 972:1296, ack 1, win 732, options [nop,nop,TS val 553043374 ecr 3593118323], length 324
2026-09-27 07:33:33.996114 enp0s5 Out IP 10.0.0.117.35150 > 64.181.150.234.443: Flags [.], ack 1296, win 2846, options [nop,nop,TS val 3593118692 ecr 553043374], length 0
2026-09-27 07:33:34.327111 enp0s5 In IP 64.181.150.234.443 > 10.0.0.117.35150: Flags [P.], seq 1296:1620, ack 1, win 732, options [nop,nop,TS val 553043705 ecr 3593118692], length 324
2026-09-27 07:33:34.327126 enp0s5 Out IP 10.0.0.117.35150 > 64.181.150.234.443: Flags [.], ack 1620, win 2846, options [nop,nop,TS val 3593119023 ecr 553043705], length 0
^C
10 packets captured
16 packets received by filter
0 packets dropped by kernel
コーディング能力を軽くチェック
grok 4.2, 4.6, 4.7でコーディング能力をチェックしてみましょう。
お題は「2D Physics Playground」です。
プロンプトは以下。
空ディレクトリから、ブラウザで動く「2D Physics Playground」を作成してください。
説明や設計だけで終わらず、必要なファイルの作成、実装、検証、修正まで行ってください。
■ 技術条件
HTML・CSS・JavaScriptとCanvas 2Dを使用する。
フレームワーク、物理エンジン、外部API、CDN、外部画像は禁止。
以下のコマンドで起動できること。
python3 -m http.server 8000
■ 基本動作
・初期画面にはボールとStartボタンを表示し、停止状態にする。
・Startを1回押すと、12個のボールが自動で動き始める。
・重力による落下、壁・床での反射、ボール同士の衝突を表示する。
・開始前の配置操作や、開始後の追加操作は不要。
・Startを連打しても処理が多重起動しない。
■ 共通初期条件
物理空間は幅960、高さ540。左上を原点とし、右・下を正方向とする。
ボールは半径18、同じ質量。
i=0~11について、初期値を次のようにする。
x = 100 + 140 * (i % 6)
y = 80 + 90 * Math.floor(i / 6)
vx = iが偶数なら90、奇数なら-90
vy = 0
長さはpx、時間は秒。重力加速度500、反発係数0.9。
乱数は使用しない。
■ 操作
・Pause/Resume:一時停止と再開。
・Reset:ボール、設定、経過時間を初期状態に戻して停止。
・重力と反発係数を変更できるスライダー。
・Canvasの空白をクリックすると、初速0のボールを追加。
・操作説明は画面内に短く表示する。
■ 見た目
ダーク背景、色分けしたボール、控えめな軌跡を使い、
完成品らしい配色・余白・文字サイズにする。
ボール数、シミュレーション経過時間、FPSを表示する。
画面サイズに合わせて表示を縮尺調整し、物理空間の大きさは変えない。
具体的な画面構成や装飾は自由に設計してよい。
■ 物理と品質
描画にはrequestAnimationFrame、物理更新には固定時間刻みを使用する。
ボール同士の衝突応答と重なり補正を実装する。
通常操作で、ボールの消失、明らかなすり抜け、不自然な加速が起きないこと。
Pause中は物理状態と経過時間を更新しない。
Reset後にStartすると、同じ初期挙動を再現すること。
■ 検証と納品
開始、一時停止、再開、リセット、衝突、スライダーを検証し、
発見した不具合を修正する。
ブラウザ操作が可能なら実際の表示と操作も確認する。
利用できない場合は、見た目や操作が未検証であることを明記する。
実行していないテストを「確認済み」と報告しない。
README.mdに起動方法、操作方法、実装概要、既知の制約を記載する。
最後に、実装した機能、実施した検証、未確認事項を簡潔に報告する。
結果
どれも一発で出力されました。
grok 4.7
grok 4.6
grok 4.3
grok 4.2
注意点
簡単な動作テストはできましたが、この構成では以下の様に注意すべき点があります。
| 項目 | OCI + Grok 4.7での制約 |
|---|---|
| コンテキストの自動圧縮 | **できない。長いセッションでauto-compactionが走るとOCI/xAIとの互換性問題で停止する。 |
| Codex内蔵Web検索 |
できない。 web_search="disabled" が必要。最新ドキュメントやWeb上の情報をCodex自身に検索させる使い方は不可。OpenAI側ではweb_searchが標準ツールとして提供されます。(OpenAI Developers) |
| Multi-agent / Subagent |
できない。 multi_agent=false が必要。複数サブエージェントに調査・実装・レビューを分担させる使い方は不可。OpenAI標準ではサブエージェントへの委譲・並列実行が可能です。(OpenAI Developers) |
| Shared app-server daemon |
現在の構成では使えない。 daemon_auto_start=false が必要。複数のCodexクライアントで共有daemonを再利用するのではなく、各codexプロセスが独立して動く。 |
/modelからGrokを選択 |
基本的にできない。 GrokはCodex標準モデルカタログに出てこないため、config.tomlまたは--modelで指定する運用になる。 |
| OpenAI固有のHosted Tool |
そのままは使えないものがある。 OCI Responses APIで公式にサポートされるtool typeは現在function / file_search / code_interpreter / mcp。Codexがweb_searchやnamespace等を送る機能は互換性エラーになる。(Oracle Docs) |
| Plugins / Apps / MCP |
全面的に使えるとはまだ言えない。 有効な状態で通常応答できることは確認済みだが、実際にツールをモデルへ公開した際にCodexがnamespace形式を生成するとOCIで失敗する可能性がある。要個別検証。 |
| Codex新機能をそのままON | 難しい。 OpenAI側に新しいtool typeやagent機能が追加されても、OCI Responses API側がその形式に対応するまでは利用できない可能性がある。 |
逆に、現時点で問題なさそうな利用としては以下のような「単一Coding Agent」としての基本操作です。
- リポジトリを読む
- ファイルを編集する
- shellコマンドを実行する
- git diffを見る
- build/testを実行する
- 結果を見て再修正する
最後に
動作することは確認できましたが、コンテキストの圧縮やWebツールなどの制約でCodexと同等の体験は難しいことがわかりました。
ある程度の範囲であれば何か良い利用用途が見つかるかもしれません。
xAI社ではGrok Buildというコーディングエージェントをリリースしているので、そちらを試してみるのが良いのかもと思いました。






