使用dsh-vision给纯文本DeepSeek Harness加上view_image识图能力

前言

DeepSeek Harness(dsh)是 DeepSeek 开源的智能体运行时,官方仓库的定位是「一切皆插件」:工具、界面、模型适配都可以以外挂形式挂进同一套 Cordis 运行时。当前开发者预览阶段迭代很快,兼容性破坏变更是预期之内的事。

社区里有一份独立的插件目录(https://deepseek-harness-plugin.com/zh-CN/plugins/),用来检索、分类和给出安装命令。它不是 DeepSeek / 幻方的官方应用商店,和官方仓库没有从属关系。目录按功能分成界面增强、工具与能力、模型与提供方等类别,本稿写到 2026-08-18 时,目录里大约有 288 个插件。

日常用 dsh 写代码、看报错、对照 UI 截图时,会碰到一个很具体的限制:主对话模型如果是纯文本的 deepseek-v4 一线,本身看不了图。把截图丢进会话,模型要么拒绝,要么只能根据文件名瞎猜。社区因此出现了不少「视觉桥」插件,思路并不完全一样:有的在消息进入模型前把图片转成文字,有的注册一套像素级工具,有的走 MCP。本稿介绍的是 william-jin-cmu 维护的 dsh-vision:它不改主模型,只注册一个 view_image 工具,把「看图」外包给任意 OpenAI 兼容的视觉语言模型(VLM)。

同一份社区目录里还有其他也叫 dsh-vision 的仓库(例如 oil-oil、linenxi-ctrl 的同名插件),安装地址和实现都不同。下面说的一律是目录页 dsh-vision-william-jin-cmu 对应的这一份。

这是什么

dsh-vision 是一个 DeepSeek Harness 插件,由 william-jin-cmu 维护,许可证 BSD-3-Clause,主要语言 TypeScript。GitHub 仓库是 https://github.com/william-jin-cmu/dsh-vision ,npm 包名写成 @dsh-external/dsh-vision,当前清单版本 0.1.0。社区目录把它归在「界面增强」,收录日期 2026-08-15;仓库创建于 2026-08-05,最近一次推送是 2026-08-13。本稿核对当天,目录页和 GitHub API 上的星标都是 33。

它解决的问题可以压成一句话:纯文本 DeepSeek 看不了图,插件给运行时补一个 view_image 工具。模型带着问题和图片来源去调用它(OCR、数数、读图表、看 UI 布局,以及任意视觉问题),插件把图片和问题转发到任意 OpenAI 兼容的 VLM 端点,答案以文本返回。目录页和 README 都写明:装上之后,dsh 的 web、TUI、远程通道这些入口会同时获得这个工具。

实现上它是原生 Cordis 插件,依赖 @deepseek-ai/dsh-tools@deepseek-ai/dsh-system-promptschemastery,用运行时自带的 fetch/chat/completions,不引入 Python、uv 或 MCP。README 说桥接形状和 Qwen 官方 Qwen-MM-Plugins 的 vision_chat 一致:一条 image_url 加上一条文本问题。

需要先分清边界:它不会自动把你在输入框里粘贴的图片块转成文字再喂给主模型。工作方式是工具调用——用户提到一张本地图或一个 URL,模型决定调用 view_image,再根据返回的文本继续推理。若你要的是「粘贴即识图、消息里的 image 块被替换成描述」,那是另一类插件的路线,不要和这一份混用。

核心功能

根据目录详情页、README 和仓库源码(src/index.tssrc/vlm.ts)交叉核对,当前能力如下。

1、注册 view_image 工具。

工具说明里写得很直接:看一张图,并回答关于它的问题。参数有两个:

  • source(必填):图片来源,可以是本地绝对路径、http(s) URL,或 data: URL。
  • question(可选):想从这张图里问什么。不传时,源码默认问题是全面描述,包括可见文字原文、整体布局和显著细节。

系统提示里会加一小节,告诉主模型:它自己看不见图,但只要截图路径、图片 URL、图表、UI 稿和视觉有关,就应该调用 view_image,而且问题要具体,宁可多次聚焦调用,也不要一次问得很空。

2、把图片交给任意 OpenAI 兼容 VLM。

本地文件会先按扩展名判断 MIME,读成 base64,再以内联 data: URL 发出去;http(s) 和已有的 data: URL 原样转发。源码里支持的本地扩展名是 .png.jpg.jpeg.webp.gif.bmp.tif.tiff.heic。默认大小上限是 10 MiB(maxImageBytes,可改),超时默认 60 秒。请求会带上工具执行的 AbortSignal,用户取消对话时,发给 VLM 的请求也会停。

3、一套 baseURL + apiKey + model 换后端。

README 给出的常用组合如下(端点、模型名以仓库文档为准,厂商价格和配额会变,这里只转述文档,不当作长期报价):

  • 默认免费档:https://open.bigmodel.cn/api/paas/v4,模型 glm-4.6v-flash
  • 同端点付费升级:glm-4.6v
  • 阿里云百炼兼容模式:https://dashscope.aliyuncs.com/compatible-mode/v1,文档示例是 qwen3-vl-flash;截图 / GUI 场景文档建议换 qwen3.7-plus,难图上 qwen3.8-max
  • 火山方舟:https://ark.cn-beijing.volces.com/api/v3,文档示例是带日期后缀的 doubao-seed-2-1-turbo-260628。短名(例如 doubao-seed-2.0-lite)按 README 会 404,可用列表要查方舟的 GET /api/v3/models
  • 离线:http://localhost:11434/v1,例如 qwen3-vl:4b,走本机 Ollama,不需要 key。
  • 预留:README 写到 2026-08,DeepSeek 官方识图 API 尚未开放,官方口径是 soon;一旦上线,按文档是改一行配置,沿用已有 DeepSeek key。

默认走智谱时,源码还有一条免费档降级链:主模型返回 429 / 404 / 5xx 时,依次试 glm-4.1v-thinking-flashglm-4v-flash。自定义了 fallbackModels 就按自定义列表走;换了非默认 baseURL 或主模型后,这条智谱降级链不会自动套上去。

4、密钥、推理块和错误信息的处理。

API key 的读取顺序在 README 和源码里一致:插件配置 apiKey → 环境变量 VISION_API_KEYDSH_VISION_API_KEY(只认已经 export 的值;文档写 dsh 0812 起 .env 文件里禁止 DSH_ 前缀变量)→ ZHIPUAI_API_KEYDASHSCOPE_API_KEY。推荐写进 ~/.dsh/.env 的名字是 VISION_API_KEYbaseURL 指向 localhost / 127.0.0.1 / ::1 时可以不配 key。错误信息里的 key 会被替换成 ***。thinking 类模型夹在正文里的推理块会被剥掉;如果整段回复只剩推理、没有答案,会提示把 maxTokens 调高。文档建议这类模型至少 maxTokens: 2048

README 还附了一组作者在 2026-08-05 对 4K 屏幕截图问答的实测表,覆盖智谱、百炼、方舟、Kimi 等约 10 个模型,延迟大约从 2.9 秒到 21 秒不等。这是仓库作者的一次全链路调用记录,不是第三方评测,环境、题面和高峰限流都会影响结果,只能当选模型时的参考。

安装与启用

社区目录给出的安装命令如下,在 DeepSeek Harness 终端里运行:

dsh plugin add github:william-jin-cmu/dsh-vision

需要可复现安装时,按目录页的写法固定 commit 哈希:

dsh plugin add github:william-jin-cmu/dsh-vision#commit

#commit 换成具体的提交哈希。官方 CLI 文档里,往某个 profile 装 GitHub 插件的完整形式是 dsh plugin --profile <profile> add github:owner/repo;目录页这一条没有写 --profile,以页面原文为准。从 Git 源码安装时,pnpm 10 起可能拦截 prepare 构建脚本,第一次失败的话,按 dsh 提示把 allowBuilds 写进对应 profile 的 pnpm-workspace.yaml 再执行一次。

README 另外给了一种不经过插件管理器的本地挂载:把仓库 clone 到本机,把宿主的 @deepseek-ai/dsh-toolsschemastery 链到插件的 node_modules,再写入 ~/.dsh/config.yaml。文档里的 clone 地址写成了 https://github.com/dsh-external/dsh-vision,核对 GitHub API 时该地址与 william-jin-cmu/dsh-vision 是同一仓库。README 还提到用 DSH Companion 时插件已随应用自带、以及可选的 dshx install / dsh registry install;这两条只在该 README 里出现,本稿没有另开环境复核,需要的话以仓库当前文档为准。

目录页有一条安装前必须看的说明:插件以当前 dsh 进程的权限运行,安装时可能执行代码。装之前检查源代码仓库和许可证。

配置与用法

仓库给出的配置块如下,可以写在插件配置里:

dsh-vision:
  baseURL: https://open.bigmodel.cn/api/paas/v4
  apiKey: "" # 留空则读环境变量
  model: glm-4.6v-flash
  maxTokens: 2048
  timeoutMs: 60000
  maxImageBytes: 10485760

apiKey 留空时按上一节的环境变量顺序读取。源码里还有 fallbackModels,默认空数组;空着且仍是默认智谱端点 + glm-4.6v-flash 时,才会启用那条免费档降级链。

推荐的密钥写法是在 ~/.dsh/.env 里放:

VISION_API_KEY=你的智谱或百炼密钥

默认模型 glm-4.6v-flash 按 README 属于智谱免费视觉档,需要先到 https://open.bigmodel.cn 申请 key。没有 key、又不是 localhost 端点时,工具调用会直接报错,并提示去配 apiKey / VISION_API_KEY,或改成 Ollama。

README 里的调用流程是这样的(路径请换成你机器上的绝对路径):

用户: 看下 ~/Desktop/error.png 是什么报错
模型 → view_image(source="/Users/me/Desktop/error.png", question="这个报错的完整文本是什么?")
     ← "TypeError: Cannot read properties of undefined (reading 'map') at …"
模型: 这是一个 … 建议 …

仓库还描述过一次 dsh web + DeepSeek-V4-Flash 的实际过程:对纯文本模型说桌面上有一张 images.jpeg,模型自己定位文件、带着问题调 view_image,再把 VLM 返回的描述写进后续回答。你在 web、TUI 或远程通道里都可以用同样的说法,例如:

看一下 /home/me/screenshots/fail.png,把红色报错原文完整抄下来,并指出是哪一行代码抛的。
打开 https://example.com/chart.png,读出柱状图里 2025 和 2026 的数值对比。

问题写具体,比只说「看看这张图」更有效。这是插件系统提示里的建议,也符合工具本身「回答问题、不只做配图说明」的设计。

换后端时,改的是同一组字段。例如改用本机 Ollama:

dsh-vision:
  baseURL: http://localhost:11434/v1
  apiKey: ""
  model: qwen3-vl:4b

改用百炼:

dsh-vision:
  baseURL: https://dashscope.aliyuncs.com/compatible-mode/v1
  apiKey: ""
  model: qwen3-vl-flash

百炼密钥可以放在 DASHSCOPE_API_KEY,也可以统一用 VISION_API_KEY

适用场景与注意事项

比较适合这些情况:

  • 主模型是纯文本 DeepSeek,但日常要看报错截图、终端输出、UI 布局、图表或扫描件。
  • 希望识图后端可替换:云端免费档、百炼 / 方舟付费线、或本机 Ollama,用同一套工具接口。
  • 希望 web、TUI、远程通道共用一个 view_image,而不是只在某一个界面里生效。

使用前有几条需要当作约束,而不是可选项。

第一,插件以当前 dsh 进程的权限运行。view_image 会按给定的绝对路径读本地文件,安装和运行都可能执行代码。装之前看源码和 BSD-3-Clause 许可证;生产环境把 GitHub 来源钉在某个 commit 上。

第二,默认路径会把图片发到第三方 VLM。本地文件被编成 base64 后,POST 到你配置的 baseURL。桌面截图、客户单据、含密钥的报错页,都会离开本机。只有把 baseURL 指到 localhost(例如 Ollama)时,图片才不必出机器。选云端还是本地,等于在选数据边界。

第三,这是工具调用,不是多模态主模型。主模型仍然看不见像素;它能「看」的只有 VLM 返回的那段文本。描述质量、OCR 对错、图表读数,都取决于你选的视觉模型和提问方式。主模型如果没调用工具,插件不会在后台自动扫图。

第四,目录里同名插件很多。dsh-visiondsh-vision-routerdsh-vision-toolkitdsh-vision-proxydsh-vision-bridge 不是同一个项目。安装命令必须带上 william-jin-cmu/dsh-vision 这一段,不要只搜名字随便装一个。

第五,免费档会限流。智谱免费模型走公共容量池,429 时默认配置会降级到更老的免费视觉模型,细节会变少。高峰不稳定就换付费线、百炼或本地模型。方舟模型 ID 带日期后缀,短名 404 是文档里写过的坑。

第六,dsh 本身仍是 developer preview,插件声明的引擎下限是 dsh >= 0.0.1。宿主升级后工具注册方式、profile 布局或 .env 变量规则都可能变,以当时的 dsh 文档和插件 README 为准。

小结

dsh-vision 做的事情很窄:给看不了图的 DeepSeek 补一个 view_image,把视觉问题交给任意 OpenAI 兼容 VLM,再把文本答案交回智能体循环。维护者是 william-jin-cmu,许可证 BSD-3-Clause。社区目录的安装命令是 dsh plugin add github:william-jin-cmu/dsh-vision

它解决的是「纯文本模型 + 需要看图」这一种组合,并不把 dsh 变成原生多模态客户端,也不会替你保管图片隐私。装之前看源码、选好 VLM 端点、把密钥和体积限制配清楚,比先追求「有视觉」更要紧。

目录页:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-vision-william-jin-cmu/

GitHub:https://github.com/william-jin-cmu/dsh-vision

DeepSeek Harness 官方仓库:https://github.com/deepseek-ai/deepseek-harness

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