Xでシェア

Writing / 生成AI

N° 19

【Codex】Codex CLIをOllama・LM Studioのローカルモデルで動かす:`--oss`の設定と安全な使い方

Codex CLIの`--oss`モードを使い、OllamaまたはLM Studioのローカルモデルへ接続する方法を解説します。モデル指定、`config.toml`、`codex exec`、コンテキスト長、サンドボックス、承認ポリシーに加え、実際のファイル編集やテスト実行で起こりやすい失敗とクラウドモデルへの切り替え基準まで整理します。

1. はじめに:Codex CLIはローカルモデルでも動かせる

Codex CLIはOpenAIのクラウドモデルだけでなく、OllamaまたはLM Studioで提供するローカルモデルにも接続できます。基本形は次のとおりです。

bash
codex --oss --local-provider ollama --model <MODEL_NAME>
bash
codex --oss --local-provider lmstudio --model <MODEL_NAME>

ただし、モデル単体で会話できることと、ファイルを正しく読み、ツールを呼び出し、編集後にテストまで完了できることは別問題です。本記事では接続方法だけでなく、小規模リポジトリで編集とテストを安全に試す方法、失敗の切り分け方、クラウドモデルへ切り替える判断基準まで扱います。

2. 通常利用とローカルモデル利用の違い

通常利用では、Codex CLIがプロンプトや必要なコンテキストをOpenAIのモデルへ送り、返された判断に従ってローカルのファイル操作やコマンド実行を仲介します。

--ossを付けると、このうち推論先がOllamaまたはLM Studioへ切り替わります。リポジトリを読み、パッチを適用し、シェルを起動する主体は引き続きCodex CLIです。つまり、ローカルになるのは主にモデル推論であり、ファイル権限まで無害になるわけではありません。

flowchart LR
    accTitle: Codex CLIの推論経路
    accDescr: Codex CLIはクラウド利用ではOpenAIモデルへ接続し、ローカル利用ではOllamaまたはLM Studioを経由してローカルモデルへ接続する。ファイル操作とコマンド実行はどちらもCodex CLIが仲介する。
    Repo[作業リポジトリ] <--> CLI[Codex CLI]
    CLI -->|通常利用| OpenAI[OpenAIモデル]
    CLI -->|--oss| Provider[Ollama または LM Studio]
    Provider --> Local[ローカルモデル]
    CLI --> Tools[ファイル編集・コマンド実行]

ローカル推論とクラウド推論の構成

ローカル利用には、推論APIへコードを送らない構成を作りやすい、従量課金を気にせず反復できる、量子化やモデルを選べるという利点があります。一方で、速度、コンテキスト長、指示追従、Tool Callingの品質は手元のモデルとハードウェアに強く依存します。

なお、--ossだけで完全なオフライン性が保証されるわけではありません。Ollamaの:cloudモデル、LM Linkのリモート実行、Codexのネットワーク機能などを併用すれば通信は発生します。機密コードを扱う場合は、モデル名、サーバーの接続先、ネットワーク設定、ログやテレメトリーの方針も確認してください。

3. 事前準備と検証環境

必要なのは、Codex CLI、OllamaまたはLM Studio、ローカルで動くモデル、テスト可能な小規模Gitリポジトリです。最初から業務リポジトリへ書き込み権限を与えず、次のような検証環境を用意します。

plaintext
local-codex-demo/
├── src/
│   └── calculator.py
├── tests/
│   └── test_calculator.py
├── README.md
└── AGENTS.md

検証は「モデル単体で会話する」「読み取りだけ任せる」「変更案を出させる」「1ファイルだけ編集させる」「テストを実行させる」の順に進めます。段階を分けることで、接続障害とエージェント能力不足を混同しにくくなります。

4. コーディング向けローカルモデルの選び方

チャット性能だけでは選べない

Codexで重要なのは、コード生成能力だけではありません。複数ファイルの関係把握、制約への追従、ツール呼び出し、構造化された引数の生成、コマンド結果を踏まえた再判断が必要です。利用候補について、少なくとも次を確認します。

  • 必要なRAM・VRAMと量子化
  • 最大および実際に割り当てるコンテキスト長
  • Tool Callingと構造化出力への適性
  • コード理解・生成能力
  • チャットテンプレート
  • OllamaまたはLM Studio上の正確なモデル識別子

小型モデルは、1ファイルの説明、型ヒントやコメントの追加、単純なテスト生成、局所的なリファクタリングから試すのが現実的です。大規模な設計変更や曖昧な要件からの長時間自律実装は、接続に成功しても安定するとは限りません。

