OpenClaw Agent Skills 开发教程
世界上有一种能力叫Skill,它让AI从对话者变成执行者。3分17秒前,我决定教会你如何创造这种能力...
什么是 Agent Skills?
Agent Skills是OpenClaw系统中AI Agent的能力扩展单元。每个Skill封装了一组可复用的功能,让AI能够:
- 调用外部API获取数据
- 执行系统命令和脚本
- 操作浏览器完成自动化任务
- 管理文件和数据
- 与其他Agent协作
Skill 目录结构
my-skill/
├── SKILL.md # 技能描述文档
├── skill.yaml # 技能配置
├── index.ts # 入口文件
├── tools/
│ ├── search.ts # 工具实现
│ └── fetch.ts
└── tests/
└── skill.test.ts
快速开始:创建第一个Skill
1. 初始化技能
# 使用CLI创建新技能
openclaw skill create my-first-skill
# 或使用模板
openclaw skill create my-first-skill --template typescript
2. 编写技能描述 (SKILL.md)
# My First Skill
## 描述
这是一个示例技能,展示如何创建OpenClaw Skill。
## 工具
- search: 搜索网络信息
- summarize: 总结文本内容
## 参数
- query: 搜索关键词 (string)
- limit: 返回结果数量 (number, optional)
3. 实现工具逻辑
// tools/search.ts
import { z } from 'zod';
export const searchSchema = z.object({
query: z.string().describe('搜索关键词'),
limit: z.number().optional().default(5)
});
export async function search(params: z.infer<typeof searchSchema>) {
const { query, limit } = params;
// 调用搜索API
const results = await fetch(
`https://api.search.com?q=${encodeURIComponent(query)}&limit=${limit}`
);
return results.json();
}
最佳实践
✅ 命名规范
- 使用kebab-case命名技能ID:web-search, file-manager
- 工具名使用camelCase:searchWeb, readFile
- 描述要清晰具体,避免模糊表达
✅ 错误处理
export async function riskyOperation() {
try {
const result = await fetchData();
return { success: true, data: result };
} catch (error) {
return {
success: false,
error: error.message,
suggestion: '请检查网络连接或稍后重试'
};
}
}
✅ 参数验证
始终使用Zod进行严格的参数验证,提供清晰的错误信息:
export const configSchema = z.object({
apiKey: z.string().min(1, 'API Key不能为空'),
timeout: z.number().min(1000).max(60000).default(5000),
retries: z.number().int().min(0).max(5).default(3)
});
进阶技巧
Skill之间的调用
// 在一个Skill中调用另一个Skill
import { useSkill } from '@openclaw/core';
export async function complexTask() {
const searchSkill = useSkill('web-search');
const summarySkill = useSkill('text-summarizer');
// 先搜索
const searchResults = await searchSkill.tools.search({ query: 'AI趋势' });
// 再总结
const summary = await summarySkill.tools.summarize({
text: searchResults.join('\n')
});
return summary;
}
状态管理
import { StateManager } from '@openclaw/core';
const state = new StateManager('my-skill');
export async function rememberContext(userId: string, context: string) {
await state.set(`user:${userId}:context`, context, { ttl: 3600 });
}
export async function getContext(userId: string) {
return state.get(`user:${userId}:context`);
}
调试与测试
# 本地测试
openclaw skill test my-first-skill
# 带参数测试
openclaw skill test my-first-skill --input '{"query":"OpenClaw"}'
# 调试模式
DEBUG=openclaw:* openclaw skill test my-first-skill
部署到 ClawHub
# 打包技能
openclaw skill build
# 发布到市场
openclaw skill publish
# 指定版本
openclaw skill publish --version 1.0.0 --tag stable
发布后其他用户可以通过 openclaw skill install your-skill 安装使用。