当官方那 59 个技能已经无法满足你「查天气、发邮件、看伊朗新闻」的野望时,是时候亲手给龙虾(OpenClaw 🦞)打几颗技能宝石了。
一、龙虾是谁,技能又是什么
OpenClaw——那只「Your own personal AI assistant. Any OS. Any Platform. The lobster way.」的龙虾——默认就带了一堆 Bundled Skills:写代码、搜网页、读文件……但总有些事它「会做但不够好用」,或者「压根没现成的」。
这时候你就得自己写 Workspace Skills:在 OpenClaw 的工作区里加一个技能目录,写一份 SKILL.md,告诉模型:在什么情况下激活、能调用什么工具、怎么用。 说白了:你给龙虾写「岗位说明书」,它按说明书去调你的脚本、读你的文件、发你的邮件。
二、自建四件套:我都给龙虾装了啥
在「Skills → Workspace Skills」里,你会看到自己装的四个玩意儿:
| 技能 | 一句话人设 | 为啥要自建 |
|---|---|---|
| weather-cn | 中国天气网专线,不翻墙、不 wttr | 国内直连、城市编码齐全,问「苏州今天天气」真能给你数 |
| news-query | 国内可访问的新闻源,查完还能发邮箱 | 禁止 browser、只用大陆源,顺便接上 send-email |
| send-email | 发邮件工具人 | 你说「把刚才的新闻发我邮箱」,它就真发 |
| iran-news-email | 伊朗相关新闻 + 指定邮箱一条龙 | 小众需求,自建才香 |
共同点:全是「脚本 + 技能描述」。Skill 负责「什么时候出手、叫什么命令」;真正干活的是你服务器上的 shell 脚本(比如 weather_cn.sh、world_news_email.sh)。
三、天气技能背后的「黑魔法」:脚本 + 缓存 + 代理兜底
光在 OpenClaw 里写一个「查天气」的 Skill 还不够——因为龙虾用的是 zai/智谱 流式接口,流式下模型经常把「我要执行 exec」写在 content 正文里(<exec><command>...</command></exec>),而不是走标准的 tool_calls。OpenClaw 只认后者,结果你看到满屏标签,龙虾却不帮你跑命令。
于是有了三重保险:
- 脚本
weather_cn.sh "城市":调中国天气网搜索 API 拿城市编码,再抓页面解析温度。模型只要会输出「执行这个脚本 + 城市名」,就能拿到结果。 - 缓存
weather_cn_cache.md:把北京、上海等常用城市每小时写进一份 markdown,Skill 里让模型优先 read 这份文件。读文件是能正常工作的,所以「北京天气怎么样」经常直接走缓存,又快又稳。 - 代理兜底(灵魂一笔) 智谱请求经过自建的 zai-proxy(例如本机 3999 端口)。代理用非流式向智谱要完整响应,再转成「假流式」给 OpenClaw;同时在响应里扫描 content:
- 发现
read某工作区文件 → 代理自己去读,把内容以「【读取结果】」注入回复; - 发现
exec且命令是你白名单里的脚本(如weather_cn.sh "苏州")→ 代理在主机上跑脚本,把「【执行结果】」注入回复。 更骚的是:如果模型傻乎乎地写了「苏州今天天气」、正则误匹配成「今天」当城市,代理里还加了城市名修正(优先匹配「X今天/明天/后天天气」里的 X),并过滤掉「今天」「一下」「怎么」之类的非城市词,避免把「今天」当城市查一遍然后告诉你「未找到城市编码」。
- 发现
于是:Skill 负责「让模型想到要查天气并输出 exec/read」;脚本 + 缓存 + 代理负责「让这些输出真的变成你能看到的天气结果」。
四、踩坑与觉悟(为什么不能只靠「写一个 Skill」)
- 流式 + 智谱:tool 调用经常只出现在 content 里,OpenClaw 不解析,所以你看到的是「模型说他要 exec,但没人帮他 exec」。 → 要么换非流式(若 OpenClaw 支持),要么代理层做 content 解析与执行/读取注入(我们选的这条路)。
- 城市名抽错了:「苏州今天天气」被解析成城市「今天」→ 脚本返回「未找到城市编码」。 → 在代理里用更好的正则(
X今天/明天/后天天气)和排除词表,只把真正的城市名喂给weather_cn.sh。 - 安全:代理只允许执行白名单路径下的脚本(如
/root/.openclaw/workspace/jobs/*.sh),不执行任意curl/cat,避免模型被诱导执行危险命令。
五、小结:自建技能让龙虾从「只会聊天」变成「真能干活」
- Skill = 给 OpenClaw 的「何时、何地、用什么」的说明;脚本 + 缓存 + 代理 = 在你环境里真正执行的那只手。
- 天气、新闻、邮件、伊朗专题……都是同一套玩法:Workspace Skill 描述意图与工具,工作区里的脚本和文件干脏活累活,必要时用代理把「模型写在 content 里的工具调用」变成真实执行和注入结果。
最后,祝你的龙虾早日进化成:会查天气、会发邮件、会筛新闻的全能型打工人。 至于它会不会真的举起钳子给你倒咖啡——那得等下一颗技能宝石了。☕🦞
(本文涉及的技术细节可参见:NANOBOT_VS_OPENCLAW_WEATHER.md、OpenClaw 官方 Skills 文档,以及你服务器上 openclaw-zai-proxy 与 weather_cn.sh 的实现。)