背景:从"能不能做"到"怎么做"

用 OpenClaw 做自动化的过程中,我遇到了一个典型需求:每天早上自动搜集技术热点,生成中文摘要日报,推到 Slack 频道。

OpenClaw 本身没有这个功能。但翻了文档之后,我发现它有一套能力扩展机制叫 Skill,而且这套机制的设计颇有意思——它是基于 Markdown 文件的,不需要写代码编译,不需要发布到某个 registry,甚至不需要重启服务。一个 SKILL.md 文件就够了。

这篇文章我打算从协议层面拆解 Skill 的设计原理,然后通过一个完整的实战案例(每日技术日报)来演示开发全过程。如果你对 AI Agent 的扩展机制感兴趣,或者想搞清楚"Markdown 怎么就能当插件用",这篇应该能回答你的问题。


一、Skill 的协议设计

1.1 什么是 Skill

Skill 是 OpenClaw 中 AI Agent 的能力扩展单元。从形式上看,它是一个包含 SKILL.md 文件的目录。从功能上看,它是一份写给 Agent 的 结构化操作手册

和传统的代码插件相比:

维度传统插件OpenClaw Skill
格式代码(JS/Python等)Markdown 文档
安装编译/安装依赖复制文件到目录
加载启动时全量加载按需分层加载
执行者运行时/解释器AI Agent
更新重新编译/部署改完文件即生效

本质区别在于:传统插件是告诉机器"怎么做",Skill 是告诉 AI Agent"应该做什么"。Agent 拿到指令后,自行决定如何调用底层工具来完成。

1.2 三层加载模型

Skill 的加载采用渐进式设计,分三层:

基础层:元数据(常驻)

name: daily-tech-digest
description: "每日技术日报生成与推送..."

约 100 词,始终在 Agent 的上下文中。Agent 通过扫描所有 Skill 的元数据来决定当前请求该触发哪个 Skill。

第二层:SKILL.md 正文(触发时加载)
只有当 Agent 决定使用某个 Skill 时,才会读取其正文。建议控制在 500 行以内。

第三层:附属资源(按需加载)
scripts/references/assets/ 等目录中的文件,Agent 在执行过程中根据需要读取。

这种设计的目的是保护上下文窗口——Agent 的上下文是稀缺资源,不能把几十个 Skill 的内容全部塞进去。

1.3 目录结构规范

skill-name/
├── SKILL.md          # 必需:技能定义文件
├── scripts/          # 可选:可执行脚本(Bash/Python 等)
├── references/       # 可选:参考文档(Agent 按需读取)
└── assets/           # 可选:输出用资源(模板、图标等)

各目录职责:

  • scripts/:存放需要确定性执行的脚本。典型场景是那些 Agent 每次都会重写且逻辑固定的操作。脚本可以被 Agent 直接执行,不需要加载到上下文中。
  • references/:参考文档。比如 API 文档、数据源配置。Agent 在需要时才读取,避免一次性占满上下文。如果文件超过 100 行,建议在文件头部加目录。
  • assets/:输出用的资源文件。Agent 不读取其内容,而是直接在输出中引用。比如报告模板、品牌图标。

注意:不要在 Skill 中创建 README.md、CHANGELOG.md 之类的辅助文件。Skill 的目标读者是 AI Agent,不是人类开发者。


二、SKILL.md 写法详解

2.1 Frontmatter

SKILL.md 以 YAML frontmatter 开头,包含两个必要字段:

---
name: daily-tech-digest
description: |
  每日技术日报生成与推送。自动搜索当天技术热点新闻,
  生成中文摘要日报,推送到 Slack 频道。
  触发条件:用户要求生成技术日报、每日新闻摘要、技术热点汇总,
  或定时任务触发每日日报生成。
  关键词:日报、技术新闻、热点、每日摘要、tech digest。
---

name 的规范:

  • 只用小写字母、数字和连字符
  • 长度不超过 64 个字符
  • 推荐动词前导的描述性命名,如 generate-reportdaily-tech-digest

description 是关键中的关键:

  • 它是 Agent 判断是否触发 Skill 的核心依据
  • 要同时说明"做什么"和"什么时候用"
  • 尽可能覆盖用户可能的各种表述方式
  • 不要把"什么时候用"写在正文里——正文只在触发后才加载,写了也没用

2.2 正文

正文是标准 Markdown,写给 Agent 的操作指令。风格建议用祈使句。

推荐结构:

# Skill 名称

简要说明。

## 使用场景

