はじめに
インストールおよび開発する Skill が増えるにつれて、それらの間の連携がますます重要になります。ユーザーの一つのリクエストが複数の Skill の協力を必要とする場合があります——例えば「明日の北京の天気を調べて、雨なら傘を持つことをリマインドして」という場合、天気予報とタイマーリマインダーの2つの Skill が連携する必要があります。
本チュートリアルでは、OpenClaw における複数 Skill 連携のメカニズムとベストプラクティスを深く掘り下げます。
複数 Skill 連携の基本原理
Skill の起動フロー
OpenClaw がメッセージを受信すると、以下のフローを経ます:
ユーザーメッセージ
│
▼
┌──────────────────┐
│ トリガーワード │ ← すべての Skill のトリガーワードをチェック
│ マッチングフェーズ │
└────────┬─────────┘
│
┌────▼────┐
│ マッチ数?│
└────┬────┘
┌────┼────────────┐
│ │ │
0件 1件 複数件
│ │ │
▼ ▼ ▼
Skill その Skill 優先度で
なし を直接起動 ソート
汎用 最高優先度を選択
会話 または組合せ起動
単一起動 vs 複数起動モード
OpenClaw は2つの Skill 起動モードをサポートしています:
{
skills: {
// 起動モード
activationMode: "single", // デフォルト:最高優先度の1つの Skill のみ起動
// activationMode: "multi", // マッチしたすべての Skill を同時起動
}
}
| モード | 説明 | 適用シナリオ |
|---|---|---|
single |
最高優先度の1つの Skill のみ起動 | シンプルなシナリオ、競合回避 |
multi |
マッチしたすべての Skill を同時起動 | 複雑なシナリオ、複数 Skill の連携が必要 |
優先度管理
Skill の優先度設定
各 Skill は SKILL.md で優先度を宣言できます:
---
name: weather
priority: 20
triggers:
- 天気
- weather
---
またはグローバル設定で一元管理します:
{
skills: {
priority: {
"weather": 20,
"reminder": 15,
"translator": 10,
"rss-reader": 10,
"general-chat": 1 // 汎用会話は最低優先度
}
}
}
優先度ルール
- 値が大きいほど優先度が高い
- デフォルトの優先度は 10
- 同じ優先度の Skill はファイル名のアルファベット順
- 優先度 0 の Skill は自動起動されない(明示的な呼び出しが必要)
優先度の並び順を確認
openclaw skill list --verbose
Skills (by priority):
Priority Name Triggers Status
──────── ──── ──────── ──────
20 weather 天気,weather,気温 active
15 reminder 提醒,remind,闹钟 active
10 translator 翻訳,translate active
10 rss-reader 購読,ニュース,rss active
1 general-chat (catch-all) active
コンテキスト共有
Skill 間のコンテキスト受け渡し
multi 起動モードでは、複数の Skill がコンテキスト情報を共有できます:
{
skills: {
activationMode: "multi",
context: {
// Skill 間での変数共有を許可
sharedVariables: true,
// 共有変数のライフタイム(秒)
variableTTL: 300
}
}
}
実践例:天気 + リマインダーの連携
ユーザーが言います:「明日の北京の天気を調べて、雨なら傘の用意をリマインドして」
フロー:
weatherSkill がトリガーされ、北京の明日の天気を検索- 天気の結果を共有コンテキストに格納
reminderSkill が天気の結果を読み取り、雨かどうかを判断- 雨がある場合、自動的にリマインダーを作成
Skill で共有コンテキストを参照する方法:
---
name: smart-reminder
priority: 14
triggers:
- リマインド
- もし
- 場合
context_aware: true # この Skill が他の Skill の出力を読み取れることを宣言
---
# スマートリマインダースキル
## Behavior
ユーザーのリクエストに条件付きリマインダーが含まれる場合(例:「もし...なら...をリマインドして」):
1. 条件部分が他の Skill のデータ(天気、株価など)に関わるか確認
2. 関わる場合、関連 Skill の実行完了を待機
3. 他の Skill の出力結果に基づいて、リマインダーを作成する必要があるか判断
4. リマインダーを作成するか、ユーザーに条件が満たされていないことを通知
ワークフローオーケストレーション
チェーン呼び出し
ワークフローにより Skill の実行順序とデータフローを定義できます。ワークフロー設定を作成します:
{
workflows: {
// モーニングブリーフィングワークフロー
"morning-briefing": {
trigger: "おはよう|朝のブリーフィング|おはようございます",
steps: [
{
skill: "weather",
input: "今日の{userCity}の天気",
outputVar: "todayWeather"
},
{
skill: "rss-reader",
input: "最新ニュースの要約",
outputVar: "newsDigest"
},
{
skill: "reminder",
input: "今日のリマインダー",
outputVar: "todayReminders"
}
],
// 最終出力テンプレート
output: {
template: "morning-briefing",
combine: "sequential"
}
}
}
}
出力テンプレートの定義
~/.openclaw/skills/ にワークフローテンプレート morning-briefing.SKILL.md を作成します:
---
name: morning-briefing
priority: 0
triggers: []
type: workflow-template
---
# モーニングブリーフィングテンプレート
## Output Format
以下の情報を簡潔なモーニングブリーフィングにまとめます:
☀️ おはようございます!本日のブリーフィング
━━ 天気 ━━ {todayWeather}
━━ ニュース ━━ {newsDigest}
━━ 予定 ━━ {todayReminders}
今日も良い一日を!
注意:まとめる際は簡潔にし、各セクションは5行以内に抑えてください。
並列実行
ワークフロー内のステップはデフォルトで順番に実行されますが、独立したステップは並列化できます:
{
workflows: {
"morning-briefing": {
trigger: "おはよう|朝のブリーフィング",
steps: [
// これら3つのステップは相互に依存しないため並列実行可能
{
skill: "weather",
input: "今日の天気",
parallel: true // 並列実行可能としてマーク
},
{
skill: "rss-reader",
input: "最新ニュース",
parallel: true
},
{
skill: "reminder",
input: "今日の予定",
parallel: true
}
],
output: {
template: "morning-briefing",
combine: "sequential"
}
}
}
}
条件付き起動
コンテキストに基づく条件付き起動
特定の Skill は特定の条件下でのみ起動します:
---
name: clothing-advisor
priority: 8
triggers:
- 何を着る
- 服装
conditions:
# weather Skill も起動している場合にのみ有効
requires: ["weather"]
---
# 服装アドバイススキル
## Behavior
weather Skill が返す天気データに基づいて、服装アドバイスを提供します:
- 気温 > 30°C:薄手の半袖、ショートパンツ
- 気温 20-30°C:長袖シャツまたは薄手のジャケット
- 気温 10-20°C:セーターまたは厚手のジャケット
- 気温 0-10°C:厚手のコート、マフラー
- 気温 < 0°C:ダウンジャケット、手袋、帽子
同時に降雨(傘)や強風(防風ジャケット)などの要因も考慮します。
チャンネルに基づく条件付き起動
---
name: code-review
priority: 15
triggers:
- review
- コードレビュー
channels:
# Slack と Discord でのみ起動
allow: ["slack", "discord"]
# WhatsApp では起動しない
deny: ["whatsapp"]
---
時間に基づく条件付き起動
---
name: good-morning
priority: 5
triggers:
- おはよう
- おはようございます
conditions:
timeRange: "06:00-11:00" # 朝6時から11時の間のみ起動
---
競合の解決
トリガーワードの競合
複数の Skill のトリガーワードが重複する場合:
Skill A: triggers: ["検索", "サーチ"]
Skill B: triggers: ["検索", "データ"]
ユーザーが「天気を検索」と言うと、両方の Skill がマッチします。解決方法:
方法1:優先度で区別
{
skills: {
priority: {
"skill-a": 20, // より高い優先度
"skill-b": 10
}
}
}
方法2:より正確なトリガーワード
# Skill A - より正確なトリガーワードに変更
triggers:
- 天気を検索
- 天気サーチ
# Skill B - より正確なトリガーワードに変更
triggers:
- データ検索
- データサーチ
方法3:排他宣言の使用
---
name: skill-a
excludes: ["skill-b"] # skill-a が起動したとき、skill-b を排除
---
出力の競合
複数の Skill が同時に起動し、いずれも出力を生成する場合:
{
skills: {
activationMode: "multi",
outputCombine: "merge", // すべての出力を統合
// outputCombine: "first", // 最初の Skill の出力のみ取得
// outputCombine: "last", // 最後の Skill の出力のみ取得
outputSeparator: "\n\n---\n\n" // 出力間のセパレータ
}
}
実践:スマート日報ワークフローの構築
以下は完全な実践事例です——毎日自動プッシュされるスマート日報の構築。
ワークフロー設定
{
workflows: {
"daily-report": {
// 手動トリガー
trigger: "日報|daily report",
// またはスケジュールトリガー(毎日18:00)
schedule: "0 18 * * *",
steps: [
{
skill: "rss-reader",
input: "今日の重要なニュース",
outputVar: "news",
parallel: true
},
{
skill: "github-notify",
input: "今日のPRとIssueの更新",
outputVar: "github",
parallel: true
},
{
skill: "reminder",
input: "明日の予定",
outputVar: "todos",
parallel: true
}
],
output: {
template: "daily-report-template",
pushTo: ["slack", "telegram"]
}
}
}
}
ワークフローテンプレート
~/.openclaw/skills/daily-report-template.SKILL.md を作成します:
---
name: daily-report-template
type: workflow-template
---
# 日報テンプレート
## Output Format
📊 本日の業務日報
━━ 業界動向 ━━ {news}
━━ プロジェクト進捗 ━━ {github}
━━ 明日の予定 ━━ {todos}
━━━━━━━━━━━━ OpenClaw により自動生成
要件:
- ニュースセクションは最も重要な3-5件を厳選
- GitHub セクションは主要な変更のみを記載
- 予定セクションは優先度順にソート
- 全体を簡潔に保ち、500文字以内
ワークフローのデバッグ
# ワークフロー設定を確認
openclaw workflow list
# ワークフローを手動トリガー(スケジュールをスキップ)
openclaw workflow run daily-report
# ワークフロー実行ログを確認
openclaw logs --filter workflow
ベストプラクティス
- Skill の責務を単一に保つ:各 Skill は1つのことだけを行い、ワークフローで組み合わせます
- 優先度を合理的に設定:よく使う Skill は高優先度、汎用 Skill は低優先度
- トリガーワードは正確に:曖昧すぎるトリガーワードによる誤トリガーを回避します
- 条件付き起動を活用:不要な Skill のロードを削減します
- 組み合わせシナリオをテスト:複数 Skill が連携する際はエッジケースを十分にテストします
- Token 消費を監視:複数 Skill の同時起動は Token 使用量を増加させます
まとめ
複数 Skill の連携とワークフローオーケストレーションは、OpenClaw を上級レベルで活用するための重要な機能です。適切な優先度管理、コンテキスト共有、条件付き起動、ワークフローオーケストレーションにより、強力な自動化 AI アシスタントを構築できます。鍵となるのは、各 Skill をシンプルかつ独立に保ち、組み合わせによって複雑な機能を実現することです。