为 DeepSeek Harness 扩展网页搜索能力,支持多引擎路由与融合、20 平台搜索、SQLite 持久化缓存、脚本猫式按站提取与 Playwright 渲染。
- 语言
- TypeScript
- License
- MIT
- 分支
- master
安装
$ dsh plugin --profile web add github:anweat/dsh-web-search-pro在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程
对话式安装
帮我安装 DeepSeek Harness 插件 anweat/dsh-web-search-pro:先查看仓库 https://github.com/anweat/dsh-web-search-pro.git 确认安全性,然后执行安装命令并验证插件加载成功。
把这段指令粘贴给 DSH Web GUI 里的助手,由它代你完成安装与验证。
一句话定位
给 DeepSeek Harness 加一套"网页搜索 + 抓取 + 快照"合一的工具集,把单后端原生搜索换成多引擎路由 + 持久缓存 + 20 平台搜索 + 脚本猫式按站提取 + Playwright 兜底渲染。
核心能力
- 多引擎路由与融合:DeepSeek 原生、Exa、DuckDuckGo、Bing、Jina 之间按顺序回退,并行时可做 RRF 倒排融合排序
- 20 平台搜索:GitHub / B站 / YouTube / V2EX / 小红书 / Twitter / Reddit / IG / FB / RSS,加 知乎 / 微博 / 豆瓣 / 贴吧 / 抖音 / 快手 / arXiv / PubMed
- 持久化缓存:搜索结果、页面快照、按站提取规则全部存入 SQLite,跨重启复用,热数据走进程内 LRU
- 可读化抓取:Jina Reader → HTTP+规则抽取 → Playwright 兜底三段式,失败自动晋级
- 持久化页面快照:headless 浏览器截图 + HTML + 文本落盘到本地目录
- 查询历史与回放:按关键词/引擎/平台过滤历史,按 queryId 回放,支持导出 JSON
- 自定义平台:settings.yaml 写一份 URL 模板 + 结果选择器即可新增站点,无需改代码
技术实现
- 语言: TypeScript
- 关键依赖: @deepseek-ai/cordis(Hook 容器), @deepseek-ai/dsh-tools & dsh-web(工具定义与 ctx.web 抽象), @deepseek-ai/dsh-settings(settings.yaml 热重载段), jsdom(HTML 解析)
- 架构模式: Cordis bundle 插件,通过 cordis.patch.yml 同时挂载本插件行与 dsh-browser 行;inject 依赖
tools / systemPrompt / browser三个服务 - 入口文件: src/index.ts:apply(ctx, config)
适用场景
想让 DSH 真正能"上网做研究"的场景:写代码时查最新 API 文档、查开源项目 issue、追踪学术论文、做选题调研、翻中文社区讨论。普通 DSH 用户遇到"模型回答过时/查不到最新资料"时,这套插件会显著提升信息密度和新鲜度。
前置依赖与兼容性
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| DSH Harness | 0.1.0-rc.6+ | 依赖的 @deepseek-ai/* 系列运行时均为 rc.6 |
| @anweat/dsh-browser | ^0.1.2 | 同伴插件,提供 browser 服务(本插件的 cordis.patch 会自动挂载) |
| Node.js | >=22.19.0 | 来自 package.json#engines |
| 平台 | 跨平台 | 未声明特定平台限制 |
| 原生模块 | 无 | 仅使用 Node 内置模块与纯 JS 依赖 |
安装方式
dsh plugin --profile web add github:anweat/dsh-web-search-pro
配置项
| 配置 | 类型 | 说明 | 默认值 |
|---|---|---|---|
| engines | 字符串数组 | 多引擎按顺序回退(或并行融合),可用 id:seam, exa, ddg, bing, jina, github, bilibili, v2ex, youtube, arxiv, pubmed | ["ddg","bing","exa","seam","jina"] |
| parallelEngines | 布尔 | 启用后所有引擎并行查询并用 RRF 融合结果 | false |
| ttlSeconds | 数字 | 搜索结果与页面快照的有效期(秒) | 3600 |
| memoryCacheEntries | 数字 | 进程内 LRU 缓存条目上限 | 128 |
| searchMaxResults | 数字 | 单次搜索返回结果数上限 | 8 |
| timeoutMs | 数字 | 单次调用协同超时(毫秒) | 30000 |
| rrfConstant | 数字 | RRF 融合常数 k | 60 |
| freshnessBoost / freshnessDays | 数字 | 对新近内容的额外打分权重(0..1)与衰减天数 | 0.2 / 30 |
| authorityBoost / authorityDomains | 数字 / 字符串数组 | 对权威域名(.edu/.gov/.org 等)的额外打分 | 0.25 / [] |
| exaApiKey / jinaApiKey | 字符串 | 启用 Exa / Jina 时填写;也可走环境变量或 .credentials.yaml | 未设置 |
| exaApiKeyEnv / jinaApiKeyEnv | 字符串 | 引用环境变量名 | EXA_API_KEY / JINA_API_KEY |
| registerProvider / providerId | 布尔 / 字符串 | 启用后接管 DSH 内置 web_search 工具,路由走本插件 | false / web-search-pro |
| enableCliBackends | 布尔 | 是否允许调用 gh / bili / yt-dlp / opencli / agent-reach 等外部 CLI | true |
| opencliEnabled / agentReachEnabled | 布尔 | 单独开关 opencli 与 agent-reach 后端 | true |
| platformRules | 字典 | 按平台 id 覆盖结果选择器(站点改版后无需改代码) | {} |
| customPlatforms | 字典 | 用户自定义站点:URL 模板 + 选择器 + 可选 Cookie | {} |
| playwright.enabled | 布尔 | 是否启用 Playwright 兜底抓取与快照 | true |
| playwright.snapshotDir | 字符串 | 快照落盘目录 | <dbDir>/snapshots |
| dbPath | 字符串 | SQLite 数据库路径 | $DSH_HOME/data/web-search-pro/store.db |
| verbose | 布尔 | 启动时把本次加载信息追加到 dbPath 旁的 apply.log | false |
常见问题
Q: 跟 DSH 内置的 web_search 有什么区别?
A: 内置工具只走 ctx.web 一个后端;本插件把它升级为多引擎路由、自动回退、可融合排序,并加 SQLite 持久化缓存、查询历史、20 平台搜索、脚本猫式按站提取、Playwright 兜底抓取与快照。
Q: 一定要用 API Key 吗?
A: 不必须。默认引擎 ddg / bing / seam 都不需要 Key;只有启用 Exa 或 Jina 时才需要,可在 settings.yaml 或环境变量 EXA_API_KEY / JINA_API_KEY 填写。
Q: 知乎、小红书、B 站这些要怎么搜?
A: 通用搜索引擎能搜到结果,但中文社区(知乎/微博/豆瓣/贴吧/抖音/快手/小红书)走 Playwright 驱动的登录态浏览器,需要先用 scripts/save-login.mjs 登录一次保存 cookies,再在 settings.yaml 设 playwright.storageStatePath。
Q: 安装后还需要装什么外部工具?
A: 开箱即用即可搜通用网页。若要用 GitHub / B站 / YouTube / agent-reach 等专属后端,先用 web_deps 工具检测,再用检测出的安装命令补齐。
Q: 数据存在哪里?
A: 默认在 $DSH_HOME/data/web-search-pro/ 下:store.db 存历史与缓存、snapshots/ 存网页快照。改 dbPath 或快照目录可在 settings.yaml 的 web-search-pro 段重设。
Q: 怎么卸载?
A: 用 dsh plugin --profile web remove dsh-web-search-pro 即可。SQLite 数据库与快照默认留在仓库目录,按需手动删除。
上手难度
入门 — 开箱即用装好即可搜通用网页;只有启用 Exa/Jina Key、抓取中文社区、想自定义平台时才需要进一步配置。
已知问题与限制
- 选择器是"尽力而为":中文社区平台的结果选择器写死在代码里,站点改版后可能取不到结果,可通过 settings.yaml 的 platformRules 覆盖,无需改代码。
- 登录态依赖外部脚本:知乎/微博/豆瓣/贴吧/抖音/快手/小红书需要用户先运行 scripts/save-login.mjs 登录一次保存 cookies,否则返回结果为空。
- 依赖外部 CLI 的后端需自装:GitHub / B站 / YouTube / agent-reach 后端需系统安装 gh / bili-cli / yt-dlp / agent-reach;opencli 和 playwright 由 dsh-browser 插件捆绑,无需手动装。
- 默认关闭注销外挂:registerProvider 默认 false,DSH 内置 web_search 不会自动切到本插件;想接管需手动设为 true 或设环境变量 DSH_WEB_SEARCH_PROVIDER=web-search-pro。
增强型、可持久化的扩展网页搜索插件 for DeepSeek Harness(DSH)。
一个 DSH bundle 插件,把多引擎网页搜索、平台搜索、持久化缓存、脚本猫式按站提取、Playwright 渲染打包成模型可直接调用的 9 个工具。灵感来自 MediaCrawler、Agent-Reach、脚本猫/油猴 userscript、opencli 与 playwright。
安装
dsh plugin --profile web add dsh-web-search-pro # 自动装 dsh-browser(dependency)+ 自动挂载 browser 行(本 patch)
# 或本地目录 / tarball:
dsh plugin --profile web add ./dsh-web-search-pro
# 重启(web profile 关闭了 HMR):
dsh --profile web
dsh-browser 需先发布到 npm(本地测试可用
dsh plugin --profile web add ../dsh-browser ../dsh-web-search-pro一条命令显式列两个)。 依赖@deepseek-ai/*已发布到 npm(^0.1.0-rc.6,与社区 dsh-cc-tui 一致)。 若你的 harness 是本地源码 checkout(如0.1.0-rc.5),版本号可能有出入——用dsh plugin --profile web add ./<path>并在 profile 的pnpm-workspace.yaml里对齐版本后重装即可。
工具(9 个)
| 工具 | 作用 |
|---|---|
web_search_pro | 多引擎搜索 + RRF 融合 + 内存/SQLite 双层缓存 + 历史 |
web_fetch_pro | 可读化抓取(Jina → HTTP+规则抽取 → Playwright 兜底)+ 快照缓存 |
web_platform_search | 20 平台:GitHub/B站/YouTube/V2EX/小红书/Twitter/Reddit/IG/FB/RSS + 知乎/微博/豆瓣/贴吧/抖音/快手(Playwright 登录态) |
web_snapshot | Playwright 全页截图 + HTML + 文本落盘 |
web_history / web_cache_clear / web_search_stats | 持久历史 / 清缓存 / 存储统计 |
web_rule | 持久化按站提取规则(脚本猫式,list/upsert/remove) |
web_deps | 检测/安装外部依赖(gh/bili/yt-dlp/opencli/agent-reach/mcporter/playwright) |
配置
三层,越靠前越日常:
-
$DSH_HOME/settings.yaml→web-search-pro:段(热重载,改完即生效):web-search-pro: exaApiKey: 'sk-...' # 或环境变量 EXA_API_KEY / .credentials.yaml jinaApiKey: 'jina_...' # 或环境变量 JINA_API_KEY engines: [ddg, bing, exa, seam, jina] parallelEngines: false ttlSeconds: 3600 searchMaxResults: 8 -
cordis.yml
config:(部署级默认值,见cordis.patch.yml)。 -
环境变量 / 凭据:
$EXA_API_KEY、$JINA_API_KEY(exaApiKeyEnv/jinaApiKeyEnv引用)。
外部依赖(按需)
多数后端需要系统额外安装的工具;插件提供 web_deps 工具检测与安装:
| 依赖 | 用途 | 安装 |
|---|---|---|
| gh | GitHub 后端 | winget install GitHub.cli / choco install gh |
| bili-cli | B站后端 | uv tool install bili-cli / pipx install bili-cli |
| yt-dlp | YouTube 后端 | uv tool install yt-dlp / pip install yt-dlp |
| opencli | 小红书/Twitter/Reddit/IG/FB | npm i -g opencli |
| agent-reach | agent-reach 后端 | uv tool install agent-reach / pip install agent-reach |
| playwright | 渲染/截图后端 | npm i -g playwright && playwright install chromium |
平台与引擎
seam(ctx.web/DeepSeek 原生)· exa · ddg · bing · jina · github · bilibili · v2ex · youtube。默认顺序 ddg, bing, exa, seam, jina(免费优先),失败自动回退;multi 并行融合。
开发
pnpm install
pnpm build # tsc src → lib
源码在 src/;lib/ 为发布产物(已提交)。
License
MIT
中文社区平台登录态
zhihu / weibo / douban / tieba / douyin / kuaishou 的免登录公开接口都被风控, 所以走 Playwright 驱动登录态浏览器(借鉴 MediaCrawler 思路、MIT 独立实现,未用其签名算法):
- 登录一次保存登录态:
node scripts/save-login.mjs all login-state.json - 在
$DSH_HOME/settings.yaml里设playwright.storageStatePath - 站点改版时无需改代码,用
platformRules按平台覆盖结果选择器
详见 LOGIN.md。
历史管理
web_history 支持:kind/query/engine/platform 过滤、replay(用 queryId 回放已存结果)、 export(把过滤后的历史+结果写成 JSON 文件)。
自定义平台(解析 cookie 去搜索)
在 settings.yaml 里定义任意站点(URL 模板 + 结果选择器 + 可选 Cookie), web_platform_search 就能直接搜它——不需要改代码:
web-search-pro:
customPlatforms:
mybili:
name: '我的B站'
url: 'https://search.bilibili.com/all?keyword={query}'
item: '.bili-video-card'
title: '.bili-video-card__info--tit'
link: 'a'
# 需要登录的站点补 cookie(a=b; c=d,自动应用到 url 域名)
myforum:
name: '某论坛'
url: 'https://forum.example.com/search?q={query}'
item: '.thread'
title: '.thread-title a'
link: '.thread-title a'
cookie: 'sessionid=abc123; csrftoken=xyz'
收录徽章
[](https://deepseek-plugin.org/plugins/anweat/dsh-web-search-pro)把这段 markdown 粘贴到你的 GitHub README,链接回本插件详情页。徽章只声明已被本站收录,不代表安全认证。