コンテキスト長が重要な理由

モデルへ渡るのはユーザーの依頼だけではありません。システム指示、AGENTS.md、読み込んだファイル、ツール引数、コマンド出力、テスト結果、会話履歴が積み上がります。

Ollamaはエージェントやコーディングツールに少なくとも64Kトークンを設定するよう案内しています。一方、LM StudioのCodex連携ガイドは約25Kを超える設定を推奨しています。ただし、コンテキストを増やすほどKVキャッシュなどに必要なメモリも増えます。最大値を機械的に選ぶのではなく、速度とメモリ使用量を観察してください。

5. Ollamaを準備する

Ollamaサーバーを起動し、使用するモデルを取得します。アプリ版では、すでにサーバーが動いている場合があります。

bash
ollama serve
ollama pull <MODEL_NAME>
ollama ls
ollama run <MODEL_NAME>

ollama lsに表示される名前をCodexの--modelへ渡します。まずollama runで、コード生成と説明が単体で成立するか確認してください。

64Kコンテキストを割り当ててサーバーを起動する例は次のとおりです。

bash
OLLAMA_CONTEXT_LENGTH=64000 ollama serve

メモリ不足や速度低下が起きたら、実際の割り当てとCPUへのオフロードを確認します。

bash
ollama ps

OllamaにはCodex用の設定を生成して起動するコマンドもあります。

bash
ollama launch codex

設定だけ行う場合は次を使用できます。

bash
ollama launch codex --config

本記事では接続先を明確にするため、以降はCodex側で--local-provider ollamaを指定します。

6. LM Studioを準備する

LM Studioでは、モデルをダウンロードしてメモリへロードし、GPU Offloadとコンテキスト長を設定します。チャット画面で単体動作を確認したら、Developer画面またはCLIからローカルサーバーを起動します。

bash
lms server start --port 1234

LM Studioの既定ポートは1234です。Codexとの接続にはOpenAI互換のPOST /v1/responsesが使われます。問題が起きたら、サーバーの起動、モデルのロード、APIリクエストの受信、指定したモデル識別子の一致をDeveloper画面で確認します。

項目

Ollama

LM Studio

主な操作

CLI中心

GUIとCLI

モデル確認

ollama ls

My Models/Developer

サーバー

アプリまたはollama serve

Developerまたはlms

向いている人

ターミナル中心で管理したい

ロード状態やメモリを画面で確認したい

7. CodexをOSSモードで起動する

プロバイダーとモデルを明示して起動します。

bash
codex --oss --local-provider ollama --model <MODEL_NAME>
bash
codex --oss --local-provider lmstudio --model <MODEL_NAME>

--model-mへ短縮できます。

bash
codex --oss --local-provider ollama -m <MODEL_NAME>

OpenAIの現行ドキュメントでは、対話モードで--ossだけを指定し、プロバイダーの既定値がない場合は選択を促されます。一方、codex execはプロバイダーを決定できないとエラー終了します。再現可能な手順やスクリプトでは--local-providerを明示するのが安全です。

モデルが見つからない場合は、表示名ではなくAPIが認識する識別子を指定しているか確認します。Ollamaではollama ls、LM StudioではDeveloper画面のモデル識別子が基準です。

8. config.tomlへ既定値を保存する

ユーザー設定は~/.codex/config.tomlに保存します。

config.tomlplaintext
oss_provider = "ollama"
model = "<MODEL_NAME>"

approval_policy = "on-request"
sandbox_mode = "workspace-write"

これで起動コマンドを短縮できます。

bash
codex --oss

LM Studioを既定にする場合はoss_provider = "lmstudio"へ変更します。コマンドライン引数は設定より優先されるため、一度だけ切り替えることも可能です。

bash
codex --oss --local-provider lmstudio --model <OTHER_MODEL>

クラウド用とローカル用を分けるなら、$CODEX_HOME/local.config.tomlを作成し、次のように選択します。

bash
codex --profile local --oss

現行のプロファイルは$CODEX_HOME/<profile-name>.config.tomlという独立ファイルです。プロバイダーを切り替えるたびに主設定を書き換える必要はありません。

9. 実践:ローカルモデルにリポジトリを操作させる

読み取りから始める

検証用リポジトリで、最初は変更を禁止します。

plaintext
このリポジトリの構成を確認してください。
まだファイルは変更せず、各ファイルの役割と改善点だけを説明してください。

