给 DeepSeek 加一双"眼睛":用 opencode 插件实现图片识别


📝 本文由 DeepSeek(AI) 根据博主本人的项目记录整理总结,部分表述可能与实际略有出入,仅供学习参考。

DeepSeek 很聪明,但它看不了图。想让它分析一张截图、识别照片里的文字、描述一张 UI 界面,直接丢图片过去只会得到一句”我无法查看图片”。

今天分享一个低成本解法:给 opencode 写一个消息中间件插件,把图片自动转成文字描述,再交给 DeepSeek 处理。原理是”借”阿里云百炼的 qwen3.5-ocr 视觉模型来当眼睛。

思路:在主模型之前拦截图片

opencode 提供了 experimental.chat.messages.transform 钩子,可以在这个时刻改写即将发送给主模型的消息。插件的完整流程:

  1. 扫描用户消息里所有图片(mimeimage/* 开头的文件 part)
  2. 读取图片内容(支持 data URL、本地路径、http(s) 链接)
  3. 调用百炼的 OpenAI 兼容接口,让 OCR 模型完整提取文字 + 描述物体/场景/布局
  4. 把原图片替换成 [图片内容] + 识别文本的纯文本 part
  5. 主模型拿到的就是纯文本,完全无感

这样用户上传图片后什么都不用管,体验上和原生支持图片的模型一模一样。

两个关键设计

自动跳过有视觉能力的主模型。 通过 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 都是敏感信息,务必环境变量化 + 不入库

  目录