Appearance
技能开发实战 (Skills Development)
本文将深入讲解如何开发 OpenClaw 自定义技能,包括 JSON Schema 定义、TypeScript 实现、以及 Streaming Tool 开发。
1. 技能结构 (Skill Structure)
一个标准的 OpenClaw Skill 是一个文件夹,必须包含以下文件:
text
my-skill/
├── package.json # 元数据和依赖
├── SKILL.md # LLM 使用说明书 (System Prompt)
├── TOOLS.md # Tool Schema 定义 (JSON Schema 简写)
└── index.js # 业务逻辑实现 (CommonJS 或 ESM)1.1 SKILL.md:告诉 LLM 怎么用
这是最重要的文件。LLM 并不知道你的代码怎么写,它只看文档。
markdown
# My Weather Skill
当用户询问天气时使用此技能。
支持以下城市:Beijing, Shanghai, New York.
如果用户没有指定城市,默认使用 Beijing。
## Tools
- `get_weather(city)`: 获取指定城市的天气。1.2 TOOLS.md:告诉 Gateway 怎么调
这是一个简化的 JSON Schema 定义。Gateway 会用它来校验参数。
markdown
- get_weather: 获取天气信息。
- city: (string) 城市名称,例如 "Beijing"。或者使用完整 JSON Schema (推荐复杂参数使用):
json
{
"name": "get_weather",
"description": "获取天气信息",
"parameters": {
"type": "object",
"properties": {
"city": { "type": "string", "description": "城市名称" }
},
"required": ["city"]
}
}1.3 index.js:业务逻辑
javascript
module.exports = {
// 定义 Tool 的实现函数
async get_weather({ city }) {
if (!city) throw new Error("City is required");
// 调用外部 API (这里模拟一下)
const data = await fetch(`https://api.weather.com/${city}`);
const json = await data.json();
return `当前 ${city} 的天气是:${json.temp}°C, ${json.condition}`;
}
};2. 高级模式 (Advanced Patterns)
2.1 流式工具 (Streaming Tools)
有些工具运行很慢(比如 ping 或者 tail -f)。OpenClaw 支持 Streaming Tool,可以把输出实时推送到前端。
javascript
module.exports = {
async ping({ host }, { stream }) {
const { spawn } = require('child_process');
const proc = spawn('ping', ['-c', '5', host]);
proc.stdout.on('data', (data) => {
// 实时推送数据块
stream.write(data.toString());
});
return new Promise((resolve) => {
proc.on('close', () => resolve("Ping finished"));
});
}
};2.2 交互式 Canvas (Interactive UI)
OpenClaw 支持 canvas 工具,可以在前端渲染 HTML/JS 界面。
javascript
module.exports = {
async show_chart({ data }) {
// 返回一段 HTML,前端会在 iframe 里渲染
return {
type: "canvas",
html: `
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<canvas id="myChart"></canvas>
<script>
new Chart(document.getElementById('myChart'), {
type: 'bar',
data: ${JSON.stringify(data)}
});
</script>
`
};
}
};2.3 浏览器自动化 (Browser Automation)
OpenClaw 内置了 CDP (Chrome DevTools Protocol) 支持。你可以直接控制浏览器。
javascript
module.exports = {
async screenshot_webpage({ url }, { browser }) {
// browser 对象是 Puppeteer 的 Page 实例
await browser.goto(url);
const buffer = await browser.screenshot();
return { type: "image", buffer };
}
};