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

OpenClaw技能开发入门:为Qwen3.5-9B定制图片分类插件

OpenClaw技能开发入门为Qwen3.5-9B定制图片分类插件1. 为什么需要开发图片分类技能上周整理手机相册时我对着3000多张杂乱无章的照片头疼不已——旅行风景、工作截图、宠物照片全都混在一起。手动分类不仅耗时费力还经常因为主观判断不一致导致重复劳动。这让我萌生了一个想法能否用OpenClawQwen3.5-9B多模态能力实现自动化图片分类经过三天摸索我成功开发出一个能理解图片内容并按主题自动归档的技能。这个过程中踩过的坑和最终解决方案正是本文要分享的核心内容。相比通用AI助手定制化技能的优势在于精准适配个人需求可以按照自己的分类体系如工作/生活/宠物来定义规则保护隐私数据所有处理都在本地完成避免上传照片到第三方服务持续迭代优化可以根据实际效果不断调整分类逻辑2. 开发环境准备2.1 基础工具链检查在开始前请确保已具备以下环境以macOS为例# 检查Node.js版本需要v18 node -v # 检查OpenClaw CLI openclaw --version # 安装clawhub脚手架 npm install -g clawhub如果尚未部署Qwen3.5-9B模型可以使用星图平台的一键镜像# 快速启动模型服务假设使用平台镜像 docker run -p 5000:5000 qwen3.5-9b-awq-4bit2.2 模型能力验证开发前建议先用curl测试模型的多模态能力curl -X POST http://localhost:5000/v1/chat/completions \ -H Content-Type: application/json \ -d { model: qwen-vl, messages: [ { role: user, content: [ {type: text, text: 描述这张图片的主要内容}, {type: image_url, image_url: {url: file:///Users/me/photo.jpg}} ] } ] }正常响应应包含对图片内容的文字描述这是后续分类的基础。3. 创建技能脚手架3.1 初始化项目使用clawhub创建技能骨架clawhub init photo-classifier --templatebasic-skill cd photo-classifier生成的核心文件结构如下. ├── manifest.json # 技能元数据 ├── package.json # Node.js依赖 ├── src │ ├── index.js # 主逻辑 │ └── utils.js # 工具函数 └── test # 测试用例3.2 配置技能元数据编辑manifest.json定义技能能力{ name: photo-classifier, version: 0.1.0, description: 基于Qwen3.5的智能图片分类器, entry: src/index.js, triggers: { classifyPhotos: { description: 对指定目录图片进行分类, parameters: { folderPath: { type: string, description: 待分类图片目录路径 } } } }, dependencies: { models: [qwen-vl] } }关键配置说明triggers定义了技能调用入口dependencies声明需要Qwen多模态模型支持parameters定义了用户需要提供的参数4. 核心逻辑开发4.1 图片处理模块在src/utils.js中添加图片预处理函数const fs require(fs); const path require(path); async function scanImageFolder(folderPath) { const files await fs.promises.readdir(folderPath); return files .filter(file [.jpg, .png].includes(path.extname(file).toLowerCase())) .map(file path.join(folderPath, file)); } function createCategoryFolders(rootPath, categories) { categories.forEach(cat { const dir path.join(rootPath, cat); if (!fs.existsSync(dir)) { fs.mkdirSync(dir, { recursive: true }); } }); }4.2 模型交互逻辑在src/index.js中实现分类主逻辑const axios require(axios); const { scanImageFolder, createCategoryFolders } require(./utils); const MODEL_API http://localhost:5000/v1/chat/completions; async function analyzeImage(imagePath) { const response await axios.post(MODEL_API, { model: qwen-vl, messages: [{ role: user, content: [ { type: text, text: 用不超过3个关键词描述图片内容格式为: 人物|物体|场景 }, { type: image_url, image_url: { url: file://${imagePath} } } ] }] }); return response.data.choices[0].message.content; } function determineCategory(analysisResult) { const [person, object, scene] analysisResult.split(|).map(s s.trim()); // 自定义分类规则 if (person.includes(同事) || object.includes(截图)) return 工作; if (person.includes(猫) || object.includes(宠物)) return 宠物; if (scene.includes(海滩) || scene.includes(山)) return 旅行; return 其他; }5. 技能集成与测试5.1 主函数实现继续完善src/index.jsmodule.exports async function (context) { const { folderPath } context.parameters; const categories [工作, 旅行, 宠物, 其他]; try { createCategoryFolders(folderPath, categories); const imageFiles await scanImageFolder(folderPath); for (const file of imageFiles) { const analysis await analyzeImage(file); const category determineCategory(analysis); const destPath path.join( path.dirname(file), category, path.basename(file) ); fs.renameSync(file, destPath); context.log(已分类: ${file} - ${category}); } return { success: true, classified: imageFiles.length }; } catch (error) { context.logger.error(分类失败:, error); throw new Error(图片分类处理失败); } };5.2 本地测试方法创建测试脚本test/test.jsconst skill require(../src/index); (async () { const mockContext { parameters: { folderPath: ./test-photos }, log: console.log, logger: { error: console.error } }; await skill(mockContext); })();放置测试图片到test-photos目录后运行node test/test.js6. 部署与使用6.1 安装到OpenClaw在技能目录执行clawhub pack clawhub install ./photo-classifier-0.1.0.claw6.2 通过对话调用启动OpenClaw后可以在聊天窗口输入帮我分类照片~/Pictures/未整理6.3 性能优化建议在实际使用中发现两个优化点批量处理修改为每次请求分析多张图片减少API调用次数缓存机制对已分类图片记录哈希值避免重复处理优化后的模型请求示例async function analyzeImagesBatch(imagePaths) { const messages imagePaths.map(path ({ role: user, content: [ { type: text, text: 批量分析用关键词描述每张图片 }, { type: image_url, image_url: { url: file://${path} } } ] })); // 实际实现需要模型支持批量处理 const response await axios.post(MODEL_API, { model: qwen-vl, messages }); return response.data; }7. 开发心得与注意事项通过这次开发我总结了几个关键经验模型提示词设计最初使用描述这张图片的简单提示导致返回结果格式不一致。改为严格指定关键词1|关键词2|关键词3格式后解析成功率显著提升。错误处理要特别注意模型可能返回非预期内容的情况。我在determineCategory函数中添加了默认分类和格式校验function safeSplit(str) { try { const parts str.split(|); return parts.length 3 ? parts : [,,]; } catch { return [,,]; } }权限问题在Windows开发时遇到文件操作权限错误需要通过openclaw.config.json显式声明需要的权限{ permissions: { filesystem: [read, write] } }这个技能的开发过程让我深刻体会到好的AI应用不仅需要强大的模型更需要细致的工程化设计。现在我的相册终于恢复了整洁而开发过程中积累的经验也为后续开发更复杂的OpenClaw技能打下了基础。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

