dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
DeepSeek 搜索:DeepSeek Harness 多引擎网页搜索、正文抓取与深度资料收集插件
给 DeepSeek Harness 桌面端补上“真正能上网查资料”的能力:多引擎搜索 + 网页正文抓取 + 一次调用完成深度收集,并提供一个中文设置页。
仓库地址:https://github.com/a2042798096-debug/dsh-deepseek-search
web_search 会自动切换到本插件的多引擎搜索链,模型不需要换工具名。web_research:搜索 → 选页 → 抓正文 → 汇总,带出处。web_collect:一次读多个 URL 的正文。web_engines:查看引擎启用/可用状态。当前版本默认接入国内可直连的 必应、百度、搜狗、360;Tavily / Exa / Firecrawl / Brave / Serper 需要 Key,DuckDuckGo / SearXNG 默认关闭。在部分中国大陆网络中,Google、DuckDuckGo、Brave、SearXNG 公共实例可能连接超时,所以没有把它们设为默认。
web_research 把“多查询 → 多引擎 → 选页 → 抓正文 → 带出处汇总”串起来,不用模型来回十几轮。web_search / web_fetch 的名字和参数不变,已有提示词、技能、工作流不用改;只是 web_search 背后的提供方换成了多引擎。web_engines 的“最近错误”里,方便判断是 Key、网络还是反爬。ctx.web.fetch(),复用它配置的代理、DNS 校验和安全限制。/link 跳转壳会自动解析成真实地址。web_research 支持 includeContent: false 摘要模式、maxPages、每页字符上限和总输出上限,调研长文时也能控制上下文。config.mjs 的目录、engines.mjs 的 runner/parser,再加一个离线 fixture。| 维度 | 原版 DSH | 本插件 |
|---|---|---|
| 搜索方式 | DeepSeek 官方:deepseek-official(Messages 原生搜索)或 deepseek-search-api | 本插件注册 deepseek-search,聚合多个搜索引擎 |
| 引擎数量 | 单一官方提供方 | 默认 4 个免费引擎;可选 7 个 API/自建引擎 |
| 成本 | 一次搜索通常是一次辅助模型请求,消耗 token/官方额度 | 免费引擎零模型 token;API 引擎使用各家额度 |
| 延迟 | 更接近一次模型回合 | 并行 HTTP,通常 1–3 秒返回搜索结果;抓正文另计 |
| 结果 | 官方排序与结构化来源 | 加权 RRF、跨引擎去重、来源引擎标注 |
| 工具 | web_search、web_fetch | 原生两个不变,另加 web_research、web_collect、web_engines |
| 网页抓取 | http 或 deepseek-fetch-api | 仍走 ctx.web.fetch(),默认固定 http |
| 配置入口 | 设置 → 内置插件设置 → 网页搜索 | 设置 → DeepSeek 搜索 |
| 查询去向 | api.deepseek.com | 你启用的 Bing/百度/搜狗/360 或 Tavily/Exa 等 |
| 失败模式 | 凭据、端点、官方额度 | 反爬、网页改版、网络;多引擎 + 可选 API 兜底 |
web_fetch,不需要批量收集;先获取代码:
git clone https://github.com/a2042798096-debug/dsh-deepseek-search.git
cd dsh-deepseek-search
完全退出 DeepSeek Harness(不是最小化到托盘,是退出进程)。
双击本目录下的 安装.cmd,或在 PowerShell 中运行:
powershell -NoProfile -ExecutionPolicy Bypass -File .\install.ps1
脚本会把本目录以 link: 方式装进 desktop profile,并打印验证结果。
重新启动 DeepSeek Harness。
打开 设置 → DeepSeek 搜索,点一次“试搜”确认引擎可用。
# 按你的实际路径修改这两行
$dsh = "D:\deepseekharness\resources\runtime\cli\bin\dsh.cmd"
$plugin = "C:\path\to\dsh-deepseek-search"
& $dsh plugin --profile desktop add "link:$($plugin -replace '\\','/')"
如果 DSH 安装路径不同,把 $dsh 换成实际安装目录(目录下应有 resources\runtime\cli\bin\dsh.cmd)。
安装完成后,profile 的 package.json 会自动把 dsh-deepseek-search 加入 dependencies 和 dsh.profile.bundles;插件包内的 cordis.patch.yml 会把 web.searchProvider 切到 deepseek-search。
桌面端同一时间只建议由一种方式安装,重复安装前先卸载。
安装并重启后,正常和模型聊天即可。例如:
模型会自己选择:
| 工具 | 用途 |
|---|---|
web_search(原生) | 普通搜索,返回标题、URL、摘要;现在由本插件的多引擎链提供结果 |
web_fetch(原生) | 打开单个 URL,DSH 自带,带 SSRF 防护与正文转换 |
web_research | 多查询、多引擎搜索 + 抓取前 N 页正文 + 汇总;适合调研 |
web_collect | 批量抓取指定 URL 的正文;适合已有链接 |
web_engines | 查看引擎是否可用、配置路径、当前参数 |
| 参数 | 说明 |
|---|---|
query | 必填,主题/问题,建议关键词 |
queries | 可选,额外的查询角度,最多 4 组 |
depth | quick(3 页)/ standard(6 页)/ deep(10 页) |
maxPages | 可选,1–10,覆盖 depth 的页数 |
includeContent | 可选,默认 true;设为 false 只返回摘要/节选,节省上下文 |
engines | 可选,指定引擎 id,如 ["bing","baidu"] |
| 参数 | 说明 |
|---|---|
urls | 必填,1–10 个 http(s) URL |
maxCharsPerPage | 每页正文上限,1000–50000 |
includeLinks | 是否附带页面内链接 |
web_fetch;仍不行再用 web_collect 或换 URL。设置 → DeepSeek 搜索:
Key 只写入本机配置文件,设置页只显示 •••• 加后四位;保存时留空表示保持原 Key。
| id | 名称 | 类型 | 默认 | 说明 |
|---|---|---|---|---|
bing | 必应 Bing | 免费 | 开 | 默认走 cn.bing.com,可改地址 |
baidu | 百度 | 免费 | 开 | 中文覆盖好;结果条数受反爬影响 |
sogou | 搜狗 | 免费 | 开 | 公众号内容多;跳转壳会自动解析 |
so360 | 360 搜索 | 免费 | 开 | 作为中文补充 |
duckduckgo | DuckDuckGo | 免费 | 关 | 大陆通常需代理 |
searxng | SearXNG | 自建 | 关 | 填实例地址;需实例开启 JSON 输出 |
tavily | Tavily | API | 关 | 需 TAVILY_API_KEY 或设置页 Key |
exa | Exa | API | 关 | 需 EXA_API_KEY |
firecrawl | Firecrawl | API | 关 | 需 FIRECRAWL_API_KEY |
brave | Brave Search | API | 关 | 需 BRAVE_API_KEY |
serper | Serper (Google) | API | 关 | 需 SERPER_API_KEY |
默认路径:
C:\Users\<你的用户名>\.dsh\deepseek-search\config.json
DSH_DEEPSEEK_SEARCH_CONFIG 指定其他路径。TAVILY_API_KEY、EXA_API_KEY、FIRECRAWL_API_KEY、BRAVE_API_KEY、SERPER_API_KEY。config.example.json。修改后可在设置页点“保存”,或直接重启 DSH。{
"engines": {
"bing": { "enabled": true, "baseURL": "https://cn.bing.com", "weight": 1 },
"tavily": { "enabled": true, "apiKey": "<your-tavily-key>", "weight": 1.1 }
},
"search": {
"resultsPerEngine": 10,
"engineTimeoutMs": 15000,
"totalTimeoutMs": 30000,
"maxEnginesPerQuery": 6,
"cacheTtlMs": 180000
},
"fetch": {
"maxCharsPerPage": 12000,
"researchMaxPages": 6,
"concurrency": 3,
"readerBaseURL": ""
}
}
weight 影响 RRF 排序权重,默认必应 1、百度 0.95、搜狗 0.85、360 0.8,API 引擎略高。readerBaseURL 可选:正文过短时调用第三方阅读器,支持 {url} 占位符,例如 https://r.jina.ai/{url}。默认关闭。/link 跳转壳会被解析成真实域名,解析失败的结果丢弃。ctx.web.fetch() 读取页面,复用其 SSRF 防护、DNS 校验、连接固定、重定向和大小限制。插件 bundle 补丁会同时固定 web.searchProvider: deepseek-search 和 web.fetchProvider: http;因为补丁层的 config 是替换而不是深合并,漏掉 fetchProvider 会让 deepseek-fetch-api 与 http 同时可用并报歧义。article / main / 公众号 #js_content / CSDN #content_views / 知乎 RichText / GitHub markdown-body,按文本长度和链接密度选最佳容器。ctx.web.fetch(),不会绕过它的公网地址校验。~/.dsh/deepseek-search/config.json(尽力设为 0600),也可以改用环境变量。dsh-deepseek-search 已安装且启用。C:\Users\<你>\.dsh\profiles\desktop\package.json 的 dsh.profile.bundles 是否包含它。web_search 仍然走 DeepSeek 官方搜索检查 profile 的 cordis.patch.yml 是否有:
- id: web
config:
searchProvider: deepseek-search
或打开 设置 → 插件 → 内置插件设置 → 网页搜索,确认提供方已切换。切换后重启。
https://cn.bing.com。web_fetch 失败时换用文章镜像或搜索结果里的其他来源。ctx.web.fetch(),因此也能复用 DSH 的代理。API 引擎的 POST 请求不会走这个回退。multiple usable web providers are registered (deepseek-fetch-api, http),说明 web 的 fetchProvider 没有被固定。请确认插件自带的 cordis.patch.yml 同时包含 searchProvider: deepseek-search 和 fetchProvider: http;旧版本可在 profile 的 cordis.patch.yml 里补上,然后重载/重启。deep 深度会抓 10 页,慢是正常的;日常用 standard。powershell -NoProfile -ExecutionPolicy Bypass -File .\uninstall.ps1
或:
$dsh = "D:\deepseekharness\resources\runtime\cli\bin\dsh.cmd"
& $dsh plugin --profile desktop remove dsh-deepseek-search
卸载后重启 DSH。配置文件默认保留在 ~/.dsh/deepseek-search/config.json;如需彻底清除,加 -PurgeConfig 或手动删除该目录。
本插件不需要构建:lib/index.mjs 是 Host ESM,lib/client.js 是手写的 __ModuleLoader__.load 浏览器包,直接改源码即可。
# 语法检查
node --check lib/index.mjs
node --check lib/client.js
# CI 同款离线测试:解析器、配置、正文提取、输出格式化
node test/offline.test.mjs
# Client bundle 包装与设置页注册
node test/client.test.mjs
# 也可以直接跑 npm test(offline + client,不访问网络)
npm test
# 真实网络冒烟:多引擎搜索
node test/engines.test.mjs "DeepSeek Harness 插件"
# 正文提取(网络)
node test/extract.test.mjs
# 搜索 + 抓取 + 汇总(网络)
node test/research.test.mjs
# 假 ctx 下的 Host 集成测试(工具、提供方、设置路由,需要网络)
node test/host.test.mjs
GitHub Actions 的 CI 工作流只跑离线测试和 bundle 包装检查,不会访问搜索引擎,因此在 CI 中稳定。真实网络测试保留给本地手动运行。
目录:
dsh-deepseek-search/
├─ lib/
│ ├─ index.mjs Host 入口:提供方、3 个工具、HTTP 路由
│ ├─ config.mjs 配置模型、默认值、持久化、脱敏
│ ├─ engines.mjs 引擎实现、解析、RRF 合并、跳转解析
│ ├─ html.mjs 轻量正文提取
│ ├─ research.mjs 抓取、批量收集、深度收集、输出格式化
│ └─ client.js 设置页浏览器包
├─ test/ 离线测试 + 真实网络冒烟/集成测试
├─ .github/workflows/ci.yml
├─ cordis.patch.yml 插件 bundle 补丁
├─ package.json
├─ config.example.json
├─ install.ps1 / uninstall.ps1 / 安装.cmd / 卸载.cmd
├─ SECURITY.md
├─ CONTRIBUTING.md
├─ CHANGELOG.md
└─ README.md
这个插件不是“比官方搜索更强”的承诺,而是在官方搜索之外多给一套可调、可省 token、可多源交叉的方案。下面是明确的取舍。
| 限制 | 影响 | 插件里的应对 |
|---|---|---|
| 免费引擎靠 HTML 解析 | 搜索引擎改版、反爬、验证码会让结果变少或为空 | 多引擎并行、单引擎失败隔离、结果缓存;设置页显示“最近错误”;可切到 Tavily/Exa 等 API 引擎 |
| 百度在无 Cookie 时结果少 | 中文结果覆盖不如预期 | 同时启用必应/搜狗/360;需要更稳时加 API 引擎 |
| 搜狗/360 有跳转壳 | 不能直接拿到真实域名 | 自动解析 /link 跳转;解析失败的结果丢弃,避免返回垃圾链接 |
| 查询会发给第三方 | 隐私边界从“只到 DeepSeek”变成“到多个搜索引擎” | 每个引擎可单独关闭;Key 只存本机;设置页明确数据流向;不想外发时只用官方提供方 |
| 某些引擎在当前网络不可达 | DuckDuckGo/Google/Brave/SearXNG 可能超时 | 默认只开国内四引擎;直连失败时自动回退到 ctx.web.fetch()(可复用 DSH 代理);API 引擎 POST 不走该回退 |
| 长文会占用上下文 | 多页正文可能很长 | includeContent:false 摘要模式、maxPages、每页字符上限、总输出上限;页面默认截断 |
| 不支持 PDF/Office/音视频 | 这些链接会明确失败 | 用 web_fetch 打开可读页面;配置 readerBaseURL 走第三方阅读器;或换来源 |
| 没有内部 LLM 总结 | web_research 只做检索和正文拼接,不做二次生成 | 主模型直接阅读带出处的资料;需要更短时用摘要模式;不额外消耗一次模型调用 |
补丁会替换 web 配置 | 漏写 fetchProvider 会导致抓取提供方歧义 | cordis.patch.yml 同时固定 searchProvider: deepseek-search 和 fetchProvider: http;故障排查里有说明 |
通过 link: 安装 | 移动/删除插件文件夹会让链接失效 | 安装脚本使用绝对路径;移动后重新执行安装;README 已注明 |
| API Key 存在本机 JSON | 本机文件被读取时可能泄露 | 尽力设为 0600;优先用环境变量;设置页只显示后四位;不写入日志/工具输出 |
不是替代关系:原生 web_fetch 仍然保留,web_research/web_collect 也复用它的安全抓取;如果只需要官方搜索,把 web.searchProvider 切回 deepseek-official 或卸载插件即可。
见 CONTRIBUTING.md。提交前请运行 npm test,并确保不要把任何真实 API Key 写进仓库。
MIT