- OpenClaw ツールは直接注入されませんが、
bundleMcp: trueのバックエンドは loopback MCP ブリッジを通じて Gateway ツールを受け取れます。 - 対応する CLI 向けの JSONL ストリーミング。
- セッションに対応しているため、後続ターンの一貫性が保たれます。
- CLI が画像パスを受け付ける場合、画像はそのまま渡されます。
クイックスタート
バンドルされた Anthropic Plugin はデフォルトのclaude-cli バックエンドを登録するため、Claude Code がインストール済みでログイン済みであれば、追加設定なしで動作します。
main はデフォルトのエージェント ID です。それ以外の場合は、自分のエージェント ID に置き換えてください。
Gateway が最小限の PATH で launchd/systemd の下で動作している場合は、バイナリを明示的に指定します。
agents.defaults.cliBackends の下でそのバックエンドを参照していると、OpenClaw は所有元のバンドル済み Plugin を自動読み込みします。
フォールバックとして使う
CLI バックエンドをフォールバックリストに追加すると、主モデルが失敗した場合にのみ実行されます。agents.defaults.models を許可リストとして使う場合は、CLI バックエンドモデルもそこに含めてください。主プロバイダーが失敗した場合(認証、レート制限、タイムアウト)、OpenClaw は次に CLI バックエンドを試します。
設定
すべての CLI バックエンドはagents.defaults.cliBackends の下にあり、プロバイダー ID(例: claude-cli, my-cli)をキーにします。プロバイダー ID はモデル参照の左側になります: <provider>/<model>。
仕組み
- プロバイダープレフィックス(
claude-cli/...)でバックエンドを選択します。 - 同じ OpenClaw プロンプトとワークスペースコンテキストを使ってシステムプロンプトを構築します。
- セッション ID(対応している場合)を指定して CLI を実行し、履歴の一貫性を保ちます。バンドル済みの
claude-cliバックエンドは、OpenClaw セッションごとに Claude stdio プロセスを生かし続け、後続ターンを stream-json stdin 経由で送信します。 - 出力(JSON またはプレーンテキスト)を解析し、最終テキストを返します。
- バックエンドごとにセッション ID を永続化し、後続ターンが同じ CLI セッションを再利用できるようにします。
Claude CLI の詳細
バンドル済みのclaude-cli バックエンドは、Claude Code のネイティブ Skills リゾルバーを優先します。現在の Skills スナップショットに、実体化されたパスを持つ選択済み Skills が少なくとも 1 つある場合、OpenClaw は --plugin-dir 経由で一時的な Claude Code Plugin を渡し、追加されるシステムプロンプトから重複する OpenClaw Skills カタログを省略します。実体化された Plugin Skills がない場合、OpenClaw はフォールバックとしてプロンプトカタログを保持します。Skills の env/API キー上書きは、その実行の子プロセス環境にも引き続き適用されます。
Claude CLI には独自の非対話型権限モードがあります。OpenClaw は Claude 固有の設定を追加する代わりに、それを既存の exec ポリシーにマップします。OpenClaw 管理の Claude ライブセッションでは、有効な exec ポリシーが authoritative です。YOLO(tools.exec.security: "full" と tools.exec.ask: "off")では Claude を --permission-mode bypassPermissions で起動し、制限的なポリシーでは --permission-mode default で起動します。エージェント単位の agents.list[].tools.exec 設定は、そのエージェントのグローバルな tools.exec を上書きします。生のバックエンド引数に --permission-mode が含まれていても、Claude のライブ起動ではそのフラグを有効なポリシーに一致するよう正規化します。
このバックエンドは OpenClaw の /think レベルも Claude Code のネイティブな --effort フラグにマップします。minimal/low -> low、adaptive/medium -> medium となり、high/xhigh/max はそのまま渡されます。他の CLI バックエンドで /think が生成される CLI に影響するには、所有元 Plugin が同等の argv マッパーを宣言する必要があります。
OpenClaw が claude-cli を使う前に、同じホスト上で Claude Code 自体がログイン済みである必要があります。
claude バイナリがまだ PATH 上にない場合にのみ、agents.defaults.cliBackends.claude-cli.command を設定してください。
セッション
- CLI がセッションに対応している場合は、
sessionArg(例:--session-id)を設定します。ID を複数のフラグに入れる必要がある場合は、sessionArgs(プレースホルダー{sessionId})を設定します。 - CLI が異なるフラグの resume サブコマンドを使う場合は、
resumeArgs(再開時にargsを置き換える)を設定し、必要に応じて非 JSON 再開用にresumeOutputを設定します。 sessionMode:always: 常にセッション ID を送信します(保存済みがなければ新しい UUID)。existing: 以前に保存されたセッション ID がある場合のみ送信します。none: セッション ID を送信しません。
claude-cliはデフォルトでliveSession: "claude-stdio"、output: "jsonl"、input: "stdin"になるため、トランスポートフィールドを省略したカスタム設定を含め、アクティブな間は後続ターンがライブ Claude プロセスを再利用します。Gateway が再起動した場合、またはアイドルプロセスが終了した場合、OpenClaw は保存済みの Claude セッション ID から再開します。保存済みセッション ID は、再開前に読み取り可能なプロジェクトトランスクリプトに照合して検証されます。トランスクリプトがない場合は、--resumeの下で暗黙に新規セッションを開始するのではなく、バインディングをクリアします(reason=transcript-missingとしてログ記録)。- Claude ライブセッションは、デフォルトでターンごとに 8 MiB と 20,000 行の生 JSONL 出力ガードを維持します。バックエンドごとに
agents.defaults.cliBackends.claude-cli.reliability.outputLimits.maxTurnRawCharsとmaxTurnLinesで引き上げられます。OpenClaw はこれらの設定を 64 MiB と 100,000 行にクランプします。 - 保存済み CLI セッションは、プロバイダー所有の継続性です。暗黙の日次セッションリセットでは切断されません。
/resetと明示的なsession.resetポリシーでは引き続き切断されます。 - 新しい CLI セッションは通常、OpenClaw の Compaction サマリーと Compaction 後の末尾だけから再シードします。Compaction 前に無効化された短いセッションを復旧するには、バックエンドが
reseedFromRawTranscriptWhenUncompacted: trueでオプトインできます。生トランスクリプトの再シードは、CLI トランスクリプトの欠落、孤立した tool-use 末尾、メッセージポリシー/システムプロンプト/cwd/MCP の変更、またはセッション期限切れリトライなど、安全な無効化に限定され、範囲も制限されます。認証プロファイルまたは認証情報 epoch の変更では、生トランスクリプト履歴は決して再シードされません。
serialize: true は同一レーンの実行順序を保ちます(ほとんどの CLI は 1 つのプロバイダーレーン上でシリアライズします)。OpenClaw は、選択された認証 ID が変わった場合にも保存済み CLI セッションの再利用を破棄します。これには、認証プロファイル ID、静的 API キー、静的トークン、または CLI が公開している場合の OAuth アカウント ID の変更が含まれます。OAuth アクセス/リフレッシュトークンのローテーションだけではセッションは切断されません。CLI に安定した OAuth アカウント ID がない場合、OpenClaw はその CLI 自身に再開権限の適用を任せます。
claude-cli セッションからのフォールバック前置き
claude-cli の試行が agents.defaults.model.fallbacks 内の非 CLI 候補にフェイルオーバーした場合、OpenClaw は Claude Code のローカル JSONL トランスクリプト(~/.claude/projects/ 配下、ワークスペースごとにキー付け)から収集したコンテキスト前置きで次の試行をシードします。このシードがないと、claude-cli 実行では OpenClaw 自身のセッショントランスクリプトが空のため、フォールバックプロバイダーはコールドスタートします。
- 前置きは最新の
/compactサマリーまたはcompact_boundaryマーカーを優先し、その後、文字数予算まで境界後の最新ターンを追加します。境界前のターンは、すでにサマリーで表現されているため破棄されます。 - ツールブロックは、プロンプト予算を正直に保つため、コンパクトな
(tool call: name)と(tool result: …)ヒントに統合されます。大きすぎるサマリーは切り詰められ、(truncated)とラベル付けされます。 - 同一プロバイダーの
claude-cliからclaude-cliへのフォールバックは、Claude 自身の--resumeに依存し、前置きをスキップします。 - このシードは既存の Claude セッションファイルパス検証を再利用するため、任意のパスを読み取ることはできません。
画像
CLI が画像パスを受け付ける場合は、imageArg を設定します。
imageArg が設定されている場合、それらのパスは CLI 引数として渡されます。設定されていない場合、OpenClaw はファイルパスをプロンプトに追加します(パス注入)。これは、プレーンなパスからローカルファイルを自動読み込みする CLI で機能します。
入力と出力
output: "text"(デフォルト)は stdout を最終応答として扱います。output: "json"は JSON の解析を試み、テキストとセッション ID を抽出します。output: "jsonl"は JSONL ストリームを解析し、最終エージェントメッセージと、存在する場合はセッション識別子を抽出します。- Gemini CLI の JSON 出力では、
usageがないか空の場合、OpenClaw は返信テキストをresponseから、使用量をstatsから読み取ります。バンドル済み Gemini CLI のデフォルトはstream-jsonを使います。古い--output-format json上書きは引き続き JSON パーサーを使います。
input: "arg"(デフォルト)はプロンプトを最後の CLI 引数として渡します。input: "stdin"は stdin 経由でプロンプトを送信します。- プロンプトが非常に長く、
maxPromptArgCharsが設定されている場合は、代わりに stdin が使われます。
Plugin 所有のデフォルト
CLI バックエンドのデフォルトは Plugin サーフェスの一部です。- Plugin は
api.registerCliBackend(...)でそれらを登録します。 - バックエンドの
idはモデル参照内のプロバイダープレフィックスになります。 agents.defaults.cliBackends.<id>のユーザー設定は、引き続き Plugin デフォルトを上書きします。- バックエンド固有の設定クリーンアップは、任意の
normalizeConfigフックを通じて Plugin 所有のままです。
claude-cli を所有し、Google は google-gemini-cli を所有します。OpenAI Codex エージェント実行は、openai/* を通じて Codex app-server ハーネスを使います。OpenClaw はバンドル済みの codex-cli バックエンドを登録しなくなりました。
バンドル済み Anthropic Plugin は claude-cli 向けに次を登録します。
| Key | Value |
|---|---|
command | claude |
args | -p --output-format stream-json --include-partial-messages --verbose --setting-sources user --allowedTools mcp__openclaw__* --disallowedTools ScheduleWakeup,CronCreate,Bash(run_in_background:true),Monitor |
output | jsonl |
input | stdin |
modelArg | --model |
sessionArg | --session-id |
sessionMode | always |
imageArg | @ |
imagePathScope | workspace |
systemPromptFileArg | --append-system-prompt-file |
systemPromptMode | append |
google-gemini-cli 用に登録されます。
| Key | Value |
|---|---|
command | gemini |
args | --skip-trust --approval-mode auto_edit --output-format stream-json --prompt {prompt} |
resumeArgs | 同じ、--resume {sessionId} を付加 |
output / resumeOutput | jsonl |
jsonlDialect | gemini-stream-json |
imageArg | @ |
imagePathScope | workspace |
modelArg | --model |
sessionMode | existing |
sessionIdFields | ["session_id", "sessionId"] |
PATH 上に gemini として存在している必要があります(brew install gemini-cli または npm install -g @google/gemini-cli)。
Gemini CLI 出力に関する注記:
- デフォルトの
stream-jsonパーサーは、アシスタントのmessageイベント、ツールイベント、最終resultの使用量、致命的な Gemini エラーイベントを読み取ります。 - Gemini の引数を
--output-format jsonに上書きした場合、OpenClaw はそのバックエンドをoutput: "json"に正規化し、JSON のresponseフィールドから返信テキストを読み取ります。 usageが存在しないか空の場合、使用量はstatsにフォールバックします。stats.cachedは OpenClaw のcacheReadに正規化され、stats.inputが欠落している場合、入力トークンはstats.input_tokens - stats.cachedから導出されます。
command パスです)。
テキスト変換オーバーレイ
小さなプロンプト/メッセージ互換シムが必要な Plugin は、プロバイダーや CLI バックエンドを置き換えずに双方向テキスト変換を宣言できます。input は、CLI に渡されるシステムプロンプトとユーザープロンプトを書き換えます。output は、OpenClaw が独自の制御マーカーとチャネル配信を処理する前に、ストリーミングされたアシスタントテキストと解析済みの最終テキストを書き換えます。プロバイダーに基づくモデル呼び出しでは、ストリーム修復後かつツール実行前に、構造化ツール呼び出し引数内の文字列値も復元します。生のプロバイダー JSON フラグメントは変更されません。コンシューマーは、構造化された partial、end、または result ペイロードを使用する必要があります。
プロバイダー固有の JSONL イベントを発行する CLI では、そのバックエンドの設定で jsonlDialect を設定してください。Claude Code 互換ストリームには claude-stream-json、Gemini CLI の stream-json イベントには gemini-stream-json を使用します。
ネイティブ Compaction の所有権
一部の CLI バックエンドは独自のトランスクリプトを圧縮するエージェントを実行するため、OpenClaw はそれらに対して保護用サマライザーを実行してはいけません。そうするとバックエンド自身の Compaction と競合し、ターンがハード失敗する可能性があります。claude-cli にはハーネスエンドポイントがないため(Claude Code は内部で圧縮します)、ownsNativeCompaction: true を宣言し、OpenClaw の Compaction パスはセッションエントリを変更せずに返します。Codex などのネイティブハーネスセッションは、引き続きハーネスの Compaction エンドポイントにルーティングされます。
ownsNativeCompaction は、実際に Compaction を所有するバックエンドにのみ宣言してください。そのバックエンドは、コンテキストウィンドウ付近で自身のトランスクリプトを確実に制限し、再開可能なセッション(例: --resume / --session-id)を永続化する必要があります。そうでない場合、遅延されたセッションが予算を超えたままになる可能性があります。
バンドル MCP オーバーレイ
CLI バックエンドは OpenClaw ツール呼び出しを直接受け取りませんが、バックエンドはbundleMcp: true で生成済み MCP 設定オーバーレイにオプトインできます。現在のバンドル動作:
claude-cli: 生成された厳格な MCP 設定ファイル。google-gemini-cli: 生成された Gemini システム設定ファイル。
- CLI プロセスに Gateway ツールを公開する loopback HTTP MCP サーバーを起動し、セッションごとのトークン(
OPENCLAW_MCP_TOKEN)で認証します。 - ツールアクセスを現在のセッション、アカウント、チャネルコンテキストにスコープします。
- 現在のワークスペースで有効なバンドル MCP サーバーを読み込み、既存のバックエンド MCP 設定/設定形状とマージします。
- 所有 Plugin からのバックエンド所有の統合モードを使って起動設定を書き換えます。
mcp.sessionIdleTtlMs ミリ秒のアイドル時間後に回収されます(デフォルトは 10 分。無効にするには 0 を設定)。認証プローブ、slug 生成、Active Memory recall などのワンショット埋め込み実行は、stdio 子プロセスや Streamable HTTP/SSE ストリームが実行より長く残らないよう、実行終了時にクリーンアップを要求します。
再シード履歴上限
新しい CLI セッションが以前の OpenClaw トランスクリプトからシードされる場合(たとえばsession_expired リトライ後)、レンダリングされる <conversation_history> ブロックは、再シードプロンプトの肥大化を防ぐために上限が設定されます。デフォルトは 12,288 文字(約 3,000 トークン)です。
Claude CLI バックエンドは、代わりに解決済みの Claude コンテキストウィンドウに応じてこの上限をスケールします。より大きなコンテキストウィンドウでは、固定の上限まで、より大きな以前の履歴スライスを取得します。他の CLI バックエンドは保守的なデフォルトを維持します。この上限は、再シードプロンプトの以前の履歴ブロックにのみ適用されます。ライブセッションの出力制限は、reliability.outputLimits の下で別途調整されます(セッションを参照)。
制限事項
- OpenClaw ツール呼び出しを直接使用できません: OpenClaw は CLI バックエンドプロトコルにツール呼び出しを注入しません。バックエンドが Gateway ツールを参照できるのは、
bundleMcp: trueにオプトインした場合のみです。 - ストリーミングはバックエンド固有です: 一部のバックエンドは JSONL をストリーミングし、他は終了までバッファリングします。
- 構造化出力は CLI 自身の JSON 形式に依存します。
トラブルシューティング
| 症状 | 修正方法 |
|---|---|
| CLI が見つからない | command をフルパスに設定します。 |
| モデル名が違う | modelAliases を使用して provider/model を CLI のモデル ID にマップします。 |
| セッション継続性がない | sessionArg が設定され、sessionMode が none でないことを確認します。 |
| 画像が無視される | imageArg を設定し、CLI がファイルパスをサポートしていることを確認します。 |