📝 本文由 DeepSeek(AI) 根据博主本人的项目记录整理总结,部分表述可能与实际略有出入,仅供学习参考。
DeepSeek 很聪明,但它看不了图。想让它分析一张截图、识别照片里的文字、描述一张 UI 界面,直接丢图片过去只会得到一句”我无法查看图片”。
今天分享一个低成本解法:给 opencode 写一个消息中间件插件,把图片自动转成文字描述,再交给 DeepSeek 处理。原理是”借”阿里云百炼的 qwen3.5-ocr 视觉模型来当眼睛。
思路:在主模型之前拦截图片
opencode 提供了 experimental.chat.messages.transform 钩子,可以在这个时刻改写即将发送给主模型的消息。插件的完整流程:
- 扫描用户消息里所有图片(
mime以image/*开头的文件 part) - 读取图片内容(支持 data URL、本地路径、http(s) 链接)
- 调用百炼的 OpenAI 兼容接口,让 OCR 模型完整提取文字 + 描述物体/场景/布局
- 把原图片替换成
[图片内容]+ 识别文本的纯文本 part - 主模型拿到的就是纯文本,完全无感
这样用户上传图片后什么都不用管,体验上和原生支持图片的模型一模一样。
两个关键设计
自动跳过有视觉能力的主模型。 通过 experimental.chat.system.transform 读取当前主模型的 capabilities.input.image,如果它本身就能看图(比如切到了 qwen-vl),插件直接不介入。
结果缓存。 按图片 part 的 id 缓存 OCR 结果,同一张图只调一次 API,不浪费额度。
安装步骤
插件文件放到 opencode 的 plugins 目录即可自动加载:
| 作用域 | 路径 |
|---|---|
| 全局(推荐) | ~/.config/opencode/plugins/qwen-ocr-bridge.ts |
| 项目级 | <你的项目>/.opencode/plugins/qwen-ocr-bridge.ts |
关于 API 端点,请务必注意
阿里云百炼的 OpenAI 兼容端点,每个账号都是不一样的,形如:
https://llm-<你的专属ID>.cn-beijing.maas.aliyuncs.com/compatible-mode/v1
<你的专属ID> 因人而异,网上(包括很多文章)贴出来的地址不能照抄,抄了会报 403 / not found。正确做法是登录阿里云百炼控制台,在 API-KEY 管理页面查看你自己的专属端点。
更稳妥的方式是不写死在代码里,用环境变量注入:
const OCR_MODEL = process.env.QWEN_OCR_MODEL ?? "qwen3.5-ocr"
// 端点是"一人一个",通过环境变量注入,不要硬编码!
const OCR_BASE_URL =
process.env.QWEN_OCR_BASE_URL ??
"https://llm-<你的专属ID>.cn-beijing.maas.aliyuncs.com/compatible-mode/v1"
const OCR_API_KEY = process.env.DASHSCOPE_API_KEY ?? ""
调用部分就是标准的 OpenAI 兼容格式:
const res = await fetch(`${OCR_BASE_URL}/chat/completions`, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${OCR_API_KEY}`,
},
body: JSON.stringify({
model: OCR_MODEL,
messages: [
{
role: "user",
content: [
{ type: "image_url", image_url: { url: dataUrl } },
{ type: "text", text: "请完整识别并描述这张图片……" },
],
},
],
}),
})
安全提醒:Key 只进环境变量
写这类插件时最容易踩的坑就是把 API Key 硬编码进文件,然后随手推到 GitHub 上。请务必做到:
- Key 一律从环境变量读取,例如
process.env.DASHSCOPE_API_KEY - 插件文件里永远不要出现
sk-开头的真实 Key,也不要出现自己的专属端点地址 - 仓库里做好
.gitignore,把含 Key 的本地配置排除在外 - 发现 Key 疑似泄露,立刻去百炼控制台重置,旧的立即作废
设置环境变量:
# Windows
setx DASHSCOPE_API_KEY "sk-你的Key"
setx QWEN_OCR_BASE_URL "https://llm-你的专属ID.cn-beijing.maas.aliyuncs.com/compatible-mode/v1"
# macOS / Linux
echo 'export DASHSCOPE_API_KEY="sk-你的Key"' >> ~/.zshrc
使用
重启 opencode,在对话里直接拖入或粘贴图片发送即可,识别结果自动以文字形式交给主模型。整个过程全自动。
小结
- 主模型不支持图片 ≠ 不能用图片,中间件 + 云端 OCR 是通用解法
- 视觉模型选免费的
qwen3.5-ocr足够应付截图、文档、UI、照片等场景 - 专属 API 端点和 Key 都是敏感信息,务必环境变量化 + 不入库