@hy-sde-org/dsh-web-search-public

中文文档
0.2.1-rc.5发布于 2026/11/01MITTypeScriptES Module

DeepSeek Harness的无凭据并发网络搜索扇形输出(Startpage, DuckDuckGo, Ecosia,谷歌,Mojeek,共识合并,软/硬截止日期)

中文使用文档
文档目录17 节
  1. 为什么
  2. 先决条件
  3. 快速启动
  4. 路线A——发布的npm包(推荐)
  5. 路线B -从源代码(验证此checkout或在插件上进行hack)
  6. 验证组合配置
  7. 运行
  8. 卸载
  9. bundle的作用
  10. 扇形输出是如何工作的
  11. 浏览器升级(僵尸墙)
  12. 配置
  13. 错误
  14. 私隐及保安须知
  15. 兼容性
  16. 开发
  17. 许可和归属

[!请注意) 📦这个插件位于 dsh-plugins 单文件问题和拉请求在那里。 npm: @hy-sde-org/dsh-web-search-public

dsh-web-search-public - credential-free网络搜索DeepSeek Harness

一个零api密钥的web搜索提供程序 DeepSeek利用. 一个人 web_search 叫它 将查询发送到所有五个公共引擎 并行- Startpage, DuckDuckGo, Ecosia,谷歌,Mojeek -并通过 跨引擎的共识,所以没有单一引擎的bot挑战,超时,或空页面可以 降低搜索。没有API密钥,没有帐户,没有获取提供程序,没有设置。

身份价值
包@hy-sde-org/dsh-web-search-public
插件idweb-search-public
提供者idpublic
发动机(呈扇形)startpage, duckduckgo, ecosia, google, mojeek

基于 oh-my-pi -免凭据引擎 scraper是从oh-my-pi’s移植过来的 web/search/providers,提供者是一个忠实的 oh-my-pi的端口平行 searchPublicWeb 汇总(扇形输出,软/硬截止日期, 共识合并),适用于DeepSeek挽具 ctx.web seam。 oh-my-pi是麻省理工学院授权的(Mario Zechner, Can Bölük);看到 THIRD-PARTY-NOTICES.md.

为什么

DeepSeek Harness提供了需要API密钥的搜索提供商(DeepSeek, Exa, Perplexity)。 此包是无凭据的默认值:每个搜索都是对每个用户的匿名请求 公共搜索引擎并行。一个机器人挑战,速率限制,或下降引擎被吸收 -答案来自响应的任何一个引擎,以及多个引擎一致的结果 有几家排名第一。整个呼叫受到软/硬期限的限制,所以挂起的引擎可以 永远不要把搜索与工具预算挂钩。

先决条件

  • Node.js 22.19或更新版本,启用npm和pnpm PATH;
  • DeepSeek利用 0.2.0-rc.2 包括标准 dsh CLI;
  • 没有API密钥-没有其他。

在继续之前安装Harness CLI和pnpm:

npm install --global @deepseek-ai/[email protected] pnpm
dsh --version

快速启动

dsh plugin --profile web add @hy-sde-org/dsh-web-search-public

路线B -从源代码(验证此checkout或在插件上进行hack)

git clone [email protected]:hy-sde/dsh-plugins.git
cd dsh-plugins/dsh-web-search-public
pnpm install
PACKAGE_TARBALL="$(pnpm pack | tail -n 1)"
dsh plugin --profile web add "$PWD/$PACKAGE_TARBALL"
cd ../..

pnpm pack 正常运行 prepack 构建并生成一个包含 dist/. 一个直接 github:<this-repo> 依赖项不包含构建输出,并且不支持安装 路径-始终安装构建的tarball(或发布的包)。

验证组合配置

dsh web --dump-config

组成的树必须显示出来 web.config.searchProvider: public 和一个 web-search-public 插件行加载 @hy-sde-org/dsh-web-search-public.

运行

dsh web

请代理 web_search 某物。控件中返回呈现的源 consensus-merged扇出。

卸载

dsh plugin --profile web remove @hy-sde-org/dsh-web-search-public

已经发货了吗? 如果你的马具检查已经安装 web-search-public 在它的底部 Bundle(最近的一个发行版采用了这个包作为默认配置),跳过安装 -它已经是活动的提供者。将这个包添加到顶部会复制加载器 行,引导失败(“重复加载程序条目id”)。

