OpenClaw技能开发入门:为gemma-3-12b-it编写第一个天气查询模块

张开发
2026/4/7 5:21:41 15 分钟阅读

分享文章

OpenClaw技能开发入门:为gemma-3-12b-it编写第一个天气查询模块
OpenClaw技能开发入门为gemma-3-12b-it编写第一个天气查询模块1. 为什么选择OpenClaw开发自定义技能去年冬天我经常需要同时查看多个城市的天气来决定出差行程。反复切换浏览器标签和天气应用的低效操作让我萌生了用AI自动化这个流程的想法。经过几轮技术选型最终选择OpenClaw作为实现平台——它既能对接本地部署的gemma-3-12b-it模型保持数据隐私又提供了完整的技能开发框架。与直接调用天气API的脚本不同OpenClaw技能的核心价值在于自然语言交互用户可以说查下北京明天会下雨吗而不需要记住固定命令格式上下文理解模型能处理比昨天温度高吗这类相对查询多平台集成结果可自动同步到飞书/邮件等渠道2. 开发环境准备2.1 基础组件安装我的开发环境是macOS VS Code先通过Homebrew完成基础依赖安装brew install node22 npm install -g openclawlatest clawhublatest验证环境时遇到个小坑新版本要求Node.js 18但系统自带的是16版。用nvm use 18切换后解决。2.2 模型服务对接由于使用本地部署的gemma-3-12b-it模型需要在~/.openclaw/openclaw.json配置模型端点{ models: { providers: { local-gemma: { baseUrl: http://localhost:3000/v1, api: openai-completions, models: [{ id: gemma-3-12b-it, name: Local Gemma }] } } } }这里特别注意api字段必须设为openai-completions因为gemma的WebUI实现了兼容OpenAI的接口协议。3. 创建天气查询技能项目3.1 初始化技能骨架通过ClawHub CLI创建项目模板clawhub create weather-query -t basic-skill cd weather-query生成的核心文件结构weather-query/ ├── package.json ├── skill.json # 技能元数据 ├── src/ │ ├── index.js # 主逻辑 │ └── weather.js # 业务实现 └── test/3.2 定义技能元数据编辑skill.json声明技能能力{ name: weather-query, description: 查询实时天气信息, triggers: [ { type: command, patterns: [ 查*天气, *会下雨吗, *温度多少 ] } ], permissions: [http] }patterns支持通配符匹配确保能捕获各种天气查询的自然语言变体。permissions声明需要网络访问权限。4. 实现天气API集成4.1 选择天气数据源对比了多家天气API后选择高德地图API免费版QPS足够个人使用返回数据包含降水概率等扩展字段国内服务器响应速度快申请Key时注意开通Web服务API权限不要选Android/iOS平台。4.2 编写业务逻辑在src/weather.js实现核心功能const axios require(axios); class WeatherService { constructor(apiKey) { this.apiKey apiKey; this.baseUrl https://restapi.amap.com/v3/weather/weatherInfo; } async query(city) { try { const response await axios.get(this.baseUrl, { params: { key: this.apiKey, city: city, extensions: all // 获取预报数据 } }); return this.formatResponse(response.data); } catch (error) { console.error(Weather API error:, error); return { error: 获取天气数据失败 }; } } formatResponse(data) { // 提取核心字段并转换为自然语言描述 const forecasts data.forecasts[0].casts; return { today: 今天${forecasts[0].dayweather}温度${forecasts[0].daytemp}℃, tomorrow: 明天${forecasts[1].dayweather}降水概率${forecasts[1].dayprecip}% }; } } module.exports WeatherService;特别注意错误处理要完善避免API异常导致整个技能崩溃。5. 对接OpenClaw主程序5.1 编写入口逻辑src/index.js负责桥接OpenClaw框架const WeatherService require(./weather); const weather new WeatherService(process.env.AMAP_KEY); module.exports async (claw) { claw.on(weather-query:command, async (args, context) { const city context.entities.city || 北京; // 默认城市 const result await weather.query(city); if (result.error) { return { text: result.error }; } return { text: ${city}天气${result.today}${result.tomorrow}, cards: [{ title: ${city}天气预报, content: [ { type: text, text: result.today }, { type: text, text: result.tomorrow } ] }] }; }); };5.2 环境变量配置在项目根目录创建.env文件存放敏感信息AMAP_KEY你的高德API密钥通过process.env读取避免密钥硬编码在代码中。6. 测试与调试技巧6.1 本地测试模式开发阶段使用clawhub dev启动实时调试clawhub dev --watch这个模式会监控文件变动自动重载在控制台打印详细日志提供测试聊天界面6.2 常见问题排查遇到过的典型问题及解决方案中文城市名识别不准在context.entities中添加city的别名映射API返回数据格式不符先用Postman验证原始接口响应权限被拒绝检查skill.json的permissions是否包含http7. 发布到ClawHub社区7.1 打包发布首先更新package.json中的版本号然后执行clawhub publish --public发布流程会运行测试用例生成压缩包上传到ClawHub仓库7.2 版本管理建议遵循语义化版本控制补丁版本0.0.x修复bug次要版本0.x.0新增功能主版本x.0.0不兼容变更例如新增多语言支持属于次要版本升级。8. 进阶开发方向完成基础功能后可以考虑增强多数据源回退当主API不可用时自动切换备用源历史记录对比存储查询记录实现比昨天冷吗这类需求预警通知当出现暴雨等极端天气时主动推送提醒这些扩展可以通过新增skill.json中的triggers类型实现。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

更多文章