Skip to content

第22课 · 让 DeepSeek 能看图

给 DeepSeek 配一双眼睛:小黑戴上眼镜看清世界

本节要点

  • 痛点:DeepSeek 是纯文本模型,给它发图片它「看不懂」——截图让它分析,它直接罢工
  • 两种解决办法:① 直接换成多模态模型(最省事);② 继续用便宜的 DeepSeek,给它配一个「识图子代理」
  • 本课重点:用 oh-my-opencode-slim 插件里的 observer(观察者)子代理,给它配上一个支持看图的模型
  • 一段现成指令:复制粘贴给 AI,它会自动帮你拉取模型、判断哪个能看图、完成全部配置并测试
  • 配好后,DeepSeek 遇到图片会自动「叫」识图子代理帮忙看,写前端代码能截图自查、报错直接截图发它

1. 痛点:DeepSeek 是个「瞎子」

前面课程里我们主推的是 DeepSeek——它便宜(按量收费)、编码能力强,性价比很高。但它有一个明显的短板:它是一个纯文本模型,不是多模态的,识别不了图片。

实际场景是这样的:你截了一张图(比如一个界面、一段报错信息),粘贴发给 DeepSeek,让它分析一下——结果它直接告诉你「我无法识别图片」。

写代码的时候这特别难受:

  • 让 AI 做前端界面,做完你想让它截图看看显示对不对——它看不了
  • 遇到报错,你懒得手敲错误信息,直接截图发它——它也看不了

等于这个 AI 干活很猛,但眼睛是瞎的。


2. 两种解决办法

方式一:直接换成多模态模型(最省事)

最简单的办法,就是别用 DeepSeek,换一个本身就支持看图的多模态模型。

现在市面上的选择很多,而且变化很快,常见的有:

  • Coding Plan 包月服务:比如 Kimi Coding Plan、小米的 Mimo 等,一个月固定费用随便用
  • 按量收费的多模态模型:阿里云百炼、硅基流动等平台都有
  • 免费的多模态模型:比如 MIMO 2.5(免费版就能看图)

想知道哪个编码模型最强

目前编码能力最强的大概是智谱 GLM 5.2Kimi code 2.7,你可以看看你常用的平台里有没有这两个,同时支持多模态的话,直接用就行。

换多模态模型后,粘贴图片它立刻就能识别,没有任何问题。

方式二:继续用便宜的 DeepSeek,给它配一个「识图子代理」 👈 本课重点

但 DeepSeek 实在便宜好用,很多人不想换。那怎么办?

办法是:DeepSeek 继续当主力(干文本的活),另外给它配一个专门负责看图的「助手」。 遇到图片,DeepSeek 会自动把图片交给这个助手看,助手看完再把结果告诉 DeepSeek。

这个「助手」,在 oh-my-opencode-slim 插件里叫 observer(观察者)子代理

💡 如果你没装 oh-my-opencode-slim 插件,先回到第5课把它装上。这节课的方法依赖这个插件。


3. 原理:oh-my-opencode-slim 是「多智能体」

回顾一下第 5、12 课讲过的:oh-my-opencode-slim 是一个「多智能体」插件。

它的结构像一个公司:

  • 编排者(orchestrator):相当于项目经理,负责理解你的需求、分配任务
  • 下面挂着好几个「子代理」:每个子代理擅长不同的活,比如查资料的、写代码的、做设计的……

其中有一个子代理叫 observer(观察者),它的特长就是看图、分析图片

问题是:这个 observer 子代理默认是关闭的(插件作者把它放在了「禁用列表」里)。我们要做的就三件事:

  1. 打开它(从禁用列表里移出来)
  2. 给它配一个支持看图的模型(比如阿里云百炼的视觉模型)
  3. 测试一下,让 DeepSeek 遇到图片时能自动叫它帮忙

听起来要改配置文件、选模型……有点复杂?别怕,我给你写好了一段指令,复制粘贴就行。


4. 准备:去服务商申请一个 API Key

在用指令之前,你需要先有一个支持看图的模型 API Key

推荐用你平时就在用的平台(任意一个都行):

平台特点
阿里云百炼阿里官方,模型全,有 qwen-vl 系列视觉模型
硅基流动聚合多个开源模型,价格便宜
其他平台智谱、Kimi、小米 Mimo 等,只要你那儿有多模态模型就行