✅ 适用的场景
❌ 不适用的场景

## 执行流程

### 步骤 1
...
### 步骤 2
...

## 注意事项

正文的核心目标是:Agent 读完这段内容后,能独立完成任务。不需要多余的背景介绍,不需要"为什么要做这个",直接告诉它"怎么做"。


三、实战:每日技术日报 Skill

需求

每天早上自动搜索技术热点,生成中文日报,推送到 Slack 频道。

目录

daily-tech-digest/
├── SKILL.md
└── scripts/
    └── generate_digest.sh

完整 SKILL.md

---
name: daily-tech-digest
description: |
  每日技术日报生成与推送。自动搜索当天技术热点新闻,生成中文摘要日报,
  推送到 Slack 频道。
  触发条件:用户要求生成技术日报、每日新闻摘要、技术热点汇总,
  或定时任务触发每日日报生成。
  关键词:日报、技术新闻、热点、每日摘要、tech digest。
---

# 每日技术日报

自动搜索技术热点,生成中文日报并推送到 Slack。

## 使用场景

✅ **适用:**
- 用户说"生成今天的技术日报"
- 定时任务触发每日日报
- 用户要求搜索技术热点并汇总

❌ **不适用:**
- 查询特定技术问题的深度分析
- 非技术类新闻汇总

## 执行流程

### 1. 搜索技术热点

使用 web_search 工具搜索以下关键词(每个取前 5 条):

- "AI 人工智能 新闻 today"
- "云计算 cloud computing news"
- "开源项目 trending"
- "软件开发 技术趋势"

### 2. 筛选和去重

从搜索结果中筛选:
- 过滤掉超过 48 小时的旧新闻
- 去除重复内容(相同 URL 或标题相似度 > 80%)
- 保留 8-12 条高质量条目

### 3. 生成日报

按以下格式生成中文日报:

📰 技术日报 | YYYY-MM-DD

🔥 今日热点

1. [标题]

摘要(2-3 句话概括核心内容)
🔗 来源:[链接]

2. [标题]

...


💡 由 OpenClaw 自动生成


### 4. 推送到 Slack

使用 message 工具发送到指定 Slack 频道:

- 默认频道:当前对话所在频道
- 如果用户指定了频道,发送到指定频道
- 消息格式使用 Slack 兼容的 Markdown

### 5. 保存归档

将日报保存到 `~/.openclaw/workspace/digests/YYYY-MM-DD.md` 归档。

## 脚本

如需批量抓取,可执行辅助脚本:

bash scripts/generate_digest.sh


## 定时任务

建议通过 OpenClaw 的 cron 功能设置每日定时执行:

- 时间:每天早上 9:00(UTC+8)
- 任务:生成技术日报并推送到 Slack

## 注意事项

- 搜索结果依赖 web_search 工具的可用性
- 单次生成的日报条目控制在 8-12 条,避免信息过载
- 如搜索结果不足,如实告知,不要编造内容

辅助脚本

scripts/generate_digest.sh

#!/usr/bin/env bash
# 辅助脚本:抓取 AWS 官方博客最新条目作为日报素材

set -euo pipefail

DATE=$(date +%Y-%m-%d)
OUTPUT_DIR="${HOME}/.openclaw/workspace/digests"
OUTPUT_FILE="${OUTPUT_DIR}/${DATE}.md"

mkdir -p "$OUTPUT_DIR"

echo "📰 技术日报 | ${DATE}" > "$OUTPUT_FILE"
echo "" >> "$OUTPUT_FILE"
echo "## 🔥 今日技术热点" >> "$OUTPUT_FILE"
echo "" >> "$OUTPUT_FILE"

# 从 AWS 官方博客 RSS 拉取最新条目
FEED_URL="https://aws.amazon.com/blogs/china/feed/"
TITLES=$(curl -s "$FEED_URL" | grep -oP '(?<=<title>).*?(?=</title>)' | head -12 | tail -10)

INDEX=1
while IFS= read -r title; do
  if [ -n "$title" ]; then
    echo "### ${INDEX}. ${title}" >> "$OUTPUT_FILE"
    echo "" >> "$OUTPUT_FILE"
    INDEX=$((INDEX + 1))
  fi
done <<< "$TITLES"

echo "---" >> "$OUTPUT_FILE"
echo "💡 由 OpenClaw 自动生成" >> "$OUTPUT_FILE"

echo "日报已保存到: ${OUTPUT_FILE}"

四、安装和测试

安装