bundle的作用

包声明了一个DSH包(dsh.bundle.patch → cordis.patch.yml),所以 dsh plugin 安装它并将它的补丁层应用到配置文件中:

  1. 集合 web.config.searchProvider 来 public (使无凭据的扇出成为默认值),
  2. 插入 web-search-public 插件行。

键控的DeepSeek路由(web-search-deepseek,提供商id deepseek-official)是 不 禁用-使用它的部署通过设置保留其明确的选择 web.searchProvider: deepseek-official 并提供 DEEPSEEK_API_KEY 证书。 没有挂载任何获取提供程序 tool-web 保持 fetch: false:模型可以搜索,不能 获取任意url,这完全延迟了SSRF的暴露。

扇形输出是如何工作的

PublicSearchProvider.search() 比赛 engines 同时(一个忠实的oh-my-pi的港口) searchPublicWeb):

         ┌────────────────────── fan-out (one query) ──────────────────────┐
         ▼            ▼            ▼            ▼            ▼
     startpage    duckduckgo     ecosia      google       mojeek
         └────────────► consensus merge ◄────────────────┘
  • 每个引擎都是并行的。比赛在 最早的 Of:所有引擎 定居, 软的最后期限 (5秒默认值)至少有一个成功在手,或 困难的最后期限 (默认30秒)不管——然后中止所有仍在运行的引擎。 如果软期限过去了还没有成功,也不是所有的事情都失败了,电话 一直等待第一次成功的最后期限。

  • 源跨引擎进行重复数据删除(case/www./尾斜杠规范化url)和 排名 cross-engine共识 -有多少引擎返回一个URL -然后最佳排名, 然后是引擎指令。信息量最大的片段胜出;早期引擎的标题/URL胜出 陛下关系。

  • 每个引擎仍然在各自的引擎下运行 AbortSignal.timeout(timeoutMs) 比赛,所以一个引擎 这忽略了总量的取消将在其自身的上限上消亡。

  • 限速弹性是尽力而为的,分层的。 硬块(HTTP 4xx)或 打开连续搜索中重复的零结果页面 发动机的 断路器: 它被跳过 engineBackoffMs (默认5分钟,每连续行程加倍至 maxEngineBackoffMs),没有发送请求,并在窗口后再次探测。的事情 传输失败(HTTP 5xx,超时,网络获取失败)之后重试整个扇出 指数回退(maxRetries/retryDelayMs(中止感知睡眠);硬块是 从来没有重试。一旦重试失败——或者每个引擎都关闭了——提供商 fast-fails为 failureCooldownMs (默认5分钟 retry in about Ns 错误而不是 重新爆破引擎,只是扼杀了我们(这将加深阻塞)。一个纯 ——no results 聚合是查询级的,永远不会重试或冷却。

  • available() 是 true 只要配置了至少一个引擎,提供程序总是 可用,这才是关键。

  • 调用者中止(signal.aborted)终止扇形出局并投掷 WEB_ABORTED.

  • 只有在 每一个 引擎失败,提供程序抛出 WEB_PROVIDER_ERROR 与每个 发动机原因(id: <reason>; …). 零有机结果,超时引擎,失败 HTTP请求都被视为“此引擎没有任何内容”,并被合并吸收。

默认配置的最坏情况是≈ hardDeadlineMs (30秒),远低于 60秒搜索预算 dsh-tool-web 书在运输束束。

浏览器升级(僵尸墙)

b谷歌,Ecosia和Mojeek是 browser-backed (一个经济新闻 browserFetch 端口:每个引擎 先尝一尝原味 fetch 携带连贯的Chrome导航标题(客户端提示) 派生自它的UA),当它得到一个bot墙(一个启用js的重试页面)的回答时, Cloudflare管理的挑战(“Ecosia防火墙”),Mojeek的ALTCHA工作量证明墙,或者 b谷歌的“异常流量” /sorry Gate -它通过升级为真正的浏览器 ctx.browser.fetchPageHtml (@hy-sde-org/dsh-browser 服务,隐形 launch 或者 CloakBrowser patch 后端):home-URL cookie播种,best-effort ready-selector等待,以及 ALTCHA自动解决(强制点击阴影- dom复选框+ PoW重定向等,omp的 solveCaptcha). 断路器只在每次传输取货时打开 和 浏览器- - - - - - 被阻塞。

升级是可选的:安装 browser 服务的行 之前 此提供程序和 浏览器支持的引擎亮了起来;如果没有它,它们将保持仅取(原始行为),并且 timeoutMs (默认30秒)是每个引擎的预算,包括获取→浏览器步骤。

配置

所有选项都是可选的;常量填充默认值。通过插件行进行配置 config: 在您的配置文件补丁中,或通过编程方式 ctx.plugin(...).

选项默认的目的
enginesstartpage, duckduckgo, ecosia, google, mojeek引擎id为扇形赛车;这个顺序是协商一致关系的破局规则;未列出的引擎保持禁用状态
timeoutMs30000每个引擎传输超时(ms):即使忽略聚合取消,也限制一个引擎;浏览器支持的引擎可能会把时间花在fetch→stealth-browser升级上,所以默认值是30秒
softDeadlineMs5000软汇总截止日期-在所有引擎解决或以≥1成功通过后立即返回
hardDeadlineMs30000硬汇总截止日期——归还我们所有的东西,甚至什么都不归还;必须≥ softDeadlineMs
maxRetries1当至少一个引擎因故障而死亡时,重试所有引擎失败的聚合 的事情 传输失败(HTTP 5xx、超时或网络获取失败)。每次重试都会在后退后重新运行整个扇形输出,因此,剥离第一次尝试的短引擎油门仍然会产生结果。 0 禁用进行重试。硬块(HTTP 4xx)永远不会重试-它们打开了引擎的断路器-和一个纯粹的全部no results 聚合是查询级的,不会重试。
retryDelayMs2000重试#1前的基本延迟(ms);每次尝试都加倍。
failureCooldownMs300000快速失败窗口(ms)在所有引擎关闭失败后(重试耗尽,或每个引擎硬阻塞/绊倒):在这个窗口中搜索返回一个清除 retry in about Ns 错误,而不是重新轰炸引擎,这只会抑制我们(这将加深阻塞)。 0 禁用窗口。
engineBackoffMs300000每个引擎的基本断路窗口(ms):一个引擎在连续的搜索中硬阻塞(HTTP 4xx)或没有返回结果,而不是在每次搜索中重新爆炸。每次连续旅行双人间最多可达 maxEngineBackoffMs;探测成功后复位。 0 禁用单引擎断路器。
maxEngineBackoffMs3600000每台发动机加倍断路器窗口盖(毫秒)。
userAgentbrowser-shaped常数发送给引擎的User-Agent(故意不是产品UA)
- id: web-search-public
  name: '@hy-sde-org/dsh-web-search-public'
  config:
    engines: [startpage, duckduckgo, google, mojeek]   # drop Ecosia, reorder
    timeoutMs: 30000
    softDeadlineMs: 4000
    hardDeadlineMs: 25000
    maxRetries: 1
    retryDelayMs: 2000
    failureCooldownMs: 300000
    engineBackoffMs: 300000
    maxEngineBackoffMs: 3600000

PublicEngineId 值是导出的引擎id;已知集合之外的任何id都会被删除 在启动时,零引擎配置使 available() false(浮出水面 WEB_PROVIDER_CONFIGURED_UNAVAILABLE)。

错误

搜索失败使用网络接缝 WEB_* 代码:

代码意义
WEB_PROVIDER_ERROR每个引擎都失灵了;消息列表 id: reason; …

速率有限的所有失败聚合(传输签名,重试用尽)显示 相同 WEB_PROVIDER_ERROR 与 public search engines are rate limited (…); retry in about Ns. | WEB_ABORTED |调用者在搜索中终止| | WEB_PROVIDER_CONFIGURED_UNAVAILABLE |配置的提供商不可用| | WEB_PROVIDER_CONFIGURED_MISSING |配置的提供商id未注册|

私隐及保安须知

  • 没有凭证。 提供程序从不读取键,因此不会发生泄漏。引擎 接收查询、浏览器形状的User-Agent以及其他任何内容。
  • 将查询视为公共查询。 每个查询都以匿名方式发送到公共搜索引擎 请求-由于扇形输出,包括同时使用几个引擎。不要搜索 您不会粘贴到公共搜索框中的秘密或PII。
  • 放大是固有的。 每个搜索都与每个配置好的引擎并行地联系 (每个查询最多5个匿名刮擦)。这就是韧性和共识的代价 与单引擎链相比,它增加了机器人挑战/速率限制暴露(参见 文档/ operations.md.
  • 没有取回提供程序。 tool-web fetch: false 停留:模型不能被指向 任意url,因此SSRF和不安全内容表面保持关闭。
  • 重定向的政策。 所有引擎都使用 redirect: "error" -重定向被视为 失败并被合并吸收,而不是将调用方泄漏到外部位置。
  • 挑战是可以预见的。 Startpage, Ecosia和谷歌经常提供bot检查; 解析器将挑战的页面视为零结果,扇形输出容忍它们。看到 文档/ operations.md 用于运行时期望。

兼容性

组件支持合同
node . js22.19或更新版本
DeepSeek利用0.2.0-rc.2 (@deepseek-ai/dsh-web, @deepseek-ai/cordis 点范围)
缝ctx.web WebSearchProvider (没有键,没有获取提供程序)

提供程序只实现 WebSearchProvider seam合同;面向模型的工具是 @deepseek-ai/dsh-tool-web,此包裹不提供。DeepSeek是一个 开发者预览版。上游的接缝契约变更需要一个新的包发布和契约 审查。

开发

npm ci
npm run check
npm test
npm run build
npm pack --dry-run

默认套件针对fixture HTML(无网络)运行解析器和提供商契约测试, 包括扇出、一致合并和截止日期行为。用于在线验证 针对当前引擎标记的抓取器,运行可选的实际测试-它练习 Startpage, DuckDuckGo和Mojeek的有机结果和验证机器人挑战的引擎 (Ecosia/谷歌)降级而不是崩溃:

DSH_WEB_SEARCH_REAL_E2E=1 npm run test:real

看到 CONTRIBUTING.md 对于发布检查表和设计约束,以及 文档/ operations.md 用于运行时行为和故障排除。

许可和归属

这个包的许可是MIT——与其上游相同的许可 oh-my-pi。无需凭证的引擎抓取器和 平行 searchPublicWeb 聚合设计来自oh-my-pi (MIT许可,©Mario) Zechner 2025,©Can Bölük 2025-2026);上游版权所有者记录在LICENSE中 下面是本包自己的公告,而上游公告文本则全文转载于 THIRD-PARTY-NOTICES.md.

这个插件是一个单独的可安装包;马具仍然是它自己的财产 项目。

版本与发布记录

@hy-sde-org/dsh-web-search-public 共发布 14 个版本,首次发布于 2026/08/17;过去 12 个月发布了 14 个版本。

版本发布日期距今
0.2.1-rc.5latest2026/11/012 天前
0.2.1-rc.32026/10/259 天前
0.2.1-alpha.42026/10/1618 天前
0.2.1-alpha.22026/10/1321 天前
0.2.0-rc.22026/10/031 个月前
0.1.7-rc.22026/09/291 个月前

关于 @hy-sde-org/dsh-web-search-public 的常见问题

@hy-sde-org/dsh-web-search-public 是什么?

DeepSeek Harness的无凭据并发网络搜索扇形输出(Startpage, DuckDuckGo, Ecosia,谷歌,Mojeek,共识合并,软/硬截止日期)

如何安装 @hy-sde-org/dsh-web-search-public?

在项目目录运行 npm install @hy-sde-org/dsh-web-search-public,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:@deepseek-ai/cordis(~4.0.5)、@deepseek-ai/dsh-web(^0.2.1-rc.5)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@hy-sde-org/dsh-web-search-public 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@hy-sde-org/dsh-web-search-public 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@hy-sde-org/dsh-web-search-public 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=22.19.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@hy-sde-org/dsh-web-search-public 可以商用吗?

@hy-sde-org/dsh-web-search-public 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@hy-sde-org/dsh-web-search-public 还在维护吗?

最新版本 0.2.1-rc.5 发布于 2026/11/01(2 天前);至今共发布 14 个版本,其中过去 12 个月发布了 14 个;首次发布于 2026/08/17。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。