ホーム チュートリアル カテゴリ Skills サイトについて
ZH EN JA KO
スキル・プラグイン

OpenClaw複数Skill連携とワークフローオーケストレーションチュートリアル

· 16 分で読了

はじめに

インストールおよび開発する 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
    }
  }
}

実践例:天気 + リマインダーの連携

ユーザーが言います:「明日の北京の天気を調べて、雨なら傘の用意をリマインドして」

フロー:

  1. weather Skill がトリガーされ、北京の明日の天気を検索
  2. 天気の結果を共有コンテキストに格納
  3. reminder Skill が天気の結果を読み取り、雨かどうかを判断
  4. 雨がある場合、自動的にリマインダーを作成

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

ベストプラクティス

  1. Skill の責務を単一に保つ:各 Skill は1つのことだけを行い、ワークフローで組み合わせます
  2. 優先度を合理的に設定:よく使う Skill は高優先度、汎用 Skill は低優先度
  3. トリガーワードは正確に:曖昧すぎるトリガーワードによる誤トリガーを回避します
  4. 条件付き起動を活用:不要な Skill のロードを削減します
  5. 組み合わせシナリオをテスト:複数 Skill が連携する際はエッジケースを十分にテストします
  6. Token 消費を監視:複数 Skill の同時起動は Token 使用量を増加させます

まとめ

複数 Skill の連携とワークフローオーケストレーションは、OpenClaw を上級レベルで活用するための重要な機能です。適切な優先度管理、コンテキスト共有、条件付き起動、ワークフローオーケストレーションにより、強力な自動化 AI アシスタントを構築できます。鍵となるのは、各 Skill をシンプルかつ独立に保ち、組み合わせによって複雑な機能を実現することです。

OpenClawは無料のオープンソースAIアシスタント。WhatsApp、Telegram、Discordなど多数のプラットフォームに対応