文章目录
- OpenClaw里的Skill,本质上就是一个文件夹: my-skill/├── SKILL.md // 必须有,这是核心├── scripts/ // 可选,放脚本└── resources/ // 可选,放资源文件 重点是SKILL.md——这玩意儿就是AI的说明书。AI能不能用好这个Skill,全看它写得清不清楚。
- 你发消息 → Agent判断用哪个Skill → 读取SKILL.md → 按说明执行操作 → 返回结果 就这么个流程,没啥神秘的。
- 位置 优先级 啥意思 /skills 最高 当前工作区专用 ~/.openclaw/skills 中 所有Agent都能用 内置Skill 最低 官方自带的 如果你在workspace里写了个跟内置同名的Skill,会直接覆盖掉它。这个机制挺有用的,可以魔改官方Skill。
- 我就一个朴素的需求: 能查A股、港股、美股 显示当前价格和涨跌幅 免费,不想花冤枉钱 技术方案很简单,用新浪财经的免费接口就行。
- 在终端执行下面命令: mkdir -p ~/.openclaw/workspace/skills/stock-query cd ~/.openclaw/workspace/skills/stock-query
- 这是最关键的一步,直接决定AI能不能正确使用这个Skill。文件内容如下: — 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分钟内不重复查
- 如果觉得让AI直接调bash不太安全,可以自己写个Node.js工具。创建tools.js文件,内容如下: // 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 };
- — 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 能不能直接调用
目录
- 前言
- 一、Skill到底是啥?
- 1.1 先搞清楚概念
- 1.2 工作流程
- 1.3 加载优先级
- 二、实战:写一个股票查询Skill
- 2.1 需求先说清楚
- 2.2 动手建目录
- 2.3 重点:写好SKILL.md
- 2.4 想更可控?加个自定义工具
- 2.5 配置文件里的一些门道
- 三、本地测试怎么搞
- 3.1 让Agent刷新一下
- 3.2 试一把
- 3.3 调试心得
- 四、发布到ClawHub
- 4.1 目录结构
- 4.2 发布命令
- 4.3 别人怎么用
- 五、常见问题
- 5.1 Skill不生效
- 5.2 接口调不通
- 5.3 AI理解错了
- 六、进阶玩法
- 6.1 缓存得加上
- 6.2 错误处理要做好
- 6.3 输出用中文
- 写在最后
用OpenClaw也有一段时间了,不得不说这工具确实香。但时间一长,就发现官方自带的那些Skill不太够用了。
比如我想让它帮我查查股票,发现没有。比如我想让它读飞书文档,官方那个用起来总是差点意思。
后来就想,与其凑合用,不如自己写一个。这一写不要紧,发现这里门道还挺多。今天就把踩过的坑整理出来,供大家参考。
OpenClaw里的Skill,本质上就是一个文件夹:
my-skill/
├── SKILL.md // 必须有,这是核心
├── scripts/ // 可选,放脚本
└── resources/ // 可选,放资源文件
重点是SKILL.md——这玩意儿就是AI的说明书。AI能不能用好这个Skill,全看它写得清不清楚。
你发消息 → Agent判断用哪个Skill → 读取SKILL.md → 按说明执行操作 → 返回结果
你发消息 → Agent判断用哪个Skill → 读取SKILL.md → 按说明执行操作 → 返回结果
就这么个流程,没啥神秘的。
| 位置 | 优先级 | 啥意思 |
|---|---|---|
| /skills | 最高 | 当前工作区专用 |
| ~/.openclaw/skills | 中 | 所有Agent都能用 |
| 内置Skill | 最低 | 官方自带的 |
如果你在workspace里写了个跟内置同名的Skill,会直接覆盖掉它。这个机制挺有用的,可以魔改官方Skill。
我就一个朴素的需求:
- 能查A股、港股、美股
- 显示当前价格和涨跌幅
- 免费,不想花冤枉钱
技术方案很简单,用新浪财经的免费接口就行。
在终端执行下面命令:
mkdir -p ~/.openclaw/workspace/skills/stock-query cd ~/.openclaw/workspace/skills/stock-query
这是最关键的一步,直接决定AI能不能正确使用这个Skill。文件内容如下:
---
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分钟内不重复查
如果觉得让AI直接调bash不太安全,可以自己写个Node.js工具。创建tools.js文件,内容如下:
// 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 };
---
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 | 能不能直接调用 |
最简单的方式就是在对话里说一声"刷新一下Skill列表"。
或者重启Gateway:
openclaw gateway restart
查茅台:茅台现在多少钱
查苹果:苹果股票啥价
查腾讯:腾讯控股咋样了
查茅台:茅台现在多少钱
查苹果:苹果股票啥价
查腾讯:腾讯控股咋样了
如果跑不通,先看日志:
openclaw gateway --verbose
先手动调一下接口,确认能跑通再说:
curl -s "https://hq.sinajs.cn/list=s_sh600519"
stock-query/
├── SKILL.md
├── tools.js
└── README.md
stock-query/
├── SKILL.md
├── tools.js
└── README.md
先装CLI:
npm install -g clawhub
登录:
clawhub login
发布:
clawhub publish ./stock-query
安装:
clawhub install stock-query
更新:
clawhub update stock-query
查这几个点:
- 目录名和name对不上
- SKILL.md位置不对
- YAML格式写错了
- Gateway没重启
可能原因:
- 网络问题,有些API国内访问不了
- 频率太高被限了
- 接口本身挂了
解决思路:准备备选方案。新浪不行就换东方财富:
curl -s "https://push2.eastmoney.com/api/qt/stock/get?fields=f43,f44,f45,f46,f47,f48,f50,f51,f52,f57&secid=1.600519"
这很正常。解决办法就是在SKILL.md里把"什么时候用""什么时候不用"写得更细,越具体越好。
同一个问题5分钟内别调接口了,浪费资源。缓存在~/.cache/stock-query/目录。
别把原始错误信息暴露给用户,不太好。接口出问题就先试试备选接口,都不行就说"暂时查不了,稍后再试"。
既然是中国人用,就用中文返回,别中英文混杂。
正确示例:茅台 1695.00元 涨5块 (+0.30%)
错误示例:Maotai: 1695.00, change: +5.00 (+0.30%)
开发Skill这件事,说难也不难,关键就三点:
- SKILL.md写清楚——AI能不能用好全看这个
- 工具选对——bash能搞定的事没必要整那么复杂
- 多测——别想当然,踩坑很正常
熟练了之后,你会发现这玩意儿真的很好用。任何重复性的工作都可以变成一个Skill,让AI帮你干。
到此这篇关于OpenClaw Skill开发实战指南:从入门到独立发布的文章就介绍到这了,更多相关OpenClaw Skill开发内容请搜索风君子博客以前的文章或继续浏览下面的相关文章,希望大家以后多多支持风君子博客!