给 opencode 装个眼睛:一个能读截图、看剪贴板的 vision 插件
📅 2026/8/2 14:32:34
👁️ 阅读次数
📝 编程学习
最近把 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 时自动重试一次。
实现思路
实现本身不复杂,三块:
- 图片转 base64 data URL,以
image_url形式发给 OpenRouter 的/chat/completions接口; - 大图先压缩再上传,避免传原图浪费流量和 token;
- 剪贴板优先走 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
编程学习
技术分享
实战经验