用 dsh-read-image 让纯文本 DeepSeek Harness 模型读图

前言

DeepSeek Harness(dsh)把智能体运行时拆成可替换的插件:模型适配、工具、会话、界面都可以挂上去或换掉,官方把它概括成「Everything is a plugin」。开发者预览阶段里,一个很具体的摩擦很快就会碰到——主模型如果走的是纯文本路由,对话框里粘贴的截图、报错界面、UI 稿会被 api-proxy 的准入闸门拦下,像素进不了会话,文本模型也就无从「看」这张图。

社区插件 dsh-read-image 针对这件事做了即插即用的补丁:不改任何 preset,把图片放进会话、投影成 [Image #N],再由一等公民 read_image 工具配合可配置的视觉模型读回来。本文依据社区目录详情页、GitHub 仓库 README / package.json / LICENSE,以及 DeepSeek Harness 官方仓库 交叉核对后整理。需要说明的是,deepseek-harness-plugin.com 是独立运营的社区目录,站点自身声明与 DeepSeek / 幻方无官方从属、背书或赞助关系,不是官方应用商店。

这是什么

dsh-read-image 是一款「会话与消息」类 DeepSeek Harness 插件,由 OoWJZZoO 维护,仓库在 github.com/OoWJZZoO/dsh-read-image,许可证为 MIT。npm 包名为 @deepseek-ai/dsh-read-image,当前版本 0.1.0,主要语言 JavaScript。社区目录于 2026-08-15 收录;截至 2026-08-18,GitHub 星标为 3。package.jsondsh.client.platform 声明为 web,安装说明也围绕 web profile。

它要解决的不是「再做一个多模态聊天窗口」,而是这三件已经写进 README 的事:

  • 纯文本路由不再因为用户发了图片而被拦截
  • 发给文本 API 的请求里,图片块被替换成 [Image #N],像素不进入文本模型
  • Agent 可以按会话序号或文件路径调用 read_image,由你配置的视觉模型把图转成文字描述

要求 DeepSeek Harness 0.1.0-rc.6 或更高。Harness 仍处于开发者预览,README 写明:更新的 release candidate 可能需要兼容性适配。

核心功能

文本路由放行图片

用户发送图片时,插件包装 llm.resolveModelInfo,让文本路由对外声明可以接受图片输入,api-proxy 的准入闸门因此放行。卸载插件时会恢复原来的声明。能力真值表用包装前的原始 resolveModelInfo 构建,避免把自己伪装成「原生多模态」之后再据此做判断。

[Image #N] 投影

文本路由上,模型请求里的图片块会被同步替换成 [Image #N] 文本,再重新派发;像素不会进入文本 API。原生已经声明图片输入的多模态路由则原样放行。会话日志仍是事实源:图片引用照常持久化,替换只发生在模型可见边界。

一等公民 read_image 工具

每个会话在 session/created 时自动注册 read_image,并遮蔽 harness 内置的同名工具。工具描述会内插当前真实默认值,Agent 不必猜配置。参数如下:

  • image_index:读取会话中第 N 张图(对应 [Image #N]
  • file_path:按路径读本地图片,格式为 PNG / JPEG / WebP / GIF
  • prompt / reasoning_effort / timeout_ms / max_tokens / max_thinking_tokens:可选覆盖;省略则用配置默认值

文本路由下,配置的视觉模型把图片转成文字描述返回;原生多模态路由下,工具直接返回图片本身。调用是无状态的,同一张图可以反复读。

会话的基础路由本身已经声明图片输入时(README 举例 mimo-v2.5),插件不注册自定义工具、也不注入 [Image #N] 提示词段。该路由下图片直接进入模型上下文,模型看到的是 harness 内置 read_image(仅 file_path,语义是把图片本身返回)。

设置页与热加载

侧边栏齿轮进入设置后,有一页「读图」,用来选视觉模型和默认参数。配置底座是 $DSH_HOME/settings.yaml(未设置 DSH_HOME 时,Linux / macOS 为 ~/.dsh/settings.yaml,Windows 为 %USERPROFILE%\.dsh\settings.yaml),热加载、不必重启。Web 端写入 user layer,覆盖 yaml 里的对应项。

浏览器设置协议对插件命名空间有白名单(WEB_SETTINGS_NAMESPACES),插件自己的 settings.register() 对客户端只会得到 settings-not-exposed。因此「读图」页不走这条协议,而是经 host 侧 typert Remote 桥 readImageConfig.get/set 读写同一命名空间,headless 与 Web 共用一份配置。

启动自检

插件会探测它依赖的 harness 内部契约。任一检查失败时走安全失败:不挂载任何能力,harness 照常启动;完整诊断写入 ~/.dsh/logs/dsh-read-image-guard.log(Windows 为 %USERPROFILE%\.dsh\logs\dsh-read-image-guard.log),前台只打一条短提示。关闭自检需要在 dsh-read-image 段把 guard.enabled 设为 false,README 标明这是自担风险。

安装与启用

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

dsh plugin add github:oowjzzoo/dsh-read-image

仓库 README 推荐明确装到 web profile(GitHub 用户名大小写为 OoWJZZoO;GitHub 不区分大小写,与目录页的 oowjzzoo 指向同一仓库):

dsh plugin --profile web add github:OoWJZZoO/dsh-read-image

然后重启 dsh web。本包通过 dsh.bundle 清单附带 cordis.patch.yml,profile bundle 机制会自动合成插件行,不必手工改 patch。

如需可复现安装,目录页建议固定 commit 哈希。截至 2026-08-18,仓库 main 最新提交为 fa0bab0b1ffbf4b0320fc43d064719ea7276543a(2026-08-15,补充 Windows 路径说明):

dsh plugin add github:oowjzzoo/dsh-read-image#fa0bab0b1ffbf4b0320fc43d064719ea7276543a

手动安装时,把依赖写进 ~/.dsh/profiles/web/package.json,再在 cordis.patch.yml 插入插件行。README 给出的依赖钉在标签 v0.1.0

"@deepseek-ai/dsh-read-image": "github:OoWJZZoO/dsh-read-image#v0.1.0"
cd ~/.dsh/profiles/web && pnpm install
- insert:
    - id: read-image
      name: '@deepseek-ai/dsh-read-image'
      config: {}

两条路不要同时走:dsh plugin add 已经合成插件行,再手工加依赖并插入同一行,会把插件注册两次。

装完还要给视觉模型声明图片输入,并告诉插件用哪条路由、哪个模型:

# 1) 给视觉模型声明图片输入能力(pi-ai 路由)
llm-pi-ai:
  providers:
    <your-provider>:
      models:
        - id: <your-vision-model>
          input: [text, image]

# 2) 本插件配置
dsh-read-image:
  visionProvider: <your-provider>
  visionModel: <your-vision-model>

visionModel 必须声明 input: [text, image]。也可以在 Web 的「设置 → 读图」里选 provider 和模型,下拉选项来自「模型」页。其余键与 README 默认值如下:

默认值 说明
visionProvider 视觉模型所在的路由 provider
visionModel 负责读图的多模态模型 id
defaultPrompt 英文分步描述提示词(分类 → 文本逐字转 Markdown / 视觉描述) 未传 prompt 时使用
defaultReasoningEffort low 默认思考强度。low 是各主流模型普遍支持并生效的最低档;off 在很多适配器上等于不传该字段,对默认开思考的模型不关闭思考,思考会挤占 max_tokens
defaultTimeoutMs 300000 视觉调用超时,5 分钟
defaultMaxThinkingTokens 4096 思考 token 独立预算,不占输出配额;超预算导致输出为空时会显式报错
defaultMaxTokens 8192 实际输出上限;发给 API 的 max_tokens = 该值 + defaultMaxThinkingTokensreasoning_effort=off 时思考预算为 0,原样透传)
guard.enabled true 环境自检;false 跳过自检强行加载

典型用法

粘贴一张图后,文本模型看到的是 [Image #1],由 Agent 调用工具读回:

read_image image_index=1

读工作区或本地文件:

read_image file_path=/path/to/image.png

Windows 上 C:\Users\...C:/Users/... 两种写法都可以,反斜杠由 harness 文件服务处理。插件运行时是纯 Node.js,README 写明在 Windows 上原样可用;~/.dsh 对应 %USERPROFILE%\.dsh

需要针对这张图提问,或临时改思考强度、超时、token 上限时,把 promptreasoning_efforttimeout_msmax_tokensmax_thinking_tokens 一并传入即可覆盖默认值。同一张图可以多次调用。

适用场景与注意事项

适合主模型是纯文本、但会话里偶尔要看截图、报错界面、UI 稿或本地图片文件的 DSH 用户。已经在原生多模态路由上工作的会话(例如 README 提到的 mimo-v2.5)不会走 [Image #N] 投影,也用不到这套自定义工具。

使用前需要自己准备一条已声明 input: [text, image] 的视觉模型,并填好 visionProvider / visionModel。插件复用 ctx.llm 的凭证、重试和日志,视觉调用走的是你在 harness 里已经配好的那条链路,并不是内置免费识图服务。

目录页和官方插件安装说明都强调:插件以当前 dsh 进程的权限运行,安装时可能执行代码。安装前应检查源代码仓库和许可证。本插件为 MIT,源码在上述 GitHub 仓库;来自 GitHub 的插件在安装时还可能跑构建脚本,只应安装你信任的来源,需要可复现时固定 commit。

另外几条来自 README 的边界:

  • 依赖 harness 内部契约,版本升级后形态可能变化;自检失败时插件不加载,不要默认「装上就一定生效」
  • guard.enabled: false 会跳过保险丝,只在你清楚风险时使用
  • 不要把 dsh plugin add 和手工改 package.json / cordis.patch.yml 叠在一起
  • 开发 / 部署脚本 scripts/*.sh 是 POSIX bash,Windows 上要用 Git Bash / WSL / MSYS2,或按 README 手工拷贝 package.jsonlib/cordis.patch.yml

小结

dsh-read-image 做的是一条很窄的桥:纯文本 DSH 会话可以收下图片,模型侧只看到 [Image #N],真正识图交给你指定的视觉模型和 read_image 工具。不改 preset,Web 设置页可以直接改默认参数,启动时还有一层契约自检。

目录页:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-read-image/

GitHub:https://github.com/OoWJZZoO/dsh-read-image

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

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

小夜