阿里云百炼为例(其他平台流程类似):

  1. 浏览器搜索「阿里云百炼」(建议用微软必应搜,百度搜出来的经常是垃圾信息)
  2. 进入官网,注册账号 + 实名认证
  3. 充值一点钱(按量收费,看几张图花不了几毛钱)
  4. 在控制台找到「模型广场」,看看有哪些视觉模型 / 全模态模型(心里有个数就行,不用记)
  5. 创建一个 API Key,复制下来备用

API Key 是花钱的凭证

API Key 相当于你的钱包密码,谁拿到就能用你的额度。千万别发到群里、别提交到 git 仓库。 用完了不放心可以回去把它删掉重建。


5. 核心:复制这段指令,粘贴给 AI

这是本课的重头戏。把下面整段指令复制,粘贴给你正在用的 OpenCode(或 Claude Code)会话,发给它。

它会像一个安装向导一样,一步一步引导你完成配置——你只需要回答它问的两个问题(用哪家服务商、API Key 是多少),剩下的它全包。

markdown
# 任务:为 observer 子代理配置视觉模型(让它能读图)

## 背景
当前主模型是 DeepSeek(纯文本,不支持图像)。我要启用 oh-my-opencode-slim 的 observer 子代理,给它配一个支持视觉的模型,这样以后可以 `@observer 分析 /path/to/image.png` 让它读图。

## 三个硬性要求(之前失败的原因,必须全部满足)
1. **模型必须同时支持「图像输入」+「tool calling / function calling」**
   原因:observer 要调用 `read` 工具去读图片文件路径。纯视觉但不会 function calling 的模型(很多开源小 VL 模型就是这种)会让 observer 完全瘫痪。
2. **模型配置里 `modalities.input` 必须包含 `"image"`**
   原因:opencode 默认认为模型不支持图片,会主动剥离图片,read 工具返回 "Cannot read image (this model does not support image input)"。必填。
3. **`disabled_agents` 必须清空 observer**
   原因:oh-my-opencode-slim 默认禁用 observer,不清空它根本不会注册。

另外避开已知 bug:通过 @observer 直接拖图片附件会被 subtask 丢弃。**正确用法是传文件路径**让 observer 自己 read。

## 执行步骤

### Step 1:向我确认 provider 和 api-key
如果我没主动给,先问我:
- 提供商是哪家?(阿里云百炼 / 硅基流动 / OpenAI / Gemini / 智谱 / 其他)
- api-key 是多少?

