前言
随着你安装和开发的 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
}
}
}
实战示例:天气+提醒协作
用户说:"查一下北京明天的天气,如果下雨就提醒我带伞"
执行流程:
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: [
// 这三个步骤相互独立,可以并行执行
{
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
最佳实践
- 保持每个Skill职责单一:每个 Skill 只做好一件事,通过工作流组合它们
- 合理设置优先级:高频使用的 Skill 设置更高优先级,通用型 Skill 设置较低优先级
- 触发词要精准:避免过于宽泛的触发词导致误触发
- 善用条件激活:减少不必要的 Skill 加载
- 测试组合场景:多 Skill 协作时,充分测试边界情况
- 关注Token消耗:同时激活多个 Skill 会增加 Token 用量
总结
多 Skill 协作和工作流编排是 OpenClaw 的重要高级能力。通过合理的优先级管理、上下文共享、条件激活和工作流编排,你可以打造功能强大的自动化 AI 助手。核心原则是让每个 Skill 保持简单独立,再通过组合实现复杂功能。