当前位置: 首页 > news >正文

OpenClaw开源贡献:为Qwen3.5-9B编写自定义技能开发指南

OpenClaw开源贡献:为Qwen3.5-9B编写自定义技能开发指南

1. 为什么我们需要自定义技能

去年冬天,我在整理个人项目时发现一个痛点:每天需要手动查询多个城市的天气情况来规划出差行程。作为一个技术爱好者,我本能地思考能否用自动化解决这个问题。当时OpenClaw刚刚发布,我决定尝试为其开发一个天气查询技能。

这个决定让我意外地走进了开源贡献的世界。通过为OpenClaw开发技能,我不仅解决了自己的需求,还学会了如何将个人工具转化为社区共享资源。本文将分享我从零开始创建天气查询技能的全过程,包括踩过的坑和最终验证通过的方案。

2. 开发前的准备工作

2.1 环境配置

首先需要确保开发环境就绪。我使用的是macOS系统,通过以下命令安装了OpenClaw开发套件:

npm install -g @openclaw/cli @openclaw/devkit

验证安装是否成功:

clawdev --version # 应输出类似:@openclaw/devkit 1.2.3

2.2 技能项目初始化

创建一个新的技能项目非常简单:

clawdev init weather-query cd weather-query

这会生成一个标准的技能项目结构:

weather-query/ ├── package.json ├── src/ │ ├── index.ts # 主入口文件 │ └── types.ts # 类型定义 ├── tool.json # 工具描述文件 └── README.md

3. 定义天气查询工具

3.1 编写tool.json

这是技能的核心描述文件,告诉OpenClaw这个工具能做什么。我的weather-query/tool.json内容如下:

{ "name": "weather_query", "description": "查询指定城市的当前天气情况", "parameters": { "type": "object", "properties": { "city": { "type": "string", "description": "需要查询的城市名称,如'北京'或'New York'" }, "unit": { "type": "string", "enum": ["celsius", "fahrenheit"], "description": "温度单位,默认为摄氏度(celsius)", "default": "celsius" } }, "required": ["city"] } }

这个定义明确表示:工具需要城市名称作为必填参数,温度单位是可选的(默认为摄氏度)。

3.2 实现处理函数

在src/index.ts中,我们需要实现实际的天气查询逻辑。我选择了和风天气API作为数据源(免费版足够个人使用):

