dsh-web-searxng-search:用自托管 SearXNG 替代 DSH 内置联网搜索

前言

DeepSeek Harness(DSH)在 web profile 里提供 web_search 工具,默认走 DeepSeek API 侧的搜索能力:每次查询会计费,且与 API Key 绑定。若你已有或可部署 SearXNG 元搜索引擎,更希望 Agent 的联网检索走自己掌控的基础设施、且不依赖第三方搜索 API 账号,就需要在 ctx.web 这条 seam 上注册另一套 WebSearchProvider。

下面介绍社区插件 dsh-web-searxng-search(维护者 kkgace,分类:联网工具)。它在 Harness 里挂接自托管 SearXNG 实例,无需 API Key 与厂商账号;内置 web_search 的调用方式不变,由配置切换实际后端。

这是什么

dsh-web-searxng-search 是 DSH 的 Cordis 插件:实现 WebSearchProvider 契约,通过 ctx.web.registerSearchProvider 注册搜索提供者,并由 bundle 自带的 cordis.patch.yml 将 web.searchProvider 指向 searxng。搜索请求发往你在 baseURL 中配置的 SearXNG 根地址,读取其 Search API 的 JSON 结果。

插件本身无额外运行时依赖;@deepseek-ai/* 由宿主作为 peer 提供。要求 Node.js >= 22.19,DeepSeek Harness 侧需 @deepseek-ai/dsh-web 0.1.x。

核心功能

README 中列出的能力如下,均围绕「替换 provider、不改工具面」:

  1. 即插即用:在 ctx.web seam 上注册 provider,内置 web_search 继续可用。
  2. 可配置检索行为:超时、语言、安全搜索级别、SearXNG categories 与 engines 白名单。
  3. 结果按 URL 去重:元搜索常返回重复条目。
  4. 配置错误可区分:实例返回 HTML(未开 JSON)与「无结果」会给出不同提示。
  5. 生命周期:注册包在 ctx.effect 中,卸载与 HMR 可干净回滚。
  6. 离线测试:仓库含 14 个不依赖网络的单元测试(npm test)。

失败以 WebError 抛出,宿主处理;不会静默回退到其他 provider。

前置条件:SearXNG 开启 JSON

SearXNG 默认不输出 JSON;未启用时实例仍可能返回 200 与 HTML 页面,插件会报配置类错误而非「无结果」。在实例的 settings.yml 中启用 JSON:

# settings.yml
search:
  formats:
    - html
    - json

安装插件前,用 curl 验证端点(将地址换成你的实例):

curl -fsS 'http://localhost:8888/search?q=test&format=json' | head -c 120

安装与启用

在 web profile 下添加插件(命令来自官方 README):

# from npm
dsh plugin --profile web add dsh-web-searxng-search

# from GitHub
dsh plugin --profile web add github:kkgace/dsh-web-searxng-search

# from a local checkout
dsh plugin --profile web add /path/to/dsh-web-searxng-search

然后重启 web 应用:

dsh web

插件上架后,也可在 Settings → Plugin Market 中安装。

注意:仅安装插件不够。bundle 会通过 patch 将 web.searchProvider 设为 searxng;若 profile 未生效或仍指向内置 provider,web_search 会继续走原后端。修改配置后需重启 dsh web。

配置

默认 baseURL 为 http://localhost:8888。指向自有实例时,在 profile overlay 里补丁已有条目,不要 insert 新行(否则会与 bundle 重复 id,启动报 duplicate loader entry id: web-search-searxng):

# ~/.dsh/profiles/web/cordis.patch.yml
- id: web-search-searxng
  config:
    baseURL: 'https://searxng.example.com'

也可在运行 dsh 的环境中设置 SEARXNG_BASE_URL。

选项 类型 默认 说明
baseURL string http://localhost:8888 实例根 URL,不要带末尾 /search
timeoutMs number 15000 单次请求超时,1000–120000 ms
language string — 传给实例的 UI 语言,如 en-US
safeSearch 0 \| 1 \| 2 0 关闭 · 适中 · 严格
categories string — 逗号分隔类别,如 general,it
engines string — 逗号分隔引擎名,缩小检索范围
apiKey string — 仅当实例需要 Bearer 时填写

典型用法与排查

仍走其他 provider:检查 web.searchProvider 是否为 searxng,并确认已执行 dsh web 重启。

有数据却显示无结果:多为实例未开 JSON format,见上文 settings.yml。

WEB_PROVIDER_CONFIGURED_UNAVAILABLE:available() 为 false,通常 baseURL 不是合法的 http(s) 绝对 URL。

WEB_PROVIDER_TIMEOUT:在 timeoutMs 内实例未响应,可调大超时或检查网络与实例负载。

Agent 侧无需改工具名:配置正确后,对话里照常触发 web_search,请求由插件转发到 SearXNG。

适用场景与注意

适合:已部署或计划部署 SearXNG、希望 DSH Agent 联网检索自控、避免 DeepSeek 搜索 API 计费与 Key 归因的团队或个人。

不适合:没有可维护的 SearXNG 实例,或不愿在元搜索层做引擎与合规配置的场景。

DSH 生态强调「一切皆插件」;SkillHub 等社区目录独立于 DeepSeek / 幻方,并非官方应用商店。插件以当前 dsh 进程权限运行,安装前建议阅读仓库源码与 MIT 许可证,确认 baseURL 与可选 apiKey 符合你的安全策略。

结尾

dsh-web-searxng-search 在 ctx.web 上把 web_search 接到自托管 SearXNG,保留工具接口、换掉计费与厂商账号依赖;前提是实例开启 JSON API,并通过 patch 正确选中 searxng provider。

  • 目录页:https://www.skillhub.cn/plugins/kkgace/dsh-web-searxng-search
  • GitHub:https://github.com/kkgace/dsh-web-searxng-search
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye