ysr666/dsh-vision-router
ysr666/dsh-vision-router为纯文本 Agent 提供视觉能力:内置免 Key 视觉链 + 像素级视觉工具(看图问答、定位、裁剪、像素对比、取色、OCR、矢量化、抠图、截图);粘贴图片即可用。
移除拦截图片请求的多模态能力门禁:改写 llm.resolveModelInfo 的返回值与适配器模型表,为未声明 input 的路由补上 image 输入能力,使其可以发送和读取图片。不改 app.asar,也不改配置树。
去掉 DeepSeek Harness(DSH)「当前模型不支持图片」的拒绝限制,让未声明多模态能力的模型也能发送和读取图片。
不修改 app.asar 里任何一行代码,也不改配置树——纯运行时接缝,随 DSH 升级继续可用。
DSH 判定一条路由能否吃图片,依据两处能力声明:
LlmModelInfo.inputModalities(可选字段)。缺这个字段,或数组里没有 "image",
就被当成纯文本模型。这是所有门禁的唯一判定来源:
| 位置 | 表现 |
|---|---|
会话控制器 prompt() | 发送时弹「当前模型不支持图片,请切换支持图片的模型」 |
子代理 assertImageCapable | 向子代理发图被拒 |
read_file 读图 | does not declare image input |
| MCP / ACP 图片注入 | 同上 |
适配器自己持有的模型表(不经过上面那处)。pi-ai 在发请求前查
model.input.includes("image");deepseek 适配器序列化前查
connection.models[].inputModalities。
典型触发场景:自定义/本地网关路由(如 Agent2API、自建 OpenAI 兼容网关)在配置里只写了
id / name / contextWindow / maxTokens,没写 input,于是落到默认值 ["text"],
被判定为不支持图片——哪怕上游模型其实支持。
只用两个运行时接缝:
llm.resolveModelInfo,给结果补上 "image" → 拆掉上表中所有门禁。llm.adapters,把适配器模型表里的 input / inputModalities 补上
"image" → 拆掉 pi-ai 的自检。适配器换快照(配置热更新)时自动重做。plugin_manager 安装(推荐)在 DSH 里让 agent 执行:
plugin_manager action: install_bundle target: github:wmk66ds/dsh-vision-unlock
或在 Web UI 的 设置 → 插件 面板里,把上面这串填进安装框。
target 也可以写完整 URL,两种等价:
| 写法 | 说明 |
|---|---|
github:wmk66ds/dsh-vision-unlock | GitHub 简写,推荐 |
https://github.com/wmk66ds/dsh-vision-unlock | 完整 git URL |
锁定版本用 # 加 ref:
github:wmk66ds/dsh-vision-unlock#v1.0.0
若本机访问 GitHub 不畅,DSH 走的是它自己的网络栈;必要时先确认你的代理环境 能被 DSH 进程继承(例如 Clash Verge 的 TUN / 系统代理)。
把本仓库放到一个稳定的路径,例如 D:\workbench\dsh-vision-unlock。
在你的 profile 目录(默认 ~/.dsh/profiles/desktop/)的 node_modules 下建立指向它的链接:
cmd /c "mklink /J `"%USERPROFILE%\.dsh\profiles\desktop\node_modules\dsh-vision-unlock`" `"D:\workbench\dsh-vision-unlock`""
编辑该 profile 的 package.json,在 dsh.profile.bundles 数组加入 "dsh-vision-unlock",
并在 dependencies 加入 "dsh-vision-unlock": "link:D:/workbench/dsh-vision-unlock"。
重启 DSH。
Windows 上用 junction(
mklink /J)而不是符号链接——后者需要管理员权限。 注意 desktop profile 由 Electron 应用独占管理,dsh plugin --profile desktop会拒绝执行,所以才有这里的手动步骤。
cordis.patch.yml 里的 config:
- insert:
- id: vision-unlock
name: 'dsh-vision-unlock'
config:
providers: [] # 留空 = 所有 provider;否则只放行列出的
models: [] # 留空 = 所有模型;否则只放行列出的
两个白名单都为空时全部放行;非空时需同时命中才放行。
llm.adapters 暴露,
本插件改不到。该路由如需图片,请在设置页给模型勾选 Image(等价于写
inputModalities: [text, image])。从 profile 的 package.json 中删掉 dsh-vision-unlock(bundles 与 dependencies 两处),
删除 node_modules/dsh-vision-unlock,重启 DSH。
针对 DSH 桌面版(含 dsh-llm / dsh-llm-pi-ai / dsh-api-session-controller)验证。
依赖的是 llm.resolveModelInfo 与 llm.adapters 这两个接口,若上游改动需要同步调整。
MIT