带 API 的 Skill 开发

普通 Skill 是"龙虾的常用动作脚本"。带 API 的 Skill 是龙虾跟外部世界沟通的神经——查询数据、调外部服务、推送结果,都靠它。

这篇讲怎么用对话让龙虾帮你写一个带 API 调用的 Skill——你只说诉求,龙虾负责生成代码、配置 manifest、测试、调试。你看懂产物长啥样就行,不用自己敲。

前置条件

  • 读完 指挥中枢模式,理解"龙虾决策、外挂执行"的分工
  • 有一个想集成的 API(任何 REST API 都行,例子用"天气 API")

一、Skill 的本质

Skill 不是黑魔法,就是两样东西:

  1. 一段可执行代码(Python / bash / Node,随便)
  2. 一份 manifest(声明这个名字、接受什么参数、在哪里找代码)

龙虾收到指令时,按 manifest 找到对应 skill,把参数传进去执行,把 stdout 当返回值。就这样。

Skill 的目录结构长这样:

~/.openclaw/skills/
  weather/
    skill.yaml        ← manifest
    main.py           ← 实际代码
    requirements.txt  ← Python 依赖(可选)

二、用对话让龙虾帮你写一个 Skill

对龙虾说

帮我写一个 Skill,功能是"查询某城市的当前天气"。

需求:
- 输入:城市名(中文或拼音都行)
- 数据源:wttr.in(https://wttr.in/<city>?format=j1)
- 输出:JSON 格式,含城市、温度(摄氏度)、湿度、天气描述
- 错误处理:网络超时 10 秒;API 失败时返回 {"ok": false, "error": "..."}
- 密钥管理:从环境变量读 WEATHER_API_KEY(虽然 wttr 不需要,但留个 hook 备以后换 provider)

请:
1. 在 ~/.openclaw/skills/weather/ 下创建 skill.yaml 和 main.py
2. 写完后立刻在命令行跑一次"python3 main.py --city 北京"验证能返回 JSON
3. 把测试输出贴给我看
4. 如果有报错,自己先尝试修复,修不好再问我

龙虾会做什么

龙虾会按指令一步步执行。你可以让它展示产物确认:

把生成好的 skill.yaml 和 main.py 完整展示给我看一下。

龙虾会贴出类似这样的产物:

skill.yaml(manifest,告诉龙虾这个 skill 叫什么、怎么调):

name: weather
description: 查询某城市的当前天气
parameters:
  - name: city
    type: string
    description: 城市名(中文或拼音),例如 "北京" 或 "beijing"
    required: true
command: python3 {{skill_dir}}/main.py --city "{{city}}"

main.py(实际代码,调 API + 返回 JSON):

import argparse
import json
import os
import sys
import urllib.request

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--city", required=True)
    args = parser.parse_args()

    url = f"https://wttr.in/{args.city}?format=j1"
    try:
        with urllib.request.urlopen(url, timeout=10) as resp:
            data = json.loads(resp.read())
    except Exception as e:
        print(json.dumps({"ok": False, "error": f"weather API failed: {e}"}))
        sys.exit(1)

    current = data["current_condition"][0]
    print(json.dumps({
        "ok": True,
        "city": args.city,
        "temp_c": current["temp_C"],
        "humidity": current["humidity"],
        "desc": current["weatherDesc"][0]["value"],
    }))

if __name__ == "__main__":
    main()

你看一眼产物对不对,对就让龙虾正式启用。

三、密钥管理:不要硬编码

新手最常犯的错——把 API key 写死在 main.py 里。问题:① key 会随 skill 同步/分享出去;② 改 key 要改代码;③ git 里留痕。

正确做法——在对话里明确:

Skill 里的密钥必须从环境变量读,绝不能硬编码。具体:
- 代码里用 os.environ.get("XXX_API_KEY") 读
- 如果环境变量没设置,返回 {"ok": false, "error": "XXX_API_KEY env not set"}
- 把要用的密钥名告诉我,我加到 ~/.openclaw/.env 里

密钥进龙虾上下文的风险

如果你的 skill 把 API key 打印到 stdout(比如调试时 print(f"using key: {API_KEY}")),key 会进入龙虾的对话记忆,后续可能在其他对话里漏出来

铁律:密钥永远不打印。如果调试需要,写到 stderr 或日志文件,不要 stdout。

在对话里强调这一点:

注意:密钥永远不打印到 stdout。如果调试要看,写日志到 ~/.openclaw/logs/xxx.log。

四、错误处理:3 条规则

让龙虾写 skill 时,把这 3 条规则写进对话:

规则 1:永远返回 JSON

不管成功失败,stdout 必须是合法 JSON。这样龙虾能稳定解析。

成功返回 {"ok": true, "data": ...},失败返回 {"ok": false, "error": "...", "code": "..."} 并 exit 1。

规则 2:区分"业务失败"和"系统失败"

错误分两类,用不同的 exit code:
- 业务失败(如"城市不存在"、"无权限"):exit 1,不需要重试
- 系统失败(如"API 超时"、"网络断开"):exit 2,可以重试

规则 3:网络请求必须超时

所有网络请求必须有 timeout 参数(建议 5-10 秒),不要用默认无超时。
龙虾等 skill 的默认超时是 60 秒,skill 内部超时要比这个小。

五、入参/出参 Schema

入参:在 manifest 里声明

skill.yaml 的 parameters 字段,每个参数要写清楚:
- name:参数名
- type:类型(string / integer / boolean)
- description:人类可读的描述(这个很重要,龙虾根据 description 决定什么时候用这个 skill)
- required:是否必填
- default:默认值(可选)

description 重要——龙虾根据它判断什么时候用这个 skill、传什么参数。写得越具体,龙虾调用越准

出参:约定一个稳定结构

所有 skill 的 stdout 统一结构:
成功:{"ok": true, "data": {...}, "metadata": {"latency_ms": ..., "provider": ...}}
失败:{"ok": false, "error": "...", "code": "...", "retry_after_seconds": 60}

retry_after_seconds 是可选的——告诉调用方"60 秒后再试"。

六、调试

1. 让龙虾自己测

请测试一下 weather skill:
1. 直接跑 python3 ~/.openclaw/skills/weather/main.py --city 北京
2. 把 stdout 完整贴给我
3. 如果失败,先自己排查(看错误信息、对照代码、尝试修复)
4. 修好了再测,修不好告诉我具体卡在哪

2. 让龙虾解释为什么失败

weather skill 调用失败了,错误是"timeout"。
请帮我分析:
- 是 wttr.in 服务慢?
- 是我们这边的网络问题?
- 是代码里的 timeout 设太短?
- 给我修复建议

3. 日志独立写

帮 weather skill 加日志:
- 用 Python logging 模块
- 日志写到 ~/.openclaw/logs/weather.log
- 记录每次调用的输入、latency、结果摘要(不要记敏感字段)
- 这样调试时跟龙虾主日志分离,单独看

七、发布与共享

自己用

放到 ~/.openclaw/skills/〈name〉/ 下,龙虾立刻能用。

团队/社区共享

帮我把 weather skill 打包发布到 clawhub。
发布前检查:
- [ ] manifest 的 description 写清楚
- [ ] 没有硬编码密钥
- [ ] 依赖写进 requirements.txt
- [ ] 错误返回都是合法 JSON
- [ ] 网络请求都带超时
- [ ] 加一份简短的 README.md 说明用法
全部 OK 再发布。

其他人就能通过 openclaw skill install weather 装上。

八、下一步

正文导航

打开抖音
有问题点击我