5分钟在ClawHub发布你的第一个Agent技能

什么是 ClawHub?

ClawHub 是 OpenClaw 的技能市场,类似于 VS Code 的插件市场、Chrome 的扩展商店。

核心概念:

  • Skill:一个可复用的功能模块
  • Agent:使用 Skills 的 AI 助手
  • ClawHub:Skills 的发布和分发平台

目前 ClawHub 已有技能:

  • tavily-search:网络搜索
  • agent-memory-store:跨 Agent 记忆共享
  • weather:天气查询
  • healthcheck:系统健康检查
  • ...

目前共计有 19268 个 skill

本文将分享如何开发一个自己的 Skill,并上传到 ClawHub。


5 分钟开发第一个 Skill

第一步:创建 Skill 目录(1 分钟)

bash 复制代码
# 创建技能目录
mkdir -p ~/.openclaw/skills/my-first-skill
cd ~/.openclaw/skills/my-first-skill

# 创建核心文件
touch SKILL.md
mkdir -p scripts

第二步:编写 SKILL.md(2 分钟)

SKILL.md 是技能的配置文件,告诉 OpenClaw 这个技能是什么、怎么用。

markdown 复制代码
---
name: hello-world
version: 1.0.0
description: 我的第一个 OpenClaw 技能, say hello to the world
author: your-name
homepage: https://github.com/your-name/hello-world-skill
---

# Hello World Skill

一个简单的示例技能,展示 OpenClaw Skill 的基本结构。

## 功能

- 向用户打招呼
- 返回当前时间

## 使用

```bash
# 命令行调用
python scripts/hello.py

第三步:编写功能脚本(1 分钟)

创建 scripts/hello.py

python 复制代码
#!/usr/bin/env python
"""
Hello World Skill - 我的第一个 OpenClaw 技能
"""
import datetime

def main():
    now = datetime.datetime.now()
    print(f"👋 Hello from OpenClaw!")
    print(f"🕐 Current time: {now.strftime('%Y-%m-%d %H:%M:%S')}")
    print(f"✨ Your first skill is working!")

if __name__ == "__main__":
    main()

第四步:本地测试(1 分钟)

bash 复制代码
# 测试脚本
python scripts/hello.py

# 输出:
# 👋 Hello from OpenClaw!
# 🕐 Current time: 2026-03-10 21:55:32
# ✨ Your first skill is working!

恭喜你!第一个 Skill 开发完成。


进阶:让 Agent 能调用 Skill

上面的 Skill 只是命令行工具,真正的威力是让 Agent 能调用它。

创建 Agent 可调用的版本

修改 scripts/hello.py

python 复制代码
#!/usr/bin/env python
"""
Hello World Skill - Agent 可调用版本
"""
import datetime
import json
import sys

def get_greeting(name="World"):
    """获取问候语"""
    hour = datetime.datetime.now().hour
    
    if 5 <= hour < 12:
        greeting = "早上好"
    elif 12 <= hour < 18:
        greeting = "下午好"
    else:
        greeting = "晚上好"
    
    return {
        "greeting": greeting,
        "name": name,
        "time": datetime.datetime.now().isoformat(),
        "message": f"{greeting},{name}!欢迎使用 OpenClaw Skills 🎉"
    }

def main():
    # 支持命令行参数
    name = sys.argv[1] if len(sys.argv) > 1 else "World"
    result = get_greeting(name)
    print(json.dumps(result, ensure_ascii=False, indent=2))

if __name__ == "__main__":
    main()

在 Agent 中使用

Agent 可以通过 exec 工具调用:

python 复制代码
# Agent 调用示例
result = exec("python ~/.openclaw/skills/my-first-skill/scripts/hello.py 用户名")
print(result)  # 输出 JSON 格式的问候信息

发布到 ClawHub

准备工作

  1. 先安装 Node.js 和 npm
bash 复制代码
node -v
npm -v
  1. 安装 clawhub CLI
bash 复制代码
npm i -g clawhub
  1. 验证 clawhub 命令已生效
bash 复制代码
clawhub --help
  1. 登录 ClawHub
bash 复制代码
clawhub login

执行后窗口会出现

perl 复制代码
Opening browser: https://clawhub.ai/cli/auth?redirect_uri=http%3A%2F%2F127.0.0.1%3A54109%2Fcallback&label_b64=xxxx&state=*** 

复制在浏览器访问下即可完成登录

登录成功,命令窗口会出现 √ OK. Logged in as @xxx

发布流程

bash 复制代码
# 进入技能目录
cd ~/.openclaw/skills

# 发布技能
clawhub publish my-first-skill --slug my-first-skill-0311 --name my-first-skill-0311 --version 1.0.0 --changelog "Initial release"

实际你会发现 clawhub publish 会失败,错误如下

yaml 复制代码
× Publish payload: acceptLicenseTerms: invalid value

这个问题是clawhub cli 的bug

ruby 复制代码
https://github.com/openclaw/clawhub/issues/648

根据官方给的临时解决方案是在请求体增加一个 "acceptLicenseTerms": true 参数

于是我在本地clawhub安装目录找到了publish.js,在payload中增加了上面的参数

c 复制代码
 // 临时增加 acceptLicenseTerms 参数
 const acceptLicenseTerms = true;
 form.set('payload', JSON.stringify({
    slug,
    displayName,
    version,
    changelog,
    acceptLicenseTerms,
    tags,
    ...(forkOf ? { forkOf } : {}),
}));

再次执行,发布成功

√ OK. Published my-first-skill-0311@1.0.0 (k97bxxt91xh9g632ghjjympy0s82mcc9)

接着执行

perl 复制代码
clawhub undelete my-first-skill-0311

然后在 https://clawhub.ai/skills 搜索即可看到发布的skill

验证发布

bash 复制代码
# 搜索你的技能
clawhub search my-first-skill-0311

# 安装测试
clawhub install my-first-skill-0311

实战:开发一个天气查询 Skill

光说不练假把式,我们来开发一个实用的天气查询 Skill。

目录结构

objectivec 复制代码
weather-skill/
├── SKILL.md
├── scripts/
│   └── weather.py
└── README.md

SKILL.md

markdown 复制代码
---
name: weather-query
version: 1.0.0
description: 查询全球任意城市的天气,支持中文城市名
author: your-name
homepage: https://github.com/your-name/weather-skill
---

# Weather Query Skill

基于 wttr.in 的天气查询技能,无需 API Key。

## 功能

- 查询指定城市天气
- 支持中文城市名
- 返回温度、湿度、天气状况

## 使用

```bash
python scripts/weather.py 北京
python scripts/weather.py Tokyo

