ローカルモデルは実現可能です。ただし、ハードウェア、コンテキストサイズ、プロンプトインジェクション防御の要求水準も上がります。小型または極端に量子化されたカードではコンテキストが切り詰められ、安全性が漏れやすくなります。このページは、より高性能なローカルスタックとカスタムの OpenAI 互換ローカルサーバー向けの、意見を明確にしたガイドです。最も手間の少ないオンボーディングには、LM Studio または Ollama とDocumentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
openclaw onboard から始めてください。
選択したモデルが必要とするときだけ起動すべきローカルサーバーについては、
ローカルモデルサービス を参照してください。
ハードウェアの下限
高めを目指してください。快適なエージェントループには 最大構成の Mac Studio 2台以上、または同等の GPU リグ(約$30k+) が目安です。単一の 24 GB GPU は、軽いプロンプトを高めのレイテンシで扱う場合にのみ機能します。常に ホストできる最大 / フルサイズのバリアント を実行してください。小型または大幅に量子化されたチェックポイントはプロンプトインジェクションのリスクを高めます(セキュリティ を参照)。バックエンドを選ぶ
バックエンドが対応している場合(LM Studio は対応)、Responses API(
api: "openai-responses")を使用してください。それ以外は Chat Completions(api: "openai-completions")を使い続けます。
推奨: LM Studio + 大規模ローカルモデル(Responses API)
現時点で最良のローカルスタックです。LM Studio で大規模モデル(たとえば、フルサイズの Qwen、DeepSeek、または Llama ビルド)を読み込み、ローカルサーバー(デフォルトhttp://127.0.0.1:1234)を有効にし、Responses API を使って推論を最終テキストから分離します。
- LM Studio をインストールします: https://lmstudio.ai
- LM Studio で 利用可能な最大のモデルビルド をダウンロードし(「small」や大幅に量子化されたバリアントは避ける)、サーバーを起動し、
http://127.0.0.1:1234/v1/modelsにそれが一覧表示されることを確認します。 my-local-modelを、LM Studio に表示される実際のモデル ID に置き換えます。- モデルを読み込んだままにします。コールドロードは起動レイテンシを追加します。
- LM Studio ビルドが異なる場合は、
contextWindow/maxTokensを調整します。 - WhatsApp では、最終テキストだけが送信されるように Responses API を使い続けます。
models.mode: "merge" を使用します。
ハイブリッド設定: ホスト型をプライマリ、ローカルをフォールバック
ローカル優先、ホスト型の安全網付き
プライマリとフォールバックの順序を入れ替えます。ローカルマシンがダウンしているときに Sonnet または Opus にフォールバックできるよう、同じ providers ブロックとmodels.mode: "merge" を維持します。
リージョン別ホスティング / データルーティング
- ホスト型の MiniMax/Kimi/GLM バリアントは、OpenRouter にもリージョン固定エンドポイント(例: 米国ホスト)付きで存在します。選択した法域内にトラフィックを維持しつつ、Anthropic/OpenAI フォールバックのために
models.mode: "merge"を使い続けるには、そこでリージョン別バリアントを選びます。 - ローカル専用が最も強力なプライバシー経路です。ホスト型リージョナルルーティングは、プロバイダー機能が必要だがデータフローを制御したい場合の中間策です。
その他の OpenAI 互換ローカルプロキシ
MLX(mlx_lm.server)、vLLM、SGLang、LiteLLM、OAI-proxy、またはカスタム
Gateway は、OpenAI 形式の /v1/chat/completions
エンドポイントを公開していれば機能します。バックエンドが /v1/responses 対応を明示的に
文書化していない限り、Chat Completions アダプターを使用してください。上の provider ブロックを
自分のエンドポイントとモデル ID に置き換えます。
baseUrl を持つカスタム provider で api が省略された場合、OpenClaw はデフォルトで
openai-completions を使用します。127.0.0.1 などのループバックエンドポイントは自動的に
信頼されます。LAN、tailnet、プライベート DNS エンドポイントでは、引き続き
request.allowPrivateNetwork: true が必要です。
models.providers.<id>.models[].id の値は provider ローカルです。そこに
provider プレフィックスを含めないでください。たとえば、
mlx_lm.server --model mlx-community/Qwen3-30B-A3B-6bit で起動した MLX サーバーでは、
次のカタログ ID とモデル参照を使用します。
models.providers.mlx.models[].id: "mlx-community/Qwen3-30B-A3B-6bit"agents.defaults.model.primary: "mlx/mlx-community/Qwen3-30B-A3B-6bit"
input: ["text", "image"] を設定します。対話型のカスタム provider
オンボーディングは一般的なビジョンモデル ID を推論し、不明な名前についてのみ質問します。
非対話型オンボーディングも同じ推論を使用します。不明なビジョン ID には --custom-image-input を、
エンドポイントの背後ではテキスト専用である既知に見えるモデルには --custom-text-input を使用してください。
ホスト型モデルをフォールバックとして利用可能にしておくため、models.mode: "merge" を維持します。
低速なローカルまたはリモートモデルサーバーには、agents.defaults.timeoutSeconds を上げる前に
models.providers.<id>.timeoutSeconds を使用してください。provider タイムアウトは、
接続、ヘッダー、本文ストリーミング、保護された fetch 全体の中断を含むモデル HTTP リクエストにのみ適用されます。
カスタム OpenAI 互換 provider では、
baseUrl がループバック、プライベート LAN、.local、またはベアホスト名に解決される場合、apiKey: "ollama-local" のような非シークレットのローカルマーカーを永続化することが許容されます。OpenClaw はそれを、キー不足として報告する代わりに有効なローカル認証情報として扱います。公開ホスト名を受け入れる provider には実際の値を使用してください。/v1 バックエンドの挙動メモ:
- OpenClaw はこれらを、ネイティブ OpenAI エンドポイントではなく、プロキシ形式の OpenAI 互換ルートとして扱います
- ここではネイティブ OpenAI 専用のリクエスト整形は適用されません。つまり、
service_tierなし、Responses のstoreなし、OpenAI 推論互換ペイロード 整形なし、プロンプトキャッシュヒントなしです - 非表示の OpenClaw 帰属ヘッダー(
originator、version、User-Agent)は、 これらのカスタムプロキシ URL には注入されません
-
一部のサーバーは、Chat Completions で構造化された content-part 配列ではなく、
文字列の
messages[].contentのみを受け入れます。そのようなエンドポイントにはmodels.providers.<provider>.models[].compat.requiresStringContent: trueを設定してください。 -
一部のローカルモデルは、
[tool_name]に続く JSON と[END_TOOL_REQUEST]のような、 独立した角括弧付きツールリクエストをテキストとして出力します。OpenClaw は、 その名前がそのターンに登録済みのツールと完全に一致する場合にのみ、 それらを実際のツール呼び出しに昇格します。一致しない場合、そのブロックは未対応のテキストとして扱われ、 ユーザーに表示される返信からは隠されます。 - モデルが JSON、XML、またはツール呼び出しのように見える ReAct 形式のテキストを出力したが、 provider が構造化 invocation を出力しなかった場合、OpenClaw はそれをテキストのまま残し、 実行 ID、provider/model、検出されたパターン、利用可能な場合はツール名を含む警告をログに記録します。 これは完了したツール実行ではなく、provider/model のツール呼び出し 非互換性として扱ってください。
-
ツールが実行されず、たとえば生の JSON、
XML、ReAct 構文、または provider レスポンス内の空の
tool_calls配列のように、assistant テキストとして表示される場合は、 まずサーバーがツール呼び出し対応のチャットテンプレート / パーサーを使用していることを確認してください。 ツール使用が強制された場合にのみパーサーが動作する OpenAI 互換 Chat Completions バックエンドでは、 テキスト解析に頼る代わりに、モデルごとのリクエスト上書きを設定します。これは、すべての通常ターンでツールを呼び出すべきモデル / セッションにのみ使用してください。 OpenClaw のデフォルトのプロキシ値tool_choice: "auto"を上書きします。local/my-local-modelは、openclaw models listに表示される正確な provider/model 参照に置き換えてください。 -
カスタム OpenAI 互換モデルが、組み込みプロファイルを超える OpenAI 推論 effort を受け入れる場合は、
モデルの compat ブロックで宣言してください。ここに
"xhigh"を追加すると、/think xhigh、セッションピッカー、Gateway 検証、llm-task検証で、その設定済み provider/model 参照のレベルが公開されます。
小型またはより厳格なバックエンド
モデルが問題なく読み込まれるのに完全なエージェントターンが誤動作する場合は、トップダウンで作業します。まずトランスポートを確認し、その後に対象範囲を絞り込みます。-
ローカルモデル自体が応答することを確認します。 ツールもエージェントコンテキストも使いません。
-
Gateway ルーティングを確認します。 指定したプロンプトのみを送信します。トランスクリプト、AGENTS ブートストラップ、コンテキストエンジンの組み立て、ツール、同梱 MCP サーバーはスキップしますが、Gateway ルーティング、認証、プロバイダー選択は引き続き実行されます。
-
軽量モードを試します。 両方のプローブが通るのに実際のエージェントターンが不正なツール呼び出しや過大なプロンプトで失敗する場合は、
agents.defaults.experimental.localModelLean: trueを有効にします。これにより、最も重い 3 つのデフォルトツール(browser、cron、message)が削除され、プロンプトの形が小さくなり、壊れにくくなります。詳しい説明、使用するタイミング、有効化されていることの確認方法については、実験的機能 → ローカルモデル軽量モードを参照してください。 -
最後の手段としてツールを完全に無効化します。 軽量モードでも不十分な場合は、そのモデルエントリに
models.providers.<provider>.models[].compat.supportsTools: falseを設定します。すると、そのモデルではエージェントがツール呼び出しなしで動作します。 -
それ以降のボトルネックはアップストリームです。 軽量モードと
supportsTools: falseの後でも、大きめの OpenClaw 実行でのみバックエンドが失敗する場合、残る問題は通常、アップストリームのモデルまたはサーバー容量です。コンテキストウィンドウ、GPU メモリ、kv-cache の退避、またはバックエンドのバグが原因です。その時点では OpenClaw のトランスポート層の問題ではありません。
トラブルシューティング
- Gateway はプロキシに到達できますか?
curl http://127.0.0.1:1234/v1/models。 - LM Studio モデルがアンロードされていますか? 再読み込みしてください。コールドスタートは「ハング」の一般的な原因です。
- ローカルサーバーが
terminated、ECONNRESETと表示する、またはターンの途中でストリームを閉じますか? OpenClaw は、低カーディナリティのmodel.call.error.failureKindと OpenClaw プロセスの RSS/ヒープスナップショットを診断に記録します。LM Studio/Ollama の メモリ圧迫については、そのタイムスタンプをサーバーログまたは macOS のクラッシュ / jetsam ログと照合し、モデルサーバーが強制終了されたかどうかを確認してください。 - OpenClaw は、検出されたモデルウィンドウ、または
agents.defaults.contextTokensが有効ウィンドウを下げている場合は上限なしのモデルウィンドウから、コンテキストウィンドウのプリフライトしきい値を導出します。20% 未満では 8k の下限で警告します。ハードブロックは 4k の下限で 10% のしきい値を使用し、有効コンテキストウィンドウまでに制限されるため、過大なモデルメタデータによって本来有効なユーザー上限が拒否されることはありません。このプリフライトに当たる場合は、サーバー/モデルのコンテキスト上限を引き上げるか、より大きなモデルを選択してください。 - コンテキストエラーですか?
contextWindowを下げるか、サーバー上限を引き上げてください。 - OpenAI 互換サーバーが
messages[].content ... expected a stringを返しますか? そのモデルエントリにcompat.requiresStringContent: trueを追加してください。 - OpenAI 互換サーバーが
validation.keysを返す、またはメッセージエントリではroleとcontentのみが許可されると言いますか? そのモデルエントリにcompat.strictMessageKeys: trueを追加してください。 - 小さな直接の
/v1/chat/completions呼び出しは動作するのに、openclaw infer model run --localが Gemma または別のローカルモデルで失敗しますか? まずプロバイダー URL、モデル参照、認証 マーカー、サーバーログを確認してください。ローカルのmodel runにはエージェントツールは含まれません。 ローカルのmodel runが成功するのに大きめのエージェントターンが失敗する場合は、localModelLeanまたはcompat.supportsTools: falseでエージェントの ツール対象範囲を減らしてください。 - ツール呼び出しが生の JSON/XML/ReAct テキストとして表示される、またはプロバイダーが
空の
tool_calls配列を返しますか? アシスタントテキストを盲目的に ツール実行へ変換するプロキシを追加しないでください。先にサーバーのチャットテンプレート/パーサーを修正してください。 ツール使用を強制した場合にのみモデルが動作するなら、上記のモデル単位のparams.extra_body.tool_choice: "required"オーバーライドを追加し、毎ターンでツール呼び出しが期待される セッションにのみそのモデルエントリを使用してください。 - 安全性: ローカルモデルはプロバイダー側フィルターをスキップします。プロンプトインジェクションの影響範囲を制限するため、エージェントは狭く保ち、Compaction を有効にしてください。