dsh-image-bridge
Let image-incapable LLM models receive image messages in DeepSeek Harness (dsh): replace image blocks with text placeholders + local paths, then describe via a vision script (qwen)
安装
此插件尚未提供可验证的 bundle,或兼容性检查未通过。请先阅读仓库说明。 阅读完整 README ↗
说明文档
阅读完整 README ↗dsh-image-bridge
让不支持图片输入的模型(如 DeepSeek)也能接收图片消息的 DeepSeek Harness (dsh) 插件。
原理:图片消息到达模型前,agent/pre-step 钩子把消息里的 image 块替换为文本占位(含附件本地路径 + 识图脚本调用指令)。agent 收到后调用自带识图脚本(默认 qwen 视觉模型)描述图片,再基于描述回答。模型请求里永远只有文本,不会触发适配器的图片拒绝逻辑。
为什么需要它
- dsh 的模型适配器(如 DeepSeek 的
assertTextOnly)对历史消息里的 image 块会直接抛UNSUPPORTED_CONTENT——一张图进过会话后,之后每一轮都失败。 - apiproxy 在 prompt 入口也会按
modelInfo.inputModalities拒绝无图模型的图片消息。 - 本插件 + 两个小 patch(见下)解决整条链路。
安装
- 把本仓库的
index.js和vision-qwen.mjs放进 profile 目录(两个文件必须同目录,或自行配置脚本路径):~/.dsh/profiles/web/image-bridge-plugin/{index.js, vision-qwen.mjs} - 在
~/.dsh/profiles/web/cordis.patch.yml注册:- insert: - id: image-bridge name: ./image-bridge-plugin/index.js config: enabled: true # visionScript: 自定义识图脚本路径(可选;默认同目录 vision-qwen.mjs, # 也可用环境变量 DSH_VISION_SCRIPT) - 配置识图 API Key:环境变量
DASHSCOPE_API_KEY(阿里云百炼 DashScope,千问视觉模型)。 脚本也会回退读取$DSH_HOME/.credentials.yaml里的DASHSCOPE_API_KEY。 - 重启 dsh web。
配套 patch(dsh 升级后需要重打)
发布版的插件本身只做"图片 → 文本占位"的替换;要让图片能进到这一步,还需要两处官方包补丁(升级 dsh 后丢失需重打):
- apiproxy 放行:
@deepseek-ai/dsh-host-apiproxy两处图片模态检查改为绕过lib/index.js与lib/types/api-proxy.js:if (modelInfo.inputModalities ...)→if (false && ...)
- DeepSeek 适配器图片中和(关键配套,缺了"消息都发不进来"):
@deepseek-ai/dsh-llm-deepseek/lib/index.js:assertTextOnly从"抛错"改为"把 image 块中和成文本占位",serializeMessages使用中和后的 content。- 该补丁同时自动治愈已中毒的会话(历史里的图片序列化为占位文本)。
⚠️ 改动 dsh 官方包属于高危修改:改前备份、改后
node --check验证、重启后测试。
工作原理
用户发图 ──▶ GUI 附件落盘 $DSH_HOME/attachments/v1/objects//
│ (apiproxy patch 放行无图模型)
▼
agent/pre-step 钩子(本插件)
├─ await next() 拿完整 decision(保留 persona/工具上下文)
└─ image 块 → 文本占位:[图片…本地文件
。先用识图脚本…node vision-qwen.mjs "
"…]
│
▼
模型(纯文本请求)→ agent 调用 vision-qwen.mjs(qwen3.7-plus)→ 描述图片 → 回答