dsh-image-bridge
by Seryta
DSH(DeepSeek Harness)插件:把用户在 Web GUI 里附加到消息中的图片,用视觉模型 (默认智谱 GLM-4V-Flash,免费)转成文字描述后注入对话,让 DeepSeek 这类纯文本 模型也能"看见"图片。
DSH (DeepSeek Harness) plugin: converts images attached to messages in the Web GUI into textual descriptions via a vision model (default Zhipu GLM-4V-Flash, free) and injects them into the conversation, so text-only models like DeepSeek can also see pictures.
安装
dsh plugin --profile web add github:Seryta/dsh-image-bridgeGitHub 源码安装:首次需按提示配置 allowBuilds 构建授权后重试
安装与环境配置指引、插件开发教程见 DSH 中文社区文档 ↗
安装即在你的机器上以你的权限运行第三方代码——它可读写文件、使用凭据、访问网络,DSH 的工具审批不会为插件代码加沙箱。「检测到 manifest」仅代表发现 dsh.bundle / dsh.plugin 清单,不构成兼容性或安全审查;安装前请审阅源码,不熟悉的插件先在不含密钥的环境试用。
README
DSH(DeepSeek Harness)插件:把用户在 Web GUI 里附加到消息中的图片,用视觉模型 (默认智谱 GLM-4V-Flash,免费)转成文字描述后注入对话,让 DeepSeek 这类纯文本 模型也能"看见"图片。
原理(挂载点)
- 拦截点:
agent/pre-step瀑布事件。它在模型请求组装前运行,返回的PreStepDecision.messages就是进入本步的消息列表,可在进入前替换。 - 图片数据结构:消息内容块里
{ type: 'image', attachment: ImageAttachmentRef }; 图片字节由附件服务(ctx.attachments.readImage)按内容寻址引用取出。 - 成功时把图片块替换为
[图片描述] …文本块,文本块原样保留。 - 图片准入:若所选模型声明
inputModalities: ['text'],harness 会在消息进入 循环前拒绝图片。需要配套一个补 image 模态声明的插件(见 llm-deepseek-image-admit, 或任何同类 provider 包装)。
韧性策略
- 单模型重试:429/503 指数退避重试(默认 2 次:1s、2s);
- 模型回退:404、重试耗尽、其他 5xx 换下一个模型;默认免费档降级链
glm-4.6v-flash → glm-4.1v-thinking-flash → glm-4v-flash;thinking 模型的<think>推理块自动剥离; - 失败降级:全部失败时图片块替换为
[图片识别失败] …说明文本——本轮 继续跑,模型如实告知用户;不放过图片块触发UNSUPPORTED_CONTENT整轮失败。
功能特性
- attachmentId 转译缓存(单图消息):同一张图在后续步骤不再重复识别;
- 体积/分辨率上限:超
maxImageBytes(默认 10MB)或maxImagePixels(默认 40MP)直接失败说明,不送重试链; - tool-result 嵌套图片递归转录;
- content parts 数组健壮性:网关返回
[{text}]数组时按序拼接; - 四点式逐字转写 prompt:逐字文字 → 版面结构 → 视觉元素 → 其他细节, 完整优先于简洁;
- 多厂商凭证 env 名:
ZHIPU_API_KEY / ZHIPUAI_API_KEY / VISION_API_KEY / DASHSCOPE_API_KEY依次尝试。
配置
| 项 | 环境变量 | 默认 | 说明 |
|---|---|---|---|
| 模型 | IMAGE_BRIDGE_MODEL |
glm-4v-flash |
主模型名 |
| 回退模型 | IMAGE_BRIDGE_FALLBACKS |
glm-4.6v-flash,glm-4.1v-thinking-flash,glm-4v-flash |
逗号分隔,依次尝试 |
| 重试次数 | IMAGE_BRIDGE_RETRIES |
2 |
单模型在 429/503 上的额外重试次数 |
| 描述语言 | IMAGE_BRIDGE_LOCALE |
zh |
zh 中文 / 其他英文 |
| 端点 | IMAGE_BRIDGE_BASE_URL |
智谱 OpenAI 兼容端点 | 换任意 OpenAI 兼容 VLM(配对应 key env 名) |
| 图片字节上限 | IMAGE_BRIDGE_MAX_IMAGE_BYTES |
10485760(10MB) |
超限直接失败说明 |
| 图片像素上限 | IMAGE_BRIDGE_MAX_IMAGE_PIXELS |
40000000(40MP) |
width×height 超限直接失败说明 |
| 单次请求超时 | —(仅 cordis config attemptTimeoutMs) |
30000 ms |
|
| 总预算 | —(仅 cordis config budgetMs) |
75000 ms |
单条消息识别总时间上限 |
凭证读取顺序:环境变量 → ctx.credentials.resolve → ~/.dsh/.credentials.yaml
兜底解析(极简 KEY: value 行)。key 绝不进入日志。
安装
dsh plugin --profile web add github:Seryta/dsh-image-bridge
安装后重启 dsh web。纯手写 JS,零构建、零第三方依赖,仅用 Node 内置模块。
验证
# 单元自检(无网络、不读真实凭证,12 条路径)
node index.test.mjs
覆盖:成功替换、503 退避重试、404 回退、重试耗尽降级+notice、空响应降级、
无图片放行、无 key 降级、单图缓存命中、体积超限、<think> 剥离、
parts 数组拼接、tool-result 嵌套递归。
与同类插件的差异
| 项目 | 形态 | 本插件的取舍 |
|---|---|---|
| dsh-vision-proxy | provider-route 包装 + 请求流内转录 | 本插件挂 agent/pre-step 重写消息,不改 provider 路由;多模型统一生效 |
| dsh-vision | view_image 工具 |
工具形态模型需主动调用;本插件自动转录、模型无感 |
| modlens | read_image 工具 + 模型变体 + 结构化 evidence | 本插件不引入模型变体与 schema 约束,零配置零构建 |
已知限制
- 一次消息里多张图片合并为一次视觉 API 调用、一段描述;转译缓存按有序 attachmentId 组合键命中(同组同序的图片每步不重复识别;换序视为不同 组合、重新识别)。
- 缓存按 attachmentId 存描述文本(上限 100,FIFO 淘汰);失败结果不缓存。
- 图片不做压缩/缩放预处理;超限图片直接失败说明而非自动压缩。
- 免费档 VLM 可能限流;重试/回退后仍失败走失败说明路径,对话不受影响。
License
MIT
原始 README: https://github.com/Seryta/dsh-image-bridge/blob/master/README.md ↗
同类插件
查看全部 →
modlens
为纯文本模型架起视觉桥梁:粘贴图片,输出结构化 JSON 证据(OCR、版面、语义)。

dsh-vision-toolkit
让纯文本模型更好地做视觉任务:带意图的图片问答、长截图 OCR、UI 还原等。

dsh-vision-router
为纯文本 Agent 提供视觉能力:内置免 Key 视觉链 + 像素级视觉工具(看图问答、定位、裁剪、像素对比、取色、OCR、矢量化、抠图、截图);粘贴图片即可用。

dsh-vision-complete
给 DeepSeek 补上「眼睛和耳朵」的多模态视觉插件:看图 / OCR / 物体检测 / 视频理解 / 语音转写 / 截图直读,一键安装(DSH 插件)。

dsh-media-skills
面向纯文本模型的免费视觉桥与生图:粘贴读图、GLM-4V-Flash 与 Gemini 引擎故障转移、modlens 同款结构化证据输出,并自动播种免费视觉模型路由。

dsh-vision-opencode
给纯文本主模型加可配置识图模型:vision_read_image 工具、输入框识图模型选择器,以及纯文本路由的图片自动转文字。