存在しないファイルを作り上げていないか、変更禁止を守ったか、対象を正しく把握したかを確認します。

1ファイルだけ編集する

plaintext
src/calculator.pyだけを対象にしてください。

目的:
- 型ヒントを追加する
- docstringを追加する

禁止事項:
- 関数名と処理内容を変更しない
- 外部ライブラリを追加しない
- 他のファイルを変更しない

変更後:
- 差分を確認する
- pytestを実行する
- 変更点とテスト結果を報告する

小型モデルには、対象、目的、禁止事項、完了条件を分けて伝えます。「いい感じに改善して」のような広い依頼は、不要な変更やループを起こしやすくなります。

テストを追加させる場合も範囲を限定します。

plaintext
現在の実装を確認し、tests/test_calculator.pyに境界値テストを追加してください。
既存テストは削除しないでください。
失敗した場合は原因を説明してから修正し、再試行は2回までにしてください。

最後はCodexの説明だけを信用せず、人間側でも確認します。

bash
git status
git diff
pytest

10. codex execで非対話実行する

codex execは対話画面を開かず、明確な1タスクを実行するモードです。スクリプトやCI形式の処理に向きます。

bash
codex exec \
  --oss \
  --local-provider ollama \
  --model <MODEL_NAME> \
  "リポジトリの構成を説明してください"

LM Studioの場合もプロバイダーを置き換えるだけです。

bash
codex exec \
  --oss \
  --local-provider lmstudio \
  --model <MODEL_NAME> \
  "テストコードを確認し、不足しているケースを列挙してください"

標準入力も利用できます。

bash
cat prompt.txt | codex exec \
  --oss \
  --local-provider ollama \
  --model <MODEL_NAME> \
  -

方法

向いている場面

codex

途中で判断や差分を確認する

codex exec

境界の明確な単発処理

シェル+exec

同じ読み取り処理を反復する

CI+exec

十分検証済みの自動チェック

ローカルモデルの挙動を把握するまでは対話モードを使い、無人実行は読み取り中心から始めます。

11. 承認ポリシーとサンドボックス

サンドボックスは「技術的にどこまで操作できるか」、承認ポリシーは「どの操作で人間へ確認するか」を制御します。推論先がローカルでも、この2層は必要です。

最初は読み取り専用で確認します。

bash
codex \
  --oss \
  --local-provider ollama \
  --model <MODEL_NAME> \
  --sandbox read-only \
  --ask-for-approval on-request

編集を許可する段階では、書き込み範囲をワークスペース内に限定します。

bash
codex \
  --oss \
  --local-provider ollama \
  --model <MODEL_NAME> \
  --sandbox workspace-write \
  --ask-for-approval on-request

主なサンドボックスモードはread-onlyworkspace-writedanger-full-accessです。承認ポリシーにはuntrustedon-requestneverがあります。neverは「安全な操作だけを行う」という意味ではなく、承認を対話的に求めない設定です。

bash
codex --dangerously-bypass-approvals-and-sandbox

このオプションは承認とサンドボックスを迂回します。公式資料も隔離されたランナー内だけで使うよう警告しています。特にツール呼び出しが不安定なローカルモデルとは組み合わせないでください。

12. ローカルモデルで起こりやすい問題

問題を「Codex CLI」「APIサーバー」「モデル」「コンテキスト/メモリ」に分けると、モデル交換だけを繰り返さずに済みます。

flowchart TD
    accTitle: ローカルCodexの障害切り分け
    accDescr: Codexの失敗を、APIへ到達しない接続問題、モデル識別子やロードの問題、コンテキストとメモリの問題、ツール呼び出しや指示追従の問題へ順番に切り分ける。
    Start[失敗を再現] --> Request{APIサーバーへ
到達したか}
    Request -->|いいえ| Server[ポート・サーバー・プロバイダーを確認]
    Request -->|はい| Loaded{指定モデルが
ロードされたか}
    Loaded -->|いいえ| Model[モデル識別子とロード状態を確認]
    Loaded -->|はい| Resource{遅延・停止・
コンテキスト不足か}
    Resource -->|はい| Memory[コンテキスト・RAM・VRAM・オフロードを確認]
    Resource -->|いいえ| Tool{ツール引数や
指示を守れないか}
    Tool -->|はい| Capability[タスクを縮小しモデルやテンプレートを変更]
    Tool -->|いいえ| Logs[Codex出力・テスト・差分を調査]

ローカル実行の障害切り分け

Tool Callingが壊れる

