想给 OpenClaw 加新能力?Skill 开发完整指南(含 Markdown 协议详解)
用 OpenClaw 做自动化的过程中,我遇到了一个典型需求:每天早上自动搜集技术热点,生成中文摘要日报,推到 Slack 频道。 OpenClaw 本身没有这个功能。但翻了文档之后,我发现它有一套能力扩展机制叫 Skill,而且这套机制的设计颇有意思——它是基于 Markdown 文件的,不需要写代码编译,不需要发布到某个 registry,甚至不需要重启服务。一个 SKILL.md 文件就够了。 这篇文章我打算从协议层面拆解 Skill 的设计原理,然后通过一个完整的实战案例(每日技术日报)来演示开发全过程。如果你对 AI Agent 的扩展机制感兴趣,或者想搞清楚"Markdown 怎么就能当插件用",这篇应该能回答你的问题。 Skill 是 OpenClaw 中 AI Agent 的能力扩展单元。从形式上看,它是一个包含 和传统的代码插件相比: 本质区别在于:传统插件是告诉机器"怎么做",Skill 是告诉 AI Agent"应该做什么"。Agent 拿到指令后,自行决定如何调用底层工具来完成。 Skill 的加载采用渐进式设计,分三层: 基础层:元数据(常驻) 约 100 词,始终在 Agent 的上下文中。Agent 通过扫描所有 Skill 的元数据来决定当前请求该触发哪个 Skill。 第二层:SKILL.md 正文(触发时加载) 第三层:附属资源(按需加载) 这种设计的目的是保护上下文窗口——Agent 的上下文是稀缺资源,不能把几十个 Skill 的内容全部塞进去。 各目录职责: 注意:不要在 Skill 中创建 README.md、CHANGELOG.md 之类的辅助文件。Skill 的目标读者是 AI Agent,不是人类开发者。 SKILL.md 以 YAML frontmatter 开头,包含两个必要字段: name 的规范: description 是关键中的关键: 正文是标准 Markdown,写给 Agent 的操作指令。风格建议用祈使句。 推荐结构: 正文的核心目标是:Agent 读完这段内容后,能独立完成任务。不需要多余的背景介绍,不需要"为什么要做这个",直接告诉它"怎么做"。 📰 技术日报 | YYYY-MM-DD 摘要(2-3 句话概括核心内容) ... 💡 由 OpenClaw 自动生成 bash scripts/generate_digest.sh 放好后,OpenClaw 在下次会话自动加载。不需要重启。 对 Agent 说: 观察 Agent 是否: 问 Agent:"你现在有哪些 skills?" 如果不在列表中,排查: 如果 Skill 已加载但用户的请求没触发它,说明 改进方法:扩充 description 中的关键词和场景描述。把你能想到的用户可能说法都加进去。 description 中包含特殊字符(冒号、引号等)时需要注意: 常见检查项: 在实际开发中,如果 Skill 的功能比较复杂,SKILL.md 正文可能会膨胀到几百行。这时候就需要利用渐进式加载的第三层——把详细内容拆到 references/ 目录。 在 SKILL.md 中只需引用: Agent 只会加载当前需要的文件,不会把三个文件全读进来。 如果日报需要固定排版,可以放一个模板到 assets/ 目录: Agent 直接拿模板填充内容,保证每次输出格式一致。 OpenClaw 有一个 heartbeat 机制——Agent 会定期被唤醒执行检查任务。在 这样不用配 cron,Agent 在心跳周期中也会触发日报生成。 ClawHub 是 OpenClaw 的技能共享平台。如果你的 Skill 经过验证可以稳定工作,可以考虑发布: 其他用户就可以直接安装使用你开发的 Skill。 OpenClaw 的 Skill 机制本质上是一种面向 AI Agent 的声明式扩展协议。它用 Markdown 代替了代码,用自然语言指令代替了 API 调用,把能力扩展的门槛降到了"会写文档"的级别。 这种设计在工程上有几个值得关注的点: 我在亚马逊云科技的实际工作中用这套机制自动化了多个重复性流程,效果符合预期。如果你也在探索 AI Agent 的能力扩展方案,OpenClaw Skill 是一个值得研究的参考。 Skill 开发有坑?评论区一起排 🔧背景:从"能不能做"到"怎么做"
一、Skill 的协议设计
1.1 什么是 Skill
SKILL.md 文件的目录。从功能上看,它是一份写给 Agent 的 结构化操作手册。维度 传统插件 OpenClaw Skill 格式 代码(JS/Python等) Markdown 文档 安装 编译/安装依赖 复制文件到目录 加载 启动时全量加载 按需分层加载 执行者 运行时/解释器 AI Agent 更新 重新编译/部署 改完文件即生效 1.2 三层加载模型
name: daily-tech-digest
description: "每日技术日报生成与推送..."
只有当 Agent 决定使用某个 Skill 时,才会读取其正文。建议控制在 500 行以内。scripts/、references/、assets/ 等目录中的文件,Agent 在执行过程中根据需要读取。1.3 目录结构规范
skill-name/
├── SKILL.md # 必需:技能定义文件
├── scripts/ # 可选:可执行脚本(Bash/Python 等)
├── references/ # 可选:参考文档(Agent 按需读取)
└── assets/ # 可选:输出用资源(模板、图标等)二、SKILL.md 写法详解
2.1 Frontmatter
---
name: daily-tech-digest
description: |
每日技术日报生成与推送。自动搜索当天技术热点新闻,
生成中文摘要日报,推送到 Slack 频道。
触发条件:用户要求生成技术日报、每日新闻摘要、技术热点汇总,
或定时任务触发每日日报生成。
关键词:日报、技术新闻、热点、每日摘要、tech digest。
---generate-report、daily-tech-digest2.2 正文
# Skill 名称
简要说明。
## 使用场景
✅ 适用的场景
❌ 不适用的场景
## 执行流程
### 步骤 1
...
### 步骤 2
...
## 注意事项三、实战:每日技术日报 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. 生成日报
按以下格式生成中文日报:
🔥 今日热点
1. [标题]
🔗 来源:[链接]2. [标题]
### 4. 推送到 Slack
使用 message 工具发送到指定 Slack 频道:
- 默认频道:当前对话所在频道
- 如果用户指定了频道,发送到指定频道
- 消息格式使用 Slack 兼容的 Markdown
### 5. 保存归档
将日报保存到 `~/.openclaw/workspace/digests/YYYY-MM-DD.md` 归档。
## 脚本
如需批量抓取,可执行辅助脚本:
## 定时任务
建议通过 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验证
生成今天的技术日报daily-tech-digest Skill五、调试指南
5.1 确认加载状态
~/.openclaw/workspace/skills/daily-tech-digest/SKILL.md--- 分隔符是否完整name 和 description 字段是否存在且语法正确5.2 触发失败
description 匹配不上。5.3 YAML 语法问题
# ❌ 冒号会导致解析失败
description: 功能:生成日报
# ✅ 引号包裹
description: "功能:生成日报"
# ✅ 多行语法
description: |
功能:生成日报
触发:用户要求日报5.4 脚本问题
chmod +x scripts/generate_digest.shcurl 等工具已安装六、进阶:渐进式内容组织
示例:按领域拆分数据源
daily-tech-digest/
├── SKILL.md
├── scripts/
│ └── generate_digest.sh
└── references/
├── ai-sources.md # AI 领域的搜索策略和数据源
├── cloud-sources.md # 云计算领域
└── frontend-sources.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)模板化输出
daily-tech-digest/
└── assets/
└── digest_template.md配合 Heartbeat 机制
HEARTBEAT.md 里添加日报提醒:- [ ] 工作日早上 9:00 左右,执行每日技术日报 Skill七、发布到 ClawHub
.skill 文件总结