dsh-web-search-ddg
aooyoo
Zero-token DuckDuckGo search provider for the DeepSeek Harness (DSH) web seam — local headless browser, no API key, no m…
PROJECT TOPICS
PROJECT README
DSH 多模态输入插件:为不同类型的文件(图片 / 视频 / 音频 / 文本)配置独立的处理模型链,在文件进入会话模型之前,先用预设模型把它处理成 Prompt Tokens(文本),再交给会话模型。插件在 DSH 设置中新增独立的 Multimodal 页面。
DeepSeek 等会话模型只接受文本输入(inputModalities 为 text)。DSH 原生行为是:向这类模型附加图片时直接拒绝(Model does not support image input),视频 / 音频 / 普通文件则根本无法附加。本插件在发送路径上拦截文件输入:先调用你配置的多模态模型(如视觉模型)把文件转成描述文本,再把文本作为 Prompt Tokens 发给会话模型。
model does not support image input)。在 DSH 设置 → 模型 中把本地视觉模型(如 Ollama 的 uGemma4)的 input 配置为 [text, image];multimodal/send 接管——消息立即入日志(用户消息含图片 + 文字原样显示,输入栏立即清空),描述在首个模型调用时由 llm/stream 瀑布惰性解析并注入上下文(日志永不被修改,同一图片+提问只跑一次链);你输入的文字会一并注入处理提示词;# 在 DSH 中挂载(web profile)
dsh plugin --profile web add <本插件路径或 tgz>
# headless profile 也会用到设置时同样挂载
dsh plugin --profile headless add <本插件路径或 tgz>
浏览器硬刷新(Ctrl+Shift+R)后,设置中会出现「Multimodal」页。
客户端改动热加载,无需重启 dsh web;host 半改动需要重启。
示例:给图片预设配置一个视觉模型 → 发送图片时自动生成描述文本再进入文本会话模型;配置了原生多模态会话模型时,图片则原样交给会话模型。
plugins:
multimodal:
enabled: true
presets:
- id: image
name: 图片
kind: image
patterns: [] # 空 = 匹配该类型所有文件;如 [*.png, *.jpg]
prompt: 请详细描述这张图片…
maxBytes: 10485760 # 覆盖大小上限(字节,默认 10MB)
onError: note # 默认 note(替换为失败说明);或 pass-through
models:
- provider: deepseek-official
model: deepseek-chat
- provider: openai
model: gpt-4o
npm install
npm run typecheck # 类型检查
npm test # vitest
npm run build # tsc 类型 + tsdown 打包(lib/index.js + lib/client.js)
npm pack # 发布包
agent.followup 立即入日志,端点即时返回;多模态会话模型直接返回 native 直通);描述缓存(attachmentId + preset + 提示词 + 用户文字为键,Promise 共享在途调用,一次链调用、全程复用);llm/stream 瀑布重写(WeakSet 标记防递归;图片块在模型调用层替换为描述文本,按 onError 处理失败;目标模型原生支持图片时跳过)。multimodal/send,从不修改消息内容,失败回退原生发送);conversation.input.left 附件按钮 + conversation.input.dock 状态行。MIT
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。