Pluginのインストールと使用
Pluginの追加、有効化、トラブルシューティングのためのエンドユーザー向けガイド。
Pluginの構築
最小の動作するマニフェストを使った、初めてのPluginチュートリアル。
チャネルPlugin
メッセージングチャネルPluginを構築します。
プロバイダーPlugin
モデルプロバイダーPluginを構築します。
SDK概要
インポートマップと登録APIのリファレンス。
公開ケイパビリティモデル
ケイパビリティは、OpenClaw内の公開ネイティブPluginモデルです。すべてのネイティブOpenClaw Pluginは、1つ以上のケイパビリティ型に対して登録します。| ケイパビリティ | 登録メソッド | Plugin例 |
|---|---|---|
| テキスト推論 | api.registerProvider(...) | anthropic, openai |
| CLI推論バックエンド | api.registerCliBackend(...) | anthropic, openai |
| Embeddings | api.registerEmbeddingProvider(...) | プロバイダー所有のベクターPlugin |
| 音声 | api.registerSpeechProvider(...) | elevenlabs, microsoft |
| リアルタイム文字起こし | api.registerRealtimeTranscriptionProvider(...) | openai |
| リアルタイム音声 | api.registerRealtimeVoiceProvider(...) | google, openai |
| メディア理解 | api.registerMediaUnderstandingProvider(...) | google, openai |
| トランスクリプトソース | api.registerTranscriptSourceProvider(...) | discord |
| 画像生成 | api.registerImageGenerationProvider(...) | fal, google, openai |
| 音楽生成 | api.registerMusicGenerationProvider(...) | fal, google, minimax |
| 動画生成 | api.registerVideoGenerationProvider(...) | fal, google, qwen |
| Web取得 | api.registerWebFetchProvider(...) | firecrawl |
| Web検索 | api.registerWebSearchProvider(...) | brave, firecrawl, google |
| チャネル / メッセージング | api.registerChannel(...) | matrix, msteams |
| Gateway検出 | api.registerGatewayDiscoveryService(...) | bonjour |
ケイパビリティを1つも登録しないものの、フック、ツール、検出サービス、またはバックグラウンドサービスを提供するPluginは、レガシーのフック専用Pluginです。このパターンは現在も完全にサポートされています。
外部互換性の方針
ケイパビリティモデルはcoreに導入済みで、現在はバンドル済み/ネイティブPluginで使われていますが、外部Pluginの互換性には「エクスポートされているので固定されている」よりも厳密な基準がまだ必要です。| Pluginの状況 | ガイダンス |
|---|---|
| 既存の外部Plugin | フックベースの連携を動作させ続けます。これが互換性のベースラインです。 |
| 新しいバンドル済み/ネイティブPlugin | ベンダー固有の内部参照や新しいフック専用設計よりも、明示的なケイパビリティ登録を優先します。 |
| ケイパビリティ登録を採用する外部Plugin | 許可されていますが、ケイパビリティ固有のヘルパーサーフェスは、ドキュメントで安定と示されていない限り進化中として扱ってください。 |
Pluginの形状
OpenClawは、読み込まれた各Pluginを、その実際の登録動作(静的メタデータだけではなく)に基づいて形状に分類します。plain-capability
plain-capability
ちょうど1つのケイパビリティ型を登録します(たとえば
arcee や chutes のようなプロバイダー専用Plugin)。hybrid-capability
hybrid-capability
複数のケイパビリティ型を登録します(たとえば
openai はテキスト推論、音声、メディア理解、画像生成を所有します)。hook-only
hook-only
フック(型付きまたはカスタム)のみを登録し、ケイパビリティ、ツール、コマンド、サービスは登録しません。
non-capability
non-capability
ツール、コマンド、サービス、またはルートを登録しますが、ケイパビリティは登録しません。
openclaw plugins inspect <id> を使用します。詳細は CLIリファレンス を参照してください。
レガシーフック
before_agent_start フックは、フック専用Pluginの互換性経路として引き続きサポートされています。実世界のレガシーPluginは現在もこれに依存しています。
方向性:
- 動作を維持する
- レガシーとして文書化する
- モデル/プロバイダーの上書きには
before_model_resolveを優先する - プロンプト変更には
before_prompt_buildを優先する - 実際の使用が減り、フィクスチャのカバレッジで移行安全性が証明された後にのみ削除する
互換性シグナル
openclaw doctor、openclaw plugins inspect <id>、openclaw status --all、openclaw plugins doctor は、これらの互換性通知を表示します。
| シグナル | 意味 |
|---|---|
| config valid | Configの解析に問題がなく、Pluginが解決されます |
| hook-only (info) | Pluginはフックのみを登録します。サポートされている経路ですが、まだケイパビリティ登録には移行されていません |
legacy before_agent_start (warn) | Pluginは before_model_resolve/before_prompt_build ではなく、非推奨の before_agent_start フックを使っています |
| deprecated memory-embedding API (warn) | バンドルされていないPluginが、registerEmbeddingProvider ではなく古いメモリ固有のembedding provider APIを使っています |
| hard error | Configが無効、またはPluginの読み込みに失敗しました |
openclaw status --all と openclaw plugins doctor にも表示されます。
アーキテクチャ概要
OpenClawのPluginシステムには4つのレイヤーがあります。マニフェスト + 検出
OpenClawは、設定済みパス、ワークスペースルート、グローバルPluginルート、バンドル済みPluginから候補Pluginを見つけます。検出では、ネイティブの
openclaw.plugin.json マニフェストに加え、サポート対象のバンドルマニフェストを最初に読みます。ランタイム読み込み
ネイティブOpenClaw Pluginはプロセス内で読み込まれ、ケイパビリティを中央レジストリに登録します。パッケージ化されたJavaScriptはネイティブの
require を通じて読み込まれます。サードパーティのローカルソースTypeScriptは緊急時のJitiフォールバックです。互換性のあるバンドルは、ランタイムコードをインポートせずにレジストリレコードへ正規化されます。- 解析時メタデータは
registerCli(..., { descriptors: [...] })から取得されます - 実際のPlugin CLIモジュールは遅延のままにでき、最初の呼び出し時に登録できます
- マニフェスト/config検証は、Pluginコードを実行せずにマニフェスト/スキーマメタデータから動作するべきです
- ネイティブケイパビリティ検出では、非アクティブ化レジストリスナップショットを構築するために、信頼済みPluginのエントリコードを読み込む場合があります
- ネイティブランタイム動作は、
api.registrationMode === "full"のPluginモジュールのregister(api)パスから来ます
Pluginメタデータスナップショットとルックアップテーブル
Gateway起動時には、現在のconfigスナップショット用に1つのPluginMetadataSnapshot が構築されます。このスナップショットはメタデータ専用です。インストール済みPluginインデックス、マニフェストレジストリ、マニフェスト診断、所有者マップ、Plugin ID正規化器、マニフェストレコードを保存します。読み込まれたPluginモジュール、プロバイダーSDK、パッケージ内容、ランタイムエクスポートは保持しません。
Plugin対応のconfig検証、起動時自動有効化、Gateway Pluginブートストラップは、マニフェスト/インデックスメタデータを個別に再構築する代わりに、そのスナップショットを消費します。PluginLookUpTable は同じスナップショットから派生し、現在のランタイムconfig用の起動Plugin計画を追加します。
起動後、Gatewayは現在のメタデータスナップショットを置換可能なランタイム成果物として保持します。繰り返し実行されるランタイムプロバイダー検出は、プロバイダーカタログの各パスごとにインストール済みインデックスとマニフェストレジストリを再構築する代わりに、そのスナップショットを借用できます。スナップショットは、Gatewayシャットダウン、config/Pluginインベントリの変更、インストール済みインデックスの書き込み時にクリアまたは置換されます。互換性のある現在のスナップショットが存在しない場合、呼び出し元はコールドなマニフェスト/インデックスパスへフォールバックします。互換性チェックには、plugins.load.paths やデフォルトエージェントワークスペースなどのPlugin検出ルートを含める必要があります。ワークスペースPluginはメタデータスコープの一部だからです。
スナップショットとルックアップテーブルは、繰り返される起動判断を高速パスに保ちます。
- チャネル所有権
- 遅延チャネル起動
- 起動Plugin ID
- プロバイダーとCLIバックエンドの所有権
- セットアッププロバイダー、コマンドエイリアス、モデルカタログプロバイダー、マニフェスト契約の所有権
- Plugin configスキーマとチャネルconfigスキーマの検証
- 起動時自動有効化の判断
PluginLookUpTable を受け取る代わりに、永続化されたインストール済みPluginインデックスからマニフェストレジストリを直接再構築しています。そのパスは現在、必要に応じてレジストリを再構築します。呼び出し元がすでに現在のルックアップテーブルまたは明示的なマニフェストレジストリを持っている場合は、それをランタイムフローに渡すことを優先してください。
アクティベーション計画
アクティベーション計画は制御プレーンの一部です。呼び出し元は、より広いランタイムレジストリを読み込む前に、具体的なコマンド、プロバイダー、チャンネル、ルート、エージェントハーネス、またはケイパビリティに関連する Plugin を問い合わせることができます。 プランナーは現在のマニフェスト動作との互換性を維持します。activation.*フィールドは明示的なプランナーヒントですproviders、channels、commandAliases、setup.providers、contracts.tools、およびフックはマニフェスト所有権のフォールバックのままです- 既存の呼び出し元向けに ids のみのプランナー API は引き続き利用できます
- plan API は理由ラベルを報告するため、診断で明示的なヒントと所有権フォールバックを区別できます
チャンネル Plugin と共有メッセージツール
チャンネル Plugin は、通常のチャット操作のために個別の送信/編集/リアクションツールを登録する必要はありません。OpenClaw はコアに共有のmessage ツールを 1 つ保持し、チャンネル Plugin はその背後にあるチャンネル固有の検出と実行を所有します。
現在の境界は次のとおりです。
- コアは共有
messageツールのホスト、プロンプト配線、セッション/スレッドの帳簿管理、実行ディスパッチを所有します - チャンネル Plugin はスコープ付きアクション検出、ケイパビリティ検出、およびチャンネル固有のスキーマ断片を所有します
- チャンネル Plugin は、会話 id がスレッド id をどのようにエンコードするか、または親会話からどのように継承するかなど、プロバイダー固有のセッション会話文法を所有します
- チャンネル Plugin は、アクションアダプターを通じて最終アクションを実行します
ChannelMessageActionAdapter.describeMessageTool(...) です。この統一された検出呼び出しにより、Plugin は可視アクション、ケイパビリティ、スキーマへの寄与をまとめて返せるため、それらの要素が乖離しません。
チャンネル固有の message-tool パラメーターがローカルパスやリモートメディア URL などのメディアソースを保持する場合、Plugin は describeMessageTool(...) から mediaSourceParams も返す必要があります。コアはこの明示的なリストを使い、Plugin 所有のパラメーター名をハードコードせずにサンドボックスパス正規化とアウトバウンドメディアアクセスのヒントを適用します。そこではチャンネル全体のフラットなリストではなく、アクションごとのマップを優先してください。これにより、プロフィール専用のメディアパラメーターが send などの無関係なアクションで正規化されません。
コアはその検出ステップにランタイムスコープを渡します。重要なフィールドは次のとおりです。
accountIdcurrentChannelIdcurrentThreadTscurrentMessageIdsessionKeysessionIdagentId- 信頼済みインバウンド
requesterSenderId
message ツールにチャンネル固有の分岐をハードコードせずに、アクティブなアカウント、現在のルーム/スレッド/メッセージ、または信頼済みリクエスター ID に基づいてメッセージアクションを隠したり公開したりできます。
そのため、埋め込みランナーのルーティング変更は引き続き Plugin 側の作業です。ランナーは、現在のチャット/セッション ID を Plugin 検出境界へ転送し、共有 message ツールが現在のターンに適したチャンネル所有サーフェスを公開する責任を持ちます。
チャンネル所有の実行ヘルパーについては、バンドル Plugin は実行ランタイムを自分自身の Plugin モジュール内に保持する必要があります。コアは src/agents/tools 配下の Discord、Slack、Telegram、WhatsApp message-action ランタイムを所有しなくなりました。個別の plugin-sdk/*-action-runtime サブパスは公開せず、バンドル Plugin は自分の Plugin 所有モジュールからローカルランタイムコードを直接インポートする必要があります。
同じ境界は、一般にプロバイダー名付き SDK シームにも適用されます。コアは Discord、Signal、Slack、WhatsApp、または類似の Plugin 向けのチャンネル固有の便利なバレルをインポートすべきではありません。コアがある動作を必要とする場合は、バンドル Plugin 自身の api.ts / runtime-api.ts バレルを利用するか、その必要性を共有 SDK の狭い汎用ケイパビリティへ昇格させてください。
バンドル Plugin も同じルールに従います。バンドル Plugin の runtime-api.ts は、自分自身のブランド付き openclaw/plugin-sdk/<plugin-id> ファサードを再エクスポートすべきではありません。これらのブランド付きファサードは外部 Plugin と古い利用者向けの互換シムのままですが、バンドル Plugin はローカルエクスポートに加えて、openclaw/plugin-sdk/channel-policy、openclaw/plugin-sdk/runtime-store、openclaw/plugin-sdk/webhook-ingress のような狭い汎用 SDK サブパスを使う必要があります。既存の外部エコシステムの互換境界が要求しない限り、新しいコードで Plugin id 固有の SDK ファサードを追加すべきではありません。
投票に限ると、実行パスは 2 つあります。
outbound.sendPollは、共通の投票モデルに適合するチャンネル向けの共有ベースラインですactions.handleAction("poll")は、チャンネル固有の投票セマンティクスや追加の投票パラメーターに推奨されるパスです
ケイパビリティ所有モデル
OpenClaw はネイティブ Plugin を、無関係な連携の寄せ集めではなく、企業または機能の所有境界として扱います。 つまり、次のようになります。- 企業 Plugin は通常、その企業の OpenClaw 向けサーフェスをすべて所有するべきです
- 機能 Plugin は通常、それが導入する機能サーフェス全体を所有するべきです
- チャンネルは、プロバイダー動作を場当たり的に再実装するのではなく、共有コアケイパビリティを利用するべきです
ベンダーの複数ケイパビリティ
ベンダーの複数ケイパビリティ
google はテキスト推論、CLI バックエンド、埋め込み、音声、リアルタイム音声、メディア理解、画像/音楽/動画生成、Web 検索を所有します。openai はテキスト推論、埋め込み、音声、リアルタイム文字起こし、リアルタイム音声、メディア理解、画像/動画生成を所有します。minimax はテキスト推論に加えて、メディア理解、音声、画像/音楽/動画生成、Web 検索を所有します。ベンダーの単一ケイパビリティ
ベンダーの単一ケイパビリティ
arcee と chutes はテキスト推論のみを所有し、microsoft は音声のみを所有します。ベンダー Plugin は、そのベンダーのサーフェスをさらに広く扱う必要が出るまで、この狭さのままでかまいません。機能 Plugin
機能 Plugin
voice-call は通話トランスポート、ツール、CLI、ルート、Twilio メディアストリームブリッジを所有しますが、ベンダー Plugin を直接インポートするのではなく、共有の音声、リアルタイム文字起こし、リアルタイム音声ケイパビリティを利用します。- ベンダーの OpenClaw 向けサーフェスは、テキストモデル、音声、画像、動画にまたがる場合でも 1 つの Plugin に存在します
- 他のベンダーも自分たちのサーフェス領域について同じことができます
- チャンネルは、どのベンダー Plugin がプロバイダーを所有しているかを気にしません。コアが公開する共有ケイパビリティ契約を利用します
- Plugin = 所有境界
- ケイパビリティ = 複数の Plugin が実装または利用できるコア契約
これにより、単一ベンダーや一回限りの Plugin 固有コードパスに依存するコア動作を避けつつ、所有権を明示的に保てます。
ケイパビリティのレイヤー化
コードの配置場所を決めるときは、次のメンタルモデルを使ってください。- コアケイパビリティレイヤー
- ベンダー Plugin レイヤー
- チャンネル/機能 Plugin レイヤー
共有オーケストレーション、ポリシー、フォールバック、設定マージルール、配信セマンティクス、型付き契約。
- コアは返信時の TTS ポリシー、フォールバック順序、設定、チャンネル配信を所有します
elevenlabs、google、microsoft、openaiは合成実装を所有しますvoice-callは電話 TTS ランタイムヘルパーを利用します
複数ケイパビリティを持つ企業 Plugin の例
企業 Plugin は外側から見て一貫しているべきです。OpenClaw がモデル、音声、リアルタイム文字起こし、リアルタイム音声、メディア理解、画像生成、動画生成、Web フェッチ、Web 検索の共有契約を持っている場合、ベンダーは自分のサーフェスをすべて 1 か所で所有できます。- 1 つの Plugin がベンダーサーフェスを所有します
- コアは引き続きケイパビリティ契約を所有します
- チャンネルと機能 Plugin はベンダーコードではなく
api.runtime.*ヘルパーを利用します - 契約テストでは、Plugin が所有すると主張するケイパビリティを登録していることを表明できます
ケイパビリティ例: 動画理解
OpenClaw はすでに画像/音声/動画理解を 1 つの共有ケイパビリティとして扱っています。そこにも同じ所有モデルが適用されます。
これにより、1 つのプロバイダーの動画前提をコアへ焼き込むことを避けられます。Plugin はベンダーサーフェスを所有し、コアはケイパビリティ契約とフォールバック動作を所有します。
動画生成もすでに同じシーケンスを使っています。コアは型付きケイパビリティ契約とランタイムヘルパーを所有し、ベンダー Plugin はそれに対して
api.registerVideoGenerationProvider(...) 実装を登録します。
具体的なロールアウトチェックリストが必要ですか。ケイパビリティ Cookbookを参照してください。
契約と適用
Plugin API サーフェスは、意図的にOpenClawPluginApi に型付けされ、一元化されています。この契約は、サポートされる登録ポイントと、Plugin が依存できるランタイムヘルパーを定義します。
これが重要な理由:
- Plugin 作者は、安定した内部標準を1つ得られる
- core は、2つの Plugin が同じ provider id を登録するような所有権の重複を拒否できる
- startup は、不正な形式の登録に対して実行可能な診断を表示できる
- 契約テストは、バンドル Plugin の所有権を強制し、気づかないドリフトを防げる
ランタイム登録の強制
ランタイム登録の強制
Plugin レジストリは、Plugin のロード時に登録を検証します。例: provider id の重複、speech provider id の重複、不正な形式の登録は、未定義の動作ではなく Plugin 診断を生成します。
契約テスト
契約テスト
バンドル Plugin は、テスト実行中に契約レジストリへ捕捉されるため、OpenClaw は所有権を明示的にアサートできます。現在これは、モデル provider、speech provider、web search provider、バンドル登録の所有権に使用されています。
契約に含めるべきもの
- 良い契約
- 悪い契約
- 型付けされている
- 小さい
- capability 固有
- core が所有している
- 複数の Plugin で再利用できる
- ベンダー知識なしで channel/feature が利用できる
実行モデル
ネイティブ OpenClaw Plugin は Gateway と同じプロセス内で実行されます。サンドボックス化されません。ロードされたネイティブ Plugin は、core コードと同じプロセスレベルの信頼境界を持ちます。 互換バンドルは、OpenClaw が現在それらをメタデータ/コンテンツパックとして扱うため、デフォルトでより安全です。現在のリリースでは、これは主にバンドルされた Skills を意味します。 非バンドル Plugin には、allowlist と明示的な install/load パスを使用します。workspace Plugin は本番デフォルトではなく、開発時コードとして扱います。 バンドル workspace パッケージ名では、Plugin id を npm 名に固定してください。デフォルトでは@openclaw/<id>、またはパッケージが意図的により狭い Plugin ロールを公開する場合は、-provider、-plugin、-speech、-sandbox、-media-understanding などの承認済みの型付き suffix を使用します。
信頼に関する注記:
plugins.allow が信頼するのは Plugin id であり、ソースの来歴ではありません。バンドル Plugin と同じ id を持つ workspace Plugin は、その workspace Plugin が有効化/allowlist されている場合、意図的にバンドル版をシャドウします。これはローカル開発、パッチテスト、hotfix において通常かつ有用です。バンドル Plugin の信頼は、install メタデータではなく、ロード時のディスク上の manifest とコードというソーススナップショットから解決されます。破損または差し替えられた install record が、実際のソースが主張する範囲を超えて、バンドル Plugin の信頼サーフェスを密かに広げることはできません。エクスポート境界
OpenClaw は、実装上の利便性ではなく capability をエクスポートします。 capability 登録は公開のままにします。契約ではないヘルパーエクスポートは削減します:- バンドル Plugin 固有のヘルパー subpath
- 公開 API として意図されていないランタイム配管 subpath
- ベンダー固有の便利ヘルパー
- 実装詳細である setup/オンボーディングヘルパー
plugin-sdk/gateway-runtime、plugin-sdk/security-runtime、plugin-sdk/plugin-config-runtime などの汎用 SDK 契約に昇格させます。