dsh-plugin-verified-search
f0909172434
Verified current-source search workflow for DeepSeek Harness
PROJECT TOPICS
PROJECT README
让不支持图片输入的模型(如 DeepSeek)也能接收图片消息的 DeepSeek Harness (dsh) 插件。
原理:图片消息到达模型前,agent/pre-step 钩子把消息里的 image 块替换为文本占位(含附件本地路径 + 识图脚本调用指令)。agent 收到后调用自带识图脚本(默认 qwen 视觉模型)描述图片,再基于描述回答。模型请求里永远只有文本,不会触发适配器的图片拒绝逻辑。
assertTextOnly)对历史消息里的 image 块会直接抛 UNSUPPORTED_CONTENT——一张图进过会话后,之后每一轮都失败。modelInfo.inputModalities 拒绝无图模型的图片消息。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)
DASHSCOPE_API_KEY(阿里云百炼 DashScope,千问视觉模型)。
脚本也会回退读取 $DSH_HOME/.credentials.yaml 里的 DASHSCOPE_API_KEY。发布版的插件本身只做"图片 → 文本占位"的替换;要让图片能进到这一步,还需要两处官方包补丁(升级 dsh 后丢失需重打):
@deepseek-ai/dsh-host-apiproxy 两处图片模态检查改为绕过lib/index.js 与 lib/types/api-proxy.js:if (modelInfo.inputModalities ...) → if (false && ...)@deepseek-ai/dsh-llm-deepseek/lib/index.js:assertTextOnly 从"抛错"改为"把 image 块中和成文本占位",serializeMessages 使用中和后的 content。⚠️ 改动 dsh 官方包属于高危修改:改前备份、改后
node --check验证、重启后测试。
用户发图 ──▶ GUI 附件落盘 $DSH_HOME/attachments/v1/objects/<ab>/<sha256>
│ (apiproxy patch 放行无图模型)
▼
agent/pre-step 钩子(本插件)
├─ await next() 拿完整 decision(保留 persona/工具上下文)
└─ image 块 → 文本占位:[图片…本地文件 <path>。先用识图脚本…node vision-qwen.mjs "<path>"…]
│
▼
模型(纯文本请求)→ agent 调用 vision-qwen.mjs(qwen3.7-plus)→ 描述图片 → 回答
vision-qwen.mjs <图片路径> [自定义提示词]
qwen3.7-plus(DashScope OpenAI 兼容端点,实测支持图像输入)DASHSCOPE_API_KEY(环境变量或 $DSH_HOME/.credentials.yaml)node vision-qwen.mjs photo.png "描述这张照片"MIT
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。