【OpenCodex ✕ Ollama】WindowsのPowerShellでshell_commandツールが落ちる問題の解決策
WindowsのPowerShell環境で、OpenCodex(Ollama経由でNemotronなどのモデルを接続)を使用している際、ローカルのシェルコマンド(shell_command)が正常に実行できずにエラーで落ちるトラブルが発生しました。
無事に解決できたので、同様の環境で困っている方向けに原因と対策を簡潔に残しておきます。
1. トラブル内容
OpenCodexからローカルのコマンド(例:python --version など)を実行しようとすると、shell_command ツールが正常に機能しません というエラーが表示され、コマンドの実行に失敗する。
2. 動作環境
-
OS: Windows (PowerShell環境)
-
クライアント: Codex + OpenCodex
-
LLM実行基盤: Ollama
-
使用モデル: Nemotron (その他、Tool Calling対応のLLM)
-
実行環境: Python 3.12.10 確認済み
3. 原因
原因は「LLMが出力するJSON引数のエスケープ不備」です。
Nemotronなどのモデルがツールを呼び出す際、Windows(PowerShell)特有の引用符(" や ')やパス区切り文字(\)の扱いを誤り、パース不可能な不正なJSONを出力してしまうことでエラーが発生していました。
4. 解決策
以下の3つの対策を行うことで、エラーを回避して正常にコマンドが通るようになります。
対策①:プロンプトで「PowerShell向けのエスケープ」を厳格に指示する
モデルがツール用に出力するJSONをPowerShellが解釈できる形式に強制するため、指示文(システムプロンプトやルールファイル)に以下の制約を明記します。
指示文の例:
「WindowsのPowerShellで実行可能な形式で、JSON引数を厳密にエスケープして出力せよ」
これにより、モデルは以下のように内部クォーテーションを正しくエスケープ(\")した厳密なJSONを出力するようになり、パースエラーを防げます。
{
"name": "shell_command",
"arguments": "{\n \"command\": \"python --version\"\n}"
}
対策②:パス区切りに「/」を使用する
Windows環境であっても、指示文の中でファイルパスを指定する際は \(バックスラッシュ)ではなく、/(フォワードスラッシュ)を使用します。
-
❌ 誤:.\src\main.py
-
⭕ 正:./src/main.py
対策③:config.tomlの設定調整
OpenCodexの config.toml や .rules ファイルに、シェル演算子(|, >, & など)への過剰なクォーテーション付与を禁止するルールを追記しておくことも有効です。
config.toml の配置場所
OpenCodexの設定ファイル(config.toml)は、OSのユーザー環境に応じて以下のディレクトリに格納されています。
- Windowsの標準的なパス:
C:\Users\<ユーザー名>.config\opencodex\config.toml
または
C:\Users\<ユーザー名>\AppData\Roaming\opencodex\config.toml
※フォルダが見つからない場合は、エクスプローラーの表示設定で「隠しファイル」にチェックを入れてください。
config.toml に追記する設定コード
エスケープ不備によるエラーを防ぐため、config.toml 内の [agent] セクション(なければ追記)に以下の設定を追加します。
[agent]
PowerShell環境向けにツール呼び出しのJSONエスケープを厳格化する指示
system_prompt_suffix = "When using the shell_command tool in a Windows PowerShell environment, you must strictly escape all double quotes within the JSON arguments (e.g., \\"). Do not double-quote shell operators like '|', '>', or '&'. Output the command exactly as it should be typed in a standard terminal."
同じ環境で shell_command が動かず困っている方は、まずプロンプトでのエスケープ指示と、パスの区切り文字(/)への変更を試してみてください。
【環境制約ルール】
-
実行環境は Windows の PowerShell です。
-
ヒアドキュメント(<< 'EOF')や、コマンドを繋ぐ '&&' や '||' などの Linux/Bash 構文は絶対に使用しないでください。
-
ファイルを作成・書き出す際は、pythonコードをヒアドキュメントで流し込むのではなく、PowerShellの「[System.IO.File]::WriteAllText」等を用いて直接BOMなしUTF-8で書き出すスクリプトを生成してください。
-
JSON引数のパースエラーを防ぐため、ファイルパスの区切り文字には必ずフォワードスラッシュ(/)を使用してください。
