什么是 Agent Skills?
在 OpenClaw 生态系统中,Agent Skills 是扩展 AI Agent 能力的核心模块。你可以将 Skill 理解为 Agent 的"技能包"或"插件",使其能够执行特定任务、调用外部服务或集成新的功能。
想象一下,你的 AI Agent 就像一个刚入职的新员工,而 Skills 就是它的"培训课程"。通过安装不同的 Skills,Agent 可以学会:
API 集成
连接第三方服务(飞书、GitHub等)
妙趣说: Skills 不仅仅是"插件",它们是 Agent 的"超能力"!通过组合不同的 Skills,你可以打造专属的 AI 助手团队。
Skill 架构解析
核心组件
一个标准的 OpenClaw Skill 包含以下核心组件:
| 组件 | 必填 | 说明 |
SKILL.md | 是 | Skill 的主描述文件(元数据 + 指令) |
assets/ | 否 | 静态资源目录(图片、模板等) |
scripts/ | 否 | 可执行脚本(Python、Bash 等) |
examples/ | 否 | 使用示例和测试用例 |
references/ | 否 | 参考文档和外部资源 |
目录结构示例
# 标准 Skill 目录结构
my-awesome-skill/
SKILL.md # 主描述文件(必需)
README.md # 用户文档(推荐)
assets/ # 资源文件夹
templates/report.html
images/logo.png
scripts/ # 可执行脚本
main.py
helper.sh
examples/ # 使用示例
basic_usage.md
advanced_usage.md
references/ # 参考文档
api_docs.md
tests/ # 测试文件
test_skill.py
Skill 生命周期
发现(Discovery)
用户通过 ClawHub 或本地搜索找到 Skill
安装(Installation)
OpenClaw 解析 SKILL.md 并加载依赖
初始化(Initialization)
执行初始化脚本(如果有),配置环境变量
执行(Execution)
Agent 调用 Skill 功能,处理用户请求
更新(Update)
检查新版本,平滑升级(保留用户配置)
SKILL.md 编写规范
SKILL.md 是 Skill 的核心文件,它包含两部分:
- YAML Front Matter:元数据(标题、版本、依赖等)
- Markdown Body:指令和文档(Agent 执行指南)
完整示例
---
name: email-auto-reply
version: 1.2.0
description: 自动回复邮件的 Skill(支持智能分类和模板)
author: miaoquai
license: MIT
inputs:
- name: email_address
type: string
required: true
description: 要监控的邮箱地址
- name: reply_template
type: string
required: false
default: "感谢来信,我会尽快回复!"
description: 回复模板
outputs:
- name: reply_status
type: boolean
description: 回复是否成功
dependencies:
- name: python-dateutil
version: ">=2.8.0"
- name: imaplib2
version: ">=3.0"
tools:
- name: send_email
description: 发送邮件
parameters:
- name: to
type: string
required: true
- name: subject
type: string
required: true
- name: body
type: string
required: true
tags:
- email
- automation
- productivity
---
# 邮件自动回复 Skill
## 功能说明
本 Skill 可以自动监控指定邮箱,根据邮件内容智能分类,
并使用预定义模板自动回复。
## 使用场景
- 外出时的自动回复
- 常见问题自动应答
- 邮件分类和优先级标记
## 执行步骤
1. 连接邮箱:使用 IMAP 协议连接邮箱服务器
2. 获取未读邮件并获取内容
3. 智能分类(紧急/普通/垃圾)
4. 根据分类选择回复模板,个性化内容
5. 调用 send_email 工具发送回复
YAML Front Matter 字段说明
| 字段 | 类型 | 说明 |
name | string | Skill 名称(小写字母、数字、连字符) |
version | string | 语义化版本号(如 1.2.0) |
description | string | 简短描述(50-150字符) |
author | string | 作者名称或组织 |
license | string | 开源许可证(MIT、Apache-2.0等) |
inputs | array | 输入参数定义 |
outputs | array | 输出结果定义 |
dependencies | array | 依赖的 Python 包或其他 Skills |
tools | array | 提供的工具(函数)列表 |
tags | array | 标签(用于分类和搜索) |
注意事项:
- YAML Front Matter 必须以
--- 开始和结束
- Markdown Body 在第二个
--- 之后开始
- 缩进必须使用空格(不能使用 Tab)
- 字符串包含特殊字符时需要加引号
API 参考手册
OpenClaw 提供了一套完整的 API,让 Skills 可以与 Agent、用户、外部服务交互。
核心 API 列表
Agent 交互 API
def agent_send_message(content, type="text"):
"""发送消息给用户"""
pass
def agent_ask_user(question, options=None):
"""向用户提问并等待回复"""
pass
def agent_get_status():
"""获取当前 Agent 的状态信息"""
pass
文件操作 API
def file_read(path, encoding="utf-8"):
"""读取文件内容"""
pass
def file_write(path, content, mode="w"):
"""写入文件内容"""
pass
def file_list_dir(path, pattern="*"):
"""列出目录中的文件"""
pass
网络请求 API
def http_get(url, params=None, headers=None):
"""发送 GET 请求"""
response = requests.get(url, params, headers)
return response
def http_post(url, data=None, json=None):
"""发送 POST 请求"""
response = requests.post(url, data, json)
return response
数据存储 API
def storage_save(key, value):
"""保存数据到本地存储"""
pass
def storage_load(key, default=None):
"""从本地存储读取数据"""
pass
def storage_delete(key):
"""删除存储的数据"""
pass
提示: 完整的 API 文档可以在 OpenClaw 官方文档中找到。建议在实际开发中参考官方文档获取最新 API。
完整代码示例
下面通过三个完整的示例,展示如何开发不同类型的 Skills。
示例 1:天气查询 Skill
这是一个简单的天气查询 Skill,演示如何调用外部 API 并处理响应。
SKILL.md
---
name: weather-query
version: 1.0.0
description: 查询全球城市天气信息
author: miaoquai
license: MIT
inputs:
- name: city
type: string
required: true
description: 城市名称
outputs:
- name: weather_data
type: object
description: 天气数据
dependencies:
- name: requests
version: ">=2.28.0"
tags:
- weather
- api
- utility
---
# 天气查询 Skill
## 使用步骤
1. 获取 API Key(从 openweathermap.org 注册)
2. 设置环境变量 WEATHER_API_KEY
3. 运行 Skill
## Python 脚本(scripts/query_weather.py)
def get_weather(city):
api_key = os.getenv("WEATHER_API_KEY")
params = {"q": city, "appid": api_key, "units": "metric", "lang": "zh_cn"}
response = requests.get("http://api.openweathermap.org/data/2.5/weather", params=params)
response.raise_for_status()
data = response.json()
return {
"city": data["name"],
"temperature": data["main"]["temp"],
"humidity": data["main"]["humidity"],
"description": data["weather"][0]["description"]
}
示例 2:文件批量处理 Skill
这个 Skill 演示如何处理本地文件,批量转换文件格式。
SKILL.md
---
name: file-batch-processor
version: 1.0.0
description: 批量处理文件(转换格式、重命名、压缩等)
author: miaoquai
license: MIT
inputs:
- name: input_dir
type: string
required: true
description: 输入目录路径
- name: output_dir
type: string
required: true
description: 输出目录路径
- name: operation
type: string
required: true
description: 操作类型
enum: ["convert", "rename", "compress"]
outputs:
- name: processed_count
type: integer
description: 成功处理的文件数量
dependencies:
- name: Pillow
version: ">=9.0.0"
tags:
- file
- batch
- utility
---
# 文件批量处理 Skill
## 使用示例
openclaw run file-batch-processor \
--input_dir ./images \
--output_dir ./converted \
--operation convert
## Python 脚本(scripts/process_files.py)
def batch_convert_images(input_dir, output_dir, target_format="PNG"):
import os
from PIL import Image
os.makedirs(output_dir, exist_ok=True)
count = 0
for filename in os.listdir(input_dir):
if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
img = Image.open(os.path.join(input_dir, filename))
name = os.path.splitext(filename)[0]
img.save(os.path.join(output_dir, f"{name}.{target_format.lower()}"))
count += 1
return count
示例 3:MCP 集成 Skill
这个 Skill 演示如何集成 MCP 服务器,扩展 Agent 能力。
SKILL.md
---
name: mcp-integration-demo
version: 1.0.0
description: 集成 MCP 服务器,演示 MCP 协议使用
author: miaoquai
license: MIT
inputs:
- name: server_url
type: string
required: true
description: MCP 服务器 URL
- name: command
type: string
required: true
description: 要执行的命令
outputs:
- name: result
type: object
description: MCP 服务器返回的结果
dependencies:
- name: mcp-client
version: ">=1.0.0"
tags:
- mcp
- integration
- protocol
---
# MCP 集成演示 Skill
## 什么是 MCP?
MCP(Model Context Protocol)是一个开放协议,允许 AI 应用
与外部数据源和工具无缝集成。
## 使用示例
openclaw run mcp-integration-demo \
--server_url "http://localhost:8080" \
--command "list_tools"
## Python 脚本(scripts/mcp_client.py)
class MCPClient:
def __init__(self, server_url):
self.server_url = server_url
def list_tools(self):
resp = requests.get(f"{self.server_url}/tools")
return resp.json()
def call_tool(self, name, params):
resp = requests.post(f"{self.server_url}/call",
json={"name": name, "parameters": params})
return resp.json()
def list_resources(self):
resp = requests.get(f"{self.server_url}/resources")
return resp.json()
测试与调试
一个可靠的 Skill 需要经过充分的测试。下面介绍 OpenClaw 提供的测试框架和调试技巧。
本地测试
使用 openclaw test 命令可以直接在本地测试你的 Skill:
# 运行所有测试
openclaw test my-awesome-skill/
# 运行特定测试文件
openclaw test my-awesome-skill/ --test-file test_skill.py
# 输出详细信息
openclaw test my-awesome-skill/ --verbose
测试文件结构
# tests/test_skill.py
import unittest
class TestWeatherSkill(unittest.TestCase):
def setUp(self):
"""测试前的准备工作"""
self.skill = setup_test_skill()
def test_city_input_required(self):
"""测试:城市参数为必填"""
result = self.skill.run(city=None)
self.assertIn("error", result)
def test_valid_city_response(self):
"""测试:有效城市返回正确数据"""
result = self.skill.run(city="Beijing")
self.assertIn("temperature", result)
self.assertIsInstance(result["temperature"], float)
def test_invalid_city_error(self):
"""测试:无效城市返回错误"""
result = self.skill.run(city="InvalidCity12345")
self.assertIn("error", result)
if __name__ == "__main__":
unittest.main()
调试技巧
| 技巧 | 说明 |
| 日志输出 | 在脚本中使用 print() 或 logging,Agent 会捕获输出 |
| 断点调试 | 使用 openclaw debug <skill-name> 进入调试模式 |
| 参数验证 | 使用 openclaw validate my-skill/ 检查 SKILL.md 格式 |
| 沙箱运行 | 使用 openclaw run --sandbox 在隔离环境测试 |
提示: 建议在发布前至少编写 3-5 个测试用例,覆盖正常输入、边界情况和错误处理。
发布到 ClawHub
完成开发和测试后,就可以将你的 Skill 发布到 ClawHub 技能市场了。
发布流程
准备发布包
确保你的 Skill 目录结构完整,包含 SKILL.md 和必要的资源文件。
openclaw skill package my-awesome-skill/
# 输出: my-awesome-skill-1.0.0.skill
登录 ClawHub
openclaw hub login
# 按提示输入 ClawHub 账号信息
发布技能
openclaw hub publish my-awesome-skill-1.0.0.skill
# 可选:添加发布说明
openclaw hub publish --notes "新增批量处理功能"
更新版本
openclaw hub update my-awesome-skill/ --version 1.1.0
openclaw hub publish
版本管理
| 版本 | 说明 |
1.0.0 | 首次发布 |
1.x.x | 向后兼容的功能新增和错误修复 |
2.0.0 | 重大更新,API 发生变化 |
注意: 发布后的 Skill 会被社区审核。请确保:
- 不包含敏感信息(API Key、密码等)
- 描述清晰,文档完整
- 通过了基本的功能测试
- 遵循了 OpenClaw 社区准则
最佳实践
清晰的命名
使用小写字母和连字符,如 file-batch-processor。名称应能描述功能。
完整文档
SKILL.md 不仅要写 Agent 能读的指令,也要写人类能看的文档。README.md 不要省略。
错误处理
对所有外部 API 调用添加异常处理,确保在失败时返回友好信息。
版本语义化
遵循 SemVer 规范。向后兼容的修改请升级 1.0.0 -> 1.1.0,不兼容变更则升级 1.0.0 -> 2.0.0。
参数验证
在 SKILL.md 的 inputs 中明确定义参数类型、默认值和枚举值,减少运行时错误。
跨 Skill 引用
利用 dependencies 字段引用其他 Skill,避免重复造轮子。一个 Skill 可以依赖多个基础 Skill。
安全优先
不要在 SKILL.md 中硬编码敏感信息。使用环境变量或 OpenClaw 的存储 API 来管理密钥。
社区互动
积极回复用户 issue 和 PR,收集反馈持续优化。参与 ClawHub 社区可以增加 Skill 的曝光度。