相关文章:

OpenClaw技能开发入门:为Qwen3.5-9B定制图片分类插件

OpenClaw技能开发入门:为Qwen3.5-9B定制图片分类插件 1. 为什么需要开发图片分类技能 上周整理手机相册时,我对着3000多张杂乱无章的照片头疼不已——旅行风景、工作截图、宠物照片全都混在一起。手动分类不仅耗时费力,还经常因为主观判断不…...

Kmestepper:单头称重控制系统嵌入式协同驱动框架

1. Kmestepper 库概述:面向单头称重控制系统的嵌入式运动与称重协同驱动框架Kmestepper 是专为 KmeIoT 单头称重设备(1-Head Weigher Device)设计的嵌入式底层驱动库,其核心定位并非通用步进电机或称重传感器抽象层,而…...

别再乱开槽了!手把手教你用HFSS仿真设计一个带Wi-Fi陷波的超宽带天线

别再乱开槽了!手把手教你用HFSS仿真设计一个带Wi-Fi陷波的超宽带天线 在射频工程实践中,超宽带天线设计常面临一个棘手问题:如何在不影响整体性能的前提下,精准抑制特定干扰频段。以2.4GHz Wi-Fi频段为例,当它与其他通…...

别再死记硬背了!用这10个XSS-Labs关卡,手把手教你理解前端过滤与绕过逻辑

从XSS-Labs关卡构建前端安全思维模型:10个实战场景解析 当你在浏览器地址栏输入javascript:alert(1)时,是否思考过为什么有些网站会弹出对话框而有些却毫无反应?这背后隐藏着前端工程师与安全研究者之间持续多年的攻防博弈。XSS-Labs作为经典…...

大疆照片的‘测绘模式’和‘畸变矫正’到底怎么用?一个案例讲清测绘项目中的元数据配置要点

大疆无人机测绘实战:从参数配置到三维建模的精度控制全解析 去年参与某开发区1:500地形测绘项目时,我们团队使用大疆Mavic 3E无人机采集数据后,在ContextCapture中空三解算时遇到了模型局部扭曲的问题。经过排查发现,问题根源竟是…...

别急着重装!Makefile报错‘Command not found‘的通用排查思路:以蜂鸟E203的RISC-V工具链为例

Makefile报错"Command not found"的深度排查指南:从RISC-V工具链到通用解决方案 当你满怀期待地克隆了一个开源项目,准备开始编译时,终端却无情地抛出一行红色错误:"riscv-nuclei-elf-gcc: Command not found"…...

