踩坑无数后整理的Skill开发心得,希望对你有帮助。
前言
用OpenClaw也有一段时间了,不得不说这工具确实香。但时间一长,就发现官方自带的那些Skill不太够用了。
比如我想让它帮我查查股票,发现没有。比如我想让它读飞书文档,官方那个用起来总是差点意思。
后来就想,与其凑合用,不如自己写一个。这一写不要紧,发现这里门道还挺多。今天就把踩过的坑整理出来,供大家参考。
一、Skill到底是啥?
1.1 先搞清楚概念
OpenClaw里的Skill,本质上就是一个文件夹:
objectivec
my-skill/
├── SKILL.md // 必须有,这是核心
├── scripts/ // 可选,放脚本
└── resources/ // 可选,放资源文件
重点是SKILL.md------这玩意儿就是AI的说明书。AI能不能用好这个Skill,全看它写得清不清楚。
1.2 工作流程
objectivec
你发消息 → Agent判断用哪个Skill → 读取SKILL.md → 按说明执行操作 → 返回结果
就这么个流程,没啥神秘的。
1.3 加载优先级
| 位置 | 优先级 | 啥意思 |
|---|---|---|
| /skills | 最高 | 当前工作区专用 |
| ~/.openclaw/skills | 中 | 所有Agent都能用 |
| 内置Skill | 最低 | 官方自带的 |
如果你在workspace里写了个跟内置同名的Skill,会直接覆盖掉它。这个机制挺有用的,可以魔改官方Skill。
二、实战:写一个股票查询Skill
2.1 需求先说清楚
我就一个朴素的需求:
- 能查A股、港股、美股
- 显示当前价格和涨跌幅
- 免费,不想花冤枉钱
技术方案很简单,用新浪财经的免费接口就行。
2.2 动手建目录
在终端执行下面命令:
bash
mkdir -p ~/.openclaw/workspace/skills/stock-query
cd ~/.openclaw/workspace/skills/stock-query
2.3 重点:写好SKILL.md
这是最关键的一步,直接决定AI能不能正确使用这个Skill。文件内容如下:
yaml
---
name: stock_query
description: 查询A股、港股、美股实时行情
metadata: { "openclaw": { "emoji": "📈", "requires": { "bins": ["curl"] } } }
---
# 股票行情查询 Skill
## 什么时候用
用户问股票价格、涨跌幅、行情的时候用。
## 能查什么
- A股:上证、深证、创业板,还有个股
- 港股:恒生指数、腾讯阿里这些
- 美股:苹果特斯拉这些
## 怎么用
### 查A股
查询上证指数:
curl -s "https://hq.sinajs.cn/list=s_sh000001"
查询茅台:
curl -s "https://hq.sinajs.cn/list=s_sh600519"
### 查港股
查询恒生指数:
curl -s "https://hq.sinajs.cn/list=rt_hkHSI"
查询腾讯:
curl -s "https://hq.sinajs.cn/list=rt_hk00700"
### 查美股
查询苹果:
curl -s "https://hq.sinajs.cn/list=n_aapl"
查询特斯拉:
curl -s "https://hq.sinajs.cn/list=n_tsla"
## 代码规则
| 市场 | 前缀怎么写 | 例子 |
|------|------------|------|
| 上证 | s_sh | 600519 |
| 深证 | sz_ | 000001 |
| 港股 | rt_hk | 00700 |
| 美股 | n_ | aapl |
## 返回什么
接口返回的是原始数据,自己解析一下。解析后给人看的内容包括:
- 当前价格
- 涨跌多少钱
- 涨跌幅
- 最高最低
- 成交量
## 注意点
- 新浪接口有频率限制,别疯狂请求
- 美股数据可能有延迟
- 建议加个缓存,5分钟内不重复查
2.4 想更可控?加个自定义工具
如果觉得让AI直接调bash不太安全,可以自己写个Node.js工具。创建tools.js文件,内容如下:
javascript
// tools.js
const http = require('http');
async function getStockPrice(code, market = 'a股') {
let url;
switch(market) {
case '港股':
url = 'https://hq.sinajs.cn/list=rt_hk' + code;
break;
case '美股':
url = 'https://hq.sinajs.cn/list=n_' + code.toLowerCase();
break;
default:
// A股自动判断沪市还是深市
if (code.startsWith('6')) {
url = 'https://hq.sinajs.cn/list=s_sh' + code;
} else {
url = 'https://hq.sinajs.cn/list=sz_' + code;
}
}
return new Promise((resolve, reject) => {
http.get(url, (res) => {
let data = '';
res.on('data', chunk => data += chunk);
res.on('end', () => {
const match = data.match(/="([^"]+)"/);
if (match) {
resolve(parseStockData(match[1]));
} else {
resolve({ error: '没找到这只股票' });
}
});
}).on('error', reject);
});
}
function parseStockData(raw) {
const parts = raw.split(',');
if (parts.length < 30) return { error: '数据好像有问题' };
const name = parts[0];
const open = parseFloat(parts[1]);
const close = parseFloat(parts[2]);
const high = parseFloat(parts[3]);
const low = parseFloat(parts[4]);
const change = close - open;
const changePercent = (change / open * 100).toFixed(2);
return {
name: name,
current: close.toFixed(2),
change: change.toFixed(2),
changePercent: changePercent + '%',
changeType: change >= 0 ? '涨' : '跌'
};
}
module.exports = { getStockPrice };
2.5 配置文件里的一些门道
yaml
---
name: stock_query
description: 股票行情查询Skill
metadata: {
"openclaw": {
"emoji": "📈",
"requires": { "bins": ["curl", "node"] },
"primaryEnv": "STOCK_API_KEY",
"os": ["linux", "darwin", "win32"]
}
}
user-invocable: true
---
配置项说明:
| 字段 | 干啥的 |
|---|---|
| emoji | 显示的图标 |
| requires.bins | 需要哪些命令 |
| primaryEnv | 需要哪个环境变量 |
| os | 支持哪些系统 |
| user-invocable | 能不能直接调用 |
三、本地测试怎么搞
3.1 让Agent刷新一下
最简单的方式就是在对话里说一声"刷新一下Skill列表"。
或者重启Gateway:
openclaw gateway restart
3.2 试一把
查茅台:茅台现在多少钱
查苹果:苹果股票啥价
查腾讯:腾讯控股咋样了
3.3 调试心得
如果跑不通,先看日志:
css
openclaw gateway --verbose
先手动调一下接口,确认能跑通再说:
arduino
curl -s "https://hq.sinajs.cn/list=s_sh600519"
四、发布到ClawHub
4.1 目录结构
objectivec
stock-query/
├── SKILL.md
├── tools.js
└── README.md
4.2 发布命令
先装CLI:
npm install -g clawhub
登录:
clawhub login
发布:
bash
clawhub publish ./stock-query
4.3 别人怎么用
安装:
erlang
clawhub install stock-query
更新:
sql
clawhub update stock-query
五、常见问题
5.1 Skill不生效
查这几个点:
- 目录名和name对不上
- SKILL.md位置不对
- YAML格式写错了
- Gateway没重启
5.2 接口调不通
可能原因:
- 网络问题,有些API国内访问不了
- 频率太高被限了
- 接口本身挂了
解决思路:准备备选方案。新浪不行就换东方财富:
arduino
curl -s "https://push2.eastmoney.com/api/qt/stock/get?fields=f43,f44,f45,f46,f47,f48,f50,f51,f52,f57&secid=1.600519"
5.3 AI理解错了
这很正常。解决办法就是在SKILL.md里把"什么时候用""什么时候不用"写得更细,越具体越好。
六、进阶玩法
6.1 缓存得加上
同一个问题5分钟内别调接口了,浪费资源。缓存在~/.cache/stock-query/目录。
6.2 错误处理要做好
别把原始错误信息暴露给用户,不太好。接口出问题就先试试备选接口,都不行就说"暂时查不了,稍后再试"。
6.3 输出用中文
既然是中国人用,就用中文返回,别中英文混杂。
正确示例:茅台 1695.00元 涨5块 (+0.30%)
错误示例:Maotai: 1695.00, change: +5.00 (+0.30%)
写在最后
开发Skill这件事,说难也不难,关键就三点:
- SKILL.md写清楚------AI能不能用好全看这个
- 工具选对------bash能搞定的事没必要整那么复杂
- 多测------别想当然,踩坑很正常
熟练了之后,你会发现这玩意儿真的很好用。任何重复性的工作都可以变成一个Skill,让AI帮你干。
有问题评论区聊。
参考资料:
OpenClaw官方文档:docs.openclaw.ai
ClawHub技能市场:clawhub.com
AgentSkills规范:agentskills.io