首页 教程 分类 Skills下载 关于
ZH EN JA KO
技能插件

OpenClaw多Skill协作与工作流编排

· 14 分钟

前言

随着你安装和开发的 Skill 越来越多,它们之间的协调就变得越来越重要。一个用户请求可能需要多个 Skill 配合完成——比如"查一下北京明天的天气,如果要下雨就提醒我带伞",这就需要天气查询和提醒两个 Skill 联合工作。

本教程深入讲解 OpenClaw 中多 Skill 协作的机制和最佳实践。

多Skill协作原理

Skill激活流程

当 OpenClaw 收到一条消息时,会经过以下流程:

用户消息
    │
    ▼
┌──────────────────┐
│  触发词匹配阶段   │ ← 检查所有 Skill 的触发词
│                  │
└────────┬─────────┘
         │
    ┌────▼────┐
    │ 匹配到  │
    │ 几个?  │
    └────┬────┘
    ┌────┼────────────┐
    │    │             │
   0个   1个         多个
    │    │             │
    ▼    ▼             ▼
  不使用  激活该       按优先级
  Skill  Skill       排序选择
  走通用                最高的
  对话                  或组合

单激活vs多激活模式

OpenClaw 支持两种 Skill 激活模式:

{
  skills: {
    // 激活模式
    activationMode: "single",  // 默认:只激活优先级最高的 Skill
    // activationMode: "multi",  // 允许同时激活多个 Skill
  }
}
模式 说明 适用场景
single 只激活优先级最高的匹配 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
  • 优先级相同时按文件名字母顺序排列
  • 优先级为 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之间传递上下文

在多激活模式下,多个 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: [
        // 这三个步骤相互独立,可以并行执行
        {
          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 都会匹配。解决方案:

方案一:通过优先级区分

{
  skills: {
    priority: {
      "skill-a": 20,   // 更高优先级
      "skill-b": 10
    }
  }
}

方案二:使用更精准的触发词

# Skill A - 改用更精准的触发词
triggers:
  - 查询天气
  - 搜索天气

# Skill B - 改用更精准的触发词
triggers:
  - 查询数据
  - 数据搜索

方案三:使用排斥声明

---
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 只做好一件事,通过工作流组合它们
  2. 合理设置优先级:高频使用的 Skill 设置更高优先级,通用型 Skill 设置较低优先级
  3. 触发词要精准:避免过于宽泛的触发词导致误触发
  4. 善用条件激活:减少不必要的 Skill 加载
  5. 测试组合场景:多 Skill 协作时,充分测试边界情况
  6. 关注Token消耗:同时激活多个 Skill 会增加 Token 用量

总结

多 Skill 协作和工作流编排是 OpenClaw 的重要高级能力。通过合理的优先级管理、上下文共享、条件激活和工作流编排,你可以打造功能强大的自动化 AI 助手。核心原则是让每个 Skill 保持简单独立,再通过组合实现复杂功能。

OpenClaw 是开源免费的个人AI助手,支持 WhatsApp、Telegram、Discord 等多平台接入