ファイルを読まずに読んだと回答する、ツール呼び出しを通常テキストとして出す、不正なJSON引数を生成するといった症状です。Tool Callingに適したモデルを使い、1回の依頼を1〜3ファイル程度へ絞り、JSON生成とファイル編集を別タスクにします。

指示を忘れる、同じ処理を繰り返す

制約を依頼の末尾でも繰り返し、AGENTS.mdへ恒久的なルールを書きます。「テスト失敗時の再試行は2回まで。解決できなければ停止して報告」と終了条件を与えることも有効です。

大きなリポジトリを扱えない

--cdで作業ルートを限定し、最初に構成だけを説明させ、必要なファイルを人間が指定します。巨大なテストログはコンテキストを急速に消費するため、対象テストを絞ってください。

メモリ不足または極端に遅い

Ollamaではollama psでコンテキスト割り当てとCPUオフロードを確認します。LM Studioではロード設定、GPU Offload、推定メモリを確認します。別モデルの同時ロードを避け、必要ならコンテキストまたはモデルサイズを下げます。

13. クラウド版Codexとの比較

比較項目

ローカルモデル

クラウドモデル

推論場所

手元のPCまたは自前サーバー

クラウド

従量課金

通常は外部API従量課金なし

契約・利用方法による

ハードウェア依存

大きい

比較的小さい

Tool Calling

モデル次第で不安定

高性能モデルを選びやすい

長いコンテキスト

メモリ負荷が大きい

サービス仕様の範囲で利用

大規模リポジトリ

苦手になりやすい

対応しやすい

オフライン構成

可能

基本的に不可

運用負荷

モデルとサーバーを管理

比較的小さい

二者択一にする必要はありません。機密性、難易度、変更リスク、調査にかかる人間の時間で使い分けるのが現実的です。

14. ローカルモデルに向いているタスク

向いているのは、コード説明、コメントや型ヒントの追加、命名改善、小規模リファクタリング、単純なテスト生成、READMEの下書き、1〜2ファイルの差分レビュー、定型変換です。

認証・認可、DBマイグレーション、依存関係の大規模更新、本番デプロイ、インフラ変更、削除操作、セキュリティ修正、複数サービスを横断する変更は慎重に扱います。実行する場合も、読み取り、計画、編集、検証を別セッションに分け、人間が各段階を確認してください。

15. クラウドモデルへ切り替える判断基準

同じ失敗を2〜3回繰り返す、対象ファイルを特定できない、Tool Callingエラーが続く、制約を保持できない、設計判断や複雑なデバッグが必要、人間の修正コストがAI利用前より増えた場合は切り替え時です。

flowchart TD
    accTitle: モデル選択の判断フロー
    accDescr: 低リスクで範囲が小さいタスクはローカルモデルで試し、人間が差分を確認する。複雑、高リスク、大規模、または失敗を繰り返すタスクはクラウドモデルへ切り替える。
    Task[タスクを定義] --> Risk{高リスクな変更か}
    Risk -->|はい| Cloud[クラウドモデルと厳格なレビュー]
    Risk -->|いいえ| Scope{対象は少数ファイルで
要件が明確か}
    Scope -->|いいえ| Cloud
    Scope -->|はい| Local[ローカルモデルで実行]
    Local --> Review[人間が差分とテストを確認]
    Review --> Success{妥当か}
    Success -->|はい| Done[採用]
    Success -->|いいえ| Retry{失敗は2回未満か}
    Retry -->|はい| Narrow[タスクと制約を縮小]
    Narrow --> Local
    Retry -->|いいえ| Cloud

ローカルとクラウドの使い分け

実用的な役割分担は、ローカルモデルに調査、説明、小さな変更、下書きを任せ、人間が確認し、複雑な実装や最終レビューをクラウドモデルへ渡す形です。

16. まとめ

Codex CLIは--ossでローカルモデルモードを有効化し、--local-providerollamaまたはlmstudioを選択できます。--modelには各サーバーが認識するモデル識別子を指定し、oss_providerを設定すれば毎回の指定を省略できます。codex execではプロバイダー未設定がエラーになる点にも注意が必要です。

ローカル推論は、権限管理が不要になることを意味しません。最初はread-onlyon-requestで観察し、対象と完了条件を小さく保ち、差分とテストを人間が確認してください。簡単で反復的な処理はローカル、複雑または高リスクな判断はクラウドという使い分けが、現時点では最も現実的です。

次のステップ

ほかの実装記事を探す

Writing一覧から、現在の課題に近い記事を探せます。

記事一覧へ戻る