DeepSeek Harness Hub
← 返回列表

chinng-inta/dsh-web-search-searxng

DeepSeek Harnessspec-screened在 GitHub 查看 ↗
✓ 可直接安装

一个由 SearXNG 支持的 WebSearchProvider,用于

自动检查通过:npm 包已发布且 engines 声明满足基线(声明 Node >=22);该结论来自程序自动检查,未经人工实机验证。 · 最近上游提交 2026/9/4 · 已提供中文文档
综合分
36.4
GitHub 分
36.4
用户评分
★ Stars
4
周下载量
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add dsh-web-search-searxng
npm 包 dsh-web-search-searxng 已校验归属本仓库,走 npm 安装最省事
数据截至 2026/9/19(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
安装兼容性检查✓ 自动检查通过

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

npm 包dsh-web-search-searxng @ 0.4.0
Node 引擎要求 >=22 · 基线 Node 22.19 满足
dsh CLI 依赖未声明 dsh 版本约束
入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后验证 2026/9/19 20:58:56

依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery@deepseek-ai/cordis@deepseek-ai/dsh-client-store@deepseek-ai/dsh-client-ui-primitives@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-settings@deepseek-ai/dsh-typert-protocol@deepseek-ai/dsh-typert-registry@deepseek-ai/dsh-web
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动

README

dsh-web-search-searxng

一个由 SearXNG 支持的 WebSearchProvider,用于
DeepSeek Harness 的 web 能力接缝(ctx.web)。

SearXNG 是一个自托管的元搜索引擎。这里的一次搜索就是对实例的
/search?format=json 端点发起的一次普通检索调用,因此与随附的 DeepSeek provider 不同,它不需要 API
密钥,也不消耗模型轮次——随附的 provider 会发起一次完整的 Messages 请求并使用原生 web_search 服务端工具,每次搜索都要付出延迟和生成 token 的代价。

这是一个实现包:它向 ctx.web 注册一个 provider,而不
注册面向模型的工具。@deepseek-ai/dsh-tool-web 拥有 web_search、其 schema、其提示词
指引以及结果卡片。安装此包即可让那个已有的工具针对你自己的实例工作。

安装

从 npm 安装

dsh plugin --profile web add dsh-web-search-searxng

从本仓库安装

dsh plugin --profile web add github:chinng-inta/dsh-web-search-searxng

git 依赖不会附带 lib/,因此该包会通过其 prepare 脚本自行构建——而
pnpm 会阻止安装脚本,直到你允许它们为止。因此首次运行会失败,并打印出需要允许的确切
键。将其添加到你的 profile 的 pnpm-workspace.yaml 中并重新运行:

allowBuilds:
"dsh-web-search-searxng@https://codeload.github.com/chinng-inta/dsh-web-search-searxng/tar.gz/": true

该键会固定一个提交,因此每当你安装更新的修订版本时它都会变化。从源码构建还需要
获取开发工具链(约 20 秒,而使用 registry 约 2 秒)。除非你在跟踪未发布的更改,否则优先使用 npm。

两种方式都一样

该包声明了 dsh.bundle,因此一条命令即可激活它:bundle 补丁
会插入 provider 行,并在 web 行上选中它。将其指向你的实例并重启:

export SEARXNG_URL=http://searxng.internal:8888

在启动前验证组合:

dsh --profile web --dump-config | grep -A3 'id: web'

你的实例必须提供 JSON

SearXNG 默认不启用 JSON API。在实例的 settings.yml 中:

search:
formats:
- html
- json

没有它,端点会以 HTML 结果页作答,而此 provider 会失败并给出指明修复方法的
消息,而不是解析错误。

公共实例是糟糕的后端:大多数会拒绝程序化访问(来自机器人过滤器的 HTTP 403)
或进行严格的速率限制。请运行你自己的实例。

配置

该插件拥有 web-search-searxng 设置命名空间,因此其配置节会在 harness 自身的
分层中解析:

schema 默认值  →  插件行的 config(组合基础)  →  设置文档中的用户层

当没有任何层设置 baseURL 时,它还会回退到 $SEARXNG_URL。开始使用无需其他配置:导出该变量,provider 即已配置完成。
该部分按每次搜索进行投影,因此对设置文档的编辑无需重启即可影响下一次搜索——并且清除 baseURL 会回退到环境变量,而不是让提供程序困在一个它再也看不到的值上。注册本身从不移动,因此当配置变化时,提供程序选择不会闪烁。

未挂载设置提供程序的部署仍可正常工作:源会回退到组合条目,与组合时完全一致。

所有键都是可选的。

| 键 | 默认值 | 含义 |
|---|---|---|
| baseURL | $SEARXNG_URL | 实例根地址;会追加 /search。缺失或非 http(s) 会使提供程序报告为不可用,而不是让每次搜索都失败。 |
| categories | 实例默认值 | categories= 过滤器,例如 ['news']。 |
| engines | 实例默认值 | engines= 过滤器,例如 ['duckduckgo', 'brave']。 |
| language | 实例默认值 | language= 过滤器,例如 ja、en-US。 |
| timeRange | 未设置 | time_range= 过滤器:day / week / month / year。 |
| safesearch | 实例默认值 | safesearch=:0 关闭,1 适中,2 严格。 |
| timeoutMs | 10000 | 单次搜索的资源兜底。 |
| maxSnippetChars | 500 | 每个来源的片段上限。 |
| headers | 无 | 额外的请求头,例如用于位于认证代理之后的实例。 |

作为插件行的组合基础:

- id: web-search-searxng
name: 'dsh-web-search-searxng'
config:
baseURL: http://searxng.internal:8888
language: ja
categories:
- general
- news

…或作为 harness 设置文档中的用户层(默认位于 $DSH_HOME/settings.yaml),它优先于上面的行,并且是配置界面所写入的内容:

web-search-searxng:
language: ja
maxSnippetChars: 300

每个塑造搜索行为的旋钮都是部署设置,而不是模型参数。该接缝的 WebSearchRequest 被刻意设计为仅包含 query + maxResults;提供程序中立的控制项(时效性、域过滤器、搜索深度)在上游被列为延迟工作。将它们保留在配置中,正是使此提供程序可替代随附提供程序的原因。

timeoutMs 是资源兜底,而不是面向模型的工具调用预算——@deepseek-ai/dsh-tool-call-timeout-policy 通过 tool-web 的 searchTimeoutMs 掌管后者。将此值保持在工具预算以下,这样缓慢的实例会表现为提供程序失败,而不是工具超时。

提供程序选择

bundle 补丁设置了 web.searchProvider: searxng。这是必需的,而非主观意见。

该接缝仅在恰好一个已注册提供程序可用时才会自动选择,而 @deepseek-ai/dsh-web-search-deepseek 只要存在凭据解析器——其自身的 apply() 总是会提供——就报告为可用,因此即使在未配置密钥的原始组合上,它也会回答 available() === true。注册第二个提供程序而不指定使用哪一个,会使每次搜索都以 WEB_PROVIDER_AMBIGUOUS 失败。
Bundle 层会在你的 profile 的 cordis.patch.yml、home patch 以及任何 --patch 覆盖层之前应用,因此你始终可以覆盖该选择。但请注意,patch 会替换目标行的整个 config:如果你为了其他目的自行 patch web 行,也要在那里重新声明 searchProvider: searxng。

映射

| SearXNG | Seam |
|---|---|
| results[].url | sources[].url(必需;没有该字段的结果会被丢弃) |
| results[].title | sources[].title |
| results[].content | sources[].snippet,上限为 maxSnippetChars |
| results[].publishedDate | sources[].publishedAt |
| answers[] | content,以换行符连接;为空时省略 |

来源按 URL 去重,因为元搜索引擎会合并那些经常返回同一页面的引擎。空字符串被视为缺失,而不是作为空字段发出——seam 的可选字段存在,正是为了让适配器永远不必凭空捏造它们。

truncated 从此 provider 始终为 false:maxResults 的强制执行由 seam 负责,报告我们自己的截断会错误归因于是谁的边界截断了列表。

错误

失败是 WebError,工具层会将其转换为可读的工具结果。

| 情况 | 代码 |
|---|---|
| 调用方取消 | WEB_ABORTED |
| timeoutMs 已过 | WEB_PROVIDER_ERROR |
| 实例返回非 2xx(403 带有机器人过滤提示) | WEB_PROVIDER_ERROR |
| 响应不是 JSON(通常是 formats 配置错误) | WEB_PROVIDER_ERROR |
| 无法解析的响应体 | WEB_PROVIDER_ERROR |

available() 是一个开销很小的同步检查——一个可解析的 http(s) 基础 URL——正如 seam 所要求的;它从不访问网络。

重定向会被拒绝(redirect: 'error')。自托管实例没有理由重定向搜索,而跟随重定向会将查询发送到部署从未配置过的主机。

已知限制

- maxResults 不会下推。 SearXNG 不暴露结果数量参数,因此实例返回其完整的第一页,由 seam 进行截断。这限制的是 token,而不是实例的工作量。
- publishedDate 通常缺失。 通用网络引擎很少为结果标注日期;新闻引擎通常会。如果你需要日期,请使用 categories: ['news'] 进行过滤。
- 信息框不会呈现。 它们是结构化的实体卡片,而不是对查询的回答,因此将它们扁平化到 content 中会把它们当作回答来呈现。
- 没有按引擎的失败报告。 SearXNG 在部分失败时会报告 unresponsive_engines[];seam 的结果结构没有地方放置它,因此降级的搜索看起来就像结果稀少的搜索。

兼容性

| 本包 | DeepSeek Harness |
|---|---|
| 0.4.0+ | 0.1.2-rc.1 |
| 0.3.3 – 0.3.x | 0.1.0-rc.8 – 0.1.1-rc.2 |
| 0.1.x – 0.3.2 | 0.1.0-rc.6 |

每一行都是互斥的:这里没有任何东西向后兼容,也没有任何更旧的版本向前兼容。安装错误的配对不仅会丢失这张卡——它会使整个
Web UI 的插件加载,因为破坏会表现为无法解析的客户端 require 或无效的插槽注册(#1):

- rc.8 从加载器的种子表中移除了 @deepseek-ai/dsh-client-web-react。直到 0.3.2,此包都从它导入 bindSnapshotSelector。0.3.3 改为通过插槽注入面的 hooks 隔间将其 store 交给渲染器,而 rc.8 正是在那里合成选择器钩子。
- rc.8 将 settings.plugin.item 从 list 插槽(id + order)变成了 keyed 插槽(key = 卡片所编辑的设置命名空间)。0.3.3 以 keyed 方式注册,而 rc.6 会拒绝这种方式。
- 0.1.2-alpha.1 直接删除了 @deepseek-ai/dsh-client-runtime。直到 0.3.x,此包都从它获取 createSnapshotStore,并在 dsh.client.inject 中声明它;0.4.0 从 @deepseek-ai/dsh-client-store(前端现在交给加载器的一个种子)获取同一函数,并从 inject 中移除这个幻影依赖,否则该行会永远处于待处理状态。
- 0.1.2-alpha.2 从 @deepseek-ai/dsh-settings 中删除了 settingsNamespace() 和 installSettingsSection() 辅助函数。0.4.0 使用裸命名空间字面量,并在 ctx.inject(['settings'], …) 内调用 settings.installSection,这现在是附加/分离生命周期。

0.3.0 发布设置卡片时没有附带其样式表——它能工作,但会以浏览器默认样式渲染。请使用 0.3.1 或更高版本。

该 harness 是一个开发者预览版,各发布候选版本之间存在破坏性变更,其包在 next dist-tag 下发布当前活跃线(latest 仍指向较旧的 0.0.1-rc.1)。请固定你的 harness 版本。

许可证

MIT

上游仓库有新提交时邮件通知你(每天最多一封,无更新不打扰),随时一键退订。

💬 加入 DPharness 群聊

插件用法、部署报错、新插件第一时间同步——群里问,比一个人翻文档快。

点击加入 QQ 群
DPharness 群聊二维码,手机 QQ 扫码进群
扫码进群