Agent Skills 开发完全指南

从零开始掌握 OpenClaw Skill 架构与编程 - 2026 最新版

目录

什么是 Agent Skills?

OpenClaw 生态系统中,Agent Skills 是扩展 AI Agent 能力的核心模块。你可以将 Skill 理解为 Agent 的"技能包"或"插件",使其能够执行特定任务、调用外部服务或集成新的功能。

想象一下,你的 AI Agent 就像一个刚入职的新员工,而 Skills 就是它的"培训课程"。通过安装不同的 Skills,Agent 可以学会:

邮件管理

自动读取、分类、回复邮件

数据分析

处理 CSV、生成可视化报表

API 集成

连接第三方服务(飞书、GitHub等)

自动化流程

构建复杂的工作流和定时任务

知识检索

从文档、数据库中提取信息

安全审计

检查代码、配置的安全性

妙趣说: Skills 不仅仅是"插件",它们是 Agent 的"超能力"!通过组合不同的 Skills,你可以打造专属的 AI 助手团队。

Skill 架构解析

核心组件

一个标准的 OpenClaw Skill 包含以下核心组件:

组件必填说明
SKILL.mdSkill 的主描述文件(元数据 + 指令)
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 的核心文件,它包含两部分:

  1. YAML Front Matter:元数据(标题、版本、依赖等)
  2. 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 字段说明

字段类型说明
namestringSkill 名称(小写字母、数字、连字符)
versionstring语义化版本号(如 1.2.0)
descriptionstring简短描述(50-150字符)
authorstring作者名称或组织
licensestring开源许可证(MIT、Apache-2.0等)
inputsarray输入参数定义
outputsarray输出结果定义
dependenciesarray依赖的 Python 包或其他 Skills
toolsarray提供的工具(函数)列表
tagsarray标签(用于分类和搜索)
注意事项:
  • 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 的曝光度。