[!请注意) 📦这个插件位于 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 |
| 插件id | web-search-public |
| 提供者id | public |
| 发动机(呈扇形) | startpage, duckduckgo, ecosia, google, mojeek |
基于 oh-my-pi -免凭据引擎 scraper是从oh-my-pi’s移植过来的
web/search/providers,提供者是一个忠实的 oh-my-pi的端口平行searchPublicWeb汇总(扇形输出,软/硬截止日期, 共识合并),适用于DeepSeek挽具ctx.webseam。 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包括标准dshCLI; - 没有API密钥-没有其他。
在继续之前安装Harness CLI和pnpm:
npm install --global @deepseek-ai/[email protected] pnpm
dsh --version
快速启动
路线A——发布的npm包(推荐)
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
安装它并将它的补丁层应用到配置文件中:
- 集合
web.config.searchProvider来public(使无凭据的扇出成为默认值), - 插入
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(...).
| 选项 | 默认的 | 目的 |
|---|---|---|
engines | startpage, duckduckgo, ecosia, google, mojeek | 引擎id为扇形赛车;这个顺序是协商一致关系的破局规则;未列出的引擎保持禁用状态 |
timeoutMs | 30000 | 每个引擎传输超时(ms):即使忽略聚合取消,也限制一个引擎;浏览器支持的引擎可能会把时间花在fetch→stealth-browser升级上,所以默认值是30秒 |
softDeadlineMs | 5000 | 软汇总截止日期-在所有引擎解决或以≥1成功通过后立即返回 |
hardDeadlineMs | 30000 | 硬汇总截止日期——归还我们所有的东西,甚至什么都不归还;必须≥ softDeadlineMs |
maxRetries | 1 | 当至少一个引擎因故障而死亡时,重试所有引擎失败的聚合 的事情 传输失败(HTTP 5xx、超时或网络获取失败)。每次重试都会在后退后重新运行整个扇形输出,因此,剥离第一次尝试的短引擎油门仍然会产生结果。 0 禁用进行重试。硬块(HTTP 4xx)永远不会重试-它们打开了引擎的断路器-和一个纯粹的全部no results 聚合是查询级的,不会重试。 |
retryDelayMs | 2000 | 重试#1前的基本延迟(ms);每次尝试都加倍。 |
failureCooldownMs | 300000 | 快速失败窗口(ms)在所有引擎关闭失败后(重试耗尽,或每个引擎硬阻塞/绊倒):在这个窗口中搜索返回一个清除 retry in about Ns 错误,而不是重新轰炸引擎,这只会抑制我们(这将加深阻塞)。 0 禁用窗口。 |
engineBackoffMs | 300000 | 每个引擎的基本断路窗口(ms):一个引擎在连续的搜索中硬阻塞(HTTP 4xx)或没有返回结果,而不是在每次搜索中重新爆炸。每次连续旅行双人间最多可达 maxEngineBackoffMs;探测成功后复位。 0 禁用单引擎断路器。 |
maxEngineBackoffMs | 3600000 | 每台发动机加倍断路器窗口盖(毫秒)。 |
userAgent | browser-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-webfetch: false停留:模型不能被指向 任意url,因此SSRF和不安全内容表面保持关闭。 - 重定向的政策。 所有引擎都使用
redirect: "error"-重定向被视为 失败并被合并吸收,而不是将调用方泄漏到外部位置。 - 挑战是可以预见的。 Startpage, Ecosia和谷歌经常提供bot检查; 解析器将挑战的页面视为零结果,扇形输出容忍它们。看到 文档/ operations.md 用于运行时期望。
兼容性
| 组件 | 支持合同 |
|---|---|
| node . js | 22.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.
这个插件是一个单独的可安装包;马具仍然是它自己的财产 项目。