### Step 2:检测操作系统 + 确定配置文件路径
- macOS / Linux:`~/.config/opencode/opencode.json``~/.config/opencode/oh-my-opencode-slim.jsonc`(或 `.json`
- Windows:`%USERPROFILE%\.config\opencode\opencode.json``%USERPROFILE%\.config\opencode\oh-my-opencode-slim.jsonc`(PowerShell 里用 `$env:USERPROFILE`

确认这两个文件实际位置(`.json``.jsonc` 以实际存在的为准),不存在就创建。后续所有命令都要适配当前 OS(macOS/Linux 用 `curl`,Windows PowerShell 用 `Invoke-RestMethod`)。

### Step 3:自动获取 provider 的模型列表,自己选出最合适的视觉模型
**不要套用任何预设的模型表,必须实时获取 + 判断。** 按下面流程做:

**(a) 调 provider 的 OpenAI 兼容 `/models` 接口拉取实际可用模型**
用我给的 api-key,请求 `{baseURL}/models`(带 `Authorization: Bearer {apiKey}`)。各 provider 的 baseURL:
- 阿里云百炼 DashScope:`https://dashscope.aliyuncs.com/compatible-mode/v1`
- 硅基流动 SiliconFlow:`https://api.siliconflow.cn/v1`
- 智谱 GLM:`https://open.bigmodel.cn/api/paas/v4`
- OpenAI:`https://api.openai.com/v1`
- 其他 provider:问我 baseURL

命令模板(按 OS 选一种):
```bash
# macOS / Linux
curl -s "{baseURL}/models" -H "Authorization: Bearer {apiKey}"
```
```powershell
# Windows PowerShell
Invoke-RestMethod -Uri "{baseURL}/models" -Headers @{Authorization = "Bearer {apiKey}"}
```
解析返回的 `data[].id` 列表,得到全部可用模型 ID。

**(b) 从结果里筛出候选视觉模型**
优先匹配名字含这些关键词的最新模型:`vl``vision``vlm``4o``ommivision``gemini-2``llava`。排除明显是纯文本的(`-text``-instruct` 不带 vl 的、embedding、tts、rerank 等)。

**(c) 查 provider 官方文档,确认候选模型支持 tool calling**
这一步**必做**,不能猜。用 webfetch/websearch 查 provider 官网的「模型列表/能力矩阵/function calling 支持情况」页面:
- 阿里云百炼:`https://help.aliyun.com/zh/model-studio/getting-started/models`
- 硅基流动:`https://docs.siliconflow.cn/cn/userguide/capabilities/text-generation`
- 智谱:`https://open.bigmodel.cn/dev/howuse/model`
- OpenAI / Gemini:查各自官方模型文档

确认候选模型在官方文档里**明确标注支持「图像输入」+「工具调用/function calling/tools」**

**(d) 选出最终模型**
从通过 (c) 验证的候选里,按这个优先级选一个:
1. 同系列里版本号最新的(`qwen3-vl` > `qwen2.5-vl` > `qwen-vl`
2. 参数量大的优先于小的(`-72b` > `-7b`),因为小 VL 模型经常不支持 tool calling
3. `max` / `plus` / `pro` 档优先于 `flash` / `lite`(除非我明确说要省钱的)

把你的选择和**判断依据**(拉到了哪些模型、查了哪个文档页、为什么选这个)告诉我。

⚠️ 如果候选里没有任何模型同时支持 vision + tool calling,停下来告诉我,让我换 provider 或换模型,不要硬配。

### Step 4:修改 opencode.json —— provider 配置
**关键:api-key 直接写在 `options.apiKey` 里,不要用 env 字段,不要碰环境变量。** `modalities` 必填。

第三方 provider 模板(OpenAI 兼容):
```jsonc
{
  "$schema": "https://opencode.ai/config.json",
  "provider": {
    "<provider名>": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "<显示名>",
      "options": {
        "baseURL": "<baseURL>",
        "apiKey": "<我给你的api-key>"
      },
      "models": {
        "<Step 3 选定的模型ID>": {
          "name": "<显示名>",
          "modalities": {
            "input": ["text", "image"],
            "output": ["text"]
          },
          "limit": {
            "context": <查文档得到的context>,
            "output": 8192
          }
        }
      }
    }
  }
}
```
内置 provider(OpenAI / Google)不需要 npm 和 baseURL,直接在 `models` 里加模型定义即可,api-key 按 opencode 内置方式配置(读对应环境变量;如果用户坚持内置 provider,问他是否愿意设该环境变量)。

- 如果 opencode.json 已有内容,**合并进去**,不要覆盖现有 provider。
- ⚠️ 提醒我:api-key 是明文存在配置文件里,别把这个文件提交到 git。

### Step 5:修改 oh-my-opencode-slim 配置 —— 启用 observer 并配模型
两件事:
1. `disabled_agents` 设为 `[]`(或确保不含 `observer`
2.**当前 active preset** 的 observer 块里配置模型。preset 名读配置文件里的 `"preset"` 字段。

```jsonc
{
  "disabled_agents": [],

  "presets": {
    "<当前preset名>": {
      "observer": {
        "model": "<provider名>/<Step 3 选定的模型ID>",
        "temperature": 0.1
      }
    }
  }
}
```
- 如果 observer 块已存在,只改 model 字段,不删其他配置。
- 如果文件是 `.json` 不是 `.jsonc`,改对应那个,且不能用注释。

### Step 6:测试
提示我**重启 opencode**(配置改动必须重启才生效)。

重启后,让我准备一张测试图放到临时路径:
- macOS / Linux:`/tmp/test-vision.png`(截一张图即可)
- Windows:`$env:TEMP\test-vision.png`

然后执行:
```
@observer 请用 read 工具读取并描述这张图片:<上面那个路径>
```

### Step 7:排查清单(测试失败时按顺序检查,每步报告结果)
1. **@observer 有反应吗?** 没反应 → `disabled_agents` 没清空,回 Step 5。
2. **observer 有没有尝试调用 read 工具?**
   - 完全不调工具、只会说话 → 模型不支持 tool calling,回 Step 3 重新选(可能官方文档和你判断的不一致,换更高档的模型)。
   - 这是最重要的检查项。
3. **read 工具返回 "Cannot read image (this model does not support image input)"?**
`modalities.input` 没含 `"image"`,回 Step 4。
4. **observer 报 "我无法访问文件路径"?**
   → 这是模型幻觉,不是真错。确认它有 read 工具权限,提醒它"用 read 工具读路径"。
5. **api-key 报 401/鉴权失败?** → 回 Step 4 检查 `options.apiKey`;也可能是 Step 3 的 /models 接口当时就该报 401,回去看那一步。
6. **模型返回乱码或拒绝?** → 可能模型 ID 拼错,对照 Step 3 拉到的列表重新核对。

## 完成后报告给我
- 当前操作系统、两个配置文件的完整路径
- 拉到的模型列表(视觉相关的几个)
- 查了哪个官方文档页、最终选了哪个模型、为什么(确认它同时支持 vision + tool calling + 是最新版)
- 贴出最终两个文件相关片段(api-key 用 `sk-***` 打码)
- 测试是否通过、observer 实际调用了哪些工具
- 给我一个以后使用的示例:`@observer ...`

它会怎么引导你

把指令发出去后,它会按这个流程走(你照着回答就行):

  1. 它会问你两个问题
    • 「视觉模型用哪一家?」→ 你回答,比如「阿里云百炼」
    • 「API Key 是多少?」→ 你把第 4 步申请的 key 粘贴给它
  2. 它会自动去拉取这家服务商有哪些可用模型(联网调用接口)
  3. 它会判断哪些模型是「多模态(能看图)」+「支持 tool calling(能调用工具)」的——这两个条件缺一不可,因为 observer 要靠调用工具来读图片文件
  4. 它联网查官方文档确认后,自动选一个最合适的最新模型
  5. 它帮你改两个配置文件:把服务商加进去、把 observer 打开、配好模型
  6. 让你重启 OpenCode,然后测试——准备一张图,让它识别

整个过程你只需要回答两个问题,其余全自动。

为什么不直接写死一个模型,而要让它联网去查

因为模型更新太快了——今天最好的视觉模型,半年后可能就过时了。让 AI 每次都实时去拉取模型列表 + 查文档判断,是为了让这段指令将来也能用,不管哪个厂商出了新模型,它都能自己找到最合适的。这是「面向未来」的设计。当然,代价是配置时多花一两分钟联网查询。


6. 小技巧:看清楚 AI 到底在干什么

配置过程中,AI 会联网、会调接口、会改文件,可能你只看到界面一直显示「思考中」,不知道它在干嘛,干等得心慌。

打开这两个开关,就能看见它的全部动作:

  1. 点 OpenCode 的设置(齿轮图标)
  2. 找到**「显示推理摘要」**,打开 —— 你能看到它的思考过程
  3. 找到**「显示 shell 工具」**(执行终端脚本),打开 —— 你能看到它跑了哪些命令、调了什么接口

打开之后,它执行的每一步你都能看得清清楚楚,不再是「黑箱」里干等。

💡 这两个开关平时也建议开着,尤其让 AI 跑脚本、装东西的时候,能看到它在干啥,心里有底。


7. 重启并测试

AI 改完配置后,会让你重启 OpenCode(配置改动必须重启才生效)。关掉重开就行。

然后新开一个会话,测试一下:

  1. 随便复制一张图片(截图、网上的图都行)
  2. 粘贴发给 DeepSeek,让它「分析一下这张图片」

如果配置成功,你会看到:DeepSeek(依然是那个便宜的文本模型)遇到图片后,会自动调用 observer 子代理去识别,然后把图片内容告诉你——等于 DeepSeek「长眼睛」了。

⚠️ 注意一个已知的小坑:直接把图片拖进对话框发给 @observer 有时不生效(这是 opencode 的一个已知 bug,会把图片附件丢掉)。如果遇到这种情况,改成把图片存成文件,告诉它路径让它读,就稳了。正常粘贴给 DeepSeek 主会话、让它自动调度 observer,是没问题的。


8. 这能给你带来什么

配好之后,DeepSeek 在这些场景下会「变聪明」很多:

  • 写前端代码时:让 AI 做完界面后截图自查,看看显示对不对、布局有没有错位——它能自己看了
  • 遇到报错时:懒得手敲那一长串错误信息?直接截图发它,它看图就能帮你分析
  • 看设计稿/界面图:发一张设计图让它照着做,它能看懂图里的内容

简单说,就是给原本只能读文字的 AI,配了一双能看图的眼睛。


9. 补充:也可以直接指定模型(更快)

上面那段指令是让 AI 联网自动查找最合适的模型,好处是将来模型更新也能用,坏处是配置时要等它联网查一两分钟。

如果你已经知道自己要用哪个模型(比如阿里云百炼的某个视觉模型),可以在回答它问题时直接告诉它,比如:

「阿里云百炼,用 qwen3-vl-plus 这个模型,API Key 是 sk-xxx」

这样它就跳过联网查找,直接配,几秒钟搞定。适合你已经熟悉某个平台、知道哪个模型好的情况。


10. 常见问题与避坑

10.1 oh-my-opencode-slim 插件死活装不上怎么办?

这是群里被问得最多的情况之一。如果插件怎么都装不成功(网络、权限、环境各种原因),不要卡在这里

直接去学第23课,用 Vision MCP 方案给 AI 加识图能力。MCP 方案不依赖任何插件,任何支持 MCP 的 AI 工具都能用,效果和第22课一样。

💡 两门课是并列关系,不是递进关系。第22课用插件里的 observer 子代理,第23课用 MCP 工具,二选一即可。哪个能跑通就用哪个。

10.2 粘贴图片后 DeepSeek 没反应,或者提示看不了?

正常流程下,你把图片粘贴到 DeepSeek 主会话,它会自动调度 observer 去读图。但有时候会失败,常见原因:

现象原因解决办法
粘贴后 DeepSeek 说「我无法识别图片」observer 没配好,或者 disabled_agents 没清空按第7节排查清单检查
粘贴后完全没调用 observeropencode 有时会把图片附件丢掉(已知 bug)把图片保存成文件,给路径让它读,最稳
多模态模型直接粘贴可以,DeepSeek 不行DeepSeek 本身纯文本,必须靠 observer 间接读图正常现象,确认 observer 配置正确

最稳妥的用法:截图保存到临时路径(如 /tmp/test.pngD:\temp\test.png),然后对 DeepSeek 说:

「请让 observer 读取这个路径的图片并描述:/tmp/test.png」

10.3 阿里云百炼和硅基流动有区别吗?

流程上没有本质区别,都是申请 API Key → 选视觉模型 → 填进配置。只是接口 baseURL 不同:

  • 阿里云百炼:https://dashscope.aliyuncs.com/compatible-mode/v1
  • 硅基流动:https://api.siliconflow.cn/v1

新手推荐阿里云百炼,因为文档比较全、qwen-vl 系列视觉模型成熟。硅基流动价格便宜,但开源模型多,选模型时要更注意是否同时支持 vision + tool calling。

10.4 怎么确认 observer 真的被启用了?

配置完重启 OpenCode 后,在会话里输入:

@observer 你好

如果它回应了,说明 observer 已经注册成功。如果提示「没有 @observer 这个代理」或没反应,说明 disabled_agents 里还禁着它,回 Step 5 检查配置文件。


11. 这个插件在哪些工具里能用

oh-my-opencode-slim 这个插件,根据它的文档,在 Claude CodeOpenCode 里都可以用。也就是说,上面这套「给 DeepSeek 配识图子代理」的方法,在这两个工具里都适用。


12. 下节预告:更通用的 MCP 方式

这节课的方法依赖 oh-my-opencode-slim 插件(用了它内置的 observer 子代理)。

下一节,我们会讲一个更通用的办法——配置一个 MCP

MCP 的好处是:任何 AI 工具都能用,不管你用的是 Claude Code、OpenCode,还是别的——只要支持 MCP,就能加上这个「看图」能力。比子代理的方式适用面更广。

我们下节课见。


关键收获

TIP

DeepSeek 是纯文本模型,看不了图。不想换模型的话,用 oh-my-opencode-slim 插件里的 observer 子代理给它配一个「识图助手」:先去阿里云百炼/硅基流动等平台申请一个视觉模型的 API Key,然后复制本课第 5 节那段现成指令粘贴给 AI,它会自动引导你完成全部配置(拉取模型、判断哪个能看图且支持工具调用、改配置、测试)。配好后 DeepSeek 遇到图片会自动叫识图子代理帮忙看。配置时记得打开「显示推理摘要」和「显示 shell 工具」开关,看清 AI 在干什么。


更多课程:课程大纲

© 2025 逆行的狗