ysr666/dsh-vision-router
ysr666/dsh-vision-router为纯文本 Agent 提供视觉能力:内置免 Key 视觉链 + 像素级视觉工具(看图问答、定位、裁剪、像素对比、取色、OCR、矢量化、抠图、截图);粘贴图片即可用。
纯文本路由的透明图片护栏:贴图不再 400 卡死会话,附带 vision_analyze 工具(OCR/PDF/docx/pptx/视频)。
中文 | English
让纯文本模型"看图",且图片永远不会卡死你的会话。 Transparent image guard + vision analysis tool for DeepSeek Harness (dsh).
DeepSeek Harness 的主流模型(deepseek-v4-pro 等)是纯文本模型。两个麻烦:
400 unknown variant \image_url`` → 整个会话永久卡死。本插件用两道闸门根治这两个问题,并把"看图"变成纯文本模型可用文字消费的能力。
用户贴图 → [闸门1] agent/pre-step 门口改写:图片在【写入会话日志之前】就被视觉模型转成文字
→ 日志永远只有文字,图片块根本不存在
→ [闸门2] llm/stream 兜底:历史重放时若发现图片块(例如装插件前就已中毒的会话),
在请求层改写为 OCR 文本后再发给模型
vision_analyze 工具(模型主动调用,引擎由模型按任务选择):读取工作区文件——图片 OCR、PDF 文本+内嵌图、docx/pptx 文本+内嵌图、视频抽帧 OCR(≤12 帧)、纯文本直接读;xlsx/doc 响亮拒绝。与 dsh-vision-router、ModLens、dsh-vision-toolkit、see_image/view_image 等社区视觉插件相比:
vision_analyze 的 engine 参数(local 免费抠字 / vision 视觉模型)由模型分析任务后自选,省钱且聪明。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 配置项。
minimax-m3)。deepseek-v4-pro 这类纯文本模型不能当视觉模型——它的上游网关收图会 400 并把会话卡死。passthrough。这是防 400 卡死的核心设计,不要绕过。vision_analyze 的文档/视频路径需要;纯图片 OCR 无外部依赖):
pdftotext/pdfimages(poppler-utils);ffmpeg/ffprobe;python3(仅标准库);tesseract(本地免费 OCR,需 chi_sim+eng 语言包)。budgetPerDay 兜底。42 + 7 = 49 读成 4247249),复杂图/图表/照片请用 vision 引擎(模型调用 vision_analyze 时自选)。input: [text, image](GUI 发图需要),必须保留本护栏——移除护栏时务必同时删掉该声明,否则发图会重新卡死会话。ctx.get('visionGuard')?.status(),或看 dsh 日志里的 [vision-guard] active 行。dsh plugin remove),重启即可;已识别的文字仍在会话历史里,无副作用。MIT