chore(i18n): refresh ja-JP translations
This commit is contained in:
parent
81a4b42d69
commit
0fda378789
File diff suppressed because it is too large
Load Diff
@ -1,79 +1,80 @@
|
||||
---
|
||||
read_when:
|
||||
- システムプロンプトのテキスト、ツール一覧、または時刻 / ハートビートのセクションの編集
|
||||
- システムプロンプトのテキスト、ツール一覧、または時刻/Heartbeat セクションの編集
|
||||
- ワークスペースのブートストラップや Skills の注入動作の変更
|
||||
summary: OpenClaw のシステムプロンプトに含まれる内容と、その組み立て方法
|
||||
summary: OpenClawのシステムプロンプトに何が含まれているか、およびそれがどのように組み立てられるか
|
||||
title: システムプロンプト
|
||||
x-i18n:
|
||||
generated_at: "2026-04-12T04:43:45Z"
|
||||
generated_at: "2026-04-15T19:41:42Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 057f01aac51f7737b5223f61f5d55e552d9011232aebb130426e269d8f6c257f
|
||||
source_hash: c740e4646bc4980567338237bfb55126af0df72499ca00a48e4848d9a3608ab4
|
||||
source_path: concepts/system-prompt.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# システムプロンプト
|
||||
|
||||
OpenClaw は、エージェントの実行ごとにカスタムのシステムプロンプトを構築します。このプロンプトは **OpenClaw が管理** しており、pi-coding-agent のデフォルトプロンプトは使用しません。
|
||||
OpenClaw は、エージェントの各実行ごとにカスタムのシステムプロンプトを構築します。このプロンプトは **OpenClaw が所有** しており、pi-coding-agent のデフォルトプロンプトは使用しません。
|
||||
|
||||
このプロンプトは OpenClaw によって組み立てられ、各エージェント実行に注入されます。
|
||||
|
||||
プロバイダープラグインは、OpenClaw 管理の完全なプロンプトを置き換えることなく、キャッシュ対応のプロンプトガイダンスを提供できます。プロバイダーランタイムでは、次のことが可能です。
|
||||
プロバイダ Plugin は、完全な OpenClaw 所有のプロンプトを置き換えることなく、キャッシュを意識したプロンプトガイダンスを提供できます。プロバイダランタイムでは次のことが可能です。
|
||||
|
||||
- 少数の名前付きコアセクション(`interaction_style`、`tool_call_style`、`execution_bias`)を置き換える
|
||||
- プロンプトキャッシュ境界の上に**安定したプレフィックス**を注入する
|
||||
- プロンプトキャッシュ境界の下に**動的なサフィックス**を注入する
|
||||
- プロンプトキャッシュ境界の上に **stable prefix** を注入する
|
||||
- プロンプトキャッシュ境界の下に **dynamic suffix** を注入する
|
||||
|
||||
モデルファミリー固有のチューニングには、プロバイダー管理の追加を使用してください。従来の
|
||||
`before_prompt_build` によるプロンプト変更は、互換性のため、または本当にグローバルなプロンプト変更にのみ使い、通常のプロバイダー挙動には使わないでください。
|
||||
モデルファミリー固有のチューニングには、プロバイダ所有の寄与を使ってください。従来の
|
||||
`before_prompt_build` によるプロンプト変更は、互換性維持や本当にグローバルなプロンプト変更のために残し、通常のプロバイダ動作には使わないでください。
|
||||
|
||||
## 構造
|
||||
|
||||
このプロンプトは意図的にコンパクトで、固定セクションを使用します。
|
||||
|
||||
- **Tooling**: structured-tool の信頼できる情報源であることのリマインダーと、ランタイムのツール使用ガイダンス。
|
||||
- **Safety**: 権力志向の挙動や監督の回避を避けるための短いガードレールのリマインダー。
|
||||
- **Skills**(利用可能な場合): 必要に応じて skill の指示を読み込む方法をモデルに伝えます。
|
||||
- **OpenClaw Self-Update**: `config.schema.lookup` で安全に設定を調べる方法、`config.patch` で設定にパッチを当てる方法、`config.apply` で完全な設定を置き換える方法、および明示的なユーザー要求がある場合にのみ `update.run` を実行する方法。owner 限定の `gateway` ツールは、`tools.exec.ask` / `tools.exec.security` の書き換えも拒否します。これには、それらの保護された exec パスに正規化される旧来の `tools.bash.*` エイリアスも含まれます。
|
||||
- **Tooling**: 構造化ツールの source-of-truth リマインダーと、ランタイムのツール使用ガイダンス。
|
||||
- **Safety**: 権力追求的な振る舞いや監督の回避を避けるための短いガードレールリマインダー。
|
||||
- **Skills**(利用可能な場合): 必要に応じてスキル指示を読み込む方法をモデルに伝えます。
|
||||
- **OpenClaw Self-Update**: `config.schema.lookup` を使った安全な設定確認方法、`config.patch` による設定パッチ、`config.apply` による完全設定置換、そして明示的なユーザー要求時にのみ `update.run` を実行する方法。owner-only の `gateway` ツールは、保護された exec パスに正規化される従来の `tools.bash.*` エイリアスを含め、`tools.exec.ask` / `tools.exec.security` の書き換えも拒否します。
|
||||
- **Workspace**: 作業ディレクトリ(`agents.defaults.workspace`)。
|
||||
- **Documentation**: OpenClaw ドキュメントのローカルパス(リポジトリまたは npm パッケージ)と、それを読むべきタイミング。
|
||||
- **Workspace Files (injected)**: ブートストラップファイルが以下に含まれていることを示します。
|
||||
- **Sandbox**(有効な場合): サンドボックス化されたランタイム、サンドボックスパス、および権限昇格付き exec が利用可能かどうかを示します。
|
||||
- **Current Date & Time**: ユーザーのローカル時刻、タイムゾーン、時刻形式。
|
||||
- **Reply Tags**: 対応プロバイダー向けのオプションの返信タグ構文。
|
||||
- **Heartbeats**: デフォルトエージェントで heartbeat が有効な場合の、heartbeat プロンプトと ack の挙動。
|
||||
- **Runtime**: ホスト、OS、node、モデル、リポジトリルート(検出された場合)、thinking level(1 行)。
|
||||
- **Reasoning**: 現在の可視性レベルと `/reasoning` 切り替えのヒント。
|
||||
- **Documentation**: OpenClaw ドキュメントへのローカルパス(リポジトリまたは npm パッケージ)と、それを読むべきタイミング。
|
||||
- **Workspace Files (injected)**: ブートストラップファイルが以下に含まれることを示します。
|
||||
- **Sandbox**(有効な場合): サンドボックス化されたランタイム、サンドボックスのパス、昇格 exec が利用可能かどうかを示します。
|
||||
- **Current Date & Time**: ユーザーローカル時刻、タイムゾーン、時刻形式。
|
||||
- **Reply Tags**: 対応プロバイダ向けの任意の返信タグ構文。
|
||||
- **Heartbeats**: デフォルトエージェントで Heartbeat が有効な場合の Heartbeat プロンプトと ack 動作。
|
||||
- **Runtime**: ホスト、OS、node、モデル、repo ルート(検出された場合)、thinking レベル(1 行)。
|
||||
- **Reasoning**: 現在の可視性レベルと `/reasoning` 切り替えヒント。
|
||||
|
||||
Tooling セクションには、長時間実行される作業に対するランタイムガイダンスも含まれます。
|
||||
Tooling セクションには、長時間実行される作業向けのランタイムガイダンスも含まれます。
|
||||
|
||||
- 将来のフォローアップ(`check back later`、リマインダー、定期作業)には `cron` を使用し、`exec` の sleep ループ、`yieldMs` の遅延トリック、繰り返しの `process` ポーリングは使わない
|
||||
- 今すぐ開始してバックグラウンドで継続実行されるコマンドにのみ `exec` / `process` を使用する
|
||||
- 自動完了 wake が有効な場合は、コマンドを一度だけ開始し、出力が出たときや失敗したときの push ベースの wake 経路に任せる
|
||||
- 実行中コマンドのログ、状態、入力、介入を確認する必要がある場合は `process` を使用する
|
||||
- タスクがより大きい場合は `sessions_spawn` を優先する。サブエージェントの完了は push ベースで、要求元に自動通知される
|
||||
- 完了を待つためだけに `subagents list` / `sessions_list` をループでポーリングしない
|
||||
- `exec` の sleep ループ、`yieldMs` の遅延トリック、`process` の繰り返しポーリングではなく、将来のフォローアップ(`check back later`、リマインダー、定期作業)には cron を使う
|
||||
- `exec` / `process` は、今すぐ開始してバックグラウンドで継続実行されるコマンドにのみ使う
|
||||
- 自動完了ウェイクが有効な場合は、コマンドを一度だけ開始し、出力または失敗時の push ベースのウェイク経路に依存する
|
||||
- 実行中コマンドを確認する必要があるときのログ、状態、入力、介入には `process` を使う
|
||||
- タスクがより大きい場合は、`sessions_spawn` を優先する。サブエージェントの完了は push ベースで、依頼元へ自動通知される
|
||||
- 完了待ちのためだけに `subagents list` / `sessions_list` をループでポーリングしない
|
||||
|
||||
実験的な `update_plan` ツールが有効な場合、Tooling では、これを自明でない複数ステップの作業にのみ使用し、`in_progress` のステップをちょうど 1 つに保ち、更新のたびに計画全体を繰り返さないようモデルに伝えます。
|
||||
実験的な `update_plan` ツールが有効な場合、Tooling では、それを自明でない複数ステップ作業にのみ使い、`in_progress` ステップをちょうど 1 つ維持し、各更新後に計画全体を繰り返さないようモデルに伝えます。
|
||||
|
||||
システムプロンプト内の Safety ガードレールは助言的なものです。これらはモデルの挙動を導きますが、ポリシーを強制するものではありません。強制にはツールポリシー、exec 承認、サンドボックス、チャンネル allowlist を使用してください。オペレーターは設計上これらを無効化できます。
|
||||
システムプロンプト内の Safety ガードレールは助言的なものです。モデルの動作を導きますが、ポリシーを強制するものではありません。強制には、ツールポリシー、exec 承認、サンドボックス化、チャネル許可リストを使ってください。運用者は設計上これらを無効化できます。
|
||||
|
||||
ネイティブの承認カードやボタンがあるチャンネルでは、ランタイムプロンプトは、まずそのネイティブ承認 UI に依存するようエージェントに伝えます。手動の `/approve` コマンドを含めるのは、ツール結果がチャット承認を利用できないと示している場合、または手動承認が唯一の経路である場合だけです。
|
||||
ネイティブの承認カード/ボタンがあるチャネルでは、ランタイムプロンプトはエージェントに対して、まずそのネイティブ承認 UI に依存するよう伝えます。手動の
|
||||
`/approve` コマンドを含めるのは、ツール結果がチャット承認を利用不可と示した場合、または手動承認のみが唯一の経路である場合だけです。
|
||||
|
||||
## プロンプトモード
|
||||
|
||||
OpenClaw は、サブエージェント向けにより小さいシステムプロンプトをレンダリングできます。ランタイムは各実行に `promptMode` を設定します(ユーザー向けの設定ではありません)。
|
||||
OpenClaw はサブエージェント向けにより小さいシステムプロンプトをレンダリングできます。ランタイムは各実行に `promptMode` を設定します(ユーザー向け設定ではありません)。
|
||||
|
||||
- `full`(デフォルト): 上記のすべてのセクションを含みます。
|
||||
- `minimal`: サブエージェントに使用されます。**Skills**、**Memory Recall**、**OpenClaw Self-Update**、**Model Aliases**、**User Identity**、**Reply Tags**、**Messaging**、**Silent Replies**、**Heartbeats** を省略します。Tooling、**Safety**、Workspace、Sandbox、Current Date & Time(既知の場合)、Runtime、および注入されたコンテキストは引き続き利用可能です。
|
||||
- `none`: ベースとなる識別行のみを返します。
|
||||
- `full`(デフォルト): 上記の全セクションを含みます。
|
||||
- `minimal`: サブエージェントで使われ、**Skills**、**Memory Recall**、**OpenClaw Self-Update**、**Model Aliases**、**User Identity**、**Reply Tags**、**Messaging**、**Silent Replies**、**Heartbeats** を省略します。Tooling、**Safety**、Workspace、Sandbox、Current Date & Time(既知の場合)、Runtime、および注入コンテキストは引き続き利用可能です。
|
||||
- `none`: ベースの識別 1 行のみを返します。
|
||||
|
||||
`promptMode=minimal` の場合、追加で注入されるプロンプトは **Group Chat Context** ではなく **Subagent Context** とラベル付けされます。
|
||||
|
||||
## ワークスペースのブートストラップ注入
|
||||
|
||||
ブートストラップファイルは切り詰められたうえで **Project Context** の下に追加されるため、モデルは明示的に読まなくても識別情報とプロファイルコンテキストを把握できます。
|
||||
ブートストラップファイルはトリミングされ、**Project Context** の下に追加されます。これにより、モデルは明示的に読み取らなくても識別情報やプロファイルコンテキストを把握できます。
|
||||
|
||||
- `AGENTS.md`
|
||||
- `SOUL.md`
|
||||
@ -81,47 +82,49 @@ OpenClaw は、サブエージェント向けにより小さいシステムプ
|
||||
- `IDENTITY.md`
|
||||
- `USER.md`
|
||||
- `HEARTBEAT.md`
|
||||
- `BOOTSTRAP.md`(新規ワークスペースでのみ)
|
||||
- `MEMORY.md` がある場合はそれを、ない場合は小文字のフォールバックとして `memory.md`
|
||||
- `BOOTSTRAP.md`(新規ワークスペースのみ)
|
||||
- `MEMORY.md` が存在する場合はそれを、存在しない場合は小文字のフォールバックとして `memory.md`
|
||||
|
||||
これらのファイルはすべて、**ファイルごとのゲートが適用される場合を除き**、毎ターン **コンテキストウィンドウに注入** されます。`HEARTBEAT.md` は、通常の実行では、デフォルトエージェントで heartbeat が無効な場合、または
|
||||
`agents.defaults.heartbeat.includeSystemPromptSection` が false の場合に省略されます。注入されるファイルは簡潔に保ってください。特に `MEMORY.md` は時間とともに大きくなり、予想外にコンテキスト使用量が増えたり、compaction がより頻繁に発生したりする可能性があります。
|
||||
これらのファイルはすべて、**ファイル固有のゲートが適用されない限り**、各ターンで **コンテキストウィンドウに注入** されます。`HEARTBEAT.md` は、通常実行では、デフォルトエージェントで Heartbeat が無効な場合、または
|
||||
`agents.defaults.heartbeat.includeSystemPromptSection` が false の場合に省略されます。注入ファイルは簡潔に保ってください。特に `MEMORY.md` は時間とともに大きくなりやすく、予想外にコンテキスト使用量が増えたり、Compaction がより頻繁に発生したりする原因になります。
|
||||
|
||||
> **注:** `memory/*.md` の日次ファイルは、通常のブートストラップ Project Context の一部**ではありません**。通常のターンでは、これらは `memory_search` および `memory_get` ツールを通じて必要時にアクセスされるため、モデルが明示的に読むまでコンテキストウィンドウを消費しません。例外は素の `/new` および `/reset` ターンで、この最初のターンに限り、ランタイムが最近の日次メモリをワンショットの起動コンテキストブロックとして前置できる場合があります。
|
||||
> **注:** `memory/*.md` の日次ファイルは、通常のブートストラップ Project Context の一部では **ありません**。通常ターンでは、これらは
|
||||
> `memory_search` と `memory_get` ツールを通じて必要時にアクセスされるため、モデルが明示的にそれらを読まない限りコンテキストウィンドウを消費しません。例外は素の `/new` および `/reset` ターンです。この最初のターンでは、ランタイムが最近の日次メモリを 1 回限りの起動コンテキストブロックとして先頭に追加することがあります。
|
||||
|
||||
大きなファイルはマーカー付きで切り詰められます。ファイルごとの最大サイズは
|
||||
`agents.defaults.bootstrapMaxChars`(デフォルト: 20000)で制御されます。ファイル全体にまたがる注入済みブートストラップ内容の総量は
|
||||
`agents.defaults.bootstrapTotalMaxChars`(デフォルト: 150000)で上限が設定されます。欠落しているファイルには短い欠落ファイルマーカーが注入されます。切り詰めが発生した場合、OpenClaw は Project Context に警告ブロックを注入できます。これは
|
||||
`agents.defaults.bootstrapPromptTruncationWarning`(`off`、`once`、`always`;デフォルト: `once`)で制御します。
|
||||
`agents.defaults.bootstrapMaxChars`(デフォルト: 20000)で制御されます。ファイル横断で注入されるブートストラップコンテンツ総量は
|
||||
`agents.defaults.bootstrapTotalMaxChars`(デフォルト: 150000)で上限が設けられています。見つからないファイルは短い missing-file マーカーを注入します。切り詰めが発生した場合、OpenClaw は Project Context に警告ブロックを注入できます。これは
|
||||
`agents.defaults.bootstrapPromptTruncationWarning`(`off`、`once`、`always`;
|
||||
デフォルト: `once`)で制御します。
|
||||
|
||||
サブエージェントセッションでは `AGENTS.md` と `TOOLS.md` のみが注入されます(サブエージェントのコンテキストを小さく保つため、他のブートストラップファイルは除外されます)。
|
||||
サブエージェントセッションでは `AGENTS.md` と `TOOLS.md` のみが注入されます(サブエージェントコンテキストを小さく保つため、他のブートストラップファイルは除外されます)。
|
||||
|
||||
内部フックは `agent:bootstrap` を介してこのステップを横取りし、注入されるブートストラップファイルを変更または置き換えできます(たとえば `SOUL.md` を別のペルソナに差し替えるなど)。
|
||||
内部フックは `agent:bootstrap` を通じてこのステップを横取りし、注入されるブートストラップファイルを変更または置換できます(たとえば `SOUL.md` を別のペルソナに差し替えるなど)。
|
||||
|
||||
エージェントの口調をより汎用的でなくしたい場合は、まず
|
||||
エージェントの話し方をより generic でなくしたい場合は、まず
|
||||
[SOUL.md Personality Guide](/ja-JP/concepts/soul) から始めてください。
|
||||
|
||||
各注入ファイルがどれだけ寄与しているか(生データと注入後、切り詰め、さらにツールスキーマのオーバーヘッド)を確認するには、`/context list` または `/context detail` を使用してください。[Context](/ja-JP/concepts/context) を参照してください。
|
||||
各注入ファイルの寄与量(raw と injected、切り詰め、さらにツールスキーマのオーバーヘッド)を確認するには、`/context list` または `/context detail` を使ってください。[Context](/ja-JP/concepts/context) を参照してください。
|
||||
|
||||
## 時刻の扱い
|
||||
## 時刻処理
|
||||
|
||||
システムプロンプトには、ユーザーのタイムゾーンが既知の場合、専用の **Current Date & Time** セクションが含まれます。プロンプトキャッシュを安定させるため、ここには現在 **タイムゾーン** のみが含まれます(動的な時計や時刻形式は含みません)。
|
||||
ユーザーのタイムゾーンがわかっている場合、システムプロンプトには専用の **Current Date & Time** セクションが含まれます。プロンプトキャッシュを安定させるため、現在は **タイムゾーン** のみを含みます(動的な時計や時刻形式は含みません)。
|
||||
|
||||
エージェントが現在時刻を必要とする場合は `session_status` を使用してください。ステータスカードにはタイムスタンプ行が含まれます。同じツールでは、セッションごとのモデル上書きも任意で設定できます(`model=default` でクリアされます)。
|
||||
エージェントが現在時刻を必要とする場合は `session_status` を使ってください。ステータスカードにはタイムスタンプ行が含まれます。同じツールは、セッションごとのモデル上書きも任意で設定できます(`model=default` でクリアされます)。
|
||||
|
||||
設定は次で行います。
|
||||
設定項目:
|
||||
|
||||
- `agents.defaults.userTimezone`
|
||||
- `agents.defaults.timeFormat`(`auto` | `12` | `24`)
|
||||
|
||||
完全な挙動の詳細は [Date & Time](/ja-JP/date-time) を参照してください。
|
||||
完全な動作の詳細は [Date & Time](/ja-JP/date-time) を参照してください。
|
||||
|
||||
## Skills
|
||||
|
||||
対象となる skill が存在する場合、OpenClaw は **available skills list** のコンパクト版(`formatSkillsForPrompt`)を注入し、各 skill の **ファイルパス** を含めます。プロンプトは、列挙された場所(ワークスペース、管理対象、または同梱)にある SKILL.md を読み込むために `read` を使うようモデルに指示します。対象 skill がない場合、Skills セクションは省略されます。
|
||||
条件を満たすスキルが存在する場合、OpenClaw は **利用可能なスキル一覧** をコンパクトに注入します(`formatSkillsForPrompt`)。これには各スキルの **ファイルパス** が含まれます。プロンプトは、列挙された場所(ワークスペース、managed、または bundled)にある SKILL.md を `read` で読み込むようモデルに指示します。条件を満たすスキルがない場合、Skills セクションは省略されます。
|
||||
|
||||
対象判定には、skill メタデータのゲート、ランタイム環境 / 設定チェック、および `agents.defaults.skills` または
|
||||
`agents.list[].skills` が設定されている場合の有効なエージェント skill allowlist が含まれます。
|
||||
適格性には、スキルメタデータのゲート、ランタイム環境/設定チェック、そして `agents.defaults.skills` または
|
||||
`agents.list[].skills` が設定されている場合の有効なエージェントスキル許可リストが含まれます。
|
||||
|
||||
```
|
||||
<available_skills>
|
||||
@ -133,8 +136,20 @@ OpenClaw は、サブエージェント向けにより小さいシステムプ
|
||||
</available_skills>
|
||||
```
|
||||
|
||||
これにより、ベースプロンプトを小さく保ちながら、必要な skill だけを使えるようにしています。
|
||||
これにより、ベースプロンプトを小さく保ちながら、対象を絞ったスキル利用を可能にします。
|
||||
|
||||
スキル一覧の予算はスキルサブシステムが管理します。
|
||||
|
||||
- グローバルデフォルト: `skills.limits.maxSkillsPromptChars`
|
||||
- エージェントごとの上書き: `agents.list[].skillsLimits.maxSkillsPromptChars`
|
||||
|
||||
一般的な境界付きランタイム抜粋は別のサーフェスを使います。
|
||||
|
||||
- `agents.defaults.contextLimits.*`
|
||||
- `agents.list[].contextLimits.*`
|
||||
|
||||
この分離により、スキルのサイズ設定を、`memory_get`、ライブツール結果、Compaction 後の AGENTS.md リフレッシュなどのランタイム読み取り/注入サイズから分けて扱えます。
|
||||
|
||||
## Documentation
|
||||
|
||||
利用可能な場合、システムプロンプトには **Documentation** セクションが含まれ、OpenClaw ドキュメントディレクトリのローカルパス(リポジトリ内の `docs/` または npm パッケージに同梱されたドキュメント)を示します。また、公開ミラー、ソースリポジトリ、コミュニティ Discord、および Skills を見つけるための ClawHub([https://clawhub.ai](https://clawhub.ai))にも触れます。プロンプトは、OpenClaw の挙動、コマンド、設定、またはアーキテクチャについては、まずローカルドキュメントを参照し、可能であれば自分で `openclaw status` を実行するようモデルに指示します(アクセス権がない場合にのみユーザーに尋ねます)。
|
||||
利用可能な場合、システムプロンプトには **Documentation** セクションが含まれ、ローカルの OpenClaw ドキュメントディレクトリ(リポジトリワークスペース内の `docs/` またはバンドルされた npm パッケージのドキュメント)を指し示します。さらに、公開ミラー、ソースリポジトリ、コミュニティ Discord、そしてスキル発見用の ClawHub([https://clawhub.ai](https://clawhub.ai))も記載されます。プロンプトは、OpenClaw の動作、コマンド、設定、またはアーキテクチャについては、まずローカルドキュメントを参照し、可能な場合は `openclaw status` を自分で実行するようモデルに指示します(アクセスできない場合にのみユーザーに尋ねます)。
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -2,91 +2,86 @@
|
||||
read_when:
|
||||
- 新しいメッセージングチャネルPluginを構築しています
|
||||
- OpenClawをメッセージングプラットフォームに接続したいと考えています
|
||||
- ChannelPluginアダプターの公開インターフェースを理解する必要があります
|
||||
- ChannelPluginアダプターの表面を理解する必要があります
|
||||
sidebarTitle: Channel Plugins
|
||||
summary: OpenClaw向けメッセージングチャネルPluginを構築するためのステップバイステップガイド
|
||||
summary: OpenClaw向けメッセージングチャネルPluginを構築するためのステップごとのガイド
|
||||
title: チャネルPluginの構築
|
||||
x-i18n:
|
||||
generated_at: "2026-04-15T04:43:33Z"
|
||||
generated_at: "2026-04-15T19:41:39Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: a7f4c746fe3163a8880e14c433f4db4a1475535d91716a53fb879551d8d62f65
|
||||
source_hash: 80e47e61d1e47738361692522b79aff276544446c58a7b41afe5296635dfad4b
|
||||
source_path: plugins/sdk-channel-plugins.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# チャネルPluginの構築
|
||||
|
||||
このガイドでは、OpenClawをメッセージングプラットフォームに接続するチャネルPluginの構築方法を説明します。最後には、DMセキュリティ、ペアリング、返信スレッド化、送信メッセージングを備えた動作するチャネルが完成します。
|
||||
このガイドでは、OpenClawをメッセージングプラットフォームに接続するチャネルpluginの構築方法を説明します。最終的には、DMセキュリティ、ペアリング、返信スレッド化、送信メッセージングを備えた動作するチャネルを完成させます。
|
||||
|
||||
<Info>
|
||||
OpenClaw Pluginをまだ一度も構築したことがない場合は、基本的なパッケージ
|
||||
構造とマニフェスト設定について最初に
|
||||
OpenClaw pluginをこれまでに一度も構築したことがない場合は、基本的なパッケージ構造とマニフェスト設定について、まず
|
||||
[はじめに](/ja-JP/plugins/building-plugins)を読んでください。
|
||||
</Info>
|
||||
|
||||
## チャネルPluginの仕組み
|
||||
|
||||
チャネルPluginには独自の送信・編集・リアクション用ツールは不要です。OpenClawはコアで1つの共有`message`ツールを維持します。Pluginが担当するのは次の項目です。
|
||||
チャネルpluginには、独自の送信・編集・リアクションツールは不要です。OpenClawは、コアに1つの共有`message`ツールを保持しています。pluginが担うのは次の項目です。
|
||||
|
||||
- **設定** — アカウント解決とセットアップウィザード
|
||||
- **セキュリティ** — DMポリシーと許可リスト
|
||||
- **ペアリング** — DM承認フロー
|
||||
- **セッショングラマー** — プロバイダー固有の会話idをベースチャット、スレッドid、親フォールバックにどう対応付けるか
|
||||
- **送信** — テキスト、メディア、投票をプラットフォームに送信すること
|
||||
- **スレッド化** — 返信をどうスレッド化するか
|
||||
- **Config** — アカウント解決とセットアップウィザード
|
||||
- **Security** — DMポリシーと許可リスト
|
||||
- **Pairing** — DM承認フロー
|
||||
- **Session grammar** — プロバイダー固有の会話IDを、ベースチャット、スレッドID、親フォールバックにどのように対応付けるか
|
||||
- **Outbound** — テキスト、メディア、投票をプラットフォームへ送信すること
|
||||
- **Threading** — 返信をどのようにスレッド化するか
|
||||
|
||||
コアは共有messageツール、プロンプト配線、外側のセッションキー形状、汎用的な`:thread:`管理、およびディスパッチを担当します。
|
||||
コアは、共有messageツール、プロンプト配線、外側のセッションキー形状、汎用的な`:thread:`管理、ディスパッチを担います。
|
||||
|
||||
チャネルでメディアソースを運ぶmessage-toolパラメータを追加する場合は、それらの
|
||||
パラメータ名を`describeMessageTool(...).mediaSourceParams`を通じて公開してください。コアはその明示的な一覧をサンドボックスパス正規化と送信メディアアクセスポリシーに使用するため、Plugin側でプロバイダー固有のアバター、添付ファイル、カバー画像パラメータに対して共有コアの特別扱いは不要です。
|
||||
可能であれば、`{ "set-profile": ["avatarUrl", "avatarPath"] }`のようなアクションキー付きマップを返してください。そうすることで、無関係なアクションが別アクションのメディア引数を継承しません。意図的に公開されるすべてのアクションで共有するパラメータであれば、フラットな配列でも引き続き使用できます。
|
||||
チャネルがメディアソースを運ぶmessage-toolパラメーターを追加する場合は、それらのパラメーター名を`describeMessageTool(...).mediaSourceParams`を通じて公開してください。コアはその明示的なリストを、サンドボックスパスの正規化と送信メディアアクセス方針に使用するため、plugin側でプロバイダー固有のアバター、添付ファイル、またはカバー画像パラメーターのために共有コアの特別扱いを追加する必要はありません。
|
||||
できれば、`{ "set-profile": ["avatarUrl", "avatarPath"] }`のようなアクションキー付きマップを返してください。そうすることで、無関係なアクションが別のアクションのメディア引数を継承しません。意図的にすべての公開アクションで共有されるパラメーターであれば、フラットな配列でも引き続き利用できます。
|
||||
|
||||
プラットフォームが会話id内に追加のスコープを格納する場合は、その解析を
|
||||
`messaging.resolveSessionConversation(...)`でPlugin内に保持してください。これは、`rawId`をベース会話id、任意のスレッドid、明示的な`baseConversationId`、および任意の`parentConversationCandidates`に対応付けるための正規のフックです。
|
||||
`parentConversationCandidates`を返す場合は、最も狭い親から最も広い親/ベース会話の順に並べてください。
|
||||
プラットフォームが会話IDの中に追加のスコープを保存する場合は、その解析をplugin内で`messaging.resolveSessionConversation(...)`を使って行ってください。これは、`rawId`をベース会話ID、任意のスレッドID、明示的な`baseConversationId`、および任意の`parentConversationCandidates`に対応付けるための正規のフックです。
|
||||
`parentConversationCandidates`を返す場合は、最も狭い親から最も広い/ベース会話までの順に並べてください。
|
||||
|
||||
チャネルレジストリの起動前に同じ解析が必要な同梱Pluginでは、対応する
|
||||
`resolveSessionConversation(...)`エクスポートを持つトップレベルの`session-key-api.ts`ファイルも公開できます。コアは、実行時Pluginレジストリがまだ利用できない場合にのみ、このブートストラップ安全な公開インターフェースを使用します。
|
||||
チャネルレジストリが起動する前に同じ解析を必要とする同梱pluginは、一致する`resolveSessionConversation(...)`エクスポートを持つトップレベルの`session-key-api.ts`ファイルも公開できます。コアは、実行時pluginレジストリがまだ利用できない場合に限って、このブートストラップ安全なサーフェスを使用します。
|
||||
|
||||
`messaging.resolveParentConversationCandidates(...)`は、Pluginが汎用/raw idに加えて親フォールバックのみを必要とする場合の、従来の互換性フォールバックとして引き続き利用できます。両方のフックが存在する場合、コアはまず
|
||||
`resolveSessionConversation(...).parentConversationCandidates`を使用し、その正規フックがそれらを省略した場合にのみ`resolveParentConversationCandidates(...)`へフォールバックします。
|
||||
`messaging.resolveParentConversationCandidates(...)`は、pluginが汎用/生のIDに加えて親フォールバックだけを必要とする場合の、レガシー互換フォールバックとして引き続き利用できます。両方のフックが存在する場合、コアはまず`resolveSessionConversation(...).parentConversationCandidates`を使用し、正規フックがそれらを省略した場合にのみ`resolveParentConversationCandidates(...)`へフォールバックします。
|
||||
|
||||
## 承認とチャネル機能
|
||||
|
||||
ほとんどのチャネルPluginでは、承認固有のコードは不要です。
|
||||
ほとんどのチャネルpluginでは、承認固有のコードは不要です。
|
||||
|
||||
- コアは同一チャット内の`/approve`、共有承認ボタンのペイロード、および汎用フォールバック配信を担当します。
|
||||
- チャネルで承認固有の動作が必要な場合は、チャネルPlugin上に1つの`approvalCapability`オブジェクトを置くことを推奨します。
|
||||
- コアは、同一チャット内の`/approve`、共有承認ボタンのペイロード、汎用フォールバック配信を担います。
|
||||
- チャネルが承認固有の動作を必要とする場合は、チャネルplugin上で1つの`approvalCapability`オブジェクトを使うようにしてください。
|
||||
- `ChannelPlugin.approvals`は削除されました。承認の配信/ネイティブ/レンダリング/認証に関する情報は`approvalCapability`に置いてください。
|
||||
- `plugin.auth`はlogin/logout専用です。コアはそのオブジェクトから承認認証フックを読み取らなくなりました。
|
||||
- `approvalCapability.authorizeActorAction`と`approvalCapability.getActionAvailabilityState`が正規の承認認証インターフェースです。
|
||||
- 同一チャット内の承認認証の可用性には`approvalCapability.getActionAvailabilityState`を使用してください。
|
||||
- チャネルがネイティブexec承認を公開する場合、開始サーフェス/ネイティブクライアント状態が同一チャット内承認認証と異なるときは、`approvalCapability.getExecInitiatingSurfaceState`を使用してください。コアはこのexec固有のフックを使用して`enabled`と`disabled`を区別し、開始チャネルがネイティブexec承認をサポートしているかを判断し、ネイティブクライアントのフォールバック案内にそのチャネルを含めます。`createApproverRestrictedNativeApprovalCapability(...)`は一般的なケースに対してこれを補います。
|
||||
- 重複するローカル承認プロンプトの非表示や、配信前の入力中インジケーター送信のような、チャネル固有のペイロードライフサイクル動作には、`outbound.shouldSuppressLocalPayloadPrompt`または`outbound.beforeDeliverPayload`を使用してください。
|
||||
- `plugin.auth`はlogin/logout専用です。コアはもはやそのオブジェクトから承認認証フックを読み取りません。
|
||||
- `approvalCapability.authorizeActorAction`と`approvalCapability.getActionAvailabilityState`が、正規の承認認証シームです。
|
||||
- 同一チャット承認の認証可用性には`approvalCapability.getActionAvailabilityState`を使用してください。
|
||||
- チャネルがネイティブexec承認を公開する場合、開始サーフェス/ネイティブクライアント状態が同一チャット承認認証と異なるときは、`approvalCapability.getExecInitiatingSurfaceState`を使用してください。コアはこのexec固有フックを使って、開始チャネルがネイティブexec承認をサポートしているかどうかを判定し、`enabled`と`disabled`を区別し、ネイティブクライアントのフォールバック案内にそのチャネルを含めます。`createApproverRestrictedNativeApprovalCapability(...)`は、一般的なケース向けにこれを補います。
|
||||
- 重複するローカル承認プロンプトの非表示や、配信前の入力中インジケーター送信など、チャネル固有のペイロードライフサイクル動作には、`outbound.shouldSuppressLocalPayloadPrompt`または`outbound.beforeDeliverPayload`を使用してください。
|
||||
- `approvalCapability.delivery`は、ネイティブ承認ルーティングまたはフォールバック抑制にのみ使用してください。
|
||||
- チャネル所有のネイティブ承認情報には`approvalCapability.nativeRuntime`を使用してください。`createLazyChannelApprovalNativeRuntimeAdapter(...)`を使って、ホットなチャネルエントリーポイントではこれを遅延ロードにしてください。これにより、コアは承認ライフサイクルを組み立てつつ、必要時に実行時モジュールをimportできます。
|
||||
- 共有レンダラーではなく、チャネルが本当に独自の承認ペイロードを必要とする場合にのみ`approvalCapability.render`を使用してください。
|
||||
- チャネルが、無効時パスの返信でネイティブexec承認を有効化するために必要な正確な設定項目を説明したい場合は、`approvalCapability.describeExecApprovalSetup`を使用してください。このフックは`{ channel, channelLabel, accountId }`を受け取ります。名前付きアカウントのチャネルでは、トップレベルのデフォルトではなく、`channels.<channel>.accounts.<id>.execApprovals.*`のようなアカウントスコープのパスを表示してください。
|
||||
- 既存設定から安定した所有者相当のDMアイデンティティを推測できるチャネルでは、承認固有のコアロジックを追加せずに同一チャット内の`/approve`を制限するため、`openclaw/plugin-sdk/approval-runtime`の`createResolvedApproverActionAuthAdapter`を使用してください。
|
||||
- チャネルにネイティブ承認配信が必要な場合、チャネルコードはターゲット正規化とトランスポート/プレゼンテーション情報に集中させてください。`openclaw/plugin-sdk/approval-runtime`の`createChannelExecApprovalProfile`、`createChannelNativeOriginTargetResolver`、`createChannelApproverDmTargetResolver`、`createApproverRestrictedNativeApprovalCapability`を使用してください。チャネル固有の情報は`approvalCapability.nativeRuntime`の背後に置き、理想的には`createChannelApprovalNativeRuntimeAdapter(...)`または`createLazyChannelApprovalNativeRuntimeAdapter(...)`を通してください。これにより、コアはハンドラーを組み立て、リクエストフィルタリング、ルーティング、重複排除、有効期限、Gatewayサブスクリプション、別経路通知を担当できます。`nativeRuntime`はいくつかの小さなインターフェースに分割されています。
|
||||
- `availability` — アカウントが設定済みか、およびリクエストを処理すべきかどうか
|
||||
- `presentation` — 共有承認ビューモデルを、保留/解決済み/期限切れのネイティブペイロードまたは最終アクションにマッピングする
|
||||
- チャネル所有のネイティブ承認情報には`approvalCapability.nativeRuntime`を使用してください。ホットなチャネルエントリーポイントでは、`createLazyChannelApprovalNativeRuntimeAdapter(...)`でこれを遅延化してください。これにより、コアが承認ライフサイクルを組み立てつつ、必要時に実行時モジュールをimportできます。
|
||||
- チャネルが共有レンダラーの代わりに本当にカスタム承認ペイロードを必要とする場合にのみ、`approvalCapability.render`を使用してください。
|
||||
- チャネルが、無効パスの返信でネイティブexec承認を有効化するために必要な正確なconfigノブを説明したい場合は、`approvalCapability.describeExecApprovalSetup`を使用してください。このフックは`{ channel, channelLabel, accountId }`を受け取ります。名前付きアカウントのチャネルは、トップレベルのデフォルトではなく、`channels.<channel>.accounts.<id>.execApprovals.*`のようなアカウントスコープ付きパスを描画する必要があります。
|
||||
- チャネルが既存configから安定したオーナー的DMアイデンティティを推論できる場合は、承認固有のコアロジックを追加せずに同一チャット`/approve`を制限するため、`openclaw/plugin-sdk/approval-runtime`の`createResolvedApproverActionAuthAdapter`を使用してください。
|
||||
- チャネルがネイティブ承認配信を必要とする場合、チャネルコードはターゲット正規化と転送/表示情報に集中させてください。`openclaw/plugin-sdk/approval-runtime`の`createChannelExecApprovalProfile`、`createChannelNativeOriginTargetResolver`、`createChannelApproverDmTargetResolver`、`createApproverRestrictedNativeApprovalCapability`を使用してください。チャネル固有の情報は`approvalCapability.nativeRuntime`の背後に置き、理想的には`createChannelApprovalNativeRuntimeAdapter(...)`または`createLazyChannelApprovalNativeRuntimeAdapter(...)`を通してください。そうすることで、コアがハンドラーを組み立て、リクエストフィルタリング、ルーティング、重複排除、有効期限、Gateway購読、別経路通知を担えます。`nativeRuntime`はいくつかのより小さなシームに分かれています。
|
||||
- `availability` — アカウントが設定されているか、およびリクエストを処理すべきかどうか
|
||||
- `presentation` — 共有承認ビューモデルを、保留/解決済み/期限切れのネイティブペイロードまたは最終アクションへ対応付ける
|
||||
- `transport` — ターゲットを準備し、ネイティブ承認メッセージを送信/更新/削除する
|
||||
- `interactions` — ネイティブボタンやリアクション向けの任意のbind/unbind/clear-actionフック
|
||||
- `interactions` — ネイティブボタンやリアクションのための任意のbind/unbind/clear-actionフック
|
||||
- `observe` — 任意の配信診断フック
|
||||
- チャネルにclient、token、Boltアプリ、Webhookレシーバーのような実行時所有オブジェクトが必要な場合は、`openclaw/plugin-sdk/channel-runtime-context`を通じて登録してください。汎用runtime-contextレジストリにより、コアは承認固有のラッパーを追加せずに、チャネル起動状態から機能駆動ハンドラーをブートストラップできます。
|
||||
- capability駆動インターフェースでまだ十分に表現できない場合にのみ、より低レベルの`createChannelApprovalHandler`または`createChannelNativeApprovalRuntime`を使用してください。
|
||||
- ネイティブ承認チャネルでは、これらのヘルパーを通じて`accountId`と`approvalKind`の両方をルーティングする必要があります。`accountId`はマルチアカウント承認ポリシーを正しいボットアカウントにスコープし、`approvalKind`はコアでハードコードされた分岐なしにexecとplugin承認の動作をチャネルで利用可能にします。
|
||||
- コアは承認の再ルーティング通知も担当するようになりました。チャネルPluginは、`createChannelNativeApprovalRuntime`から独自の「承認はDM/別チャネルに送られました」という追跡メッセージを送信すべきではありません。代わりに、共有承認capabilityヘルパーを通じて正確なoriginとapprover-DMルーティングを公開し、開始チャットに通知を投稿する前にコアが実際の配信を集約するようにしてください。
|
||||
- 配信された承認idの種類をエンドツーエンドで保持してください。ネイティブクライアントは、チャネルローカルの状態からexecとplugin承認のルーティングを推測または書き換えるべきではありません。
|
||||
- 異なる承認種類で、意図的に異なるネイティブサーフェスを公開してもかまいません。
|
||||
- チャネルがクライアント、トークン、Boltアプリ、Webhook受信側のような実行時所有オブジェクトを必要とする場合は、`openclaw/plugin-sdk/channel-runtime-context`を通じて登録してください。汎用のruntime-contextレジストリにより、コアは承認固有のラッパー接着コードを追加せずに、チャネル起動状態からcapability駆動ハンドラーをブートストラップできます。
|
||||
- capability駆動シームだけではまだ表現力が足りない場合にのみ、下位レベルの`createChannelApprovalHandler`または`createChannelNativeApprovalRuntime`に手を伸ばしてください。
|
||||
- ネイティブ承認チャネルは、`accountId`と`approvalKind`の両方をそれらのヘルパーに渡す必要があります。`accountId`は複数アカウント承認ポリシーを正しいbotアカウントにスコープし、`approvalKind`はコア内のハードコード分岐なしでexec対plugin承認動作をチャネルで利用可能にします。
|
||||
- コアは現在、承認の再ルーティング通知も担います。チャネルpluginは、`createChannelNativeApprovalRuntime`から独自の「承認はDM/別チャネルへ送られました」フォローアップメッセージを送信すべきではありません。代わりに、共有承認capabilityヘルパーを通じて正確な発信元+承認者DMルーティングを公開し、開始チャットへ通知を投稿する前に実際の配信をコアに集約させてください。
|
||||
- 配信済み承認IDの種類は、エンドツーエンドで保持してください。ネイティブクライアントは、チャネルローカル状態からexec対plugin承認ルーティングを推測したり書き換えたりしてはいけません。
|
||||
- 異なる承認種別は、意図的に異なるネイティブサーフェスを公開できます。
|
||||
現在の同梱例:
|
||||
- Slackは、exec idとplugin idの両方でネイティブ承認ルーティングを利用可能にしています。
|
||||
- Matrixは、exec承認とplugin承認で同じネイティブDM/チャネルルーティングとリアクションUXを維持しつつ、承認種類による認証の違いも許可しています。
|
||||
- `createApproverRestrictedNativeApprovalAdapter`は互換性ラッパーとしてまだ存在しますが、新しいコードではcapability builderを推奨し、Plugin上で`approvalCapability`を公開してください。
|
||||
- Slackは、execとpluginの両方のIDに対してネイティブ承認ルーティングを利用可能に保っています。
|
||||
- Matrixは、execとpluginの承認で認証を異ならせつつ、同じネイティブDM/チャネルルーティングとリアクションUXを維持しています。
|
||||
- `createApproverRestrictedNativeApprovalAdapter`は互換ラッパーとして引き続き存在しますが、新しいコードではcapability builderを優先し、plugin上に`approvalCapability`を公開してください。
|
||||
|
||||
ホットなチャネルエントリーポイントでは、そのファミリーのうち1つの部分だけが必要な場合、より狭いruntimeサブパスを優先してください。
|
||||
ホットなチャネルエントリーポイントでは、そのファミリーの一部だけが必要な場合、より狭いruntimeサブパスを優先してください。
|
||||
|
||||
- `openclaw/plugin-sdk/approval-auth-runtime`
|
||||
- `openclaw/plugin-sdk/approval-client-runtime`
|
||||
@ -98,77 +93,70 @@ x-i18n:
|
||||
- `openclaw/plugin-sdk/approval-reply-runtime`
|
||||
- `openclaw/plugin-sdk/channel-runtime-context`
|
||||
|
||||
同様に、より広い包括的な公開インターフェースが不要な場合は、
|
||||
`openclaw/plugin-sdk/setup-runtime`、
|
||||
`openclaw/plugin-sdk/setup-adapter-runtime`、
|
||||
`openclaw/plugin-sdk/reply-runtime`、
|
||||
`openclaw/plugin-sdk/reply-dispatch-runtime`、
|
||||
`openclaw/plugin-sdk/reply-reference`、および
|
||||
`openclaw/plugin-sdk/reply-chunking`
|
||||
を優先してください。
|
||||
同様に、より広い傘型サーフェスが不要な場合は、`openclaw/plugin-sdk/setup-runtime`、`openclaw/plugin-sdk/setup-adapter-runtime`、`openclaw/plugin-sdk/reply-runtime`、`openclaw/plugin-sdk/reply-dispatch-runtime`、`openclaw/plugin-sdk/reply-reference`、`openclaw/plugin-sdk/reply-chunking`を優先してください。
|
||||
|
||||
セットアップに関しては特に次のとおりです。
|
||||
セットアップについては、特に次のとおりです。
|
||||
|
||||
- `openclaw/plugin-sdk/setup-runtime`はruntime-safeなセットアップヘルパーを提供します:
|
||||
import-safeなセットアップパッチアダプター(`createPatchedAccountSetupAdapter`,
|
||||
- `openclaw/plugin-sdk/setup-runtime`は、runtime-safeなセットアップヘルパーを扱います:
|
||||
import-safeなセットアップパッチアダプター(`createPatchedAccountSetupAdapter`、
|
||||
`createEnvPatchedAccountSetupAdapter`,
|
||||
`createSetupInputPresenceValidator`)、lookup-note出力、
|
||||
`promptResolvedAllowFrom`、`splitSetupEntries`、および委譲された
|
||||
`promptResolvedAllowFrom`、`splitSetupEntries`、委譲された
|
||||
setup-proxy builder
|
||||
- `openclaw/plugin-sdk/setup-adapter-runtime`は、`createEnvPatchedAccountSetupAdapter`向けの狭いenv-aware adapterインターフェースです
|
||||
- `openclaw/plugin-sdk/channel-setup`は、オプションインストール用セットアップbuilderと、いくつかのセットアップ安全なプリミティブを提供します:
|
||||
- `openclaw/plugin-sdk/setup-adapter-runtime`は、`createEnvPatchedAccountSetupAdapter`向けの狭いenv対応アダプターシームです
|
||||
- `openclaw/plugin-sdk/channel-setup`は、オプションインストールのセットアップbuilderと、いくつかのセットアップ安全なプリミティブを扱います:
|
||||
`createOptionalChannelSetupSurface`, `createOptionalChannelSetupAdapter`,
|
||||
|
||||
チャネルがenv駆動のセットアップまたは認証をサポートし、汎用の起動/設定フローでruntimeロード前にそれらのenv名を把握する必要がある場合は、Pluginマニフェストで`channelEnvVars`として宣言してください。チャネルruntimeの`envVars`やローカル定数は、オペレーター向け文言専用にとどめてください。
|
||||
チャネルがenv駆動のセットアップまたは認証をサポートし、汎用の起動/configフローがruntimeロード前にそれらのenv名を知る必要がある場合は、pluginマニフェストで`channelEnvVars`として宣言してください。チャネルruntimeの`envVars`またはローカル定数は、運用者向けコピー専用にしてください。
|
||||
`createOptionalChannelSetupWizard`, `DEFAULT_ACCOUNT_ID`,
|
||||
`createTopLevelChannelDmPolicy`, `setSetupChannelEnabled`, および
|
||||
`splitSetupEntries`
|
||||
|
||||
- より重い共有セットアップ/設定ヘルパー、たとえば
|
||||
`moveSingleAccountChannelSectionToDefaultAccount(...)`
|
||||
も必要な場合にのみ、より広い`openclaw/plugin-sdk/setup`インターフェースを使用してください
|
||||
- より重い共有セットアップ/configヘルパー、たとえば
|
||||
`moveSingleAccountChannelSectionToDefaultAccount(...)`も必要な場合にのみ、より広い`openclaw/plugin-sdk/setup`シームを使用してください
|
||||
|
||||
チャネルがセットアップ画面で「まずこのPluginをインストールしてください」と案内したいだけなら、`createOptionalChannelSetupSurface(...)`を優先してください。生成されるadapter/wizardは設定書き込みと最終化でfail closedし、検証、最終化、ドキュメントリンク文言で同じインストール必須メッセージを再利用します。
|
||||
チャネルがセットアップサーフェス内で「まずこのpluginをインストールしてください」と告知したいだけなら、`createOptionalChannelSetupSurface(...)`を優先してください。生成されるアダプター/ウィザードはconfig書き込みと最終化でフェイルクローズし、検証、最終化、ドキュメントリンク文言の各所で同じインストール必須メッセージを再利用します。
|
||||
|
||||
そのほかのホットなチャネルパスでも、より広い従来の公開インターフェースより狭いヘルパーを優先してください。
|
||||
その他のホットなチャネルパスでも、より広いレガシーサーフェスより狭いヘルパーを優先してください。
|
||||
|
||||
- `openclaw/plugin-sdk/account-core`,
|
||||
`openclaw/plugin-sdk/account-id`,
|
||||
`openclaw/plugin-sdk/account-resolution`, および
|
||||
`openclaw/plugin-sdk/account-helpers` は、マルチアカウント設定と
|
||||
デフォルトアカウントへのフォールバック用です
|
||||
- `openclaw/plugin-sdk/inbound-envelope` および
|
||||
`openclaw/plugin-sdk/inbound-reply-dispatch` は、受信route/envelopeと
|
||||
record-and-dispatch配線用です
|
||||
- `openclaw/plugin-sdk/messaging-targets` はターゲット解析/照合用です
|
||||
- `openclaw/plugin-sdk/outbound-media` および
|
||||
- `openclaw/plugin-sdk/account-core`、
|
||||
`openclaw/plugin-sdk/account-id`、
|
||||
`openclaw/plugin-sdk/account-resolution`、および
|
||||
`openclaw/plugin-sdk/account-helpers` は、複数アカウントconfigと
|
||||
デフォルトアカウントフォールバック向けです
|
||||
- `openclaw/plugin-sdk/inbound-envelope` と
|
||||
`openclaw/plugin-sdk/inbound-reply-dispatch` は、受信ルート/エンベロープと
|
||||
record-and-dispatch配線向けです
|
||||
- `openclaw/plugin-sdk/messaging-targets` は、ターゲット解析/マッチング向けです
|
||||
- `openclaw/plugin-sdk/outbound-media` と
|
||||
`openclaw/plugin-sdk/outbound-runtime` は、メディア読み込みと送信
|
||||
identity/send delegate用です
|
||||
- `openclaw/plugin-sdk/thread-bindings-runtime` は、スレッドbindingライフサイクル
|
||||
とadapter登録用です
|
||||
- `openclaw/plugin-sdk/agent-media-payload` は、従来のagent/media
|
||||
ペイロードフィールド配置がまだ必要な場合にのみ使用してください
|
||||
アイデンティティ/送信デリゲート向けです
|
||||
- `openclaw/plugin-sdk/thread-bindings-runtime` は、スレッドバインディングのライフサイクル
|
||||
とアダプター登録向けです
|
||||
- `openclaw/plugin-sdk/agent-media-payload` は、レガシーなagent/media
|
||||
ペイロードのフィールドレイアウトが依然必要な場合にのみ使用してください
|
||||
- `openclaw/plugin-sdk/telegram-command-config` は、Telegramカスタムコマンドの
|
||||
正規化、重複/競合検証、およびフォールバック安定なコマンド設定コントラクト用です
|
||||
正規化、重複/競合検証、およびフォールバック安定なコマンド
|
||||
config契約向けです
|
||||
|
||||
認証専用チャネルは通常、デフォルトの経路で十分です。コアが承認を処理し、Pluginは送信/認証capabilityを公開するだけで済みます。Matrix、Slack、Telegram、カスタムチャットトランスポートのようなネイティブ承認チャネルは、独自の承認ライフサイクルを実装するのではなく、共有のネイティブヘルパーを使用してください。
|
||||
認証専用チャネルは通常、デフォルトのパスで十分です。コアが承認を処理し、pluginは送信/認証capabilityを公開するだけです。Matrix、Slack、Telegram、カスタムチャット転送のようなネイティブ承認チャネルは、独自の承認ライフサイクルを実装するのではなく、共有ネイティブヘルパーを使うべきです。
|
||||
|
||||
## 受信メンションポリシー
|
||||
|
||||
受信メンション処理は、次の2層に分けたままにしてください。
|
||||
受信メンション処理は、次の2層に分けてください。
|
||||
|
||||
- Plugin所有の証拠収集
|
||||
- plugin所有の証拠収集
|
||||
- 共有ポリシー評価
|
||||
|
||||
共有レイヤーには`openclaw/plugin-sdk/channel-inbound`を使用してください。
|
||||
|
||||
Pluginローカルロジックに適しているもの:
|
||||
pluginローカルロジックに適しているもの:
|
||||
|
||||
- botへの返信の検出
|
||||
- botを引用したメッセージの検出
|
||||
- botへの返信検出
|
||||
- bot引用の検出
|
||||
- スレッド参加チェック
|
||||
- サービス/システムメッセージの除外
|
||||
- botの参加を証明するために必要なプラットフォームネイティブキャッシュ
|
||||
- bot参加を証明するために必要なプラットフォームネイティブキャッシュ
|
||||
|
||||
共有ヘルパーに適しているもの:
|
||||
|
||||
@ -176,13 +164,13 @@ Pluginローカルロジックに適しているもの:
|
||||
- 明示的メンション結果
|
||||
- 暗黙的メンション許可リスト
|
||||
- コマンドバイパス
|
||||
- 最終的なスキップ判定
|
||||
- 最終スキップ判定
|
||||
|
||||
推奨フロー:
|
||||
|
||||
1. ローカルのメンション情報を計算します。
|
||||
2. その情報を`resolveInboundMentionDecision({ facts, policy })`に渡します。
|
||||
3. 受信ゲートで`decision.effectiveWasMentioned`、`decision.shouldBypassMention`、`decision.shouldSkip`を使用します。
|
||||
3. 受信ゲートでは`decision.effectiveWasMentioned`、`decision.shouldBypassMention`、`decision.shouldSkip`を使用します。
|
||||
|
||||
```typescript
|
||||
import {
|
||||
@ -221,7 +209,7 @@ const decision = resolveInboundMentionDecision({
|
||||
if (decision.shouldSkip) return;
|
||||
```
|
||||
|
||||
`api.runtime.channel.mentions`は、すでにruntime injectionに依存している同梱チャネルPlugin向けに、同じ共有メンションヘルパーを公開します。
|
||||
`api.runtime.channel.mentions`は、すでにruntime injectionに依存している同梱チャネルplugin向けに、同じ共有メンションヘルパーを公開します。
|
||||
|
||||
- `buildMentionRegexes`
|
||||
- `matchesMentionPatterns`
|
||||
@ -229,17 +217,14 @@ if (decision.shouldSkip) return;
|
||||
- `implicitMentionKindWhen`
|
||||
- `resolveInboundMentionDecision`
|
||||
|
||||
古い`resolveMentionGating*`ヘルパーは、
|
||||
`openclaw/plugin-sdk/channel-inbound`上に互換性エクスポートとしてのみ残されています。新しいコードでは
|
||||
`resolveInboundMentionDecision({ facts, policy })`を使用してください。
|
||||
古い`resolveMentionGating*`ヘルパーは、互換エクスポート専用として`openclaw/plugin-sdk/channel-inbound`に引き続き残っています。新しいコードでは`resolveInboundMentionDecision({ facts, policy })`を使用してください。
|
||||
|
||||
## ウォークスルー
|
||||
|
||||
<Steps>
|
||||
<a id="step-1-package-and-manifest"></a>
|
||||
<Step title="パッケージとマニフェスト">
|
||||
標準的なPluginファイルを作成します。`package.json`の`channel`フィールドが、
|
||||
これをチャネルPluginにします。完全なパッケージメタデータの公開インターフェースについては、
|
||||
標準のpluginファイルを作成します。`package.json`内の`channel`フィールドが、これをチャネルpluginにする要素です。完全なパッケージメタデータのサーフェスについては、
|
||||
[Plugin Setup and Config](/ja-JP/plugins/sdk-setup#openclaw-channel)を参照してください。
|
||||
|
||||
<CodeGroup>
|
||||
@ -289,9 +274,8 @@ if (decision.shouldSkip) return;
|
||||
|
||||
</Step>
|
||||
|
||||
<Step title="チャネルPluginオブジェクトを構築する">
|
||||
`ChannelPlugin`インターフェースには、多くの任意のアダプター公開インターフェースがあります。まずは
|
||||
最小構成である`id`と`setup`から始め、必要に応じてアダプターを追加してください。
|
||||
<Step title="チャネルpluginオブジェクトを構築する">
|
||||
`ChannelPlugin`インターフェースには、多数のオプションのアダプターサーフェスがあります。まずは最小限、つまり`id`と`setup`から始め、必要に応じてアダプターを追加してください。
|
||||
|
||||
`src/channel.ts`を作成します:
|
||||
|
||||
@ -386,19 +370,17 @@ if (decision.shouldSkip) return;
|
||||
});
|
||||
```
|
||||
|
||||
<Accordion title="createChatChannelPluginが行うこと">
|
||||
低レベルのアダプターインターフェースを手動で実装する代わりに、
|
||||
宣言的なオプションを渡すと、builderがそれらを組み合わせます。
|
||||
<Accordion title="createChatChannelPluginが行ってくれること">
|
||||
低レベルのアダプターインターフェースを手動で実装する代わりに、宣言的なオプションを渡すと、builderがそれらを組み合わせます。
|
||||
|
||||
| Option | 配線されるもの |
|
||||
| オプション | 配線される内容 |
|
||||
| --- | --- |
|
||||
| `security.dm` | 設定フィールドからのスコープ付きDMセキュリティリゾルバー |
|
||||
| `security.dm` | configフィールドからスコープ付きDMセキュリティリゾルバー |
|
||||
| `pairing.text` | コード交換を伴うテキストベースのDMペアリングフロー |
|
||||
| `threading` | reply-to-modeリゾルバー(固定、アカウントスコープ、またはカスタム) |
|
||||
| `outbound.attachedResults` | 結果メタデータ(message ID)を返す送信関数 |
|
||||
| `outbound.attachedResults` | 結果メタデータ(メッセージID)を返す送信関数 |
|
||||
|
||||
完全な制御が必要な場合は、宣言的オプションの代わりに
|
||||
生のアダプターオブジェクトを渡すこともできます。
|
||||
完全な制御が必要な場合は、宣言的オプションの代わりに生のアダプターオブジェクトを渡すこともできます。
|
||||
</Accordion>
|
||||
|
||||
</Step>
|
||||
@ -439,19 +421,14 @@ if (decision.shouldSkip) return;
|
||||
});
|
||||
```
|
||||
|
||||
チャネル所有のCLI descriptorは`registerCliMetadata(...)`に置いてください。これにより、OpenClawは完全なチャネルruntimeを有効化せずに
|
||||
ルートヘルプでそれらを表示でき、通常の完全ロードでも実際のコマンド登録のために
|
||||
同じdescriptorを取得できます。`registerFull(...)`はruntime専用の処理に残してください。
|
||||
`registerFull(...)`がGateway RPCメソッドを登録する場合は、
|
||||
Plugin固有のprefixを使用してください。コア管理namespace(`config.*`、
|
||||
`exec.approvals.*`, `wizard.*`, `update.*`)は予約されたままで、
|
||||
常に`operator.admin`に解決されます。
|
||||
`defineChannelPluginEntry`は登録モードの分岐を自動的に処理します。すべての
|
||||
オプションについては[Entry Points](/ja-JP/plugins/sdk-entrypoints#definechannelpluginentry)を参照してください。
|
||||
チャネル所有のCLI descriptorは`registerCliMetadata(...)`に置いてください。これにより、OpenClawは完全なチャネルruntimeを起動せずにルートヘルプでそれらを表示でき、通常の完全ロードでも実際のコマンド登録に同じdescriptorを利用できます。`registerFull(...)`はruntime専用の処理に使ってください。
|
||||
`registerFull(...)`がGateway RPCメソッドを登録する場合は、plugin固有のプレフィックスを使用してください。コア管理名前空間(`config.*`、`exec.approvals.*`、`wizard.*`、`update.*`)は予約されており、常に`operator.admin`に解決されます。
|
||||
`defineChannelPluginEntry`は、この登録モード分割を自動的に処理します。すべてのオプションについては
|
||||
[Entry Points](/ja-JP/plugins/sdk-entrypoints#definechannelpluginentry)を参照してください。
|
||||
|
||||
</Step>
|
||||
|
||||
<Step title="setup entryを追加する">
|
||||
<Step title="セットアップエントリを追加する">
|
||||
オンボーディング中の軽量ロード用に`setup-entry.ts`を作成します:
|
||||
|
||||
```typescript setup-entry.ts
|
||||
@ -461,16 +438,15 @@ if (decision.shouldSkip) return;
|
||||
export default defineSetupPluginEntry(acmeChatPlugin);
|
||||
```
|
||||
|
||||
OpenClawは、チャネルが無効または未設定のとき、完全なentryの代わりにこれをロードします。
|
||||
これにより、セットアップフロー中に重いruntimeコードを読み込まずに済みます。
|
||||
詳細は[Setup and Config](/ja-JP/plugins/sdk-setup#setup-entry)を参照してください。
|
||||
OpenClawは、チャネルが無効または未設定のときに、完全なエントリの代わりにこれをロードします。これにより、セットアップフロー中に重いruntimeコードを引き込まずに済みます。詳細は[Setup and Config](/ja-JP/plugins/sdk-setup#setup-entry)を参照してください。
|
||||
|
||||
セットアップ安全なエクスポートをサイドカーモジュールに分離している同梱workspaceチャネルは、
|
||||
`openclaw/plugin-sdk/channel-entry-contract`の`defineBundledChannelSetupEntry(...)`を使用できます。これは、明示的なセットアップ時runtime setterも必要な場合に有効です。
|
||||
|
||||
</Step>
|
||||
|
||||
<Step title="受信メッセージを処理する">
|
||||
Pluginはプラットフォームからメッセージを受信し、それを
|
||||
OpenClawに転送する必要があります。典型的なパターンは、リクエストを検証し、
|
||||
チャネルの受信ハンドラーを通してディスパッチするWebhookです。
|
||||
pluginは、プラットフォームからメッセージを受信し、それをOpenClawへ転送する必要があります。一般的なパターンは、リクエストを検証し、チャネルの受信ハンドラーを通じてディスパッチするWebhookです。
|
||||
|
||||
```typescript
|
||||
registerFull(api) {
|
||||
@ -494,17 +470,15 @@ if (decision.shouldSkip) return;
|
||||
```
|
||||
|
||||
<Note>
|
||||
受信メッセージ処理はチャネル固有です。各チャネルPluginは
|
||||
独自の受信パイプラインを所有します。実際のパターンについては、
|
||||
同梱チャネルPlugin
|
||||
(たとえばMicrosoft TeamsまたはGoogle ChatのPluginパッケージ)を参照してください。
|
||||
受信メッセージ処理はチャネル固有です。各チャネルpluginが独自の受信パイプラインを所有します。実際のパターンについては、同梱チャネルplugin
|
||||
(たとえばMicrosoft TeamsまたはGoogle Chatのpluginパッケージ)を見てください。
|
||||
</Note>
|
||||
|
||||
</Step>
|
||||
|
||||
<a id="step-6-test"></a>
|
||||
<Step title="テスト">
|
||||
`src/channel.test.ts`に同じ場所のテストを書きます:
|
||||
`src/channel.test.ts`に同居テストを書いてください:
|
||||
|
||||
```typescript src/channel.test.ts
|
||||
import { describe, it, expect } from "vitest";
|
||||
@ -551,14 +525,14 @@ if (decision.shouldSkip) return;
|
||||
|
||||
```
|
||||
<bundled-plugin-root>/acme-chat/
|
||||
├── package.json # openclaw.channelメタデータ
|
||||
├── openclaw.plugin.json # 設定スキーマを含むマニフェスト
|
||||
├── package.json # openclaw.channel メタデータ
|
||||
├── openclaw.plugin.json # configスキーマを含むマニフェスト
|
||||
├── index.ts # defineChannelPluginEntry
|
||||
├── setup-entry.ts # defineSetupPluginEntry
|
||||
├── api.ts # 公開エクスポート(任意)
|
||||
├── runtime-api.ts # 内部runtimeエクスポート(任意)
|
||||
└── src/
|
||||
├── channel.ts # createChatChannelPlugin経由のChannelPlugin
|
||||
├── channel.ts # createChatChannelPluginによるChannelPlugin
|
||||
├── channel.test.ts # テスト
|
||||
├── client.ts # プラットフォームAPIクライアント
|
||||
└── runtime.ts # runtimeストア(必要な場合)
|
||||
@ -571,27 +545,23 @@ if (decision.shouldSkip) return;
|
||||
固定、アカウントスコープ、またはカスタムの返信モード
|
||||
</Card>
|
||||
<Card title="messageツール統合" icon="puzzle" href="/ja-JP/plugins/architecture#channel-plugins-and-the-shared-message-tool">
|
||||
describeMessageToolとアクション検出
|
||||
describeMessageTool とアクションディスカバリー
|
||||
</Card>
|
||||
<Card title="ターゲット解決" icon="crosshair" href="/ja-JP/plugins/architecture#channel-target-resolution">
|
||||
inferTargetChatType, looksLikeId, resolveTarget
|
||||
</Card>
|
||||
<Card title="runtimeヘルパー" icon="settings" href="/ja-JP/plugins/sdk-runtime">
|
||||
api.runtime経由のTTS、STT、メディア、subagent
|
||||
api.runtime を介したTTS、STT、メディア、subagent
|
||||
</Card>
|
||||
</CardGroup>
|
||||
|
||||
<Note>
|
||||
一部の同梱ヘルパーインターフェースは、同梱Pluginのメンテナンスと
|
||||
互換性のためにまだ存在します。これらは新しいチャネルPluginに推奨される
|
||||
パターンではありません。その同梱Pluginファミリーを直接メンテナンスしている場合を除き、
|
||||
共通SDK公開インターフェースの汎用channel/setup/reply/runtimeサブパスを
|
||||
優先してください。
|
||||
一部の同梱ヘルパーシームは、同梱pluginの保守と互換性のために引き続き存在します。これらは新しいチャネルpluginに推奨されるパターンではありません。その同梱pluginファミリーを直接保守しているのでない限り、共通SDKサーフェスの汎用的なchannel/setup/reply/runtimeサブパスを優先してください。
|
||||
</Note>
|
||||
|
||||
## 次のステップ
|
||||
|
||||
- [Provider Plugins](/ja-JP/plugins/sdk-provider-plugins) — Pluginがモデルも提供する場合
|
||||
- [Provider Plugins](/ja-JP/plugins/sdk-provider-plugins) — pluginがモデルも提供する場合
|
||||
- [SDK Overview](/ja-JP/plugins/sdk-overview) — 完全なサブパスimportリファレンス
|
||||
- [SDK Testing](/ja-JP/plugins/sdk-testing) — テストユーティリティとコントラクトテスト
|
||||
- [SDK Testing](/ja-JP/plugins/sdk-testing) — テストユーティリティと契約テスト
|
||||
- [Plugin Manifest](/ja-JP/plugins/manifest) — 完全なマニフェストスキーマ
|
||||
|
||||
@ -1,36 +1,36 @@
|
||||
---
|
||||
read_when:
|
||||
- definePluginEntry または defineChannelPluginEntry の正確な型シグネチャが必要
|
||||
- 登録モード(full / setup / CLI metadata)を理解したい
|
||||
- エントリーポイントのオプションを調べている
|
||||
- '`definePluginEntry` または `defineChannelPluginEntry` の正確な型シグネチャが必要です'
|
||||
- 登録モード(full と setup と CLI メタデータ)の違いを理解したい場合
|
||||
- エントリポイントのオプションを調べている場合
|
||||
sidebarTitle: Entry Points
|
||||
summary: definePluginEntry、defineChannelPluginEntry、defineSetupPluginEntry のリファレンス
|
||||
title: プラグインのエントリーポイント
|
||||
title: Plugin エントリポイント
|
||||
x-i18n:
|
||||
generated_at: "2026-04-05T12:52:13Z"
|
||||
generated_at: "2026-04-15T19:41:43Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 799dbfe71e681dd8ba929a7a631dfe745c3c5c69530126fea2f9c137b120f51f
|
||||
source_hash: aabca25bc9b8ff1b5bb4852bafe83640ffeba006ea6b6a8eff4e2c37a10f1fe4
|
||||
source_path: plugins/sdk-entrypoints.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# プラグインのエントリーポイント
|
||||
# Plugin エントリポイント
|
||||
|
||||
すべてのプラグインはデフォルトのエントリーオブジェクトを export します。SDK は、
|
||||
すべての Plugin はデフォルトのエントリオブジェクトをエクスポートします。SDK は、
|
||||
それらを作成するための 3 つのヘルパーを提供します。
|
||||
|
||||
<Tip>
|
||||
**手順ガイドを探していますか?** [Channel Plugins](/plugins/sdk-channel-plugins)
|
||||
または [Provider Plugins](/plugins/sdk-provider-plugins) のステップごとのガイドを参照してください。
|
||||
**手順を追ったガイドをお探しですか?** ステップごとのガイドについては、[Channel Plugins](/ja-JP/plugins/sdk-channel-plugins)
|
||||
または [Provider Plugins](/ja-JP/plugins/sdk-provider-plugins) を参照してください。
|
||||
</Tip>
|
||||
|
||||
## `definePluginEntry`
|
||||
|
||||
**Import:** `openclaw/plugin-sdk/plugin-entry`
|
||||
**インポート:** `openclaw/plugin-sdk/plugin-entry`
|
||||
|
||||
provider plugin、tool plugin、hook plugin、およびメッセージングチャンネル**ではない**
|
||||
ものに使用します。
|
||||
provider plugins、tool plugins、hook plugins、およびメッセージングチャネル
|
||||
**ではない** あらゆるもの向けです。
|
||||
|
||||
```typescript
|
||||
import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
|
||||
@ -50,28 +50,28 @@ export default definePluginEntry({
|
||||
});
|
||||
```
|
||||
|
||||
| Field | Type | Required | Default |
|
||||
| -------------- | ---------------------------------------------------------------- | -------- | ------------------- |
|
||||
| `id` | `string` | Yes | — |
|
||||
| `name` | `string` | Yes | — |
|
||||
| `description` | `string` | Yes | — |
|
||||
| `kind` | `string` | No | — |
|
||||
| `configSchema` | `OpenClawPluginConfigSchema \| () => OpenClawPluginConfigSchema` | No | Empty object schema |
|
||||
| `register` | `(api: OpenClawPluginApi) => void` | Yes | — |
|
||||
| フィールド | 型 | 必須 | デフォルト |
|
||||
| ---------------- | ---------------------------------------------------------------- | ---- | ------------------- |
|
||||
| `id` | `string` | はい | — |
|
||||
| `name` | `string` | はい | — |
|
||||
| `description` | `string` | はい | — |
|
||||
| `kind` | `string` | いいえ | — |
|
||||
| `configSchema` | `OpenClawPluginConfigSchema \| () => OpenClawPluginConfigSchema` | いいえ | 空のオブジェクトスキーマ |
|
||||
| `register` | `(api: OpenClawPluginApi) => void` | はい | — |
|
||||
|
||||
- `id` は `openclaw.plugin.json` マニフェストと一致している必要があります。
|
||||
- `kind` は排他的スロット用です: `"memory"` または `"context-engine"`。
|
||||
- `configSchema` は遅延評価のために関数にできます。
|
||||
- OpenClaw はそのスキーマを初回アクセス時に解決してメモ化するため、高コストなスキーマ
|
||||
- OpenClaw は最初のアクセス時にそのスキーマを解決してメモ化するため、高コストなスキーマ
|
||||
ビルダーは 1 回しか実行されません。
|
||||
|
||||
## `defineChannelPluginEntry`
|
||||
|
||||
**Import:** `openclaw/plugin-sdk/channel-core`
|
||||
**インポート:** `openclaw/plugin-sdk/channel-core`
|
||||
|
||||
チャンネル固有の配線で `definePluginEntry` をラップします。自動的に
|
||||
`api.registerChannel({ plugin })` を呼び出し、任意のルートヘルプ CLI metadata シームを公開し、
|
||||
登録モードに応じて `registerFull` を制御します。
|
||||
チャネル固有の配線を追加して `definePluginEntry` をラップします。
|
||||
`api.registerChannel({ plugin })` を自動的に呼び出し、オプションのルートヘルプ CLI メタデータ
|
||||
接続点を公開し、登録モードに応じて `registerFull` を制御します。
|
||||
|
||||
```typescript
|
||||
import { defineChannelPluginEntry } from "openclaw/plugin-sdk/channel-core";
|
||||
@ -91,41 +91,44 @@ export default defineChannelPluginEntry({
|
||||
});
|
||||
```
|
||||
|
||||
| Field | Type | Required | Default |
|
||||
| --------------------- | ---------------------------------------------------------------- | -------- | ------------------- |
|
||||
| `id` | `string` | Yes | — |
|
||||
| `name` | `string` | Yes | — |
|
||||
| `description` | `string` | Yes | — |
|
||||
| `plugin` | `ChannelPlugin` | Yes | — |
|
||||
| `configSchema` | `OpenClawPluginConfigSchema \| () => OpenClawPluginConfigSchema` | No | Empty object schema |
|
||||
| `setRuntime` | `(runtime: PluginRuntime) => void` | No | — |
|
||||
| `registerCliMetadata` | `(api: OpenClawPluginApi) => void` | No | — |
|
||||
| `registerFull` | `(api: OpenClawPluginApi) => void` | No | — |
|
||||
| フィールド | 型 | 必須 | デフォルト |
|
||||
| --------------------- | ---------------------------------------------------------------- | ---- | ------------------- |
|
||||
| `id` | `string` | はい | — |
|
||||
| `name` | `string` | はい | — |
|
||||
| `description` | `string` | はい | — |
|
||||
| `plugin` | `ChannelPlugin` | はい | — |
|
||||
| `configSchema` | `OpenClawPluginConfigSchema \| () => OpenClawPluginConfigSchema` | いいえ | 空のオブジェクトスキーマ |
|
||||
| `setRuntime` | `(runtime: PluginRuntime) => void` | いいえ | — |
|
||||
| `registerCliMetadata` | `(api: OpenClawPluginApi) => void` | いいえ | — |
|
||||
| `registerFull` | `(api: OpenClawPluginApi) => void` | いいえ | — |
|
||||
|
||||
- `setRuntime` は登録中に呼び出されるため、ランタイム参照を保存できます
|
||||
(通常は `createPluginRuntimeStore` を使います)。CLI metadata の
|
||||
(通常は `createPluginRuntimeStore` を介します)。CLI メタデータの
|
||||
取得中はスキップされます。
|
||||
- `registerCliMetadata` は `api.registrationMode === "cli-metadata"`
|
||||
と `api.registrationMode === "full"` の両方で実行されます。
|
||||
ルートヘルプを非アクティブのまま保ちつつ、通常の CLI コマンド登録を full plugin load と互換に保つため、
|
||||
チャンネル所有の CLI descriptor の正規の置き場所としてこれを使ってください。
|
||||
- `registerFull` は `api.registrationMode === "full"` のときだけ実行されます。setup-only の読み込み中はスキップされます。
|
||||
- `registerCliMetadata` は `api.registrationMode === "cli-metadata"` と
|
||||
`api.registrationMode === "full"` の両方で実行されます。
|
||||
これをチャネル所有の CLI 記述子の正式な配置場所として使用してください。そうすることで、
|
||||
ルートヘルプは非アクティベートのまま維持され、通常の CLI コマンド登録は完全な Plugin
|
||||
読み込みとの互換性を保てます。
|
||||
- `registerFull` は `api.registrationMode === "full"` の場合にのみ実行されます。
|
||||
setup-only 読み込み中はスキップされます。
|
||||
- `definePluginEntry` と同様に、`configSchema` は遅延ファクトリーにでき、
|
||||
OpenClaw は解決済みスキーマを初回アクセス時にメモ化します。
|
||||
- プラグイン所有のルート CLI コマンドでは、コマンドを
|
||||
ルート CLI parse tree から消さずに lazy-load のままにしたい場合、
|
||||
`api.registerCli(..., { descriptors: [...] })` を優先してください。channel plugin では、
|
||||
それらの descriptor は `registerCliMetadata(...)` から登録し、`registerFull(...)` はランタイム専用の処理に集中させてください。
|
||||
- `registerFull(...)` が gateway RPC method も登録する場合は、それらを
|
||||
plugin 固有の prefix に保ってください。予約済みの core admin namespace(`config.*`、
|
||||
`exec.approvals.*`、`wizard.*`、`update.*`)は常に
|
||||
OpenClaw は最初のアクセス時に解決済みスキーマをメモ化します。
|
||||
- Plugin 所有のルート CLI コマンドについては、実際のコマンドを
|
||||
ルート CLI 解析ツリーから消さずに遅延読み込みにしたい場合、
|
||||
`api.registerCli(..., { descriptors: [...] })` を優先してください。チャネル Plugin
|
||||
では、それらの記述子は `registerCliMetadata(...)` から登録し、
|
||||
`registerFull(...)` はランタイム専用の処理に集中させてください。
|
||||
- `registerFull(...)` でも gateway RPC メソッドを登録する場合は、
|
||||
Plugin 固有のプレフィックスにしてください。予約済みのコア管理名前空間
|
||||
(`config.*`、`exec.approvals.*`、`wizard.*`、`update.*`)は常に
|
||||
`operator.admin` に強制されます。
|
||||
|
||||
## `defineSetupPluginEntry`
|
||||
|
||||
**Import:** `openclaw/plugin-sdk/channel-core`
|
||||
**インポート:** `openclaw/plugin-sdk/channel-core`
|
||||
|
||||
軽量な `setup-entry.ts` ファイル用です。ランタイムや CLI の配線を持たず、
|
||||
軽量な `setup-entry.ts` ファイル向けです。ランタイムや CLI 配線なしで、
|
||||
単に `{ plugin }` を返します。
|
||||
|
||||
```typescript
|
||||
@ -134,35 +137,61 @@ import { defineSetupPluginEntry } from "openclaw/plugin-sdk/channel-core";
|
||||
export default defineSetupPluginEntry(myChannelPlugin);
|
||||
```
|
||||
|
||||
OpenClaw は、チャンネルが無効、未設定、または遅延読み込みが有効な場合、
|
||||
full entry の代わりにこれを読み込みます。これが重要になる場面については
|
||||
[Setup and Config](/plugins/sdk-setup#setup-entry) を参照してください。
|
||||
チャネルが無効化されている場合、未設定の場合、または遅延読み込みが有効な場合、
|
||||
OpenClaw は完全なエントリの代わりにこれを読み込みます。これが重要になる場面については、
|
||||
[Setup and Config](/ja-JP/plugins/sdk-setup#setup-entry) を参照してください。
|
||||
|
||||
実際には、`defineSetupPluginEntry(...)` は次の狭い setup helper
|
||||
ファミリーと組み合わせて使ってください。
|
||||
実際には、`defineSetupPluginEntry(...)` を次のような絞り込まれた setup ヘルパー
|
||||
群と組み合わせてください。
|
||||
|
||||
- `openclaw/plugin-sdk/setup-runtime` は、import-safe な setup patch adapter、
|
||||
lookup-note 出力、
|
||||
`promptResolvedAllowFrom`、`splitSetupEntries`、委譲 setup proxy などの
|
||||
ランタイムセーフな setup helper 用
|
||||
- `openclaw/plugin-sdk/channel-setup` は任意インストールの setup surface 用
|
||||
- `openclaw/plugin-sdk/setup-tools` は setup / install CLI / archive / docs helper 用
|
||||
- `openclaw/plugin-sdk/setup-runtime`:
|
||||
import-safe な setup patch アダプター、lookup-note 出力、
|
||||
`promptResolvedAllowFrom`、`splitSetupEntries`、委譲された setup proxy
|
||||
などのランタイムセーフな setup ヘルパー向け
|
||||
- `openclaw/plugin-sdk/channel-setup`:
|
||||
オプションのインストール用 setup サーフェス向け
|
||||
- `openclaw/plugin-sdk/setup-tools`:
|
||||
setup/install CLI/archive/docs ヘルパー向け
|
||||
|
||||
重い SDK、CLI 登録、長寿命ランタイム service は full
|
||||
entry に置いてください。
|
||||
重い SDK、CLI 登録、長寿命のランタイムサービスは完全なエントリに置いてください。
|
||||
|
||||
setup サーフェスとランタイムサーフェスを分離するバンドル済みワークスペースチャネルでは、
|
||||
代わりに `openclaw/plugin-sdk/channel-entry-contract` の
|
||||
`defineBundledChannelSetupEntry(...)` を使用できます。このコントラクトにより、
|
||||
setup エントリは runtime setter を公開しつつ、setup-safe な
|
||||
plugin/secrets エクスポートを保持できます。
|
||||
|
||||
```typescript
|
||||
import { defineBundledChannelSetupEntry } from "openclaw/plugin-sdk/channel-entry-contract";
|
||||
|
||||
export default defineBundledChannelSetupEntry({
|
||||
importMetaUrl: import.meta.url,
|
||||
plugin: {
|
||||
specifier: "./channel-plugin-api.js",
|
||||
exportName: "myChannelPlugin",
|
||||
},
|
||||
runtime: {
|
||||
specifier: "./runtime-api.js",
|
||||
exportName: "setMyChannelRuntime",
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
そのバンドル済みコントラクトは、完全なチャネルエントリが読み込まれる前に、
|
||||
setup フローが本当に軽量な runtime setter を必要とする場合にのみ使用してください。
|
||||
|
||||
## 登録モード
|
||||
|
||||
`api.registrationMode` は、プラグインがどのように読み込まれたかを示します。
|
||||
`api.registrationMode` は、Plugin がどのように読み込まれたかを示します。
|
||||
|
||||
| Mode | When | 何を登録するか |
|
||||
| ----------------- | --------------------------------- | ------------- |
|
||||
| `"full"` | 通常の gateway 起動時 | すべて |
|
||||
| `"setup-only"` | 無効または未設定のチャンネル | チャンネル登録のみ |
|
||||
| `"setup-runtime"` | ランタイム利用可能な setup フロー | チャンネル登録に加え、full entry が読み込まれる前に必要な軽量ランタイムのみ |
|
||||
| `"cli-metadata"` | ルートヘルプ / CLI metadata 取得 | CLI descriptor のみ |
|
||||
| モード | タイミング | 登録すべきもの |
|
||||
| ----------------- | ---------------------------------- | --------------------------------------------------------------------------------------- |
|
||||
| `"full"` | 通常の Gateway 起動 | すべて |
|
||||
| `"setup-only"` | 無効化済み / 未設定のチャネル | チャネル登録のみ |
|
||||
| `"setup-runtime"` | ランタイム利用可能な setup フロー | チャネル登録に加えて、完全なエントリが読み込まれる前に必要な軽量ランタイムのみ |
|
||||
| `"cli-metadata"` | ルートヘルプ / CLI メタデータ取得 | CLI 記述子のみ |
|
||||
|
||||
`defineChannelPluginEntry` は、この分岐を自動的に処理します。チャンネルに
|
||||
`defineChannelPluginEntry` はこの分岐を自動的に処理します。チャネルに対して
|
||||
`definePluginEntry` を直接使う場合は、自分でモードを確認してください。
|
||||
|
||||
```typescript
|
||||
@ -175,41 +204,43 @@ register(api) {
|
||||
api.registerChannel({ plugin: myPlugin });
|
||||
if (api.registrationMode !== "full") return;
|
||||
|
||||
// 重いランタイム専用の登録
|
||||
// Heavy runtime-only registrations
|
||||
api.registerService(/* ... */);
|
||||
}
|
||||
```
|
||||
|
||||
`"setup-runtime"` は、setup-only の起動サーフェスが
|
||||
full の bundled channel runtime に再突入せずに存在しなければならない期間として扱ってください。
|
||||
適しているのは、チャンネル登録、setup-safe な HTTP route、setup-safe な gateway method、
|
||||
および委譲 setup helper です。重い background service、CLI registrar、
|
||||
provider / client SDK の bootstrap は、引き続き `"full"` に属します。
|
||||
`"setup-runtime"` は、setup-only の起動サーフェスが完全なバンドル済みチャネルランタイムに
|
||||
再入せずに存在しなければならない期間として扱ってください。適しているのは、
|
||||
チャネル登録、setup-safe な HTTP ルート、setup-safe な gateway メソッド、
|
||||
委譲された setup ヘルパーです。重いバックグラウンドサービス、CLI レジストラー、
|
||||
provider/client SDK のブートストラップは、引き続き `"full"` に属します。
|
||||
|
||||
特に CLI registrar について:
|
||||
特に CLI レジストラーについては:
|
||||
|
||||
- registrar が 1 つ以上のルートコマンドを所有し、
|
||||
最初の呼び出し時に OpenClaw に実際の CLI module を lazy-load させたい場合は `descriptors` を使ってください
|
||||
- それらの descriptor が、その registrar によって公開されるすべてのトップレベルコマンド root をカバーしていることを確認してください
|
||||
- `commands` 単独は eager な互換パスにのみ使ってください
|
||||
- レジストラーが 1 つ以上のルートコマンドを所有しており、最初の呼び出し時に
|
||||
OpenClaw に実際の CLI モジュールを遅延読み込みさせたい場合は、
|
||||
`descriptors` を使用してください
|
||||
- それらの記述子が、レジストラーによって公開されるすべてのトップレベルコマンドルートを
|
||||
カバーしていることを確認してください
|
||||
- 即時互換パスでは `commands` 単独のみを使用してください
|
||||
|
||||
## プラグイン形状
|
||||
## Plugin の形状
|
||||
|
||||
OpenClaw は、読み込まれたプラグインをその登録動作によって分類します。
|
||||
OpenClaw は、読み込まれた Plugin をその登録動作によって分類します。
|
||||
|
||||
| Shape | 説明 |
|
||||
| --------------------- | ---- |
|
||||
| **plain-capability** | 1 種類の capability のみ(例: provider のみ) |
|
||||
| **hybrid-capability** | 複数種類の capability(例: provider + speech) |
|
||||
| **hook-only** | hook のみで、capability はなし |
|
||||
| **non-capability** | tools / commands / services はあるが capability はなし |
|
||||
| 形状 | 説明 |
|
||||
| --------------------- | -------------------------------------------------- |
|
||||
| **plain-capability** | 1 種類の capability のみ(例: provider-only) |
|
||||
| **hybrid-capability** | 複数種類の capability(例: provider + speech) |
|
||||
| **hook-only** | hooks のみで、capability はなし |
|
||||
| **non-capability** | Tools/commands/services はあるが capability はなし |
|
||||
|
||||
プラグインの形状を確認するには `openclaw plugins inspect <id>` を使ってください。
|
||||
Plugin の形状を確認するには `openclaw plugins inspect <id>` を使用してください。
|
||||
|
||||
## 関連
|
||||
|
||||
- [SDK Overview](/plugins/sdk-overview) — 登録 API と subpath リファレンス
|
||||
- [Runtime Helpers](/plugins/sdk-runtime) — `api.runtime` と `createPluginRuntimeStore`
|
||||
- [Setup and Config](/plugins/sdk-setup) — マニフェスト、setup entry、遅延読み込み
|
||||
- [Channel Plugins](/plugins/sdk-channel-plugins) — `ChannelPlugin` オブジェクトの構築
|
||||
- [Provider Plugins](/plugins/sdk-provider-plugins) — provider 登録と hook
|
||||
- [SDK Overview](/ja-JP/plugins/sdk-overview) — 登録 API とサブパスのリファレンス
|
||||
- [Runtime Helpers](/ja-JP/plugins/sdk-runtime) — `api.runtime` と `createPluginRuntimeStore`
|
||||
- [Setup and Config](/ja-JP/plugins/sdk-setup) — マニフェスト、setup エントリ、遅延読み込み
|
||||
- [Channel Plugins](/ja-JP/plugins/sdk-channel-plugins) — `ChannelPlugin` オブジェクトの構築
|
||||
- [Provider Plugins](/ja-JP/plugins/sdk-provider-plugins) — provider 登録と hooks
|
||||
|
||||
@ -1,27 +1,28 @@
|
||||
---
|
||||
read_when:
|
||||
- プラグインからコアヘルパー(TTS、STT、画像生成、Web検索、サブエージェント)を呼び出す必要があります
|
||||
- '`api.runtime`が何を公開しているかを理解したいです'
|
||||
- プラグインコードから設定、エージェント、またはメディアヘルパーにアクセスしています
|
||||
- Pluginからコアヘルパー(TTS、STT、画像生成、ウェブ検索、subagent)を呼び出す必要があります
|
||||
- '`api.runtime` が何を公開しているのかを理解したい'
|
||||
- Pluginコードから設定、agent、またはメディアヘルパーにアクセスしています
|
||||
sidebarTitle: Runtime Helpers
|
||||
summary: api.runtime -- プラグインで利用できる注入済みランタイムヘルパー
|
||||
title: プラグインランタイムヘルパー
|
||||
summary: api.runtime -- Pluginで利用できる注入済みランタイムヘルパー
|
||||
title: Pluginランタイムヘルパー
|
||||
x-i18n:
|
||||
generated_at: "2026-04-11T02:47:20Z"
|
||||
generated_at: "2026-04-15T19:41:39Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: fbf8a6ecd970300f784b8aca20eed40ba12c83107abd27385bfdc3347d2544be
|
||||
source_hash: c77a6e9cd48c84affa17dce684bbd0e072c8b63485e4a5d569f3793a4ea4f9c8
|
||||
source_path: plugins/sdk-runtime.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# プラグインランタイムヘルパー
|
||||
# Pluginランタイムヘルパー
|
||||
|
||||
登録時にすべてのプラグインへ注入される`api.runtime`オブジェクトのリファレンスです。ホスト内部を直接インポートする代わりに、これらのヘルパーを使用してください。
|
||||
登録時にすべてのPluginへ注入される `api.runtime` オブジェクトのリファレンスです。
|
||||
ホスト内部を直接 import する代わりに、これらのヘルパーを使用してください。
|
||||
|
||||
<Tip>
|
||||
**ウォークスルーを探していますか?** [Channel Plugins](/ja-JP/plugins/sdk-channel-plugins)
|
||||
または[Provider Plugins](/ja-JP/plugins/sdk-provider-plugins)で、これらのヘルパーが実際の流れの中でどう使われるかを段階的に確認できます。
|
||||
**手順の説明を探していますか?** これらのヘルパーが実際の文脈でどのように使われるかを段階的に示したガイドは、[Channel Plugins](/ja-JP/plugins/sdk-channel-plugins)
|
||||
または [Provider Plugins](/ja-JP/plugins/sdk-provider-plugins) を参照してください。
|
||||
</Tip>
|
||||
|
||||
```typescript
|
||||
@ -34,28 +35,28 @@ register(api) {
|
||||
|
||||
### `api.runtime.agent`
|
||||
|
||||
エージェントID、ディレクトリ、セッション管理。
|
||||
agentの識別情報、ディレクトリ、およびセッション管理。
|
||||
|
||||
```typescript
|
||||
// エージェントの作業ディレクトリを解決
|
||||
// agentの作業ディレクトリを解決
|
||||
const agentDir = api.runtime.agent.resolveAgentDir(cfg);
|
||||
|
||||
// エージェントワークスペースを解決
|
||||
// agentワークスペースを解決
|
||||
const workspaceDir = api.runtime.agent.resolveAgentWorkspaceDir(cfg);
|
||||
|
||||
// エージェントIDを取得
|
||||
// agentの識別情報を取得
|
||||
const identity = api.runtime.agent.resolveAgentIdentity(cfg);
|
||||
|
||||
// デフォルトthinkingレベルを取得
|
||||
// デフォルトの思考レベルを取得
|
||||
const thinking = api.runtime.agent.resolveThinkingDefault(cfg, provider, model);
|
||||
|
||||
// エージェントタイムアウトを取得
|
||||
// agentのタイムアウトを取得
|
||||
const timeoutMs = api.runtime.agent.resolveAgentTimeoutMs(cfg);
|
||||
|
||||
// ワークスペースの存在を保証
|
||||
// ワークスペースが存在することを保証
|
||||
await api.runtime.agent.ensureAgentWorkspace(cfg);
|
||||
|
||||
// 埋め込みエージェントターンを実行
|
||||
// 埋め込みagentターンを実行
|
||||
const agentDir = api.runtime.agent.resolveAgentDir(cfg);
|
||||
const result = await api.runtime.agent.runEmbeddedAgent({
|
||||
sessionId: "my-plugin:task-1",
|
||||
@ -67,13 +68,12 @@ const result = await api.runtime.agent.runEmbeddedAgent({
|
||||
});
|
||||
```
|
||||
|
||||
`runEmbeddedAgent(...)`は、プラグインコードから通常のOpenClaw
|
||||
エージェントターンを開始するための中立的なヘルパーです。これは、チャネル起点の返信と同じプロバイダー/モデル解決および
|
||||
エージェントハーネス選択を使用します。
|
||||
`runEmbeddedAgent(...)` は、Pluginコードから通常のOpenClaw agentターンを開始するための中立的なヘルパーです。
|
||||
これは、チャネルによってトリガーされる返信と同じプロバイダー/モデル解決およびagentハーネス選択を使用します。
|
||||
|
||||
`runEmbeddedPiAgent(...)`は、互換性エイリアスとして引き続き利用できます。
|
||||
`runEmbeddedPiAgent(...)` は、互換性のためのエイリアスとして残されています。
|
||||
|
||||
**セッションストアヘルパー**は`api.runtime.agent.session`配下にあります:
|
||||
**セッションストアヘルパー** は `api.runtime.agent.session` 配下にあります。
|
||||
|
||||
```typescript
|
||||
const storePath = api.runtime.agent.session.resolveStorePath(cfg);
|
||||
@ -84,7 +84,7 @@ const filePath = api.runtime.agent.session.resolveSessionFilePath(cfg, sessionId
|
||||
|
||||
### `api.runtime.agent.defaults`
|
||||
|
||||
デフォルトのモデル定数とプロバイダー定数:
|
||||
デフォルトのモデルおよびプロバイダー定数:
|
||||
|
||||
```typescript
|
||||
const model = api.runtime.agent.defaults.model; // 例: "anthropic/claude-sonnet-4-6"
|
||||
@ -93,22 +93,22 @@ const provider = api.runtime.agent.defaults.provider; // 例: "anthropic"
|
||||
|
||||
### `api.runtime.subagent`
|
||||
|
||||
バックグラウンドサブエージェント実行の開始と管理。
|
||||
バックグラウンドsubagent実行を起動および管理します。
|
||||
|
||||
```typescript
|
||||
// サブエージェント実行を開始
|
||||
// subagent実行を開始
|
||||
const { runId } = await api.runtime.subagent.run({
|
||||
sessionKey: "agent:main:subagent:search-helper",
|
||||
message: "Expand this query into focused follow-up searches.",
|
||||
provider: "openai", // 任意の上書き
|
||||
model: "gpt-4.1-mini", // 任意の上書き
|
||||
provider: "openai", // オプションの上書き
|
||||
model: "gpt-4.1-mini", // オプションの上書き
|
||||
deliver: false,
|
||||
});
|
||||
|
||||
// 完了を待機
|
||||
const result = await api.runtime.subagent.waitForRun({ runId, timeoutMs: 30000 });
|
||||
|
||||
// セッションメッセージを読み取り
|
||||
// セッションメッセージを読み取る
|
||||
const { messages } = await api.runtime.subagent.getSessionMessages({
|
||||
sessionKey: "agent:main:subagent:search-helper",
|
||||
limit: 10,
|
||||
@ -121,15 +121,14 @@ await api.runtime.subagent.deleteSession({
|
||||
```
|
||||
|
||||
<Warning>
|
||||
モデル上書き(`provider`/`model`)には、設定内の
|
||||
`plugins.entries.<id>.subagent.allowModelOverride: true`によるオペレーターの明示的オプトインが必要です。
|
||||
信頼されていないプラグインでもサブエージェントは実行できますが、上書き要求は拒否されます。
|
||||
モデル上書き(`provider`/`model`)には、設定の
|
||||
`plugins.entries.<id>.subagent.allowModelOverride: true` によるオペレーターのオプトインが必要です。
|
||||
信頼されていないPluginでもsubagentは実行できますが、上書きリクエストは拒否されます。
|
||||
</Warning>
|
||||
|
||||
### `api.runtime.taskFlow`
|
||||
|
||||
Task Flowランタイムを既存のOpenClawセッションキーまたは信頼済みツール
|
||||
コンテキストにバインドし、毎回ownerを渡さずにTask Flowを作成・管理します。
|
||||
TaskFlowランタイムを既存のOpenClawセッションキーまたは信頼されたツールコンテキストにバインドし、呼び出しごとに所有者を渡さずにTaskFlowを作成および管理します。
|
||||
|
||||
```typescript
|
||||
const taskFlow = api.runtime.taskFlow.fromToolContext(ctx);
|
||||
@ -156,12 +155,11 @@ const waiting = taskFlow.setWaiting({
|
||||
});
|
||||
```
|
||||
|
||||
独自のバインディングレイヤーから信頼済みのOpenClawセッションキーをすでに持っている場合は、
|
||||
`bindSession({ sessionKey, requesterOrigin })`を使用してください。生のユーザー入力からバインドしてはいけません。
|
||||
独自のバインディングレイヤーから取得した信頼済みのOpenClawセッションキーがすでにある場合は、`bindSession({ sessionKey, requesterOrigin })` を使用してください。生のユーザー入力からバインドしないでください。
|
||||
|
||||
### `api.runtime.tts`
|
||||
|
||||
テキスト読み上げ。
|
||||
テキスト読み上げ合成。
|
||||
|
||||
```typescript
|
||||
// 標準TTS
|
||||
@ -170,7 +168,7 @@ const clip = await api.runtime.tts.textToSpeech({
|
||||
cfg: api.config,
|
||||
});
|
||||
|
||||
// 電話向け最適化TTS
|
||||
// 電話向けに最適化されたTTS
|
||||
const telephonyClip = await api.runtime.tts.textToSpeechTelephony({
|
||||
text: "Hello from OpenClaw",
|
||||
cfg: api.config,
|
||||
@ -183,12 +181,11 @@ const voices = await api.runtime.tts.listVoices({
|
||||
});
|
||||
```
|
||||
|
||||
コアの`messages.tts`設定とプロバイダー選択を使用します。PCMオーディオ
|
||||
バッファ + サンプルレートを返します。
|
||||
コアの `messages.tts` 設定とプロバイダー選択を使用します。PCM音声バッファーとサンプルレートを返します。
|
||||
|
||||
### `api.runtime.mediaUnderstanding`
|
||||
|
||||
画像、音声、動画の解析。
|
||||
画像、音声、および動画の解析。
|
||||
|
||||
```typescript
|
||||
// 画像を説明
|
||||
@ -202,7 +199,7 @@ const image = await api.runtime.mediaUnderstanding.describeImageFile({
|
||||
const { text } = await api.runtime.mediaUnderstanding.transcribeAudioFile({
|
||||
filePath: "/tmp/inbound-audio.ogg",
|
||||
cfg: api.config,
|
||||
mime: "audio/ogg", // 任意。MIMEを推定できない場合に使用
|
||||
mime: "audio/ogg", // MIMEを推定できない場合はオプション
|
||||
});
|
||||
|
||||
// 動画を説明
|
||||
@ -218,11 +215,11 @@ const result = await api.runtime.mediaUnderstanding.runFile({
|
||||
});
|
||||
```
|
||||
|
||||
出力が生成されない場合(例: 入力がスキップされた場合)は`{ text: undefined }`を返します。
|
||||
出力が生成されない場合(例: 入力がスキップされた場合)は、`{ text: undefined }` を返します。
|
||||
|
||||
<Info>
|
||||
`api.runtime.stt.transcribeAudioFile(...)`は、
|
||||
`api.runtime.mediaUnderstanding.transcribeAudioFile(...)`の互換性エイリアスとして引き続き利用できます。
|
||||
`api.runtime.stt.transcribeAudioFile(...)` は、
|
||||
`api.runtime.mediaUnderstanding.transcribeAudioFile(...)` の互換性エイリアスとして残されています。
|
||||
</Info>
|
||||
|
||||
### `api.runtime.imageGeneration`
|
||||
@ -240,7 +237,7 @@ const providers = api.runtime.imageGeneration.listProviders({ cfg: api.config })
|
||||
|
||||
### `api.runtime.webSearch`
|
||||
|
||||
Web検索。
|
||||
ウェブ検索。
|
||||
|
||||
```typescript
|
||||
const providers = api.runtime.webSearch.listProviders({ config: api.config });
|
||||
@ -253,7 +250,7 @@ const result = await api.runtime.webSearch.search({
|
||||
|
||||
### `api.runtime.media`
|
||||
|
||||
低レベルメディアユーティリティ。
|
||||
低レベルのメディアユーティリティ。
|
||||
|
||||
```typescript
|
||||
const webMedia = await api.runtime.media.loadWebMedia(url);
|
||||
@ -275,7 +272,7 @@ await api.runtime.config.writeConfigFile(cfg);
|
||||
|
||||
### `api.runtime.system`
|
||||
|
||||
システムレベルユーティリティ。
|
||||
システムレベルのユーティリティ。
|
||||
|
||||
```typescript
|
||||
await api.runtime.system.enqueueSystemEvent(event);
|
||||
@ -308,7 +305,7 @@ const childLogger = api.runtime.logging.getChildLogger({ plugin: "my-plugin" },
|
||||
|
||||
### `api.runtime.modelAuth`
|
||||
|
||||
モデルおよびプロバイダー認証の解決。
|
||||
モデルおよびプロバイダーの認証解決。
|
||||
|
||||
```typescript
|
||||
const auth = await api.runtime.modelAuth.getApiKeyForModel({ model, cfg });
|
||||
@ -320,7 +317,7 @@ const providerAuth = await api.runtime.modelAuth.resolveApiKeyForProvider({
|
||||
|
||||
### `api.runtime.state`
|
||||
|
||||
状態ディレクトリ解決。
|
||||
stateディレクトリの解決。
|
||||
|
||||
```typescript
|
||||
const stateDir = api.runtime.state.resolveStateDir();
|
||||
@ -328,7 +325,7 @@ const stateDir = api.runtime.state.resolveStateDir();
|
||||
|
||||
### `api.runtime.tools`
|
||||
|
||||
メモリツールファクトリーとCLI。
|
||||
メモリツールファクトリーおよびCLI。
|
||||
|
||||
```typescript
|
||||
const getTool = api.runtime.tools.createMemoryGetTool(/* ... */);
|
||||
@ -338,10 +335,9 @@ api.runtime.tools.registerMemoryCli(/* ... */);
|
||||
|
||||
### `api.runtime.channel`
|
||||
|
||||
チャネル固有のランタイムヘルパー(チャネルプラグインが読み込まれている場合に利用可能)。
|
||||
チャネル固有のランタイムヘルパー(チャネルPluginが読み込まれている場合に利用可能)。
|
||||
|
||||
`api.runtime.channel.mentions`は、ランタイム注入を使用する
|
||||
バンドル版チャネルプラグイン向けの共有受信メンションポリシーサーフェスです:
|
||||
`api.runtime.channel.mentions` は、ランタイム注入を使用するバンドル済みチャネルPlugin向けの共有受信メンションポリシーサーフェスです。
|
||||
|
||||
```typescript
|
||||
const mentionMatch = api.runtime.channel.mentions.matchesMentionWithExplicit(text, {
|
||||
@ -376,20 +372,22 @@ const decision = api.runtime.channel.mentions.resolveInboundMentionDecision({
|
||||
- `implicitMentionKindWhen`
|
||||
- `resolveInboundMentionDecision`
|
||||
|
||||
`api.runtime.channel.mentions`は、古い
|
||||
`resolveMentionGating*`互換ヘルパーを意図的に公開していません。正規化された
|
||||
`{ facts, policy }`経路を優先してください。
|
||||
`api.runtime.channel.mentions` は、意図的に古い
|
||||
`resolveMentionGating*` 互換ヘルパーを公開していません。正規化された
|
||||
`{ facts, policy }` パスを使用してください。
|
||||
|
||||
## ランタイム参照の保存
|
||||
|
||||
`register`コールバックの外で使用するためにランタイム参照を保存するには、
|
||||
`createPluginRuntimeStore`を使用してください:
|
||||
`register` コールバックの外で使用するためにランタイム参照を保存するには、`createPluginRuntimeStore` を使用します。
|
||||
|
||||
```typescript
|
||||
import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store";
|
||||
import type { PluginRuntime } from "openclaw/plugin-sdk/runtime-store";
|
||||
|
||||
const store = createPluginRuntimeStore<PluginRuntime>("my-plugin runtime not initialized");
|
||||
const store = createPluginRuntimeStore<PluginRuntime>({
|
||||
pluginId: "my-plugin",
|
||||
errorMessage: "my-plugin runtime not initialized",
|
||||
});
|
||||
|
||||
// エントリーポイント内
|
||||
export default defineChannelPluginEntry({
|
||||
@ -402,30 +400,32 @@ export default defineChannelPluginEntry({
|
||||
|
||||
// 他のファイル内
|
||||
export function getRuntime() {
|
||||
return store.getRuntime(); // 初期化されていない場合はthrow
|
||||
return store.getRuntime(); // 初期化されていない場合は例外を投げる
|
||||
}
|
||||
|
||||
export function tryGetRuntime() {
|
||||
return store.tryGetRuntime(); // 初期化されていない場合はnullを返す
|
||||
return store.tryGetRuntime(); // 初期化されていない場合は null を返す
|
||||
}
|
||||
```
|
||||
|
||||
## その他のトップレベル`api`フィールド
|
||||
ランタイムストアの識別には `pluginId` を優先してください。より低レベルの `key` 形式は、1つのPluginが意図的に複数のランタイムスロットを必要とするまれなケース向けです。
|
||||
|
||||
`api.runtime`に加えて、APIオブジェクトは以下も提供します:
|
||||
## その他のトップレベル `api` フィールド
|
||||
|
||||
| フィールド | 型 | 説明 |
|
||||
| ------------------------ | ------------------------- | ---------------------------------------------------------------------------------------- |
|
||||
| `api.id` | `string` | プラグインID |
|
||||
| `api.name` | `string` | プラグイン表示名 |
|
||||
| `api.config` | `OpenClawConfig` | 現在の設定スナップショット(利用可能な場合は、アクティブなインメモリ実行時スナップショット) |
|
||||
| `api.pluginConfig` | `Record<string, unknown>` | `plugins.entries.<id>.config`から取得したプラグイン固有設定 |
|
||||
| `api.logger` | `PluginLogger` | スコープ付きロガー(`debug`、`info`、`warn`、`error`) |
|
||||
| `api.registrationMode` | `PluginRegistrationMode` | 現在の読み込みモード。`"setup-runtime"`は、完全なエントリー起動/設定前の軽量ウィンドウです |
|
||||
| `api.resolvePath(input)` | `(string) => string` | プラグインルートからの相対パスを解決します |
|
||||
`api.runtime` に加えて、APIオブジェクトは次も提供します:
|
||||
|
||||
| フィールド | 型 | 説明 |
|
||||
| ------------------------ | ------------------------- | ------------------------------------------------------------------------------------------- |
|
||||
| `api.id` | `string` | Plugin id |
|
||||
| `api.name` | `string` | Plugin表示名 |
|
||||
| `api.config` | `OpenClawConfig` | 現在の設定スナップショット(利用可能な場合は、アクティブなインメモリランタイムスナップショット) |
|
||||
| `api.pluginConfig` | `Record<string, unknown>` | `plugins.entries.<id>.config` から取得したPlugin固有の設定 |
|
||||
| `api.logger` | `PluginLogger` | スコープ付きロガー(`debug`、`info`、`warn`、`error`) |
|
||||
| `api.registrationMode` | `PluginRegistrationMode` | 現在のロードモード。`"setup-runtime"` は、完全なエントリー前の軽量な起動/セットアップ用ウィンドウです |
|
||||
| `api.resolvePath(input)` | `(string) => string` | Pluginルートを基準に相対パスを解決 |
|
||||
|
||||
## 関連
|
||||
|
||||
- [SDK Overview](/ja-JP/plugins/sdk-overview) -- サブパスリファレンス
|
||||
- [SDK Entry Points](/ja-JP/plugins/sdk-entrypoints) -- `definePluginEntry`オプション
|
||||
- [Plugin Internals](/ja-JP/plugins/architecture) -- capability modelとレジストリ
|
||||
- [SDK Entry Points](/ja-JP/plugins/sdk-entrypoints) -- `definePluginEntry` オプション
|
||||
- [Plugin Internals](/ja-JP/plugins/architecture) -- 機能モデルとレジストリ
|
||||
|
||||
@ -1,36 +1,37 @@
|
||||
---
|
||||
read_when:
|
||||
- プラグインにセットアップウィザードを追加している
|
||||
- setup-entry.tsとindex.tsの違いを理解する必要がある
|
||||
- プラグイン設定スキーマまたはpackage.jsonのopenclawメタデータを定義している
|
||||
- Plugin にセットアップ ウィザードを追加しています
|
||||
- '`setup-entry.ts` と `index.ts` の違いを理解する必要があります'
|
||||
- Plugin の設定スキーマまたは `package.json` の openclaw メタデータを定義しています
|
||||
sidebarTitle: Setup and Config
|
||||
summary: セットアップウィザード、setup-entry.ts、設定スキーマ、およびpackage.jsonメタデータ
|
||||
title: プラグインのセットアップと設定
|
||||
summary: セットアップ ウィザード、setup-entry.ts、設定スキーマ、package.json メタデータ
|
||||
title: Plugin セットアップと設定
|
||||
x-i18n:
|
||||
generated_at: "2026-04-06T03:11:30Z"
|
||||
generated_at: "2026-04-15T19:41:42Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: eac2586516d27bcd94cc4c259fe6274c792b3f9938c7ddd6dbf04a6dbb988dc9
|
||||
source_hash: ddf28e25e381a4a38ac478e531586f59612e1a278732597375f87c2eeefc521b
|
||||
source_path: plugins/sdk-setup.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# プラグインのセットアップと設定
|
||||
# Plugin セットアップと設定
|
||||
|
||||
プラグインパッケージング(`package.json`メタデータ)、マニフェスト
|
||||
(`openclaw.plugin.json`)、セットアップエントリー、および設定スキーマのリファレンスです。
|
||||
Plugin パッケージング(`package.json` メタデータ)、マニフェスト
|
||||
(`openclaw.plugin.json`)、セットアップ エントリ、設定スキーマのリファレンスです。
|
||||
|
||||
<Tip>
|
||||
**手順ガイドを探していますか?** パッケージングを文脈付きで説明するハウツーガイドは次を参照してください:
|
||||
**手順を追った説明を探していますか?** ハウツー ガイドでは、パッケージングを文脈の中で扱っています:
|
||||
[Channel Plugins](/ja-JP/plugins/sdk-channel-plugins#step-1-package-and-manifest) と
|
||||
[Provider Plugins](/ja-JP/plugins/sdk-provider-plugins#step-1-package-and-manifest)。
|
||||
</Tip>
|
||||
|
||||
## パッケージメタデータ
|
||||
## パッケージ メタデータ
|
||||
|
||||
プラグインシステムにプラグインが何を提供するかを伝えるため、`package.json`には`openclaw`フィールドが必要です。
|
||||
`package.json` には、Plugin システムにこの Plugin が何を提供するかを伝える
|
||||
`openclaw` フィールドが必要です。
|
||||
|
||||
**チャネルプラグイン:**
|
||||
**Channel Plugin:**
|
||||
|
||||
```json
|
||||
{
|
||||
@ -49,7 +50,7 @@ x-i18n:
|
||||
}
|
||||
```
|
||||
|
||||
**プロバイダープラグイン / ClawHub公開ベースライン:**
|
||||
**Provider Plugin / ClawHub 公開ベースライン:**
|
||||
|
||||
```json openclaw-clawhub-package.json
|
||||
{
|
||||
@ -70,46 +71,47 @@ x-i18n:
|
||||
}
|
||||
```
|
||||
|
||||
プラグインをClawHubで外部公開する場合、これらの`compat`フィールドと`build`
|
||||
Plugin を ClawHub で外部公開する場合、これらの `compat` フィールドと `build`
|
||||
フィールドは必須です。正式な公開用スニペットは
|
||||
`docs/snippets/plugin-publish/`にあります。
|
||||
`docs/snippets/plugin-publish/` にあります。
|
||||
|
||||
### `openclaw`フィールド
|
||||
### `openclaw` フィールド
|
||||
|
||||
| Field | Type | Description |
|
||||
| ------------ | ---------- | -------------------------------------------------------------------------------------------------------- |
|
||||
| `extensions` | `string[]` | エントリーポイントファイル(パッケージルートからの相対パス) |
|
||||
| `setupEntry` | `string` | 軽量なセットアップ専用エントリー(任意) |
|
||||
| `channel` | `object` | セットアップ、ピッカー、クイックスタート、およびステータス画面向けのチャネルカタログメタデータ |
|
||||
| `providers` | `string[]` | このプラグインが登録するプロバイダーid |
|
||||
| `install` | `object` | インストールヒント: `npmSpec`, `localPath`, `defaultChoice`, `minHostVersion`, `allowInvalidConfigRecovery` |
|
||||
| `startup` | `object` | 起動時の動作フラグ |
|
||||
| フィールド | 型 | 説明 |
|
||||
| ---------- | ---------- | ------------------------------------------------------------------------------------------------------ |
|
||||
| `extensions` | `string[]` | エントリ ポイント ファイル(パッケージ ルートからの相対パス) |
|
||||
| `setupEntry` | `string` | 軽量なセットアップ専用エントリ(任意) |
|
||||
| `channel` | `object` | セットアップ、ピッカー、クイックスタート、ステータス画面向けの Channel カタログ メタデータ |
|
||||
| `providers` | `string[]` | この Plugin によって登録される Provider ID |
|
||||
| `install` | `object` | インストール ヒント: `npmSpec`, `localPath`, `defaultChoice`, `minHostVersion`, `allowInvalidConfigRecovery` |
|
||||
| `startup` | `object` | 起動時の動作フラグ |
|
||||
|
||||
### `openclaw.channel`
|
||||
|
||||
`openclaw.channel`は、ランタイム読み込み前のチャネル検出およびセットアップ画面向けの軽量なパッケージメタデータです。
|
||||
`openclaw.channel` は、ランタイムが読み込まれる前に Channel の検出とセットアップ画面で使われる、
|
||||
低コストなパッケージ メタデータです。
|
||||
|
||||
| Field | Type | What it means |
|
||||
| -------------------------------------- | ---------- | ----------------------------------------------------------------------- |
|
||||
| `id` | `string` | 正式なチャネルid。 |
|
||||
| `label` | `string` | 主チャネルラベル。 |
|
||||
| `selectionLabel` | `string` | `label`と異なるべき場合のピッカー/セットアップ用ラベル。 |
|
||||
| `detailLabel` | `string` | より豊かなチャネルカタログおよびステータス画面向けの補助詳細ラベル。 |
|
||||
| `docsPath` | `string` | セットアップおよび選択リンク用のドキュメントパス。 |
|
||||
| `docsLabel` | `string` | チャネルidと異なるべき場合にドキュメントリンクで使う上書きラベル。 |
|
||||
| `blurb` | `string` | 短いオンボーディング/カタログ説明。 |
|
||||
| `order` | `number` | チャネルカタログでの並び順。 |
|
||||
| `aliases` | `string[]` | チャネル選択用の追加参照エイリアス。 |
|
||||
| `preferOver` | `string[]` | このチャネルが上位に来るべき低優先度のプラグイン/チャネルid。 |
|
||||
| `systemImage` | `string` | チャネルUIカタログ用の任意のアイコン/system-image名。 |
|
||||
| `selectionDocsPrefix` | `string` | 選択画面でのドキュメントリンク前に置く接頭辞テキスト。 |
|
||||
| `selectionDocsOmitLabel` | `boolean` | ラベル付きドキュメントリンクの代わりにドキュメントパスを直接表示する。 |
|
||||
| `selectionExtras` | `string[]` | 選択文言に追加される短い文字列。 |
|
||||
| `markdownCapable` | `boolean` | 送信書式判断で、このチャネルをMarkdown対応として扱います。 |
|
||||
| `exposure` | `object` | セットアップ、設定済み一覧、およびドキュメント画面向けの可視性制御。 |
|
||||
| `quickstartAllowFrom` | `boolean` | このチャネルを標準クイックスタート`allowFrom`セットアップフローに含めます。 |
|
||||
| `forceAccountBinding` | `boolean` | アカウントが1つしかない場合でも、明示的なアカウントバインディングを要求します。 |
|
||||
| `preferSessionLookupForAnnounceTarget` | `boolean` | このチャネルの通知先解決でセッション検索を優先します。 |
|
||||
| フィールド | 型 | 意味 |
|
||||
| ---------------------------------------- | ---------- | ----------------------------------------------------------------------------- |
|
||||
| `id` | `string` | 正式な Channel ID。 |
|
||||
| `label` | `string` | 主要な Channel ラベル。 |
|
||||
| `selectionLabel` | `string` | `label` と異なる必要がある場合の、ピッカー/セットアップ用ラベル。 |
|
||||
| `detailLabel` | `string` | より充実した Channel カタログやステータス画面向けの補助ラベル。 |
|
||||
| `docsPath` | `string` | セットアップや選択リンク用のドキュメント パス。 |
|
||||
| `docsLabel` | `string` | Channel ID と異なる必要がある場合に、ドキュメント リンクで使う上書きラベル。 |
|
||||
| `blurb` | `string` | 短いオンボーディング/カタログ説明。 |
|
||||
| `order` | `number` | Channel カタログでの並び順。 |
|
||||
| `aliases` | `string[]` | Channel 選択用の追加の検索別名。 |
|
||||
| `preferOver` | `string[]` | この Channel が優先されるべき、より優先度の低い Plugin/Channel ID。 |
|
||||
| `systemImage` | `string` | Channel UI カタログ用の任意のアイコン/system-image 名。 |
|
||||
| `selectionDocsPrefix` | `string` | 選択画面でドキュメント リンクの前に付ける接頭辞テキスト。 |
|
||||
| `selectionDocsOmitLabel` | `boolean` | ラベル付きのドキュメント リンクではなく、ドキュメント パスを直接表示します。 |
|
||||
| `selectionExtras` | `string[]` | 選択テキストに追加される短い追加文字列。 |
|
||||
| `markdownCapable` | `boolean` | 送信時の書式設定判断のため、この Channel が Markdown 対応であることを示します。 |
|
||||
| `exposure` | `object` | セットアップ、設定済み一覧、ドキュメント画面向けの Channel 表示制御。 |
|
||||
| `quickstartAllowFrom` | `boolean` | この Channel を標準のクイックスタート `allowFrom` セットアップ フローに含めます。 |
|
||||
| `forceAccountBinding` | `boolean` | アカウントが 1 つしかない場合でも、明示的なアカウント バインディングを必須にします。 |
|
||||
| `preferSessionLookupForAnnounceTarget` | `boolean` | この Channel の告知先解決時に、セッション検索を優先します。 |
|
||||
|
||||
例:
|
||||
|
||||
@ -141,35 +143,39 @@ x-i18n:
|
||||
}
|
||||
```
|
||||
|
||||
`exposure`は次をサポートします。
|
||||
`exposure` では以下をサポートします。
|
||||
|
||||
- `configured`: 設定済み/ステータス系の一覧画面にそのチャネルを含める
|
||||
- `setup`: 対話型セットアップ/設定ピッカーにそのチャネルを含める
|
||||
- `docs`: ドキュメント/ナビゲーション画面でそのチャネルを公開向けとして扱う
|
||||
- `configured`: 設定済み/ステータス形式の一覧画面に Channel を含める
|
||||
- `setup`: 対話型のセットアップ/設定ピッカーに Channel を含める
|
||||
- `docs`: ドキュメント/ナビゲーション画面で Channel を公開対象として扱う
|
||||
|
||||
`showConfigured`と`showInSetup`は、レガシーエイリアスとして引き続きサポートされます。`exposure`を推奨します。
|
||||
`showConfigured` と `showInSetup` もレガシー エイリアスとして引き続きサポートされます。
|
||||
`exposure` を優先してください。
|
||||
|
||||
### `openclaw.install`
|
||||
|
||||
`openclaw.install`はマニフェストメタデータではなく、パッケージメタデータです。
|
||||
`openclaw.install` はマニフェスト メタデータではなく、パッケージ メタデータです。
|
||||
|
||||
| Field | Type | What it means |
|
||||
| フィールド | 型 | 意味 |
|
||||
| ---------------------------- | -------------------- | -------------------------------------------------------------------------------- |
|
||||
| `npmSpec` | `string` | インストール/更新フロー用の正式なnpm spec。 |
|
||||
| `localPath` | `string` | ローカル開発またはバンドルインストールパス。 |
|
||||
| `defaultChoice` | `"npm"` \| `"local"` | 両方利用可能な場合の優先インストール元。 |
|
||||
| `minHostVersion` | `string` | `>=x.y.z`形式での最小サポートOpenClawバージョン。 |
|
||||
| `allowInvalidConfigRecovery` | `boolean` | 特定の古い設定失敗からバンドルプラグイン再インストールフローが回復できるようにします。 |
|
||||
| `npmSpec` | `string` | インストール/更新フローで使う正式な npm spec。 |
|
||||
| `localPath` | `string` | ローカル開発用またはバンドル済みインストール パス。 |
|
||||
| `defaultChoice` | `"npm"` \| `"local"` | 両方利用可能な場合の推奨インストール元。 |
|
||||
| `minHostVersion` | `string` | `>=x.y.z` 形式で表す、サポートされる最小 OpenClaw バージョン。 |
|
||||
| `allowInvalidConfigRecovery` | `boolean` | バンドル済み Plugin の再インストール フローで、特定の古い設定不整合からの回復を許可します。 |
|
||||
|
||||
`minHostVersion`が設定されている場合、インストールとマニフェストレジストリ読み込みの両方で強制されます。
|
||||
古いホストではプラグインはスキップされ、無効なバージョン文字列は拒否されます。
|
||||
`minHostVersion` が設定されている場合、インストール時とマニフェスト レジストリ読み込み時の両方で
|
||||
それが適用されます。古いホストはその Plugin をスキップし、不正なバージョン文字列は拒否されます。
|
||||
|
||||
`allowInvalidConfigRecovery`は壊れた設定全般を回避するものではありません。
|
||||
これは限定的なバンドルプラグイン回復専用であり、再インストール/セットアップが、欠落したバンドルプラグインパスや、その同じプラグインに対する古い`channels.<id>`エントリーのような既知のアップグレード残骸を修復できるようにするためのものです。無関係な理由で設定が壊れている場合、インストールは引き続きフェイルクローズし、オペレーターに`openclaw doctor --fix`の実行を案内します。
|
||||
`allowInvalidConfigRecovery` は、壊れた設定全般に対する一般的なバイパスではありません。
|
||||
これは、同じ Plugin に対応するバンドル済み Plugin パスの欠落や古い `channels.<id>`
|
||||
エントリのような、既知のアップグレード残骸を再インストール/セットアップで修復できるようにする、
|
||||
限定的なバンドル済み Plugin 回復専用です。無関係な理由で設定が壊れている場合、
|
||||
インストールは引き続き安全側で失敗し、オペレーターに `openclaw doctor --fix` の実行を案内します。
|
||||
|
||||
### 完全読み込みの遅延
|
||||
### 完全ロードの遅延
|
||||
|
||||
チャネルプラグインは、次の設定で遅延読み込みにオプトインできます。
|
||||
Channel Plugin は、以下のように遅延読み込みを有効にできます。
|
||||
|
||||
```json
|
||||
{
|
||||
@ -183,20 +189,25 @@ x-i18n:
|
||||
}
|
||||
```
|
||||
|
||||
有効にすると、OpenClawはlisten前の起動フェーズでは、すでに設定済みのチャネルに対しても`setupEntry`だけを読み込みます。完全なエントリーはGatewayがlistenを開始した後に読み込まれます。
|
||||
これを有効にすると、OpenClaw は、すでに設定済みの Channel であっても、
|
||||
リッスン開始前の起動フェーズでは `setupEntry` のみを読み込みます。完全なエントリは
|
||||
Gateway がリッスンを開始した後に読み込まれます。
|
||||
|
||||
<Warning>
|
||||
遅延読み込みを有効にするのは、`setupEntry`がGatewayがlisten開始前に必要とするすべて(チャネル登録、HTTPルート、Gatewayメソッド)を登録している場合だけにしてください。完全なエントリーが必要な起動capabilityを所有している場合は、デフォルト動作のままにしてください。
|
||||
遅延読み込みを有効にするのは、`setupEntry` が Gateway のリッスン開始前に必要なすべて
|
||||
(Channel 登録、HTTP ルート、Gateway メソッド)を登録する場合に限ってください。
|
||||
必要な起動機能を完全なエントリが担っている場合は、デフォルトの動作を維持してください。
|
||||
</Warning>
|
||||
|
||||
セットアップ/完全エントリーがGateway RPCメソッドを登録する場合は、プラグイン固有の接頭辞を維持してください。予約済みのコア管理名前空間(`config.*`,
|
||||
`exec.approvals.*`, `wizard.*`, `update.*`)は引き続きコア所有であり、常に
|
||||
`operator.admin`へ解決されます。
|
||||
セットアップ エントリまたは完全エントリで Gateway RPC メソッドを登録する場合は、
|
||||
Plugin 固有の接頭辞を付けてください。予約済みのコア管理名前空間(`config.*`、
|
||||
`exec.approvals.*`, `wizard.*`, `update.*`)はコア側の所有のままであり、常に
|
||||
`operator.admin` に解決されます。
|
||||
|
||||
## プラグインマニフェスト
|
||||
## Plugin マニフェスト
|
||||
|
||||
すべてのネイティブプラグインは、パッケージルートに`openclaw.plugin.json`を必ず含める必要があります。
|
||||
OpenClawはこれを使って、プラグインコードを実行せずに設定を検証します。
|
||||
すべてのネイティブ Plugin は、パッケージ ルートに `openclaw.plugin.json` を含める必要があります。
|
||||
OpenClaw はこれを使って、Plugin コードを実行せずに設定を検証します。
|
||||
|
||||
```json
|
||||
{
|
||||
@ -216,7 +227,7 @@ OpenClawはこれを使って、プラグインコードを実行せずに設定
|
||||
}
|
||||
```
|
||||
|
||||
チャネルプラグインでは、`kind`と`channels`を追加します。
|
||||
Channel Plugin の場合は、`kind` と `channels` を追加します。
|
||||
|
||||
```json
|
||||
{
|
||||
@ -231,7 +242,7 @@ OpenClawはこれを使って、プラグインコードを実行せずに設定
|
||||
}
|
||||
```
|
||||
|
||||
設定がないプラグインでもスキーマは必須です。空のスキーマも有効です。
|
||||
設定を持たない Plugin でも、スキーマを含める必要があります。空のスキーマも有効です。
|
||||
|
||||
```json
|
||||
{
|
||||
@ -243,24 +254,25 @@ OpenClawはこれを使って、プラグインコードを実行せずに設定
|
||||
}
|
||||
```
|
||||
|
||||
完全なスキーマリファレンスについては[Plugin Manifest](/ja-JP/plugins/manifest)を参照してください。
|
||||
完全なスキーマ リファレンスについては、[Plugin Manifest](/ja-JP/plugins/manifest) を参照してください。
|
||||
|
||||
## ClawHub公開
|
||||
## ClawHub 公開
|
||||
|
||||
プラグインパッケージには、パッケージ固有のClawHubコマンドを使ってください。
|
||||
Plugin パッケージでは、パッケージ専用の ClawHub コマンドを使用します。
|
||||
|
||||
```bash
|
||||
clawhub package publish your-org/your-plugin --dry-run
|
||||
clawhub package publish your-org/your-plugin
|
||||
```
|
||||
|
||||
従来のskill専用公開エイリアスはSkills用です。プラグインパッケージでは常に
|
||||
`clawhub package publish`を使用してください。
|
||||
旧来の skill 専用公開エイリアスは Skills 用です。Plugin パッケージでは、
|
||||
常に `clawhub package publish` を使用してください。
|
||||
|
||||
## セットアップエントリー
|
||||
## セットアップ エントリ
|
||||
|
||||
`setup-entry.ts`ファイルは、セットアップ画面のみ(オンボーディング、設定修復、
|
||||
無効化されたチャネルの検査)が必要なときにOpenClawが読み込む、`index.ts`の軽量な代替です。
|
||||
`setup-entry.ts` ファイルは `index.ts` の軽量な代替で、OpenClaw がセットアップ画面
|
||||
(オンボーディング、設定修復、無効化された Channel の確認)だけを必要とする場合に
|
||||
読み込まれます。
|
||||
|
||||
```typescript
|
||||
// setup-entry.ts
|
||||
@ -270,62 +282,83 @@ import { myChannelPlugin } from "./src/channel.js";
|
||||
export default defineSetupPluginEntry(myChannelPlugin);
|
||||
```
|
||||
|
||||
これにより、セットアップフロー中に重いランタイムコード(暗号ライブラリ、CLI登録、
|
||||
バックグラウンドサービス)を読み込まずに済みます。
|
||||
これにより、セットアップ フロー中に重いランタイム コード(暗号ライブラリ、CLI 登録、
|
||||
バックグラウンド サービス)を読み込まずに済みます。
|
||||
|
||||
**OpenClawが完全なエントリーの代わりに`setupEntry`を使う場面:**
|
||||
セットアップ安全なエクスポートをサイドカー モジュールに保持しているバンドル済みワークスペース Channel では、
|
||||
`defineSetupPluginEntry(...)` の代わりに
|
||||
`openclaw/plugin-sdk/channel-entry-contract` の
|
||||
`defineBundledChannelSetupEntry(...)` を使えます。このバンドル済みコントラクトは、
|
||||
任意の `runtime` エクスポートもサポートしており、セットアップ時のランタイム配線を
|
||||
軽量かつ明示的に保てます。
|
||||
|
||||
- チャネルは無効だが、セットアップ/オンボーディング画面が必要
|
||||
- チャネルは有効だが未設定
|
||||
- 遅延読み込みが有効(`deferConfiguredChannelFullLoadUntilAfterListen`)
|
||||
**OpenClaw が完全なエントリではなく `setupEntry` を使う場合:**
|
||||
|
||||
**`setupEntry`が登録しなければならないもの:**
|
||||
- Channel は無効化されているが、セットアップ/オンボーディング画面が必要な場合
|
||||
- Channel は有効だが未設定の場合
|
||||
- 遅延読み込みが有効な場合(`deferConfiguredChannelFullLoadUntilAfterListen`)
|
||||
|
||||
- チャネルプラグインオブジェクト(`defineSetupPluginEntry`経由)
|
||||
- Gatewayのlisten前に必要なHTTPルート
|
||||
- 起動中に必要なGatewayメソッド
|
||||
**`setupEntry` が登録しなければならないもの:**
|
||||
|
||||
これらの起動時Gatewayメソッドでも、`config.*`や`update.*`のような予約済みコア管理名前空間は避ける必要があります。
|
||||
- Channel Plugin オブジェクト(`defineSetupPluginEntry` 経由)
|
||||
- Gateway のリッスン前に必要な HTTP ルート
|
||||
- 起動時に必要な Gateway メソッド
|
||||
|
||||
**`setupEntry`に含めるべきでないもの:**
|
||||
これらの起動時 Gateway メソッドでも、`config.*` や `update.*` のような
|
||||
予約済みコア管理名前空間は引き続き避ける必要があります。
|
||||
|
||||
- CLI登録
|
||||
- バックグラウンドサービス
|
||||
- 重いランタイムimport(crypto、SDK)
|
||||
- 起動後にのみ必要なGatewayメソッド
|
||||
**`setupEntry` に含めるべきではないもの:**
|
||||
|
||||
### 狭いセットアップヘルパーimport
|
||||
- CLI 登録
|
||||
- バックグラウンド サービス
|
||||
- 重いランタイム import(crypto、SDK)
|
||||
- 起動後にのみ必要な Gateway メソッド
|
||||
|
||||
セットアップ専用のホットパスでは、セットアップ画面の一部だけが必要な場合、より広い
|
||||
`plugin-sdk/setup`アンブレラではなく、狭いセットアップヘルパー境界を優先してください。
|
||||
### 狭いセットアップ ヘルパー import
|
||||
|
||||
| Import path | Use it for | Key exports |
|
||||
| ---------------------------------- | ----------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `plugin-sdk/setup-runtime` | `setupEntry` / 遅延チャネル起動でも利用可能なセットアップ時ランタイムヘルパー | `createPatchedAccountSetupAdapter`, `createEnvPatchedAccountSetupAdapter`, `createSetupInputPresenceValidator`, `noteChannelLookupFailure`, `noteChannelLookupSummary`, `promptResolvedAllowFrom`, `splitSetupEntries`, `createAllowlistSetupWizardProxy`, `createDelegatedSetupWizardProxy` |
|
||||
| `plugin-sdk/setup-adapter-runtime` | 環境認識型アカウントセットアップアダプター | `createEnvPatchedAccountSetupAdapter` |
|
||||
| `plugin-sdk/setup-tools` | セットアップ/インストールCLI/アーカイブ/ドキュメントヘルパー | `formatCliCommand`, `detectBinary`, `extractArchive`, `resolveBrewExecutable`, `formatDocsLink`, `CONFIG_DIR` |
|
||||
セットアップ専用のホット パスでは、セットアップ画面の一部だけが必要な場合、
|
||||
より広い `plugin-sdk/setup` アンブレラではなく、より狭いセットアップ ヘルパーの境界を優先してください。
|
||||
|
||||
設定パッチヘルパー(`moveSingleAccountChannelSectionToDefaultAccount(...)`など)を含む完全な共有セットアップツールボックスが必要な場合は、より広い
|
||||
`plugin-sdk/setup`境界を使用してください。
|
||||
| import パス | 用途 | 主な export |
|
||||
| ---------------------------------- | ---------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `plugin-sdk/setup-runtime` | `setupEntry` / 遅延 Channel 起動でも利用可能な、セットアップ時ランタイム ヘルパー | `createPatchedAccountSetupAdapter`, `createEnvPatchedAccountSetupAdapter`, `createSetupInputPresenceValidator`, `noteChannelLookupFailure`, `noteChannelLookupSummary`, `promptResolvedAllowFrom`, `splitSetupEntries`, `createAllowlistSetupWizardProxy`, `createDelegatedSetupWizardProxy` |
|
||||
| `plugin-sdk/setup-adapter-runtime` | 環境対応のアカウント セットアップ アダプター | `createEnvPatchedAccountSetupAdapter` |
|
||||
| `plugin-sdk/setup-tools` | セットアップ/インストール用 CLI/アーカイブ/ドキュメント ヘルパー | `formatCliCommand`, `detectBinary`, `extractArchive`, `resolveBrewExecutable`, `formatDocsLink`, `CONFIG_DIR` |
|
||||
|
||||
セットアップパッチアダプターは、import時にもホットパス安全性を維持します。バンドルされた単一アカウント昇格契約サーフェス検索は遅延評価されるため、`plugin-sdk/setup-runtime`をimportしても、アダプターが実際に使われる前にバンドル契約サーフェス検出を先行ロードしません。
|
||||
設定パッチ ヘルパー(例:
|
||||
`moveSingleAccountChannelSectionToDefaultAccount(...)`)を含む共有セットアップ ツールボックス全体が必要な場合は、
|
||||
より広い `plugin-sdk/setup` 境界を使用してください。
|
||||
|
||||
### チャネル所有の単一アカウント昇格
|
||||
セットアップ パッチ アダプターは import 時もホット パスで安全なままです。これらのバンドル済み
|
||||
単一アカウント昇格コントラクト画面ルックアップは遅延されるため、
|
||||
`plugin-sdk/setup-runtime` を import しても、アダプターが実際に使われる前に
|
||||
バンドル済みコントラクト画面検出が即座に読み込まれることはありません。
|
||||
|
||||
チャネルが単一アカウントのトップレベル設定から
|
||||
`channels.<id>.accounts.*`へアップグレードする際、共有のデフォルト動作では、昇格されたアカウントスコープ値を`accounts.default`へ移動します。
|
||||
### Channel 所有の単一アカウント昇格
|
||||
|
||||
バンドルされたチャネルは、そのセットアップ契約サーフェスを通じてこの昇格を絞り込むか上書きできます。
|
||||
Channel が単一アカウントのトップレベル設定から
|
||||
`channels.<id>.accounts.*` にアップグレードする場合、共有のデフォルト動作では、
|
||||
昇格されたアカウント スコープ値を `accounts.default` に移動します。
|
||||
|
||||
- `singleAccountKeysToMove`: 昇格されたアカウントへ移動すべき追加のトップレベルキー
|
||||
- `namedAccountPromotionKeys`: 名前付きアカウントがすでに存在する場合、これらのキーだけが昇格先アカウントへ移動し、共有ポリシー/配信キーはチャネルルートに残る
|
||||
- `resolveSingleAccountPromotionTarget(...)`: どの既存アカウントが昇格値を受け取るかを選択
|
||||
バンドル済み Channel は、セットアップ コントラクト画面を通じてその昇格を
|
||||
絞り込んだり上書きしたりできます。
|
||||
|
||||
現在のバンドル例はMatrixです。既存の名前付きMatrixアカウントがちょうど1つある場合、または`defaultAccount`が`Ops`のような既存の非標準キーを指している場合、昇格では新しい`accounts.default`エントリーを作らず、そのアカウントを保持します。
|
||||
- `singleAccountKeysToMove`: 昇格されたアカウントに移動すべき追加のトップレベル キー
|
||||
- `namedAccountPromotionKeys`: 名前付きアカウントがすでに存在する場合、これらの
|
||||
キーだけが昇格されたアカウントに移動されます。共有のポリシー/配信キーは
|
||||
Channel ルートに残ります
|
||||
- `resolveSingleAccountPromotionTarget(...)`: どの既存アカウントが昇格された値を
|
||||
受け取るかを選択します
|
||||
|
||||
現在のバンドル済みの例は Matrix です。名前付き Matrix アカウントがちょうど 1 つ
|
||||
すでに存在する場合、または `defaultAccount` が `Ops` のような既存の非標準キーを
|
||||
指している場合、昇格では新しい `accounts.default` エントリを作成せず、
|
||||
そのアカウントを維持します。
|
||||
|
||||
## 設定スキーマ
|
||||
|
||||
プラグイン設定は、マニフェスト内のJSON Schemaに対して検証されます。ユーザーは次のようにプラグインを設定します。
|
||||
Plugin 設定は、マニフェスト内の JSON Schema に対して検証されます。ユーザーは
|
||||
次のように Plugin を設定します。
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -341,9 +374,9 @@ export default defineSetupPluginEntry(myChannelPlugin);
|
||||
}
|
||||
```
|
||||
|
||||
プラグインは、登録中にこの設定を`api.pluginConfig`として受け取ります。
|
||||
Plugin は登録時に、この設定を `api.pluginConfig` として受け取ります。
|
||||
|
||||
チャネル固有の設定には、代わりにチャネル設定セクションを使ってください。
|
||||
Channel 固有の設定では、代わりに Channel 設定セクションを使います。
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -356,10 +389,10 @@ export default defineSetupPluginEntry(myChannelPlugin);
|
||||
}
|
||||
```
|
||||
|
||||
### チャネル設定スキーマの構築
|
||||
### Channel 設定スキーマの構築
|
||||
|
||||
`openclaw/plugin-sdk/core`の`buildChannelConfigSchema`を使うと、
|
||||
Zodスキーマを、OpenClawが検証する`ChannelConfigSchema`ラッパーへ変換できます。
|
||||
`openclaw/plugin-sdk/core` の `buildChannelConfigSchema` を使うと、
|
||||
Zod スキーマを OpenClaw が検証する `ChannelConfigSchema` ラッパーに変換できます。
|
||||
|
||||
```typescript
|
||||
import { z } from "zod";
|
||||
@ -375,10 +408,10 @@ const accountSchema = z.object({
|
||||
const configSchema = buildChannelConfigSchema(accountSchema);
|
||||
```
|
||||
|
||||
## セットアップウィザード
|
||||
## セットアップ ウィザード
|
||||
|
||||
チャネルプラグインは、`openclaw onboard`向けに対話型セットアップウィザードを提供できます。
|
||||
ウィザードは`ChannelPlugin`上の`ChannelSetupWizard`オブジェクトです。
|
||||
Channel Plugin は `openclaw onboard` 向けに対話型セットアップ ウィザードを提供できます。
|
||||
ウィザードは `ChannelPlugin` 上の `ChannelSetupWizard` オブジェクトです。
|
||||
|
||||
```typescript
|
||||
import type { ChannelSetupWizard } from "openclaw/plugin-sdk/channel-setup";
|
||||
@ -411,21 +444,26 @@ const setupWizard: ChannelSetupWizard = {
|
||||
};
|
||||
```
|
||||
|
||||
`ChannelSetupWizard`型は、`credentials`, `textInputs`,
|
||||
`dmPolicy`, `allowFrom`, `groupAccess`, `prepare`, `finalize`などをサポートします。
|
||||
完全な例については、バンドルされたプラグインパッケージ(たとえばDiscordプラグインの`src/channel.setup.ts`)を参照してください。
|
||||
`ChannelSetupWizard` 型は、`credentials`、`textInputs`、
|
||||
`dmPolicy`、`allowFrom`、`groupAccess`、`prepare`、`finalize` などをサポートします。
|
||||
完全な例については、バンドル済み Plugin パッケージ
|
||||
(たとえば Discord Plugin の `src/channel.setup.ts`)を参照してください。
|
||||
|
||||
標準的な
|
||||
`note -> prompt -> parse -> merge -> patch`フローだけが必要なDM許可リストプロンプトには、`openclaw/plugin-sdk/setup`の共有セットアップヘルパー
|
||||
`createPromptParsedAllowFromForAccount(...)`,
|
||||
`createTopLevelChannelParsedAllowFromPrompt(...)`, および
|
||||
`createNestedChannelParsedAllowFromPrompt(...)`を優先してください。
|
||||
標準の
|
||||
`note -> prompt -> parse -> merge -> patch` フローだけが必要な DM 許可リスト プロンプトでは、
|
||||
`openclaw/plugin-sdk/setup` の共有セットアップ ヘルパー
|
||||
`createPromptParsedAllowFromForAccount(...)`、
|
||||
`createTopLevelChannelParsedAllowFromPrompt(...)`、
|
||||
`createNestedChannelParsedAllowFromPrompt(...)` を優先してください。
|
||||
|
||||
ラベル、スコア、および任意の追加行だけが異なるチャネルセットアップステータスブロックには、各プラグインで同じ`status`オブジェクトを手作業で作る代わりに、
|
||||
`openclaw/plugin-sdk/setup`の`createStandardChannelSetupStatus(...)`を優先してください。
|
||||
ラベル、スコア、任意の追加行だけが異なる Channel セットアップ ステータス ブロックでは、
|
||||
各 Plugin で同じ `status` オブジェクトを手書きする代わりに、
|
||||
`openclaw/plugin-sdk/setup` の
|
||||
`createStandardChannelSetupStatus(...)` を優先してください。
|
||||
|
||||
特定の文脈でのみ表示すべき任意セットアップ画面には、
|
||||
`openclaw/plugin-sdk/channel-setup`の`createOptionalChannelSetupSurface`を使ってください。
|
||||
特定の文脈でのみ表示されるべき任意のセットアップ画面では、
|
||||
`openclaw/plugin-sdk/channel-setup` の
|
||||
`createOptionalChannelSetupSurface` を使います。
|
||||
|
||||
```typescript
|
||||
import { createOptionalChannelSetupSurface } from "openclaw/plugin-sdk/channel-setup";
|
||||
@ -436,60 +474,72 @@ const setupSurface = createOptionalChannelSetupSurface({
|
||||
npmSpec: "@myorg/openclaw-my-channel",
|
||||
docsPath: "/channels/my-channel",
|
||||
});
|
||||
// { setupAdapter, setupWizard } を返します
|
||||
// Returns { setupAdapter, setupWizard }
|
||||
```
|
||||
|
||||
`plugin-sdk/channel-setup`は、任意インストール画面の片側だけが必要な場合のために、より低レベルの
|
||||
`createOptionalChannelSetupAdapter(...)`および
|
||||
`createOptionalChannelSetupWizard(...)`ビルダーも公開しています。
|
||||
`plugin-sdk/channel-setup` は、下位レベルの
|
||||
`createOptionalChannelSetupAdapter(...)` と
|
||||
`createOptionalChannelSetupWizard(...)` ビルダーも公開しており、
|
||||
その任意インストール画面の片方だけが必要な場合に使えます。
|
||||
|
||||
生成される任意アダプター/ウィザードは、実際の設定書き込みではフェイルクローズします。`validateInput`,
|
||||
`applyAccountConfig`, および `finalize` の間で1つの共通インストール必須メッセージを再利用し、`docsPath`が設定されていればドキュメントリンクを追加します。
|
||||
生成された任意アダプター/ウィザードは、実際の設定書き込み時には安全側で失敗します。
|
||||
これらは `validateInput`、`applyAccountConfig`、`finalize` の間で
|
||||
1 つのインストール必須メッセージを再利用し、`docsPath` が設定されている場合は
|
||||
ドキュメント リンクを追加します。
|
||||
|
||||
バイナリ依存のセットアップUIでは、同じバイナリ/ステータス接着コードを各チャネルへ複製する代わりに、共有の委譲ヘルパーを優先してください。
|
||||
バイナリ ベースのセットアップ UI では、同じバイナリ/ステータス用の接着コードを
|
||||
各 Channel に複製するのではなく、共有の委譲ヘルパーを優先してください。
|
||||
|
||||
- `createDetectedBinaryStatus(...)`: ラベル、ヒント、スコア、およびバイナリ検出だけが異なるステータスブロック向け
|
||||
- `createCliPathTextInput(...)`: パスベースのテキスト入力向け
|
||||
- `createDelegatedSetupWizardStatusResolvers(...)`,
|
||||
`createDelegatedPrepare(...)`, `createDelegatedFinalize(...)`, および
|
||||
`createDelegatedResolveConfigured(...)`: `setupEntry`がより重い完全ウィザードへ遅延的に転送する必要がある場合
|
||||
- `createDelegatedTextInputShouldPrompt(...)`: `setupEntry`が`textInputs[*].shouldPrompt`判定だけを委譲する必要がある場合
|
||||
- `createDetectedBinaryStatus(...)`: ラベル、ヒント、スコア、バイナリ検出だけが異なる
|
||||
ステータス ブロック向け
|
||||
- `createCliPathTextInput(...)`: パス ベースのテキスト入力向け
|
||||
- `createDelegatedSetupWizardStatusResolvers(...)`、
|
||||
`createDelegatedPrepare(...)`、`createDelegatedFinalize(...)`、
|
||||
`createDelegatedResolveConfigured(...)`:
|
||||
`setupEntry` が、より重い完全ウィザードへ遅延的に転送する必要がある場合
|
||||
- `createDelegatedTextInputShouldPrompt(...)`:
|
||||
`setupEntry` が `textInputs[*].shouldPrompt` の判断だけを委譲する必要がある場合
|
||||
|
||||
## 公開とインストール
|
||||
|
||||
**外部プラグイン:** [ClawHub](/ja-JP/tools/clawhub)またはnpmへ公開してから、次のようにインストールします。
|
||||
**外部 Plugin:** [ClawHub](/ja-JP/tools/clawhub) または npm に公開し、その後インストールします。
|
||||
|
||||
```bash
|
||||
openclaw plugins install @myorg/openclaw-my-plugin
|
||||
```
|
||||
|
||||
OpenClawは最初にClawHubを試し、自動的にnpmへフォールバックします。ClawHubを明示的に強制することもできます。
|
||||
OpenClaw は最初に ClawHub を試し、自動的に npm にフォールバックします。
|
||||
ClawHub を明示的に強制することもできます。
|
||||
|
||||
```bash
|
||||
openclaw plugins install clawhub:@myorg/openclaw-my-plugin # ClawHubのみ
|
||||
openclaw plugins install clawhub:@myorg/openclaw-my-plugin # ClawHub only
|
||||
```
|
||||
|
||||
対応する`npm:`上書きはありません。ClawHubフォールバック後にnpm経路を使いたい場合は、通常のnpmパッケージspecを使ってください。
|
||||
対応する `npm:` 上書きはありません。ClawHub フォールバック後に npm 経路を使いたい場合は、
|
||||
通常の npm パッケージ spec を使ってください。
|
||||
|
||||
```bash
|
||||
openclaw plugins install @myorg/openclaw-my-plugin
|
||||
```
|
||||
|
||||
**リポジトリ内プラグイン:** バンドルされたプラグインワークスペースツリー配下に置くと、ビルド中に自動検出されます。
|
||||
**リポジトリ内 Plugin:** バンドル済み Plugin ワークスペース ツリー配下に置くと、
|
||||
ビルド時に自動的に検出されます。
|
||||
|
||||
**ユーザーがインストールできる形式:**
|
||||
**ユーザーがインストールできるもの:**
|
||||
|
||||
```bash
|
||||
openclaw plugins install <package-name>
|
||||
```
|
||||
|
||||
<Info>
|
||||
npm由来のインストールでは、`openclaw plugins install`は
|
||||
`npm install --ignore-scripts`(ライフサイクルスクリプトなし)を実行します。プラグイン依存ツリーは純粋なJS/TSに保ち、`postinstall`ビルドを必要とするパッケージは避けてください。
|
||||
npm 由来のインストールでは、`openclaw plugins install` は
|
||||
`npm install --ignore-scripts`(ライフサイクル スクリプトなし)を実行します。
|
||||
Plugin 依存ツリーは純粋な JS/TS に保ち、`postinstall` ビルドが必要な
|
||||
パッケージは避けてください。
|
||||
</Info>
|
||||
|
||||
## 関連
|
||||
|
||||
- [SDK Entry Points](/ja-JP/plugins/sdk-entrypoints) -- `definePluginEntry`および`defineChannelPluginEntry`
|
||||
- [Plugin Manifest](/ja-JP/plugins/manifest) -- 完全なマニフェストスキーマリファレンス
|
||||
- [Building Plugins](/ja-JP/plugins/building-plugins) -- ステップごとの導入ガイド
|
||||
- [SDK Entry Points](/ja-JP/plugins/sdk-entrypoints) -- `definePluginEntry` と `defineChannelPluginEntry`
|
||||
- [Plugin Manifest](/ja-JP/plugins/manifest) -- 完全なマニフェスト スキーマ リファレンス
|
||||
- [Building Plugins](/ja-JP/plugins/building-plugins) -- ステップごとの はじめに ガイド
|
||||
|
||||
@ -1,36 +1,35 @@
|
||||
---
|
||||
read_when:
|
||||
- plugin のテストを書いている場合
|
||||
- plugin SDK のテストユーティリティが必要な場合
|
||||
- bundled plugin の contract test を理解したい場合
|
||||
- あなたはPluginのテストを書いています
|
||||
- Plugin SDKのテストユーティリティが必要です
|
||||
- バンドルされたPluginのコントラクトテストを理解したい場合
|
||||
sidebarTitle: Testing
|
||||
summary: OpenClaw plugin 向けのテストユーティリティとパターン
|
||||
title: Plugin Testing
|
||||
summary: OpenClaw Pluginのテストユーティリティとパターン
|
||||
title: Pluginのテスト
|
||||
x-i18n:
|
||||
generated_at: "2026-04-05T12:52:48Z"
|
||||
generated_at: "2026-04-15T19:41:37Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 2e95ed58ed180feadad17bb5138bd09e3b45f1f3ecdff4e2fba4874bb80099fe
|
||||
source_hash: 2f75bd3f3b5ba34b05786e0dd96d493c36db73a1d258998bf589e27e45c0bd09
|
||||
source_path: plugins/sdk-testing.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# Plugin Testing
|
||||
# Pluginのテスト
|
||||
|
||||
OpenClaw plugin 向けのテストユーティリティ、パターン、および lint enforcement の
|
||||
リファレンスです。
|
||||
OpenClaw Plugin向けのテストユーティリティ、パターン、およびlint適用に関するリファレンスです。
|
||||
|
||||
<Tip>
|
||||
**テスト例を探していますか?** ハウツーガイドには実際のテスト例が含まれています:
|
||||
[Channel plugin tests](/plugins/sdk-channel-plugins#step-6-test) と
|
||||
[Provider plugin tests](/plugins/sdk-provider-plugins#step-6-test)。
|
||||
**テスト例を探していますか?** ハウツーガイドには実際のテスト例が含まれています:
|
||||
[Channel Pluginのテスト](/ja-JP/plugins/sdk-channel-plugins#step-6-test) と
|
||||
[Provider Pluginのテスト](/ja-JP/plugins/sdk-provider-plugins#step-6-test)。
|
||||
</Tip>
|
||||
|
||||
## テストユーティリティ
|
||||
|
||||
**import:** `openclaw/plugin-sdk/testing`
|
||||
**インポート:** `openclaw/plugin-sdk/testing`
|
||||
|
||||
testing subpath は、plugin 作成者向けに絞られた helper 群を export します:
|
||||
このtestingサブパスは、Plugin作成者向けに絞り込まれた一連のヘルパーをエクスポートします:
|
||||
|
||||
```typescript
|
||||
import {
|
||||
@ -40,17 +39,17 @@ import {
|
||||
} from "openclaw/plugin-sdk/testing";
|
||||
```
|
||||
|
||||
### 利用可能な export
|
||||
### 利用可能なエクスポート
|
||||
|
||||
| Export | Purpose |
|
||||
| -------------------------------------- | ------------------------------------------------------ |
|
||||
| `installCommonResolveTargetErrorCases` | target 解決のエラーハンドリング用の共通テストケース |
|
||||
| `shouldAckReaction` | channel が ack reaction を追加すべきか確認する |
|
||||
| `removeAckReactionAfterReply` | reply 配信後に ack reaction を削除する |
|
||||
| Export | 用途 |
|
||||
| -------------------------------------- | -------------------------------------- |
|
||||
| `installCommonResolveTargetErrorCases` | ターゲット解決のエラーハンドリング向け共有テストケース |
|
||||
| `shouldAckReaction` | チャンネルがackリアクションを追加すべきかどうかを確認 |
|
||||
| `removeAckReactionAfterReply` | reply配信後にackリアクションを削除 |
|
||||
|
||||
### 型
|
||||
|
||||
testing subpath は、テストファイルで便利な型も再 export します:
|
||||
testingサブパスは、テストファイルで役立つ型も再エクスポートします:
|
||||
|
||||
```typescript
|
||||
import type {
|
||||
@ -63,10 +62,9 @@ import type {
|
||||
} from "openclaw/plugin-sdk/testing";
|
||||
```
|
||||
|
||||
## target 解決のテスト
|
||||
## ターゲット解決のテスト
|
||||
|
||||
channel target 解決の標準エラーケースを追加するには、
|
||||
`installCommonResolveTargetErrorCases` を使います:
|
||||
チャンネルのターゲット解決に対する標準的なエラーケースを追加するには、`installCommonResolveTargetErrorCases` を使用します:
|
||||
|
||||
```typescript
|
||||
import { describe } from "vitest";
|
||||
@ -75,13 +73,13 @@ import { installCommonResolveTargetErrorCases } from "openclaw/plugin-sdk/testin
|
||||
describe("my-channel target resolution", () => {
|
||||
installCommonResolveTargetErrorCases({
|
||||
resolveTarget: ({ to, mode, allowFrom }) => {
|
||||
// あなたの channel の target 解決ロジック
|
||||
// Your channel's target resolution logic
|
||||
return myChannelResolveTarget({ to, mode, allowFrom });
|
||||
},
|
||||
implicitAllowFrom: ["user1", "user2"],
|
||||
});
|
||||
|
||||
// channel 固有のテストケースを追加
|
||||
// Add channel-specific test cases
|
||||
it("should resolve @username targets", () => {
|
||||
// ...
|
||||
});
|
||||
@ -90,7 +88,7 @@ describe("my-channel target resolution", () => {
|
||||
|
||||
## テストパターン
|
||||
|
||||
### channel plugin のユニットテスト
|
||||
### Channel Pluginのユニットテスト
|
||||
|
||||
```typescript
|
||||
import { describe, it, expect, vi } from "vitest";
|
||||
@ -120,13 +118,13 @@ describe("my-channel plugin", () => {
|
||||
const inspection = myPlugin.setup.inspectAccount(cfg, undefined);
|
||||
expect(inspection.configured).toBe(true);
|
||||
expect(inspection.tokenStatus).toBe("available");
|
||||
// token 値は公開されない
|
||||
// No token value exposed
|
||||
expect(inspection).not.toHaveProperty("token");
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
### provider plugin のユニットテスト
|
||||
### Provider Pluginのユニットテスト
|
||||
|
||||
```typescript
|
||||
import { describe, it, expect } from "vitest";
|
||||
@ -154,72 +152,75 @@ describe("my-provider plugin", () => {
|
||||
});
|
||||
```
|
||||
|
||||
### plugin runtime のモック
|
||||
### Pluginランタイムのモック
|
||||
|
||||
`createPluginRuntimeStore` を使うコードでは、テスト内で runtime をモックします:
|
||||
`createPluginRuntimeStore` を使用するコードでは、テスト内でランタイムをモックします:
|
||||
|
||||
```typescript
|
||||
import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store";
|
||||
import type { PluginRuntime } from "openclaw/plugin-sdk/runtime-store";
|
||||
|
||||
const store = createPluginRuntimeStore<PluginRuntime>("test runtime not set");
|
||||
const store = createPluginRuntimeStore<PluginRuntime>({
|
||||
pluginId: "test-plugin",
|
||||
errorMessage: "test runtime not set",
|
||||
});
|
||||
|
||||
// テストセットアップ内
|
||||
// In test setup
|
||||
const mockRuntime = {
|
||||
agent: {
|
||||
resolveAgentDir: vi.fn().mockReturnValue("/tmp/agent"),
|
||||
// ... その他のモック
|
||||
// ... other mocks
|
||||
},
|
||||
config: {
|
||||
loadConfig: vi.fn(),
|
||||
writeConfigFile: vi.fn(),
|
||||
},
|
||||
// ... その他の namespace
|
||||
// ... other namespaces
|
||||
} as unknown as PluginRuntime;
|
||||
|
||||
store.setRuntime(mockRuntime);
|
||||
|
||||
// テスト後
|
||||
// After tests
|
||||
store.clearRuntime();
|
||||
```
|
||||
|
||||
### インスタンスごとの stub を使ったテスト
|
||||
### インスタンスごとのスタブを使ったテスト
|
||||
|
||||
prototype の変更ではなく、インスタンスごとの stub を推奨します:
|
||||
プロトタイプの変更よりも、インスタンスごとのスタブを優先してください:
|
||||
|
||||
```typescript
|
||||
// 推奨: インスタンスごとの stub
|
||||
// Preferred: per-instance stub
|
||||
const client = new MyChannelClient();
|
||||
client.sendMessage = vi.fn().mockResolvedValue({ id: "msg-1" });
|
||||
|
||||
// 非推奨: prototype の変更
|
||||
// Avoid: prototype mutation
|
||||
// MyChannelClient.prototype.sendMessage = vi.fn();
|
||||
```
|
||||
|
||||
## contract test(repo 内 plugin)
|
||||
## コントラクトテスト(リポジトリ内Plugin)
|
||||
|
||||
bundled plugin には、登録の所有権を検証する contract test があります:
|
||||
バンドルされたPluginには、登録の所有権を検証するコントラクトテストがあります:
|
||||
|
||||
```bash
|
||||
pnpm test -- src/plugins/contracts/
|
||||
```
|
||||
|
||||
これらのテストは次を検証します:
|
||||
これらのテストでは、次の内容を検証します:
|
||||
|
||||
- どの plugin がどの provider を登録するか
|
||||
- どの plugin がどの speech provider を登録するか
|
||||
- どのPluginがどのProviderを登録するか
|
||||
- どのPluginがどのspeech providerを登録するか
|
||||
- 登録形状の正しさ
|
||||
- runtime contract への準拠
|
||||
- ランタイムのコントラクト準拠
|
||||
|
||||
### スコープ付きテストの実行
|
||||
|
||||
特定の plugin 向け:
|
||||
特定のPluginに対して:
|
||||
|
||||
```bash
|
||||
pnpm test -- <bundled-plugin-root>/my-channel/
|
||||
```
|
||||
|
||||
contract test のみを実行する場合:
|
||||
コントラクトテストのみを実行する場合:
|
||||
|
||||
```bash
|
||||
pnpm test -- src/plugins/contracts/shape.contract.test.ts
|
||||
@ -227,36 +228,35 @@ pnpm test -- src/plugins/contracts/auth.contract.test.ts
|
||||
pnpm test -- src/plugins/contracts/runtime.contract.test.ts
|
||||
```
|
||||
|
||||
## lint enforcement(repo 内 plugin)
|
||||
## lint適用(リポジトリ内Plugin)
|
||||
|
||||
repo 内 plugin には、`pnpm check` により 3 つのルールが強制されます:
|
||||
リポジトリ内Pluginに対しては、`pnpm check` により3つのルールが適用されます:
|
||||
|
||||
1. **単一ルート import の禁止** -- `openclaw/plugin-sdk` のルート barrel は拒否される
|
||||
2. **直接の `src/` import の禁止** -- plugin は `../../src/` を直接 import できない
|
||||
3. **self-import の禁止** -- plugin は自身の `plugin-sdk/<name>` subpath を import できない
|
||||
1. **モノリシックなルートインポートの禁止** -- `openclaw/plugin-sdk` のルートbarrelは拒否されます
|
||||
2. **直接の `src/` インポートの禁止** -- Pluginは `../../src/` を直接インポートできません
|
||||
3. **自己インポートの禁止** -- Pluginは自身の `plugin-sdk/<name>` サブパスをインポートできません
|
||||
|
||||
外部 plugin はこれらの lint ルールの対象ではありませんが、同じ
|
||||
パターンに従うことが推奨されます。
|
||||
外部Pluginはこれらのlintルールの対象ではありませんが、同じパターンに従うことを推奨します。
|
||||
|
||||
## テスト設定
|
||||
|
||||
OpenClaw は、V8 coverage threshold を持つ Vitest を使用します。plugin テストでは:
|
||||
OpenClawは、V8カバレッジしきい値付きのVitestを使用しています。Pluginテストでは次を使用します:
|
||||
|
||||
```bash
|
||||
# すべてのテストを実行
|
||||
# Run all tests
|
||||
pnpm test
|
||||
|
||||
# 特定の plugin テストを実行
|
||||
# Run specific plugin tests
|
||||
pnpm test -- <bundled-plugin-root>/my-channel/src/channel.test.ts
|
||||
|
||||
# 特定のテスト名フィルターで実行
|
||||
# Run with a specific test name filter
|
||||
pnpm test -- <bundled-plugin-root>/my-channel/ -t "resolves account"
|
||||
|
||||
# coverage 付きで実行
|
||||
# Run with coverage
|
||||
pnpm test:coverage
|
||||
```
|
||||
|
||||
ローカル実行でメモリー圧迫が起きる場合:
|
||||
ローカル実行でメモリ負荷が発生する場合:
|
||||
|
||||
```bash
|
||||
OPENCLAW_VITEST_MAX_WORKERS=1 pnpm test
|
||||
@ -264,7 +264,7 @@ OPENCLAW_VITEST_MAX_WORKERS=1 pnpm test
|
||||
|
||||
## 関連
|
||||
|
||||
- [SDK Overview](/plugins/sdk-overview) -- import 規約
|
||||
- [SDK Channel Plugins](/plugins/sdk-channel-plugins) -- channel plugin interface
|
||||
- [SDK Provider Plugins](/plugins/sdk-provider-plugins) -- provider plugin hook
|
||||
- [Building Plugins](/plugins/building-plugins) -- はじめにガイド
|
||||
- [SDK Overview](/ja-JP/plugins/sdk-overview) -- インポート規約
|
||||
- [SDK Channel Plugins](/ja-JP/plugins/sdk-channel-plugins) -- Channel Pluginインターフェース
|
||||
- [SDK Provider Plugins](/ja-JP/plugins/sdk-provider-plugins) -- Provider Pluginフック
|
||||
- [Building Plugins](/ja-JP/plugins/building-plugins) -- はじめにガイド
|
||||
|
||||
@ -1,102 +1,143 @@
|
||||
---
|
||||
read_when:
|
||||
- トークン使用量、コスト、またはコンテキストウィンドウの説明
|
||||
- コンテキストの増大や圧縮の挙動のデバッグ
|
||||
summary: OpenClaw がプロンプトコンテキストを構築する方法と、トークン使用量 + コストを報告する方法
|
||||
- コンテキストの増大やCompactionの挙動をデバッグすること
|
||||
summary: OpenClawがどのようにプロンプトコンテキストを構築し、トークン使用量とコストを報告するか
|
||||
title: トークン使用量とコスト
|
||||
x-i18n:
|
||||
generated_at: "2026-04-12T04:43:45Z"
|
||||
generated_at: "2026-04-15T19:42:12Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: f8c856549cd28b8364a640e6fa9ec26aa736895c7a993e96cbe85838e7df2dfb
|
||||
source_hash: 9a706d3df8b2ea1136b3535d216c6b358e43aee2a31a4759824385e1345e6fe5
|
||||
source_path: reference/token-use.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# トークン使用量とコスト
|
||||
|
||||
OpenClaw は文字数ではなく、**トークン**を追跡します。トークンはモデルごとに異なりますが、ほとんどの OpenAI スタイルのモデルでは、英語テキストは平均して 1 トークンあたり約 4 文字です。
|
||||
OpenClawは**文字数**ではなく**トークン**を追跡します。トークンはモデル固有ですが、ほとんどのOpenAI系モデルでは英語テキストで平均して1トークンあたり約4文字です。
|
||||
|
||||
## システムプロンプトの構築方法
|
||||
|
||||
OpenClaw は実行のたびに独自のシステムプロンプトを組み立てます。これには次が含まれます。
|
||||
OpenClawは実行のたびに独自のシステムプロンプトを組み立てます。これには次が含まれます:
|
||||
|
||||
- ツール一覧 + 短い説明
|
||||
- Skills 一覧(メタデータのみ。指示は必要時に `read` で読み込まれます)
|
||||
- セルフアップデートの指示
|
||||
- ワークスペース + ブートストラップファイル(`AGENTS.md`、`SOUL.md`、`TOOLS.md`、`IDENTITY.md`、`USER.md`、`HEARTBEAT.md`、新規時の `BOOTSTRAP.md`、さらに存在する場合は `MEMORY.md`、または小文字の代替として `memory.md`)。大きなファイルは `agents.defaults.bootstrapMaxChars`(デフォルト: 20000)で切り詰められ、ブートストラップ全体の注入量は `agents.defaults.bootstrapTotalMaxChars`(デフォルト: 150000)で上限設定されます。`memory/*.md` の日次ファイルは通常のブートストラッププロンプトには含まれません。通常のターンではメモリツール経由で必要時に利用されますが、素の `/new` と `/reset` では、最初のターンに限って最近の日次メモリを含むワンショットの起動コンテキストブロックが前置されることがあります。この起動プレリュードは `agents.defaults.startupContext` で制御されます。
|
||||
- Skills一覧(メタデータのみ。指示は必要時に `read` で読み込まれます)。
|
||||
コンパクトなSkillsブロックは `skills.limits.maxSkillsPromptChars` によって制限され、
|
||||
エージェントごとのオーバーライドとして
|
||||
`agents.list[].skillsLimits.maxSkillsPromptChars` を設定することもできます。
|
||||
- 自己更新の指示
|
||||
- ワークスペース + ブートストラップファイル(`AGENTS.md`、`SOUL.md`、`TOOLS.md`、`IDENTITY.md`、`USER.md`、`HEARTBEAT.md`、新規時の `BOOTSTRAP.md`、および存在する場合の `MEMORY.md` または小文字フォールバックの `memory.md`)。大きなファイルは `agents.defaults.bootstrapMaxChars`(デフォルト: 12000)で切り詰められ、ブートストラップ注入全体は `agents.defaults.bootstrapTotalMaxChars`(デフォルト: 60000)で上限が設定されます。`memory/*.md` の日次ファイルは通常のブートストラッププロンプトには含まれません。通常のターンではメモリツール経由のオンデマンドのままですが、素の `/new` と `/reset` では、最初のターンに限り最近の日次メモリを含むワンショットの起動コンテキストブロックを先頭に追加できます。この起動プレリュードは `agents.defaults.startupContext` で制御されます。
|
||||
- 時刻(UTC + ユーザーのタイムゾーン)
|
||||
- 返信タグ + ハートビートの挙動
|
||||
- ランタイムメタデータ(ホスト/OS/モデル/思考)
|
||||
- 返信タグ + Heartbeatの挙動
|
||||
- ランタイムメタデータ(ホスト/OS/モデル/thinking)
|
||||
|
||||
完全な内訳は [システムプロンプト](/ja-JP/concepts/system-prompt) を参照してください。
|
||||
完全な内訳は [System Prompt](/ja-JP/concepts/system-prompt) を参照してください。
|
||||
|
||||
## コンテキストウィンドウに含まれるもの
|
||||
|
||||
モデルが受け取るものはすべて、コンテキスト上限に対してカウントされます。
|
||||
モデルが受け取るものはすべてコンテキスト上限に含まれます:
|
||||
|
||||
- システムプロンプト(上記のすべてのセクション)
|
||||
- システムプロンプト(上記の全セクション)
|
||||
- 会話履歴(ユーザー + アシスタントメッセージ)
|
||||
- ツール呼び出しとツール結果
|
||||
- 添付ファイル/文字起こし(画像、音声、ファイル)
|
||||
- 圧縮サマリーと枝刈りアーティファクト
|
||||
- プロバイダーのラッパーや安全性ヘッダー(表示されませんが、やはりカウントされます)
|
||||
- Compactionの要約とpruning成果物
|
||||
- Providerラッパーや安全性ヘッダー(表示はされませんが、カウント対象です)
|
||||
|
||||
画像については、OpenClaw はプロバイダー呼び出し前に文字起こし/ツールの画像ペイロードを縮小します。これを調整するには `agents.defaults.imageMaxDimensionPx`(デフォルト: `1200`)を使用します。
|
||||
ランタイム負荷の高い一部のサーフェスには、独自の明示的な上限があります:
|
||||
|
||||
- 値を小さくすると、通常はビジョントークン使用量とペイロードサイズが減ります。
|
||||
- 値を大きくすると、OCR や UI を多く含むスクリーンショットでより多くの視覚的詳細が保持されます。
|
||||
- `agents.defaults.contextLimits.memoryGetMaxChars`
|
||||
- `agents.defaults.contextLimits.memoryGetDefaultLines`
|
||||
- `agents.defaults.contextLimits.toolResultMaxChars`
|
||||
- `agents.defaults.contextLimits.postCompactionMaxChars`
|
||||
|
||||
実用的な内訳(注入された各ファイル、ツール、Skills、システムプロンプトサイズごと)を確認するには、`/context list` または `/context detail` を使ってください。[コンテキスト](/ja-JP/concepts/context) も参照してください。
|
||||
エージェントごとのオーバーライドは `agents.list[].contextLimits` の下にあります。これらのノブは、
|
||||
上限付きのランタイム抜粋と、ランタイム所有の注入ブロックに対するものです。これらは
|
||||
ブートストラップ上限、起動コンテキスト上限、Skillsプロンプト上限とは別です。
|
||||
|
||||
画像については、OpenClawはProvider呼び出し前に文字起こし/ツール画像ペイロードを縮小します。
|
||||
これを調整するには `agents.defaults.imageMaxDimensionPx`(デフォルト: `1200`)を使用します:
|
||||
|
||||
- 値を低くすると、通常はvisionトークン使用量とペイロードサイズが減少します。
|
||||
- 値を高くすると、OCRやUI中心のスクリーンショットでより多くの視覚的詳細を保持できます。
|
||||
|
||||
実用的な内訳(注入された各ファイル、ツール、Skills、システムプロンプトサイズごと)を確認するには、`/context list` または `/context detail` を使用してください。[Context](/ja-JP/concepts/context) を参照してください。
|
||||
|
||||
## 現在のトークン使用量を確認する方法
|
||||
|
||||
チャットでは次を使用します。
|
||||
チャットでは次を使用します:
|
||||
|
||||
- `/status` → セッションモデル、コンテキスト使用量、前回応答の入力/出力トークン、**推定コスト**(API キー時のみ)を表示する **絵文字豊富なステータスカード**。
|
||||
- `/usage off|tokens|full` → すべての返信に **応答ごとの使用量フッター** を追加します。
|
||||
- セッション単位で永続化されます(`responseUsage` として保存)。
|
||||
- OAuth 認証では **コストは非表示** です(トークンのみ)。
|
||||
- `/usage cost` → OpenClaw のセッションログからローカルのコスト概要を表示します。
|
||||
- `/status` → セッションモデル、コンテキスト使用量、
|
||||
直近の応答の入力/出力トークン、および**推定コスト**(APIキーのみ)を表示する
|
||||
**絵文字豊富なステータスカード**。
|
||||
- `/usage off|tokens|full` → すべての返信に**応答ごとの使用量フッター**を追加します。
|
||||
- セッションごとに保持されます(`responseUsage` として保存)。
|
||||
- OAuth認証では**コストは非表示**です(トークンのみ)。
|
||||
- `/usage cost` → OpenClawのセッションログからローカルのコスト概要を表示します。
|
||||
|
||||
その他の画面:
|
||||
その他のサーフェス:
|
||||
|
||||
- **TUI/Web TUI:** `/status` と `/usage` がサポートされています。
|
||||
- **CLI:** `openclaw status --usage` と `openclaw channels list` は、正規化されたプロバイダーのクォータウィンドウ(応答ごとのコストではなく `X% left`)を表示します。
|
||||
現在の使用量ウィンドウ対応プロバイダー: Anthropic、GitHub Copilot、Gemini CLI、OpenAI Codex、MiniMax、Xiaomi、z.ai。
|
||||
- **TUI/Web TUI:** `/status` + `/usage` がサポートされています。
|
||||
- **CLI:** `openclaw status --usage` と `openclaw channels list` は
|
||||
正規化されたProviderクォータウィンドウ(`X% left`。応答ごとのコストではありません)を表示します。
|
||||
現在の使用量ウィンドウ対応Provider: Anthropic、GitHub Copilot、Gemini CLI、
|
||||
OpenAI Codex、MiniMax、Xiaomi、z.ai。
|
||||
|
||||
使用量表示では、表示前に一般的なプロバイダーネイティブのフィールド別名を正規化します。OpenAI 系 Responses トラフィックでは、これに `input_tokens` / `output_tokens` と `prompt_tokens` / `completion_tokens` の両方が含まれるため、転送方式固有のフィールド名によって `/status`、`/usage`、またはセッション概要の表示が変わることはありません。
|
||||
Gemini CLI の JSON 使用量も正規化されます。返信テキストは `response` から取得され、CLI が明示的な `stats.input` フィールドを省略した場合は、`stats.cached` が `cacheRead` に対応付けられ、`stats.input_tokens - stats.cached` が使われます。
|
||||
ネイティブな OpenAI 系 Responses トラフィックでは、WebSocket/SSE の使用量別名も同様に正規化され、`total_tokens` が欠落しているか `0` の場合は、合計が正規化済みの input + output にフォールバックします。
|
||||
現在のセッションスナップショットが疎な場合、`/status` と `session_status` は最新の transcript 使用量ログからトークン/キャッシュカウンターやアクティブなランタイムモデルラベルを復元することもできます。既存のゼロ以外のライブ値は引き続き transcript フォールバック値より優先され、保存済み合計が存在しないか小さい場合は、より大きなプロンプト指向の transcript 合計が優先されることがあります。
|
||||
プロバイダーのクォータウィンドウ用の使用量認証は、利用可能な場合はプロバイダー固有のフックから取得されます。そうでない場合、OpenClaw は auth profile、env、または config から一致する OAuth/API キー資格情報にフォールバックします。
|
||||
使用量サーフェスは、表示前に一般的なProviderネイティブのフィールド別名を正規化します。
|
||||
OpenAI系のResponsesトラフィックでは、これに `input_tokens` /
|
||||
`output_tokens` と `prompt_tokens` / `completion_tokens` の両方が含まれるため、トランスポート固有の
|
||||
フィールド名によって `/status`、`/usage`、またはセッション要約が変わることはありません。
|
||||
Gemini CLIのJSON使用量も正規化されます: 返信テキストは `response` から取得され、
|
||||
CLIが明示的な `stats.input` フィールドを省略した場合は、`stats.cached` は `cacheRead` にマップされ、
|
||||
`stats.input_tokens - stats.cached` が使用されます。
|
||||
ネイティブなOpenAI系Responsesトラフィックでは、WebSocket/SSEの使用量別名も同様に正規化され、
|
||||
`total_tokens` が欠けているか `0` の場合は、正規化された入力 + 出力から合計が補完されます。
|
||||
現在のセッションスナップショットが疎な場合、`/status` と `session_status` は
|
||||
直近の文字起こし使用量ログからトークン/キャッシュカウンターとアクティブなランタイムモデルラベルを復元することもできます。
|
||||
既存のゼロ以外のライブ値は、引き続き文字起こしのフォールバック値より優先され、
|
||||
保存済み合計が欠けているか小さい場合には、より大きいプロンプト指向の文字起こし合計が優先されることがあります。
|
||||
Providerクォータウィンドウの使用量認証は、利用可能な場合はProvider固有のフックから取得されます。
|
||||
それ以外の場合、OpenClawは認証プロファイル、環境変数、または設定から一致するOAuth/APIキー資格情報へフォールバックします。
|
||||
|
||||
## コスト見積もり(表示される場合)
|
||||
|
||||
コストは、モデルの価格設定 config から見積もられます。
|
||||
コストはモデルの価格設定から見積もられます:
|
||||
|
||||
```
|
||||
models.providers.<provider>.models[].cost
|
||||
```
|
||||
|
||||
これらは `input`、`output`、`cacheRead`、`cacheWrite` に対する **100 万トークンあたりの USD** です。価格設定がない場合、OpenClaw はトークンのみを表示します。OAuth トークンではドル建てコストは表示されません。
|
||||
これらは `input`、`output`、`cacheRead`、`cacheWrite` に対する**100万トークンあたりのUSD**です。
|
||||
価格設定がない場合、OpenClawはトークンのみを表示します。OAuthトークンでは
|
||||
ドルコストは表示されません。
|
||||
|
||||
## キャッシュ TTL と枝刈りの影響
|
||||
## キャッシュTTLとpruningの影響
|
||||
|
||||
プロバイダーのプロンプトキャッシュは、キャッシュ TTL ウィンドウ内でのみ適用されます。OpenClaw はオプションで **cache-ttl pruning** を実行できます。これは、キャッシュ TTL の期限切れ後にセッションを枝刈りし、その後キャッシュウィンドウをリセットして、以降のリクエストで履歴全体を再キャッシュする代わりに新たにキャッシュされたコンテキストを再利用できるようにするものです。これにより、セッションが TTL を超えてアイドル状態になった場合のキャッシュ書き込みコストを低く保てます。
|
||||
Providerのプロンプトキャッシュは、キャッシュTTLウィンドウ内でのみ適用されます。OpenClawは
|
||||
オプションで**cache-ttl pruning**を実行できます: キャッシュTTLの有効期限が切れたらセッションをpruneし、
|
||||
その後キャッシュウィンドウをリセットして、後続のリクエストが履歴全体を再キャッシュする代わりに
|
||||
新たにキャッシュされたコンテキストを再利用できるようにします。これにより、セッションがTTLを超えて
|
||||
アイドル状態になった場合のキャッシュ書き込みコストを低く保てます。
|
||||
|
||||
これは [Gateway configuration](/ja-JP/gateway/configuration) で設定でき、挙動の詳細は [Session pruning](/ja-JP/concepts/session-pruning) を参照してください。
|
||||
これを設定するには [Gateway configuration](/ja-JP/gateway/configuration) を参照し、
|
||||
挙動の詳細は [Session pruning](/ja-JP/concepts/session-pruning) を参照してください。
|
||||
|
||||
ハートビートは、アイドル期間をまたいでキャッシュを**ウォーム**な状態に保つことができます。モデルのキャッシュ TTL が `1h` の場合、ハートビート間隔をその少し手前(例: `55m`)に設定すると、完全なプロンプトの再キャッシュを避けられ、キャッシュ書き込みコストを減らせます。
|
||||
Heartbeatは、アイドルギャップをまたいでキャッシュを**温かい**状態に保つことができます。モデルのキャッシュTTLが
|
||||
`1h` の場合、Heartbeat間隔をそれより少し短く(例: `55m`)設定すると、
|
||||
完全なプロンプトの再キャッシュを避けられ、キャッシュ書き込みコストを削減できます。
|
||||
|
||||
マルチエージェント構成では、1 つの共有モデル config を維持しつつ、`agents.list[].params.cacheRetention` でエージェントごとにキャッシュ挙動を調整できます。
|
||||
マルチエージェント構成では、共有のモデル設定を1つ保ちつつ、
|
||||
`agents.list[].params.cacheRetention` でエージェントごとにキャッシュ挙動を調整できます。
|
||||
|
||||
各設定項目の完全なガイドについては、[Prompt Caching](/ja-JP/reference/prompt-caching) を参照してください。
|
||||
各ノブの完全ガイドは [Prompt Caching](/ja-JP/reference/prompt-caching) を参照してください。
|
||||
|
||||
Anthropic API の価格設定では、キャッシュ読み取りは入力トークンよりかなり安価である一方、キャッシュ書き込みはより高い倍率で課金されます。最新の料金と TTL 倍率については、Anthropic の prompt caching pricing を参照してください:
|
||||
Anthropic APIの価格設定では、cache readはinputトークンより大幅に安価である一方、
|
||||
cache writeはより高い倍率で課金されます。最新の料金とTTL倍率については、
|
||||
Anthropicのプロンプトキャッシュ料金を参照してください:
|
||||
[https://docs.anthropic.com/docs/build-with-claude/prompt-caching](https://docs.anthropic.com/docs/build-with-claude/prompt-caching)
|
||||
|
||||
### 例: heartbeat で 1h キャッシュをウォームに保つ
|
||||
### 例: Heartbeatで1時間キャッシュを温かい状態に保つ
|
||||
|
||||
```yaml
|
||||
agents:
|
||||
@ -111,7 +152,7 @@ agents:
|
||||
every: "55m"
|
||||
```
|
||||
|
||||
### 例: エージェントごとのキャッシュ戦略を使った混在トラフィック
|
||||
### 例: エージェントごとのキャッシュ戦略を使った混合トラフィック
|
||||
|
||||
```yaml
|
||||
agents:
|
||||
@ -121,22 +162,25 @@ agents:
|
||||
models:
|
||||
"anthropic/claude-opus-4-6":
|
||||
params:
|
||||
cacheRetention: "long" # ほとんどのエージェント向けのデフォルトのベースライン
|
||||
cacheRetention: "long" # default baseline for most agents
|
||||
list:
|
||||
- id: "research"
|
||||
default: true
|
||||
heartbeat:
|
||||
every: "55m" # 長時間セッション向けに長いキャッシュをウォームに保つ
|
||||
every: "55m" # keep long cache warm for deep sessions
|
||||
- id: "alerts"
|
||||
params:
|
||||
cacheRetention: "none" # バースト的な通知ではキャッシュ書き込みを避ける
|
||||
cacheRetention: "none" # avoid cache writes for bursty notifications
|
||||
```
|
||||
|
||||
`agents.list[].params` は、選択されたモデルの `params` の上にマージされるため、`cacheRetention` だけを上書きし、他のモデルデフォルトはそのまま継承できます。
|
||||
`agents.list[].params` は選択されたモデルの `params` の上にマージされるため、
|
||||
`cacheRetention` のみをオーバーライドし、他のモデルデフォルトはそのまま継承できます。
|
||||
|
||||
### 例: Anthropic 1M context beta ヘッダーを有効化する
|
||||
### 例: Anthropicの1Mコンテキストベータヘッダーを有効にする
|
||||
|
||||
Anthropic の 1M コンテキストウィンドウは現在ベータ制限付きです。OpenClaw は、対応する Opus または Sonnet モデルで `context1m` を有効にすると、必要な `anthropic-beta` 値を注入できます。
|
||||
Anthropicの1Mコンテキストウィンドウは現在ベータ制限付きです。OpenClawでは、
|
||||
サポートされているOpusまたはSonnetモデルで `context1m` を有効にすると、
|
||||
必要な `anthropic-beta` 値を注入できます。
|
||||
|
||||
```yaml
|
||||
agents:
|
||||
@ -147,20 +191,23 @@ agents:
|
||||
context1m: true
|
||||
```
|
||||
|
||||
これは Anthropic の `context-1m-2025-08-07` beta ヘッダーに対応します。
|
||||
これはAnthropicの `context-1m-2025-08-07` ベータヘッダーにマップされます。
|
||||
|
||||
これは、そのモデルエントリで `context1m: true` が設定されている場合にのみ適用されます。
|
||||
|
||||
要件: 資格情報が long-context 利用対象である必要があります。そうでない場合、Anthropic はそのリクエストに対してプロバイダー側のレート制限エラーを返します。
|
||||
要件: 資格情報がロングコンテキスト利用の対象である必要があります。そうでない場合、
|
||||
Anthropicはそのリクエストに対してProvider側のレート制限エラーを返します。
|
||||
|
||||
Anthropic を OAuth/サブスクリプショントークン(`sk-ant-oat-*`)で認証している場合、OpenClaw は `context-1m-*` beta ヘッダーをスキップします。これは Anthropic が現在その組み合わせを HTTP 401 で拒否するためです。
|
||||
AnthropicをOAuth/サブスクリプショントークン(`sk-ant-oat-*`)で認証している場合、
|
||||
Anthropicは現在その組み合わせをHTTP 401で拒否するため、OpenClawは
|
||||
`context-1m-*` ベータヘッダーをスキップします。
|
||||
|
||||
## トークン圧迫を減らすためのヒント
|
||||
## トークン負荷を減らすためのヒント
|
||||
|
||||
- `/compact` を使って長いセッションを要約する。
|
||||
- ワークフロー内で大きなツール出力を削減する。
|
||||
- スクリーンショットが多いセッションでは `agents.defaults.imageMaxDimensionPx` を下げる。
|
||||
- Skill の説明は短く保つ(Skill 一覧はプロンプトに注入されるため)。
|
||||
- 冗長で探索的な作業には小さいモデルを優先する。
|
||||
- 長いセッションは `/compact` を使って要約します。
|
||||
- ワークフロー内で大きなツール出力を切り詰めます。
|
||||
- スクリーンショット中心のセッションでは `agents.defaults.imageMaxDimensionPx` を下げます。
|
||||
- Skillの説明は短く保ちます(Skill一覧はプロンプトに注入されます)。
|
||||
- 冗長で探索的な作業には、より小さいモデルを優先します。
|
||||
|
||||
正確な Skill 一覧のオーバーヘッド計算式は [Skills](/ja-JP/tools/skills) を参照してください。
|
||||
正確なSkill一覧のオーバーヘッド計算式については [Skills](/ja-JP/tools/skills) を参照してください。
|
||||
|
||||
Loading…
Reference in New Issue
Block a user