mkdir -p ~/.openclaw/workspace/skills/daily-tech-digest/scripts

cp SKILL.md ~/.openclaw/workspace/skills/daily-tech-digest/
cp scripts/generate_digest.sh ~/.openclaw/workspace/skills/daily-tech-digest/scripts/
chmod +x ~/.openclaw/workspace/skills/daily-tech-digest/scripts/generate_digest.sh

放好后,OpenClaw 在下次会话自动加载。不需要重启。

验证

对 Agent 说:

生成今天的技术日报

观察 Agent 是否:

  1. 识别到 daily-tech-digest Skill
  2. 按 SKILL.md 中的流程搜索热点
  3. 生成格式正确的日报
  4. 推送到 Slack

五、调试指南

5.1 确认加载状态

问 Agent:"你现在有哪些 skills?"

如果不在列表中,排查:

  • 文件路径:~/.openclaw/workspace/skills/daily-tech-digest/SKILL.md
  • frontmatter 的 --- 分隔符是否完整
  • namedescription 字段是否存在且语法正确

5.2 触发失败

如果 Skill 已加载但用户的请求没触发它,说明 description 匹配不上。

改进方法:扩充 description 中的关键词和场景描述。把你能想到的用户可能说法都加进去。

5.3 YAML 语法问题

description 中包含特殊字符(冒号、引号等)时需要注意:

# ❌ 冒号会导致解析失败
description: 功能:生成日报

# ✅ 引号包裹
description: "功能:生成日报"

# ✅ 多行语法
description: |
  功能:生成日报
  触发:用户要求日报

5.4 脚本问题

常见检查项:

  • 执行权限:chmod +x scripts/generate_digest.sh
  • 依赖命令:确认 curl 等工具已安装
  • 网络连通:web_search 和脚本都需要联网

六、进阶:渐进式内容组织

在实际开发中,如果 Skill 的功能比较复杂,SKILL.md 正文可能会膨胀到几百行。这时候就需要利用渐进式加载的第三层——把详细内容拆到 references/ 目录。

示例:按领域拆分数据源

daily-tech-digest/
├── SKILL.md
├── scripts/
│   └── generate_digest.sh
└── references/
    ├── ai-sources.md       # AI 领域的搜索策略和数据源
    ├── cloud-sources.md    # 云计算领域
    └── frontend-sources.md # 前端领域

在 SKILL.md 中只需引用:

## 数据源

根据用户关注的领域,读取对应的参考文件:
- AI 方向:参见 [references/ai-sources.md](references/ai-sources.md)
- 云计算方向:参见 [references/cloud-sources.md](references/cloud-sources.md)
- 前端方向:参见 [references/frontend-sources.md](references/frontend-sources.md)

Agent 只会加载当前需要的文件,不会把三个文件全读进来。

模板化输出

如果日报需要固定排版,可以放一个模板到 assets/ 目录:

daily-tech-digest/
└── assets/
    └── digest_template.md

Agent 直接拿模板填充内容,保证每次输出格式一致。

配合 Heartbeat 机制

OpenClaw 有一个 heartbeat 机制——Agent 会定期被唤醒执行检查任务。在 HEARTBEAT.md 里添加日报提醒:

- [ ] 工作日早上 9:00 左右,执行每日技术日报 Skill

这样不用配 cron,Agent 在心跳周期中也会触发日报生成。


七、发布到 ClawHub

ClawHub 是 OpenClaw 的技能共享平台。如果你的 Skill 经过验证可以稳定工作,可以考虑发布:

  1. 确保 SKILL.md frontmatter 完整规范
  2. 使用打包工具生成 .skill 文件
  3. 提交到 ClawHub

其他用户就可以直接安装使用你开发的 Skill。


总结

OpenClaw 的 Skill 机制本质上是一种面向 AI Agent 的声明式扩展协议。它用 Markdown 代替了代码,用自然语言指令代替了 API 调用,把能力扩展的门槛降到了"会写文档"的级别。

这种设计在工程上有几个值得关注的点:

  • 三层渐进加载保护了上下文窗口
  • description 驱动触发让 Skill 的匹配完全语义化
  • 目录结构约定在灵活性和规范性之间取得了平衡

我在亚马逊云科技的实际工作中用这套机制自动化了多个重复性流程,效果符合预期。如果你也在探索 AI Agent 的能力扩展方案,OpenClaw Skill 是一个值得研究的参考。


Skill 开发有坑?评论区一起排 🔧

标签: none

添加新评论