我给纯文本模型装了双「眼睛」:纯文本大模型也能看图了
起因:一个让人抓狂的 400 报错
自从用上 Claude Code,我的 coding 效率确实起飞了。但有个坎一直过不去--
像 GLM、DeepSeek 这类纯文本模型,在 Claude Code 里有个致命问题:
你截个 bug 图、贴个设计稿,想问它"这报错咋整""这页面照着还原一下",结果直接 400 Bad Request。
原因很简单:这些模型压根不支持图片输入,Claude Code 把图片塞进请求里,上游直接拒收。
workaround 也不是没有:自己先把图丢给豆包/GLM-4V 识一遍,把文字描述复制回来,再喂给 Claude Code。能用,但每次都这么搞,人是会疯的。
于是我花了个周末写了 image-vision-mcp,一个让 Claude Code 拥有图像识别能力的 MCP server。一行 npx 接入,Ctrl+V 直接贴图,纯文本模型也能"看图说话"。
它能干什么
项目里其实是两个能力,可以单独用,也能组合用。
能力一:MCP 识图工具(默认)
给 Claude Code 装一个 vision_describe_image 工具,支持本地文件路径和网络图片 URL 两种输入。装完之后,对 Claude 说:
识别这张图:C:/Users/me/screenshot.png
描述一下这张网络图片:https://example.com/chart.png
按设计图还原规格解析:C:/Users/me/design.png
分析这个测试截图里的可见问题:C:/Users/me/bug.png
Claude 会自动调用识图工具。
能力二:HTTP 图片拦截代理(高级玩法,重点)
这才是真正解决痛点的部分。
你在 Claude Code 和上游 LLM 之间架一层本地代理(监听 127.0.0.1:8787)。当请求里带图片时,代理会:
- 拦截请求中的图片;
- 调一个视觉模型(豆包、Kimi、GLM-4V、Qwen-VL 任选)把图片转成文字描述;
- 把图片替换成描述文字,再转发给上游纯文本模型。
对上游模型来说,它收到的永远都是纯文本——400 报错?不存在的。
┌───────────────────────────────────────────────────────────┐
│ Claude Code │
│ ├─ 调用 MCP 工具 vision_describe_image -> 视觉模型 API │
│ └─ 发送消息(含图片)-> http://127.0.0.1:8787 (本代理) │
│ ↓ │
│ 代理拦截图片 -> 调视觉模型识别 -> 替换为文字 │
│ ↓ │
│ 转发纯文本请求 -> 上游 LLM API(如 GLM) │
└───────────────────────────────────────────────────────────┘
装好代理之后,体验是这样的:
在输入框里
Ctrl+V粘贴图片,随手打一句"这图里有啥问题",回车。
不用先说"识别图片",不用关心关键词——贴就完事了。
最让我得意的一个设计:自动分类识图
写这个工具的过程中,我发现一个事:不同类型的图,你其实想要的信息完全不一样。
- 设计稿 -> 你想要的是能直接还原的 HTML/CSS 规格、token、布局;
- 原型图/线框图 -> 你想要的是页面结构、交互逻辑的理解;
- bug 截图 -> 你想要的是异常信息、报错堆栈的定位分析;
- 普通图片 -> 老老实实描述内容就行。
所以我在 vision_describe_image 里内置了一个 auto 自动分类模式:视觉模型先判断这张图属于哪一类,再用对应的提示词模板输出结构化结果——而且是专门为纯文本大模型"能看懂、能接着干活"优化的结构。
四种模式可以显式指定:
| mode | 适用场景 |
|---|---|
auto(默认) | 自动判断,省心 |
design_rebuild | 设计图还原成代码规格 |
prototype_understanding | 原型图/线框图结构理解 |
bug_screenshot | 测试/异常截图分析 |
general | 普通图片描述 |
代理模式下也一样:哪怕你不写"还原/原型/bug"这些关键词,视觉模型也会先自动分类,再把对应的分析结果连同你的问题一起发给上游。
接入只要 1 分钟
Step 1:配 MCP server
编辑 ~/.claude.json(以火山方舟豆包为例,换成 Kimi / 智谱 / 通义都行,改下三个变量就好):
{
"mcpServers": {
"vision-mcp": {
"command": "npx",
"args": ["-y", "image-vision-mcp"],
"env": {
"VISION_API_KEY": "你的火山方舟-api-key",
"VISION_BASE_URL": "https://ark.cn-beijing.volces.com/api/v3",
"VISION_MODEL": "doubao-seed-2-1-turbo-260628"
}
}
}
}
到这一步,MCP 识图工具已经能用了。想用代理粘贴图,再加 Step 2。
Step 2:让 Claude Code 走代理
编辑 ~/.claude/settings.json:
{
"env": {
"UPSTREAM_BASE_URL": "https://你的上游-llm-api-地址",
"ANTHROPIC_BASE_URL": "http://127.0.0.1:8787",
"ANTHROPIC_AUTH_TOKEN": "你的上游-llm-api-token"
}
}
重启 Claude Code,Ctrl+V 贴图,搞定。
支持的视觉模型(凡是 OpenAI 兼容 /chat/completions 端点、支持 image_url + base64 的都行):
| 平台 | 模型示例 |
|---|---|
| 火山方舟(豆包) | doubao-seed-2-1-turbo-260628 |
| 月之暗面 Kimi | kimi-k2.6 |
| 智谱 | glm-4v-plus / glm-4.5v |
| 阿里百炼 | qwen-vl-max / qwen2.5-vl-72b-instruct |
| 硅基流动 | Qwen/Qwen2-VL-72B-Instruct 等 |
| OpenAI | gpt-4o / gpt-4o-mini |
小贴士:火山方舟上目前只有豆包系列支持视觉输入,GLM/DeepSeek 在方舟上是纯文本。要用 GLM-4V / Qwen-VL,走对应平台或硅基流动。
几个值得说说的工程细节
写完才发现,真正费功夫的不是"能跑通",而是这些边角:
- 防 SSRF:默认拒绝访问内网/私有网络图片 URL,想放开得显式设
ALLOW_PRIVATE_NETWORK_IMAGES=1。一个本地代理不防这点,迟早出事。 - max_tokens 按模式分配 + 截断自动升级:不同识图模式输出长度差异很大,设计图还原可能很长。按模式分配 token 预算,输出被截断时自动升档重试,避免设计稿还原到一半断了。
我平时的用法
- 看报错:测试跑挂了截个图丢进去,"分析下这个测试截图里的可见问题",比复制日志快;
- 还原设计稿:Figma 截图直接贴,"按设计图还原规格解析",输出能直接拿去改的 HTML+token;
- 看原型图:产品给的原型线框图,"理解下这个页面的结构和交互";
- 读图表:年报里的数据图、监控大盘截图,"分析下图表数据"。
本质上就是把 Claude Code 从"只能读字"变成"也能看图",而且不挑后端模型——你继续用国产文本模型,识图这事儿交给专门的视觉模型。
写在最后
项目开源在 github.com/staticdeng/…,MIT 协议,npx -y image-vision-mcp 即用。架构上预留了扩展点,任何 OpenAI 兼容的视觉模型都能接,欢迎提 issue 和 PR。
如果你也在用 Claude Code + 国产模型,被"不能贴图"折磨过,不妨试一下。觉得有用的话,给个 ⭐ 是对我最大的鼓励 :)