前言¶
在 DSH(DeepSeek Harness)里用文本模型对话时,想贴一张截图、一段报错界面或一张表格照片,通常只有两条路:换一个原生多模态模型接管整个对话,或者在对话之外手动把图片描述成文字再粘贴进来。前者等于换掉对话大脑,后者每次都要重复操作。
DSH 的理念是「一切皆插件」,这件事也可以交给插件解决。下面介绍的 dsh-vision-recognizer 做的就是:保持 DeepSeek 作为对话大脑,随时附加图片,并可在 设置 → 插件 里随时切换识图供应商。
这是什么¶
dsh-vision-recognizer 是 kaixinbaba 维护的 DSH 视觉插件,MIT 许可证,当前版本 0.2.0,要求 node >= 22.19.0、dsh >= 0.1.0-rc.8。
它注册一条 adaptive provider 路由(默认 id 为 vision-recognizer,在模型选择器中显示为「DeepSeek + 智能识图」),包裹所配置的对话供应商,DeepSeek 是默认被包裹的对话供应商。这条路由始终放行图片附件,再按实际选中的模型分流:
粘贴图片 ─▶ vision-recognizer 路由 ─▶ 选中的模型支持图片输入?
├─ 是 → 原生图片请求,直接透传图片块
└─ 否 → 调用所配置视觉模型转译为文字,
纯文本模型收到 [图片转译] 结果
也就是说,原生多模态模型看到的是原始图片块,纯文本模型收到的是识图模型转译好的文字,对话大脑始终不变。
核心功能¶
供应商与协议¶
内置 15+ 国内外供应商:OpenAI、Anthropic Claude、Google Gemini、OpenRouter、Azure OpenAI、Ollama(本地)、阿里 DashScope、QwenCloud (Intl)、智谱 GLM、百度千帆、讯飞星火、Moonshot Kimi、腾讯混元、火山引擎豆包、SiliconFlow;任意 OpenAI 兼容端点可通过自定义供应商接入。
协议上同时支持 OpenAI 兼容(/chat/completions)与原生 Anthropic Messages,Claude 开箱即用。
防挂起与回退链¶
- 本地 / 匿名端点有硬性 20s 超时上限;
- HTTP 429 快速失败;
- 失败端点冷却 60s;
- 无 key 且无本地 Ollama 时快速失败,并给出可操作的指引,而不是把请求挂住。
主模型失败后,插件按序尝试 fallbackModels 里的每个条目(每项可指向不同厂商),全部失败才报错,并列出每一次尝试。
缓存与本地路径¶
- 内容哈希缓存:同一张图片每进程最多转译一次(进程内缓存,上限 200 条);
autoLocalOllama(默认开启)会探测http://localhost:11434,把运行中的 Ollama 前置到回退链中,图片不出本机。
安装与启用¶
安装只需一条命令,插件无构建脚本、完全无原生依赖(不需要 sharp 审批):
dsh plugin --profile web add dsh-vision-recognizer
npm 源慢时,可以指定镜像:
dsh plugin --profile web add dsh-vision-recognizer --registry=https://registry.npmmirror.com
本地开发安装:
dsh plugin --profile web add file:/path/to/dsh-vision-recognizer
注意必须带 file: 前缀。裸写 add . 或 add link: 会让 pnpm 以符号链接方式安装包,插件的 schemastery 依赖会从源码目录解析而找不到,导致失败。这是 pnpm symlink 安装的通用问题,不是插件本身的 bug。
重启 dsh web 后,做三件事:
1、在模型选择器选择「DeepSeek + 智能识图」;
2、打开 设置 → 插件 → Vision,选择回退视觉供应商、填入 API key 并保存;
3、在对话中粘贴图片——原生多模态选中模型直接接收原图,纯文本选中模型收到 [图片转译] 结果。
选中原生多模态模型时不需要回退 key;纯文本模型且既无 key 也无本地 Ollama 时,该轮对话会快速失败并给出指引,而不是挂起。
配置入口与存储¶
设置 → 插件 → Vision 里可以完成全部配置:选择供应商、填写 API key、覆盖 model / endpoint / token 上限 / 超时 / marker,保存后立即生效,无需重启。
UI 保存的配置写入 $DSH_HOME/vision-recognizer.json,启动时合并到打包默认值之上;cordis.patch.yml 只承载出厂默认值,用户 cordis.patch.yml 的覆盖仍可作为组合期回退。
有一个 patch 语义要留意:插件包自带的 - insert: 会把这行追加进条目列表,如果你在自己的 cordis.patch.yml 里再写同 id(dsh-vision-recognizer)的 - insert:,适配器会被重复注册(未定义行为)。想覆盖个别键,应写单个顶层 - id: dsh-vision-recognizer 条目,更好的做法是直接用设置 UI。
Key 的解析顺序是:UI 填写的 key → 供应商环境变量 → $VISION_API_KEY / $DASHSCOPE_API_KEY。
另外,各供应商的默认模型只是起点,模型 id 会随时间漂移,可在设置 UI 中覆盖 Model。
适用范围与已知限制¶
自适应回退只在选中「DeepSeek + 智能识图」这条包裹路由时生效;选择其他供应商路由会直接调用该路由。rc8 未暴露可以给所有现有路由统一加回退行为的公共 decorator hook。
rc8 还有两个已知限制:能力查找与已准备目标分发是分离的公共操作,在这个小窗口内被 HMR 替换的目标适配器可能与路由决策竞态;嵌套的目标委托也会进入 llm/stream 瀑布(README 在该处的描述被截断,细节以仓库为准)。
适用场景与安装前注意¶
适合的人群:
- 主要用 DeepSeek 做对话大脑,但希望随时能贴图的用户;
- 想在多家识图供应商之间随时切换、或优先用本地 Ollama 让图片不出本机的用户;
- 固定只用某一家原生多模态模型的用户则不需要这条包裹路由,直接选择该供应商路由即可。
安装前注意:插件以当前 dsh 进程的权限运行,建议先到 GitHub 仓库检查源码与许可证(本项目为 MIT)再安装。
小结¶
dsh-vision-recognizer 用一条自适应包裹路由解决了「想贴图又不想换对话大脑」的问题:多模态模型直接收图,纯文本模型自动落到识图转译,供应商可在设置里随时切换,本地 Ollama 开箱可用。
- 插件目录页:https://www.skillhub.cn/plugins/kaixinbaba/dsh-vision-recognizer
- GitHub 仓库:https://github.com/kaixinbaba/dsh-vision-recognizer
目录页为社区维护的独立站点,与 DeepSeek / 幻方无官方从属关系。