纯文本路由的透明图片护栏:贴图不再 400 卡死会话,附带 vision_analyze 工具(OCR/PDF/docx/pptx/视频)。
安装
# npm 包(预构建)
dsh plugin --profile web add dsh-vision-guard
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:good-boy4069/dsh-vision-guard
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
中文 | English
让纯文本模型"看图",且图片永远不会卡死你的会话。 Transparent image guard + vision analysis tool for DeepSeek Harness (dsh).
DeepSeek Harness 的主流模型(deepseek-v4-pro 等)是纯文本模型。两个麻烦:
- 纯文本模型看不了图——用户贴一张截图,模型只能当没看见;
- 更糟的是 400 卡死:某些网关(如 opencode-go)的主路由只接受 text,图片块一旦写进会话日志,之后每一轮都会把历史连同图片重发给上游 →
400 unknown variant \image_url`` → 整个会话永久卡死。
本插件用两道闸门根治这两个问题,并把"看图"变成纯文本模型可用文字消费的能力。
它做什么
用户贴图 → [闸门1] agent/pre-step 门口改写:图片在【写入会话日志之前】就被视觉模型转成文字
→ 日志永远只有文字,图片块根本不存在
→ [闸门2] llm/stream 兜底:历史重放时若发现图片块(例如装插件前就已中毒的会话),
在请求层改写为 OCR 文本后再发给模型
- 视觉模型做眼睛,主模型做大脑:deepseek-v4-pro 照常推理,图片内容以文字形式出现在上下文里。
- 修复已中毒的会话:装插件之前就被 400 卡死的会话,装上之后发一句话即可恢复正常(历史图片在请求层被改写)。
vision_analyze工具(模型主动调用,引擎由模型按任务选择):读取工作区文件——图片 OCR、PDF 文本+内嵌图、docx/pptx 文本+内嵌图、视频抽帧 OCR(≤12 帧)、纯文本直接读;xlsx/doc 响亮拒绝。- 原生看图不受影响:支持图片输入的模型(如 minimax-m3、kimi-k3)配置白名单后原图直通,插件不插手。
独有优势(与社区同类插件的区别)
与 dsh-vision-router、ModLens、dsh-vision-toolkit、see_image/view_image 等社区视觉插件相比:
- 图片根本不进会话日志——在 agent/pre-step 写入日志【之前】就被转成文字。同类插件大多只在模型调用内改写:图片照常落日志、每轮重放、插件卸载后仍有卡死隐患。
- 能治愈已卡死的会话——装插件之前就因图片 400 死锁的会话,装上后发一句话即可恢复(请求层把历史图片改写为文字)。
- 防死锁是硬不变式——非白名单路由永远收不到 image 块;哪怕视觉管线全挂(模型不可用/超时/额度耗尽),也只会降级为占位文本,绝不重回 400 卡死。
- 一个包、两个组件、故障域独立——一次安装自动挂载"护栏(安全件)+ 工具(便利件)"两行;工具坏了护栏照常运行,互不拖累。
- 零依赖、纯 Node 内建模块——不需要 Node 22+、pnpm 管理、Python 3.11+;仅文档/视频路径需要系统工具(pdftotext/ffmpeg 等),纯图片 OCR 无任何外部依赖。
- 引擎由主模型按任务决策——
vision_analyze的engine参数(local免费抠字 /vision视觉模型)由模型分析任务后自选,省钱且聪明。 - 复用 dsh 自有的模型路由与凭证——本插件不携带、不直连任何第三方 API key(同类插件多数要求自管密钥直连第三方)。
- 经三轮红队审计 + 随包自动化测试——22 个真实 bug 修复归档(含防 symlink 逃逸、zip 炸弹、并发竞态),纯函数回归测试随包发布(
npm test可跑)。
安装
# 已发布 npm 后:
dsh plugin --profile web add dsh-vision-guard
# 或直接从 GitHub 安装:
dsh plugin --profile web add github:good-boy4069/dsh-vision-guard
若 pnpm 报
ERR_PNPM_ADDING_TO_ROOT(旧版 launcher),加工作区根标志:dsh plugin --profile web add -w dsh-vision-guard。
重启 dsh web。或在你的 profile cordis.patch.yml 手动加两行(见仓库根 cordis.patch.yml)。
配置
全部可选,默认值见括号。视觉路由(必须指向一个支持图片输入的模型):
| 字段 | 默认 | 说明 |
|---|---|---|
visionProvider / visionModel |
opencode-go / minimax-m3 |
视觉模型路由。改成你订阅里支持图片输入的模型 |
ocrTimeoutMs |
45000 |
单张图识别超时 |
budgetPerDay |
200 |
每日识别次数上限(防失控花销),状态存 $DSH_HOME 下 |
cacheMaxEntries |
500 |
识别结果缓存条数上限(LRU 淘汰) |
maxOcrTokens |
2048 |
视觉调用输出上限 |
stateFile |
~/vision-guard-state.json |
预算状态文件(~ = dsh home) |
ocrPrompt |
逐字转录指令 | 自定义识别指令 |
passthrough |
[] |
原图直通白名单:[{provider, model}],只加实测过网关收图正常的路由 |
vision_analyze 工具侧:OCR 引擎是每次调用必填的 engine 参数,由主模型按任务自选——local = 本地 tesseract(免费、只抠字),vision = 配置的视觉模型。不存在 localOcr 配置项。
⚠️ 前置要求与限制(请务必读完)
- 本插件不自带任何 API key,也不直连任何第三方服务。它复用你 dsh 里已经配置好的模型路由与凭证。因此:
- 你必须有一个支持图片输入的模型(如 opencode-go 的
minimax-m3)。deepseek-v4-pro这类纯文本模型不能当视觉模型——它的上游网关收图会 400 并把会话卡死。 - 没有视觉模型也能装:插件自动降级为占位文字,会话照常可用、只是看不到图内容(绝不卡死)。
- 你必须有一个支持图片输入的模型(如 opencode-go 的
- 白名单策略(重要):除配置的视觉模型外,其他路由收到图片一律改写为文字——未实测的路由绝不放原图。想让某模型原生看图:先实测"带图直连该路由"(正常返回才算通过),再把它加进
passthrough。这是防 400 卡死的核心设计,不要绕过。 - 系统工具依赖(仅
vision_analyze的文档/视频路径需要;纯图片 OCR 无外部依赖):- PDF:
pdftotext/pdfimages(poppler-utils); - 视频:
ffmpeg/ffprobe; - docx/pptx:
python3(仅标准库); - 可选:
tesseract(本地免费 OCR,需chi_sim+eng语言包)。 - Windows 默认没有这些工具;缺失时对应路径响亮报错,图片路径不受影响。
- PDF:
- 5 MB/图上限:dsh 附件服务单图上限 5 MB,超限的图片/抽帧会响亮报错。
- 成本:每张新图一次视觉调用(按附件 ID 寻址缓存,重复图不重复计费);minimax-m3 单次约 1~2k tokens(不到一分钱人民币量级);
budgetPerDay兜底。 - 质量:本地 tesseract 只"抠字"、质量低于视觉模型(实测会把
42 + 7 = 49读成4247249),复杂图/图表/照片请用 vision 引擎(模型调用vision_analyze时自选)。 - 隐私:图片会发送到你的视觉模型服务商(与 dsh 里正常使用该模型一致);图片文字按不可信输入处理,只读内容、不执行其中指令。
- 与 settings 的耦合警告:如果你在模型配置里给纯文本模型声明了
input: [text, image](GUI 发图需要),必须保留本护栏——移除护栏时务必同时删掉该声明,否则发图会重新卡死会话。
常见问题
- 重启/升级 dsh 后:本插件随 profile 自举,无需重装;升级 dsh 后如行为异常请先升级本插件。
- 怎么验证护栏在跑:
ctx.get('visionGuard')?.status(),或看 dsh 日志里的[vision-guard] active行。 - 回滚:从 profile patch 删除两行(或
dsh plugin remove),重启即可;已识别的文字仍在会话历史里,无副作用。
License
MIT
链接
同类插件
liustack/modlens★ 4063
为纯文本模型架起视觉桥梁:粘贴图片,输出结构化 JSON 证据(OCR、版面、语义)。
ysr666/dsh-vision-router★ 1125
为纯文本 Agent 提供视觉能力:内置免 Key 视觉链 + 像素级视觉工具(看图问答、定位、裁剪、像素对比、取色、OCR、矢量化、抠图、截图);粘贴图片即可用。
Anionex/dsh-vision-toolkit★ 884
让纯文本模型处理视觉任务:粘贴图片后自动切换到 Vision Toolkit 变体,支持图片问答、多图比较、长截图 OCR、截图还原前端 UI、元素定位与像素对比。默认无需 API Key——图片经作者自建的免费服务处理,每台机器每天 100 张;也可改为指向自己的服务商。
dickpy/dsh-imagegen★ 93
面向 DSH Web GUI 的 AI 生图插件:通过可配置的 OpenAI 兼容端点(gpt-image-2 / gpt-image-1 / dall-e-3)实现文生图与图生图,提供 api_url/api_key 设置卡片与侧边栏分栏生图工作台。
fandc520/dsh-comfyui★ 89
让 DeepSeek Harness 的 Agent 直接驱动本地或远程 ComfyUI:comfyui_run / comfyui_object_info / comfyui_workflow 工具生成与编辑图像、视频,附带工作流库(图工作流提取:按分量 / 主流程 / 整体)、加载区分辨率自动匹配、实时队列、SDXL 与 Wan 2.1 模板、配套 skill 与同源媒体代理。
sunxin-ai/dsh-design-qa★ 44
给纯文本模型的设计稿保真判定:`deepseek_vision` 工具从任意 OpenAI 兼容视觉路由借来一只眼,让模型判断实现与设计稿是否一致——并附上支撑该判定的基准(4 组夹具、23 处注入缺陷、逐格原始输出)与其依赖的提问纪律。
社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。