import { Tool } from '@openclaw/core'; interface WeatherParams { city: string; unit?: 'celsius' | 'fahrenheit'; } export const weatherQuery: Tool<WeatherParams> = async ({ city, unit = 'celsius' }) => { // 这里应该替换为你自己的API Key const API_KEY = process.env.HEFENG_API_KEY; if (!API_KEY) { throw new Error('请先设置HEFENG_API_KEY环境变量'); } // 获取城市地理位置编码 const locationRes = await fetch( `https://geoapi.qweather.com/v2/city/lookup?location=${encodeURIComponent(city)}&key=${API_KEY}` ); const locationData = await locationRes.json(); if (locationData.code !== '200' || !locationData.location?.length) { return { error: `找不到城市: ${city}` }; } const locationId = locationData.location[0].id; // 查询实时天气 const weatherRes = await fetch( `https://devapi.qweather.com/v7/weather/now?location=${locationId}&key=${API_KEY}` ); const weatherData = await weatherRes.json(); if (weatherData.code !== '200') { return { error: '获取天气数据失败' }; } // 处理温度单位 let temp = weatherData.now.temp; if (unit === 'fahrenheit') { temp = (temp * 9/5) + 32; } return { city: locationData.location[0].name, temperature: temp, unit, condition: weatherData.now.text, humidity: weatherData.now.humidity, wind: weatherData.now.windDir + ' ' + weatherData.now.windScale + '级' }; };

4. 本地测试与调试

4.1 注册技能到本地OpenClaw

在项目目录下运行:

clawdev link

这会在本地OpenClaw安装目录创建符号链接,使修改能即时生效。

4.2 测试技能

可以通过OpenClaw CLI直接测试:

openclaw tools execute weather_query --city 北京

也可以在OpenClaw Web控制台输入自然语言指令测试,如: "查询北京的当前天气"

4.3 调试技巧

开发过程中我遇到了几个典型问题:

  1. API密钥管理:最初我将API密钥硬编码在代码中,后来改为环境变量更安全
  2. 城市匹配:发现部分城市名有歧义(如"Washington"可能匹配多个地点),增加了错误处理
  3. 单位转换:最初忘记处理华氏度转换,导致返回数据不准确

调试时我大量使用了OpenClaw的日志功能:

openclaw gateway --log-level debug

5. 提交贡献到ClawHub

5.1 完善项目文档

在提交前,我确保README.md包含以下关键信息:

  • 技能功能描述
  • 必要的环境变量
  • API申请指引(和风天气免费API)
  • 使用示例

5.2 创建GitHub仓库

将代码推送到GitHub个人账号下:

git init git add . git commit -m "初始提交: 天气查询技能" git remote add origin https://github.com/<你的用户名>/weather-query.git git push -u origin main

5.3 提交到ClawHub

ClawHub是OpenClaw的技能市场,提交PR的流程如下:

  1. Fork ClawHub仓库(https://github.com/openclaw/clawhub)
  2. skills目录下创建新文件夹weather-query
  3. 添加一个metadata.json文件描述你的技能:
{ "name": "weather-query", "displayName": "天气查询", "description": "查询全球城市实时天气信息", "keywords": ["weather", "查询", "工具"], "repository": "https://github.com/<你的用户名>/weather-query", "author": "你的名字 <你的邮箱>" }
  1. 提交Pull Request并等待审核

6. 与Qwen3.5-9B的适配优化

Qwen3.5-9B作为支持128K上下文的强大模型,能为技能提供更好的自然语言理解能力。我在开发过程中发现几个优化点:

  1. 工具描述优化:更详细的参数描述能帮助模型更好地理解何时调用该工具
  2. 错误处理增强:清晰的错误信息能让模型更好地向用户解释问题
  3. 结果格式化:结构化的返回数据便于模型生成用户友好的回复

例如,我调整了返回数据的结构:

return { summary: `${city}当前天气: ${weatherData.now.text}`, details: { temperature: `${temp}${unit === 'celsius' ? '°C' : '°F'}`, humidity: `${weatherData.now.humidity}%`, wind: `${weatherData.now.windDir} ${weatherData.now.windScale}级`, feelsLike: `${weatherData.now.feelsLike}°C` } };

这种结构既保留了原始数据供模型分析,又提供了可直接使用的摘要信息。

7. 开发经验与建议

通过这次开发经历,我总结了以下几点对新手开发者的建议:

  1. 从小功能开始:天气查询这类单一明确的功能是很好的起点
  2. 善用TypeScript类型:明确定义输入输出类型能减少运行时错误
  3. 考虑错误场景:网络请求失败、API限制等都需要妥善处理
  4. 文档同样重要:清晰的文档能让其他开发者更容易使用你的技能
  5. 参与社区讨论:OpenClaw的Discord频道有很多热心开发者可以提供帮助

开发自定义技能最令人兴奋的部分是看到自己的代码被社区采用。我的天气查询技能目前每月有数百次调用,这种成就感远超过解决个人需求的价值。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

http://www.cnnetsun.cn/news/1793026.html

相关文章:

  • AI开发-python-langchain框架(--串行流程 )恼
  • Imagick 处理 PDF 文件失败的常见原因与解决方案
  • 探索基于正则化极限学习机(RELM)的数据回归预测方法:附带MATLAB代码
  • Labview 与欧姆龙 PLC 的 Ethernetip TCP 网口通讯:CIP 通讯的魅力
  • 80MHz过渡频率 + 120-240放大倍数:2SC1815-Y在音频前级与开关电路中的参数解析
  • 单核1GHz vs 多核低频率:AM4379BZDNA100在工业实时控制中的优势
  • 基于springboot社区助老志愿管理服务平台的开发_s79qt96d_lx001
  • Microsoft Agent Framework Skills 执行 Scripts(实战指南)豢
  • 搞工控的兄弟应该都懂,直接怼PLC网口搞通讯有多爽。今儿就唠唠LabVIEW和三菱FX5U这对CP,不用装插件不调DLL,直接拿官方协议干就完了
  • QT程序插眼
  • 只需聊聊天,应用就上线:ArkClaw 对话开发与 IGA Pages 极速部署实践
  • OpenClaw智能装修:Qwen3.5-9B分析户型图生成改造建议
  • PHP开发者最后的防线:用自研AI校验引擎拦截92.7%的逻辑错误(附可落地的Composer包+规则集)
  • C#委托和事件练习题
  • OpenClaw技能开发入门:为百川2-13B-4bits模型定制专属自动化模块
  • 华为OD机试真题 新系统 - 准备生日礼物(Py/Java/C/C++/Js/Go)
  • PowerMeter:嵌入式电能计量开源库设计与实现
  • Redis怎样优雅地关闭AOF_在运行期间动态将appendonly设置为no
  • PCB布局设计核心原则与实战技巧
  • DFRobot MGC3130电容式手势传感器库深度解析
  • 大疆c板开发例程
  • 沈阳路灯工厂名声
  • MQTT快速入门
  • 以太网和CAN,WIFI
  • 美团推荐算法研究员面试题精选:10道高频考题+答案解析(附PDF)
  • Codeforces Round 1091 (Div. 2) and CodeCraft 26 2217
  • 实时行情系统设计:从协议选择到高可用架构,再到数据源选型钩
  • 【Hot 100 刷题计划】 LeetCode 17. 电话号码的字母组合 | C++ 回溯算法经典模板
  • GitHub 推送该用 SSH 还是 HTTPS?一篇讲透两种登录方式的区别
  • 余弦调度策略