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

给 opencode 装个眼睛:一个能读截图、看剪贴板的 vision 插件

最近把 opencode 当主力 CLI 助手用,遇到一个烦人的问题:我用的主模型不带多模态。贴一张截图进去,它回一句 “Cannot read”,没了。想让它看个报错、分析个设计稿,还得先把图存下来,再手动切到网页版模型去问。

来回折腾几次,我写了个小插件,给 opencode 加一个vision工具。现在贴图给它,它会自动把图发给 OpenRouter 的视觉模型(默认 qwen3-vl-8b),把识别结果带回来继续干活。

能干什么

  • 剪贴板识图。截图后不用存文件,直接说"看看剪贴板",插件调 Python Pillow 或 pngpaste 把剪贴板内容抓出来分析。
  • 多图对比。传逗号分隔的多个路径,一次调用对比几张图。
  • 自动压缩。超过 1568px 的图先用 macOS 自带的 sips 缩放再上传,省 token,识别速度也快。
  • 模型可换。默认 qwen3-vl-8b,要更强识别就传model: "google/gemini-2.5-flash"
  • 失败重试。请求超时 90s 或 5xx 时自动重试一次。

实现思路

实现本身不复杂,三块:

  1. 图片转 base64 data URL,以image_url形式发给 OpenRouter 的/chat/completions接口;
  2. 大图先压缩再上传,避免传原图浪费流量和 token;
  3. 剪贴板优先走 Python Pillow 的 ImageGrab,没装 Pillow 就退回 pngpaste。

API key 从 opencode.json 的 provider 配置或OPENROUTER_API_KEY环境变量读,代码里没有写死的 key,开源出去也不用担心泄密。

安装

vision.ts放进插件目录,装好依赖重启即可:

mkdir-p~/.config/opencode/pluginscpvision.ts ~/.config/opencode/plugins/

配置 key 两种方式任选:

{"provider":{"openrouter":{"options":{"apiKey":"sk-or-v1-你的key"}}}}

或者export OPENROUTER_API_KEY="你的key"

用法

主模型遇到图片会自动调vision,也可以手动指定:

vision({ imagePath: "/path/to/screenshot.png", question: "截图里有什么错误" }) vision({ imagePath: "/a.png,/b.png", question: "对比这两张图" }) vision({ imagePath: "clipboard" }) vision({ imagePath: "clipboard", model: "google/gemini-2.5-flash" })

实际感受

用了一个多月,最常用的场景是贴图表截图让它算数。之前给它看一张缓存命中率统计图,它把命中、未命中、输出几项都读出来,算了命中率,还发现"总计"和分项对不上,差值恰好等于输出数,怀疑统计口径把输出也加进去了。这种活以前要么我肉眼对,要么得自己写脚本解析。

识别速度从几秒到十几秒不等,取决于图片大小和模型负载。写这个插件主要是自己用,顺手开源出来,给同样被"模型不支持图片"卡住的人一个参考。仓库里有完整代码、安装说明和示例。

GitHub: https://github.com/xiucaicoder/opencode-vision

License: MIT

http://www.jsqmd.com/news/1313930/

相关文章:

  • PyTorch DataLoader核心参数详解与性能优化实战指南
  • 华为nova12锁屏密码与ID锁破解:Bootloader解锁与安全刷机全解析
  • OpCore-Simplify:从复杂到简单,黑苹果配置的智能革命
  • Meshtastic固件源码编译与深度定制实战指南
  • Arduino实时时钟模块DS1307:解决断电时间丢失,实现精准定时控制
  • 郑州卓见软件科技Java后端面试复盘:HashMap、ConcurrentHashMap、MySQL索引优化与短链接系统设计
  • SQL注入自动化实战:从原理到SQLmap工具深度应用
  • 7月CNVD操作系统和应用程序漏洞数量统计
  • 华为手机刷机后激活锁(FRP锁)原理与四种解锁方案全解析
  • 基于CrewAI框架构建多智能体协作系统:从理论到工程实践
  • Wio Terminal I2C接口配置与OLED屏驱动实战指南
  • 2026博山区医院护工机构推荐|合悦家政护工机构哪家好口碑好 - mobible
  • Python Web安全实战:从漏洞原理到Flask/Django纵深防御
  • RP2040驱动5.65英寸电子墨水屏:硬件连接、驱动库选择与低功耗优化实践
  • 为XIAO ESP32S3与Wio-SX1262设计3D打印外壳:从电路到产品的工程实践
  • 光流法原理与OpenCV实战:从运动估计到智能检测
  • Grove分压器模块:Arduino电压测量原理、校准与实战应用
  • G1/2英寸水流传感器:原理、选型与嵌入式系统集成实战指南
  • 周村区催乳师育婴师机构哪家好|合悦家政口碑机构推荐 - mobible
  • Lipo Rider Plus模块深度解析:从电能收集到高效电源管理的工程实践
  • ESPHome扩展reTerminal E:RTC、SD卡与麦克风集成实战
  • 审小匠 vs 传统方法:现金流量表自动编制评测(12888 映射 + 六级分类)
  • Windows服务器Python服务自启动与监控:NSSM部署与健康检查实战
  • Adobe-GenP 3.0终极破解指南:三步免费激活Adobe全家桶的完整教程
  • 完整指南:如何用OpenCore Legacy Patcher让老款Mac焕发新生
  • 从零构建个人知识库:Obsidian与AI结合打造第二大脑
  • Free-NTFS-for-Mac终极指南:免费解锁Mac的NTFS完整读写权限
  • 10.1英寸DSI接口LCD屏驱动全攻略:从树莓派到STM32实战解析
  • 如何快速清理电脑重复文件?Czkawka终极文件整理指南
  • ESP32-S3-DEV-KIT-N8R8开发板实战:8MB PSRAM与双核处理器的边缘AI应用