# @hy-sde-org/dsh-web-search-public 中文文档

规范地址：https://npmcn.com/package/%40hy-sde-org/dsh-web-search-public/

版本：0\.2\.1-rc\.5
npm 元数据更新时间：2026-11-01T04:22:56.187Z
中文译文更新时间：2026-11-01T09:55:33.269Z
软件包许可：MIT

本文由上游 README 机器翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40hy-sde-org/dsh-web-search-public
原文对照：https://npmcn.com/package/%40hy-sde-org/dsh-web-search-public/?lang=original
项目主页：https://github.com/hy-sde/dsh-web-search-public#readme
源码仓库：https://github.com/hy-sde/dsh-web-search-public

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：183 kB，60 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- Node.js 要求：\>=22\.19\.0
- 运行依赖：2 个
- peer 依赖：@deepseek-ai/cordis ~4\.0\.5，@deepseek-ai/dsh-web ^0\.2\.1-rc\.5
- 首次发布：2026-08-17T00:33:51.960Z
- 最新版本发布：2026-11-01T04:22:56.011Z
- 已发布版本数：14（近 12 个月 14 个）

## 中文简介

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

## 安装

```sh
npm install @hy-sde-org/dsh-web-search-public
```

也可以使用：`pnpm add @hy-sde-org/dsh-web-search-public`、`yarn add @hy-sde-org/dsh-web-search-public`、`bun add @hy-sde-org/dsh-web-search-public`

## README

> \[!请注意) 📦这个插件位于 [**dsh-plugins**](https://github.com/hy-sde/dsh-plugins) 单文件问题和拉请求在那里。 npm: [`@hy-sde-org/dsh-web-search-public`](https://www.npmjs.com/package/@hy-sde-org/dsh-web-search-public)

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

一个零api密钥的web搜索提供程序 [DeepSeek利用](https://github.com/deepseek-ai/deepseek-harness). 一个人 `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](https://github.com/can1357/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](https://npmcn.com/package/%40hy-sde-org/dsh-web-search-public/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：

```bash
npm install --global @deepseek-ai/dsh@0.2.0-rc.2 pnpm
dsh --version
```

## 快速启动

### 路线A——发布的npm包（推荐）

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

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

```bash
git clone git@github.com: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（或发布的包）。

### 验证组合配置

```bash
dsh web --dump-config
```

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

### 运行

```bash
dsh web
```

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

### 卸载

```bash
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`):

```text
         ┌────────────────────── 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） |

```yaml
- 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](https://npmcn.com/package/%40hy-sde-org/dsh-web-search-public/docs/operations.md).
-   **没有取回提供程序。** `tool-web` `fetch: false` 停留：模型不能被指向 任意url，因此SSRF和不安全内容表面保持关闭。
-   **重定向的政策。** 所有引擎都使用 `redirect: "error"` -重定向被视为 失败并被合并吸收，而不是将调用方泄漏到外部位置。
-   **挑战是可以预见的。** Startpage， Ecosia和谷歌经常提供bot检查； 解析器将挑战的页面视为零结果，扇形输出容忍它们。看到 [文档/ operations.md](https://npmcn.com/package/%40hy-sde-org/dsh-web-search-public/docs/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是一个 开发者预览版。上游的接缝契约变更需要一个新的包发布和契约 审查。

## 开发

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

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

```bash
DSH_WEB_SEARCH_REAL_E2E=1 npm run test:real
```

看到 [CONTRIBUTING.md](https://npmcn.com/package/%40hy-sde-org/dsh-web-search-public/CONTRIBUTING.md) 对于发布检查表和设计约束，以及 [文档/ operations.md](https://npmcn.com/package/%40hy-sde-org/dsh-web-search-public/docs/operations.md) 用于运行时行为和故障排除。

## 许可和归属

这个包的许可是MIT——与其上游相同的许可 [oh-my-pi](https://github.com/can1357/oh-my-pi)。无需凭证的引擎抓取器和 平行 `searchPublicWeb` 聚合设计来自oh-my-pi （MIT许可，©Mario） Zechner 2025，©Can Bölük 2025-2026)；上游版权所有者记录在LICENSE中 下面是本包自己的公告，而上游公告文本则全文转载于 [THIRD-PARTY-NOTICES.md](https://npmcn.com/package/%40hy-sde-org/dsh-web-search-public/THIRD-PARTY-NOTICES.md).

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

## 常见问题

### @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 和提交记录判断。