scripts/weather.py

python 复制代码
#!/usr/bin/env python
"""
Weather Query Skill - 天气查询
基于 wttr.in,无需 API Key
"""
import urllib.request
import json
import sys

def get_weather(city):
    """获取城市天气"""
    try:
        # 使用 wttr.in API
        url = "https://wttr.in/{city}?format=j1"
        
        req = urllib.request.Request(url, headers={
            'User-Agent': 'Mozilla/5.0'
        })
        
        with urllib.request.urlopen(req, timeout=10) as response:
            data = json.loads(response.read())
            
            current = data['current_condition'][0]
            
            return {
                "city": city,
                "temp_c": current['temp_C'],
                "temp_f": current['temp_F'],
                "humidity": current['humidity'],
                "weather": current['weatherDesc'][0]['value'],
                "wind": f"{current['windspeedKmph']} km/h",
                "observed": current['observation_time']
            }
    except Exception as e:
        return {"error": str(e)}

def main():
    if len(sys.argv) < 2:
        print(json.dumps({"error": "请提供城市名,如:python weather.py 北京"}, ensure_ascii=False))
        return
    
    city = sys.argv[1]
    result = get_weather(city)
    print(json.dumps(result, ensure_ascii=False, indent=2))

if __name__ == "__main__":
    main()

测试

bash 复制代码
$ python scripts/weather.py 北京
{
  "city": "北京",
  "temp_c": "15",
  "temp_f": "59",
  "humidity": "45",
  "weather": "晴朗",
  "wind": "12 km/h",
  "observed": "09:00"
}

安装

参照上面的发布到 ClawHub流程将skill名称换成weather-skill即可完成发布


Skill 开发模板

1. 目录结构规范

csharp 复制代码
your-skill/
├── SKILL.md          # 技能元信息(必须)
├── README.md         # 详细文档
├── scripts/          # 可执行脚本
│   ├── main.py
│   └── utils.py
├── config/           # 配置文件
│   └── default.json
└── tests/            # 测试文件
    └── test_main.py

2. SKILL.md 规范

markdown 复制代码
name: skill-name     # 唯一标识,小写+连字符
version: 1.0.0        # 语义化版本
description: 简短描述  # 50字以内
author: your-name     # 作者名
homepage: https://... # 项目主页

写在最后

至此,一个最小可用的 ClawHub Skill 就开发完成了。

你已经完成了 Skill.md 编写、功能脚本开发、本地测试,以及通过 ClawHub 进行发布验证这几步。

接下来,只需要把示例中的脚本替换成你自己的业务逻辑,就可以继续扩展出更多可复用的 Skills。

相关推荐
Lentou1 分钟前
程序调用AI大模型方式(SDK\HTTP\SPRINGAI\LANFCHAIN4J)
人工智能·网络协议·http
yong99905 分钟前
基于直方图优化的图像去雾技术MATLAB实现
人工智能·计算机视觉·matlab
熊猫钓鱼>_>6 分钟前
GenUI:从“文本对话”到“可操作界面”的范式转移
开发语言·人工智能·agent·sdk·vibecoding·assistant·genui
其实防守也摸鱼8 分钟前
部署本地AI大模型--ollma
人工智能·安全·ai·大模型·软件工程·本地大模型
拂晓 AI 编程8 分钟前
claude code 加上 PPT Master skill 生成可手改PPT
人工智能·powerpoint
小橙子学AI10 分钟前
Rokid AI眼镜皮肤健康检测智能体技术实践
人工智能
QQ6765800811 分钟前
智慧工地物料堆积识别 工地钢筋木材图像识别 工地砖块目标检测 建筑物大理石图像识别 建筑物工地材料识别 物料堆积识别10349期
人工智能·目标检测·计算机视觉·工地物料堆积·工地钢筋木材图像识别·工地砖块目标检测·建筑物大理石图像
懂AI的老郑14 分钟前
时空智能体技术研究与应用
人工智能
Wild API15 分钟前
多模型成本治理怎么落地?从任务分层、日志统计到结构优化的一套实战思路
大数据·网络·人工智能
前端摸鱼匠20 分钟前
【AI大模型春招面试题22】层归一化(Layer Norm)与批归一化(Batch Norm)的区别?为何大模型更倾向于使用Layer Norm?
开发语言·人工智能·面试·求职招聘·batch