截图发给 Codex,它回我"我看不到图片"——给 DeepSeek 装一双千问的眼睛


摘要:Codex + DeepSeek 模型没有识图能力——截图甩过去,AI 要么装傻让你"描述一下",要么 token 直接爆掉。本文记录从踩坑到解决的完整过程:为什么不用 GPT-4o、怎么用阿里云百炼的 Qwen3-VL-Flash 做识图代理、.env 配错路径 401 了三次才通的暗坑。附带完整的 Codex skill 配置方案。


📌 前言 / 问题场景

晚上 11 点,Spring Boot 启动报了一长串异常。你懒得逐行复制,直接 Win+Shift+S 截图,贴进 Codex:

“帮我看看这个报错。”

AI 秒回:

“我暂时看不到你发的图片内容——图片标签里没有可读取的路径。你能描述一下图片里是什么内容吗?”

你心想行吧,手动敲了几行关键报错。然后你又截了第二张——配置文件、第三张——依赖树。AI 突然开始胡言乱语,回复的内容是 10 分钟前聊过的。你一看:上下文爆了,token 超限

3 张截图,8000 token 白扔,问题没解决,还搭进去一晚上。更气的是——你用的 DeepSeek-V4-Pro 本来就不认图,图片传进去只是占坑不干活。

这不是配置问题,是模型天生没长眼睛。


📋 环境说明

组件 版本/说明
Codex CLI open-source 版本
底层模型 DeepSeek-V4-Pro / DeepSeek-V4-Flash
模型 Vision 能力 ❌ 无
识图方案 claude-vision-skill(GitHub 开源,后面细说)
识图模型 阿里云百炼 Qwen3-VL-Flash
成本 新用户 100 万 token 免费,识一次图约 300-500 token

🔍 问题复现

发第一张图时:

用户: [图片: error-log.png] 帮我看看这个报错 Codex: 我暂时看不到你发的图片内容——图片标签里没有可读取的路径。 你能描述一下图片里是什么内容吗?

发第 3 张图时:

Codex: [开始复读 10 分钟前的对话内容,完全忽略当前问题]

根因:DeepSeek 的 API 不处理 image_url 字段。图片以 base64 格式传进去了,但模型根本不解析——白白占着上下文窗口,还挤掉了真正有用的对话历史。


🧭 排查过程

尝试 1:换 GPT-4o ❌

第一反应——换个有 Vision 的模型不就完了?

GPT-4o 确实能看图。但很快发现三个问题:

  • API Key 不通用,DeepSeek 的 Key 调不了 OpenAI
  • 单独买 GPT-4o 额度,每月多一笔开销
  • 最关键的是:我就是想用 DeepSeek 写代码,换模型等于换工具,本末倒置

排除结论:不能换主模型,得在"外部"解决识图。

尝试 2:自己写 Python 脚本调千问 API 🤔

思路很直接——千问 VL 模型有 OpenAI 兼容接口:

  1. Python 读图片 → base64
  2. POST 到阿里云 DashScope
  3. 拿到文字描述,粘贴回 Codex

正要动手,搜 GitHub 时发现已经有现成的——claude-vision-skill。虽然名字带 Claude,但本质就是个 OpenAI 兼容的识图脚本,和模型无关。

决定:直接用,不重复造轮子。把精力省下来解决怎么和 Codex 的 skill 机制集成

最终方案:Codex Skill + Qwen3-VL-Flash ✅

核心思路:把识图做成 Codex 的一个 skill,每次用户发图时自动拦截 → 调千问 API → 把文字描述注入上下文。主模型(DeepSeek)完全感知不到图片的存在,它只看到一段文字描述。


🛠️ 解决方案

Step 1:获取阿里云百炼 API Key

打开 阿里云百炼控制台,创建 API Key。

新用户送 100 万 token,识一次图大概 300-500 token,日常使用几乎不花钱。

Step 2:安装 skill

ash git clone https://github.com/asuojun/claude-vision-skill.git ~/.codex/skills/claude-vision-skill

项目核心就一个 ision.js——读图 → base64 → 调 OpenAI 兼容 API → 返回文字描述。不绑定任何特定模型,细节可以看它的 README

Step 3:配置 .env(这里踩了最大的坑)

在 skill 目录下创建 .env:

`env

~/.codex/skills/claude-vision-skill/.env

DASHSCOPE_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxx
VISION_MODEL=qwen3-vl-flash
`

⚠️ 暗坑:.env 放错路径,401 了三次

第一次我把 .env 放在了项目根目录 → 401。
第二次放在 ~/.codex/ 下 → 还是 401。
第三次才反应过来——vision.js 读的是自己同目录的 .env,也就是 skill 目录下。

javascript // vision.js 里的加载逻辑 try { require("dotenv").config({ path: path.resolve(__dirname, ".env") }); } catch {}

就这一行,折腾了十几分钟。README 没写清楚 .env 的具体路径要求。

为什么选 qwen3-vl-flash 而不是 qwen-vl-max?

  • Flash 版响应快(< 2 秒),日常识图足够
  • Max 版更准但慢,适合需要识别代码截图语法高亮细节的场景
  • 日常排查截图 Flash 完全够用

Step 4:验证

配置完重启 Codex,发一张截图测试。正常流程:

用户发图 → skill 拦截 → vision.js 调千问 → 返回文字描述 → DeepSeek 基于描述回复

整个过程对用户透明——你只管发图,AI 自动识图。


🧠 原理分析

为什么这样设计?

`mermaid
sequenceDiagram
participant U as 你(用户)
participant C as Codex CLI
participant S as claude-vision-skill
participant Q as 千问 VL (DashScope)
participant D as DeepSeek 模型

U->>C: 发送截图
C->>S: 检测到图片 → 触发 skill
S->>S: vision.js 读图 → base64 编码
S->>Q: POST /chat/completions<br/>(image_url + prompt)
Q-->>S: "这是一段 Spring Boot 的异常日志…"
S-->>C: 文字描述注入上下文
C->>D: "用户发了一张图,内容是:…请帮他分析"
D-->>C: 基于文字描述回复
C-->>U: 输出结果

`

关键设计决策:

决策点 方案 A 方案 B(采用) 理由
识图谁来做 换 GPT-4o(主模型直接识图) 千问 VL 做代理 不换主模型,继续用 DeepSeek 写代码
图片怎么传 图片 base64 直接进 DeepSeek 上下文 图片 → 文字描述后注入 图片不进主模型上下文,不爆 token
脚本自己写还是用开源 手写 Python 调千问 用 claude-vision-skill 省时间,专注 Codex skill 集成

这个模式可以复制

不只是识图——任何主模型不具备的能力(TTS 语音合成、视频理解、联网搜索),都可以用 skill + 外部 API 代理 的模式补上。

本质就是:主模型只管推理,外围 skill 负责"翻译"它理解不了的输入格式


📝 总结

  1. DeepSeek 不识图不是 bug,是设计选择——它就没长眼睛,别折腾配置
  2. 别换模型,加代理——千问 VL 就看图、DeepSeek 就写代码,各干各的
  3. .env 放对路径——vision.js 读的是自己同目录下的 .env,不是项目根目录
  4. 新用户免费额度够用很久——100 万 token,按每次 500 token 算,能识 2000 张图
  5. 这个模式可以到处复用——skill + 外部 API = 给任何模型打补丁

📚 参考资料


© 本文为原创内容,转载请注明出处。

如果这篇踩坑记录帮你省了一晚上排查时间,欢迎点赞 👍、收藏 ⭐、关注 ➕,后续还会分享更多 Codex + AI Agent 的实战经验。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