@zicolasjac-ai/jensen-opencode-vision
v0.1.3
Published
OpenCode plugin that lets non-vision models read pasted/attached images by routing them through an external vision model at chat-messages-transform time.
Maintainers
Readme
jensen-opencode-vision
OpenCode 插件:让不支持图片输入的模型(deepseek-v4-flash、opencode/deepseek-v4-flash-free 等)通过外部视觉模型读取用户拖拽/附加的图片。
工作原理
在 experimental.chat.messages.transform 钩子里:
- 找到当前轮次的 user 消息,对其图片附件调用外部视觉模型(默认
MiniMax-M3),把分析结果以[Image analysis result]注入文本,删除原图片 part。 - 关键:把所有历史 user 消息中的图片附件也一并删除(上一轮的分析文本已经注入历史,图片本体无需再发给模型)。如果不删,第二轮起 opencode 会因模型不支持图片而触发
unsupportedParts()降级为ERROR: Cannot read "image.png" (this model does not support image input). Inform the user.,表现为"第一次能看,第二次就报错"。 - 视觉 API 失败时自动重试 2 次(瞬时 5xx/网络抖动自愈);仍失败则提示用户重新发送图片。
安装
npm install -g @zicolasjac-ai/jensen-opencode-vision
# 或者装到 opencode 用户目录:
cd ~/.config/opencode && npm install @zicolasjac-ai/jensen-opencode-vision在 ~/.config/opencode/opencode.json 的 plugin 数组中加入:
"plugin": [
"@zicolasjac-ai/jensen-opencode-vision"
]配置
配置文件查找顺序(找到第一个存在的就用,不会合并):
~/.config/opencode/plugins/jensen-opencode-vision/config.json← 推荐,独立于 npm 包,npm install 不会覆盖<包安装目录>/config.json← 包自带的兜底(npm 包通常不带)
第 1 个文件示例:
{
"models": [
"opencode/deepseek-v4-flash-free",
"opencode/deepseek-v4-flash",
"opencode-go/deepseek-v4-flash"
],
"vision": {
"baseURL": "https://api.minimaxi.com/v1",
"apiKey": "<your-key>",
"model": "MiniMax-M3",
"prompt": "你是纯视觉转录助手..."
}
}字段含义:
models:精确白名单。只有列在这里的模型才会被插件劫持转图片为文本;未列出的模型走原生的图片处理路径(自带视觉的不会被劫持)。不要用*通配 provider,否则会把该 provider 下所有模型都劫持。vision.baseURL:OpenAI 兼容 chat completions 端点vision.apiKey:Bearer Tokenvision.model:视觉模型标识vision.prompt:发给视觉模型的系统提示。推荐写"只做客观转录、不替用户回答问题",把决策权留给主模型。
启用验证
重启 opencode,日志里看到 jensen-opencode-vision plugin initialized 即生效。
已知限制
- 视觉 API 重试后仍失败时,历史里那张图会被删除,且无法补救——靠提示用户重发图片来恢复。
- 历史消息中的图片 part 直接删除(不调用视觉 API),避免对每张图重复调用视觉接口。
License
MIT