【几何之美】莫利定理(Morley‘s Theorem)的视觉化证明与初中数学思维

1. 莫利定理:藏在三角形里的数学奇迹 第一次听说莫利定理时,我正盯着教室墙上的三角板发呆。谁能想到,这个看似普通的几何图形里,竟然藏着如此精妙的规律——把任意三角形的三个内角各分成三等份,靠近每条边的两条三等…...

别再只会用Flask了!用FastAPI + OpenCV 5分钟搭建一个带炫酷前端界面的图片处理Web服务

5分钟用FastAPIOpenCV打造炫酷图片处理Web应用 如果你还在用Flask开发Web应用,是时候尝试更现代的解决方案了。FastAPI作为Python生态中崛起的新星,凭借其卓越的性能和开发体验,正在成为构建API服务的首选框架。本文将带你快速实现一个功能完…...

PVE 网络优化:构建高效hostonly内网传输方案

1. 为什么需要hostonly内网传输方案 最近在折腾PVE虚拟化环境时,遇到了一个让人头疼的问题:虚拟机之间传输大文件速度慢得像蜗牛爬。我的主力工作机是Win10虚拟机,通过显卡直通获得接近物理机的性能,但每次从跑qbittorrent和Samba…...

uniapp实战:ucharts饼图点击事件全解析(附跳转页面实现)

uniapp实战:ucharts饼图点击事件全解析(附跳转页面实现) 在移动端H5开发中,数据可视化图表的交互体验直接影响用户感知。最近接手一个uniapp项目时,发现ucharts的饼图交互存在几个关键痛点:如何区分图例点…...

STM32与OV7670图像采集实战:SCCB总线控制与FIFO缓存机制解析

1. OV7670图像传感器基础解析 OV7670是OmniVision公司推出的一款低成本VGA图像传感器,尺寸仅有1/6英寸,工作电压2.5V-3.0V,功耗仅60mW。这个火柴盒大小的芯片集成了图像采集、自动曝光控制、自动白平衡等完整图像处理功能。我最早接触它是在一…...

别再只当‘信号合并器’了!Bias Tee在5G小基站和毫米波测试中的实战避坑指南

5G时代Bias Tee实战指南:从小基站到毫米波的关键应用与避坑策略 在5G硬件研发的前沿战场上,Bias Tee这个看似简单的三端口器件正扮演着越来越关键的角色。不同于传统认知中的"信号合并器",现代5G系统对Bias Tee提出了前所未有的性能…...

无线通信开发者的硬件加速指南:在Vivado里用System Generator快速搭建信道仿真原型

无线通信硬件加速实战:从Simulink到FPGA的信道仿真全流程解析 在当今5G/6G通信、物联网和自动驾驶技术快速发展的背景下,无线通信系统的复杂度和性能要求呈指数级增长。传统基于通用处理器的软件仿真方法已难以满足实时性要求,而FPGA凭借其并…...

数据中心光纤跳线选型指南:SC、LC、FC三种接口的实战对比与避坑建议

数据中心光纤跳线选型指南:SC、LC、FC三种接口的实战对比与避坑建议 在数据中心的基础设施中,光纤跳线作为光信号传输的"最后一公里",其选型直接影响着网络性能的稳定性和运维效率。面对市场上SC、LC、FC三种主流接口类型&#xff…...

FPointer:嵌入式C语言轻量级带参回调机制

1. FPointer:面向嵌入式系统的轻量级泛型回调机制设计与实现1.1 设计动因与工程定位在裸机(Bare-Metal)或实时操作系统(如FreeRTOS、Zephyr)环境下,回调函数(Callback Function)是解…...

别再傻傻分不清!电子工程师必懂的TTL与CMOS芯片选型实战指南(附74LS/CD4000型号速查)

电子工程师必懂的TTL与CMOS芯片选型实战指南 在面包板上调试数字电路时,你是否曾被74LS和CD4000系列芯片的参数差异困扰?上周我接手一个电池供电的传感器项目,就因误用74LS芯片导致系统功耗超标,不得不连夜重新设计电路。这种&quo…...

从电机控制到机器人:传递函数G(s)在实际工程中到底怎么用?(附Simulink/PLC实例)

从电机控制到机器人:传递函数G(s)在实际工程中到底怎么用?(附Simulink/PLC实例) 在工业自动化领域,传递函数就像机械工程师手中的游标卡尺——它不仅是测量工具,更是设计蓝图。许多工程师在课堂上学会了推导…...

不用公网IP!用Ollama+Chatbox搭建家庭AI助手(内网穿透方案对比)

家庭AI助手实战:OllamaChatbox内网部署与穿透方案全解析 在智能家居技术快速发展的今天,将AI能力引入家庭环境已成为技术爱好者的新宠。想象一下,当你躺在沙发上用手机就能调用书房电脑运行的Llama 3大模型,或者在厨房平板上随时获…...

