OpenClaw技能开发入门:为千问3.5-35B-A3B-FP8扩展自定义多模态能力

张开发
2026/4/16 9:50:57 15 分钟阅读

分享文章

OpenClaw技能开发入门:为千问3.5-35B-A3B-FP8扩展自定义多模态能力
OpenClaw技能开发入门为千问3.5-35B-A3B-FP8扩展自定义多模态能力1. 为什么需要自定义技能去年夏天我负责一个自媒体团队的内容分发工作。每天需要处理上百张图片的水印添加和格式转换手动操作Photoshop让我精疲力竭。当我发现OpenClaw可以通过技能扩展自动化能力时决定开发一个专用于图片处理的技能模块。这个水印添加技能的开发过程让我深刻体会到OpenClaw真正的价值不在于它预置了多少功能而在于它允许开发者像搭积木一样将大模型能力与本地操作无缝结合。下面我将完整还原从零开发到发布的全过程。2. 开发环境准备2.1 基础工具链配置首先确保已安装Node.js 18和最新版OpenClaw。我使用的是macOS系统通过Homebrew完成基础安装brew install node18 npm install -g openclawlatest验证环境时遇到一个小坑如果之前安装过旧版需要先执行npm uninstall -g openclaw清除缓存。安装完成后建议运行openclaw doctor检查环境依赖。2.2 千问模型服务对接在~/.openclaw/openclaw.json中配置千问3.5模型的访问端点。由于使用星图平台的镜像服务我的配置如下{ models: { providers: { qwen-multimodal: { baseUrl: http://your-qwen-instance:8080/v1, apiKey: your-api-key, api: openai-completions, models: [ { id: qwen3.5-35b-a3b-fp8, name: Qwen Multimodal, contextWindow: 32768 } ] } } } }特别注意多模态模型需要额外声明supportsVision: true参数否则无法处理图片输入。3. 创建技能脚手架3.1 初始化技能项目OpenClaw提供了标准的技能开发模板。通过CLI工具快速生成项目骨架clawhub create watermark-skill --templatetypescript cd watermark-skill生成的项目结构包含几个关键文件skill.json技能元数据声明src/handler.ts核心逻辑入口test/测试用例目录docs/自动生成的文档3.2 技能元数据设计修改skill.json定义技能的基本属性。这是我为水印技能设计的配置{ name: image-watermark, version: 0.1.0, description: Add customizable watermark to images with Qwen3.5 vision understanding, entry: dist/handler.js, permissions: [ file.read, file.write, image.process ], inputs: { imagePath: { type: string, description: Path to source image }, text: { type: string, description: Watermark text content } } }特别注意permissions字段声明了技能需要的系统权限这是OpenClaw的安全沙箱机制要求的。4. 核心功能开发4.1 多模态API调用封装在src/lib/qwen.ts中创建千问模型的调用封装。关键点在于处理图片的base64编码import fs from fs; export async function analyzeImage(imagePath: string) { const imageData fs.readFileSync(imagePath); const base64Image imageData.toString(base64); const response await fetch(config.modelEndpoint, { method: POST, headers: { Content-Type: application/json, Authorization: Bearer ${config.apiKey} }, body: JSON.stringify({ model: qwen3.5-35b-a3b-fp8, messages: [{ role: user, content: [ { type: text, text: Describe this image for watermark positioning }, { type: image_url, image_url: data:image/png;base64,${base64Image} } ] }] }) }); return response.json(); }4.2 水印位置智能计算基于千问模型的视觉理解能力我们可以让水印自动适应图片内容。在src/lib/positioning.ts中实现智能布局算法export function calculateWatermarkPosition(analysisResult: string) { // 模型返回示例The image shows a landscape with sky on top and mountains below if (analysisResult.includes(sky)) { return { x: 20, y: 20 }; // 天空区域放置左上角 } else if (analysisResult.includes(water)) { return { x: center, y: bottom }; // 水面放置底部居中 } return { x: random, y: random }; // 默认随机位置 }这个简单的例子展示了如何将大模型的视觉理解转化为具体的操作参数。5. OpenClaw操作指令封装5.1 图片处理实现使用Sharp库实现具体的水印添加功能。在src/lib/watermark.ts中import sharp from sharp; export async function addWatermark( inputPath: string, outputPath: string, text: string, position: { x: number | string, y: number | string } ) { let image sharp(inputPath); const metadata await image.metadata(); // 计算实际坐标 const x typeof position.x string ? calculateRelativePosition(position.x, metadata.width!) : position.x; const y typeof position.y string ? calculateRelativePosition(position.y, metadata.height!) : position.y; return image .composite([{ input: await generateTextBuffer(text), top: y, left: x }]) .toFile(outputPath); }5.2 技能主处理器最后在src/handler.ts中将所有模块串联起来export default async function handler(inputs: SkillInputs) { try { // 1. 调用千问分析图片 const analysis await analyzeImage(inputs.imagePath); // 2. 计算水印位置 const position calculateWatermarkPosition(analysis.choices[0].message.content); // 3. 添加水印 const outputPath inputs.imagePath.replace(/(\.\w)$/, _watermarked$1); await addWatermark(inputs.imagePath, outputPath, inputs.text, position); return { success: true, outputPath }; } catch (error) { return { success: false, error: error.message }; } }6. 测试与发布6.1 本地测试方法OpenClaw提供了技能测试工具。创建test/test.json{ imagePath: ./test/test-image.jpg, text: Sample Watermark }运行测试命令clawhub test --input./test/test.json测试时会自动验证权限声明与实际操作的匹配度这是我发现的一个实用安全特性。6.2 发布到ClawHub市场发布前需要准备三个关键文件README.md技能使用文档example.json示例输入screenshot.png效果截图发布命令非常简单clawhub publish --public发布后可以在ClawHub市场通过关键词watermark搜索到这个技能。7. 技能文档规范建议基于我的踩坑经验总结出几点文档建议必含内容清晰的输入输出示例权限需求说明依赖的外部服务配置方法常见错误代码解释推荐结构# 技能名称 ## 功能描述 包含典型使用场景 ## 安装方法 clawhub install your-skill-name ## 输入参数 | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | imagePath | string | 是 | 图片路径 | ## 输出结果 成功时返回 json { success: true, outputPath: /path/to/output.jpg }使用示例给这张图片添加水印/photos/vacation.jpg 文字私人收藏--- **获取更多AI镜像** 想探索更多AI镜像和应用场景访问 [CSDN星图镜像广场](https://ai.csdn.net/?utm_sourcemirror_search_hot_keyword)提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

更多文章