跨平台实战:OpenClaw在Mac/Win同步控制Qwen3-4B任务流

跨平台实战:OpenClaw在Mac/Win同步控制Qwen3-4B任务流 1. 为什么需要跨平台任务流控制 去年我接手了一个数据分析项目,需要在三台设备上同时运行爬虫脚本——一台M1 MacBook Pro用于数据清洗,一台Windows游戏本跑GPU密集型任务,…...

OpenClaw研究助手:千问3.5-9B驱动的文献综述自动化

OpenClaw研究助手:千问3.5-9B驱动的文献综述自动化 1. 为什么需要自动化文献综述? 作为一位经常需要撰写文献综述的研究者,我深刻理解这个过程的痛苦。传统文献整理需要手动下载PDF、逐篇阅读、摘录关键观点、分类归档,最后再整…...

MG811SpaceData:嵌入式端CO₂传感器四维建模与多气体解耦框架

1. MG811SpaceData 库技术解析:面向嵌入式系统的电化学气体传感器数据科学框架1.1 工程定位与设计哲学MG811SpaceData 并非传统意义上的传感器驱动库,而是一个嵌入式端轻量化数据科学框架,其核心目标是在资源受限的微控制器(如Ard…...

LVGL文件系统(FatFS)深度对接:从API注册到多存储设备管理实战

1. LVGL与FatFS对接的核心价值 在嵌入式UI开发中,资源管理一直是个头疼的问题。想象一下你的智能手表要显示几十种不同风格的图标,或者工业HMI需要加载多国语言字体,如果把这些资源全都编译进固件,不仅会让程序体积膨胀&#xff0…...

OpenClaw多通道实战:百川2-13B-4bits同时接入飞书与钉钉机器人

OpenClaw多通道实战:百川2-13B-4bits同时接入飞书与钉钉机器人 1. 为什么需要多通道接入? 上个月我们市场部遇到一个典型问题:产品团队用飞书沟通,而运营团队坚持使用钉钉。当我用OpenClaw搭建了一个基于百川2-13B的智能助手后&…...

嵌入式轻量级日志框架:零堆内存与编译期级别控制

1. Logger库深度解析:面向嵌入式系统的轻量级串口日志框架 1.1 设计定位与工程价值 Logger库虽以“Arduino library”为标签,但其本质是一个面向资源受限嵌入式平台的 轻量级串口日志框架 。在STM32、ESP32、nRF52等主流MCU平台上,日志输出…...

ChatGPT 并非总是理解 SQL,但这个 Python 工具可以

原文:towardsdatascience.com/say-goodbye-to-sql-headaches-with-this-python-tool-75099f5ff33d https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/f411ec0f210c2545786c1022c49304d5.png Image by 2023852 from Pixabay 如果…...

seo代做如何评估投资回报率

SEO代做如何评估投资回报率:实用指南与解决方案 在现代数字营销中,SEO(搜索引擎优化)代做服务成为了许多企业提升网站流量和销售的重要手段。如何评估SEO代做的投资回报率(ROI)是许多企业面临的关键问题。…...

FUSB302 Arduino库:USB-C物理层与PD协议硬件协同开发指南

1. 项目概述Sitron Labs FUSB302 Arduino Library 是一款面向嵌入式开发者的专业级 USB Type-C 控制器驱动库,专为 onsemi(原安森美)FUSB302 系列可编程 USB Type-C 端口控制器设计。该库并非简单封装 I2C 读写操作,而是完整实现了…...

SEO_本地SEO优化的关键步骤与操作技巧

SEO:本地SEO优化的关键步骤与操作技巧 在当今数字化时代,本地SEO优化已经成为企业提升在线存在感和吸引本地客户的重要手段。无论你是小型本地企业,还是大型品牌,本地SEO优化都能帮助你更好地连接到潜在客户。具体该如何进行本地SEO优化呢&a…...

如何结合本地SEO优化来免费提高网站排名

如何结合本地SEO优化来免费提高网站排名 在当前数字化时代,网站排名的提升已经成为了企业和个人网站的重要目标之一。而对于本地企业来说,如何通过本地SEO优化来提高网站排名,是一个非常关键的问题。本文将详细探讨如何结合本地SEO优化来免费…...

不用精确模型也能控?手把手教你用Matlab实现MFAC控制算法(附完整代码)

零基础实现MFAC控制:Matlab实战指南与参数调优全解析 在控制工程实践中,我们常常遇到这样的困境:面对一个复杂的非线性系统(比如实验室里的倒立摆或者工厂中的液位控制装置),传统的PID控制效果不佳&#xf…...