dsh-searxng-search:让 DSH 的 web_search 走自建 SearXNG

前言

DeepSeek Harness(DSH)面向模型暴露的内置工具里,web_search 默认走随附的 DeepSeek 搜索通道(deepseek-official)。如果你已经在内网或本机部署了 SearXNG,希望检索结果来自自己的实例、且不改变模型侧的工具名与返回格式,就需要在 DSH 的 web 能力 seam 上再挂一个搜索提供方,并把 searchProvider 显式指过去。

mimoxh/dsh-searxng-search 是社区维护的 DSH 组合包插件(分类:联网工具),只做一件事:注册 id 为 searxng 的搜索提供方,通过 SearXNG 的 JSON API 响应 web_search 请求。web_fetch 仍由随附的 dsh-web-fetch-http 负责,不受影响。

这是什么

  • 名称:dsh-searxng-search(npm 包名,当前版本 0.2.0)
  • 维护者:mimoxh
  • 许可证:MIT
  • 定位:SearXNG search provider for DSH —— 零依赖、无构建步骤,仅用 Node 全局 fetch / URL / AbortSignal

插件在 package.json 中声明 dsh.seams: ["web"],通过 cordis.patch.yml 完成两件事:挂载 searxng 提供方,并将 web 行的 searchProvider 设为 searxng(避免与 deepseek-official 同时「可用」时触发 WEB_PROVIDER_AMBIGUOUS)。

核心功能

下面介绍 README 中已核实的能力要点。

不改工具契约

模型侧仍是原来的 web_search 工具,参数、结果卡片、引用格式与 DSH 默认行为一致;实现上复用 ctx.web.registerSearchProvider。

零依赖与可审计

不 import 任何 npm 包,无构建步骤。dsh-vet 在 CI 中审计 seam 声明与实现是否一致;仓库带 17 项离线自测(npm test),无需网络、无需安装依赖。

多 surface 与 profile 隔离

代码只注册 seam,不绑定单一界面。装进哪个 profile,就只有对应 surface 生效:桌面 App 用 desktop profile(须在 App 内插件管理器安装);dsh web / dsh tui / dsh headless 各自对应 web、tui、headless profile。

兼容性(资料原文)

项 要求
DSH 0.2.0-rc.2(已验证);peerDependencies 为 ^0.2.0-rc.2
Node >= 20.3.0(使用 AbortSignal.any())
运行依赖 无
构建步骤 无

DSH 目前为 developer preview,seam API(ctx.web.registerSearchProvider)可能随版本变化;第三方项目与 DeepSeek 官方无从属关系。

SearXNG 侧准备

装插件前若 SearXNG 未就绪,常见表现是搜不出结果或 HTTP 403。先做下面几步,再做安装。

1、打开 JSON API

在 SearXNG 的 settings.yml 中为 search.formats 增加 json,改完后重启 SearXNG:

search:
  formats:
    - html
    - json

未启用 JSON 时,对 format=json 的请求会返回 403(同一查询用 HTML 可能是 200)。

2、放行 DSH 主机的程序化请求

SearXNG 默认限速/机器人检测可能导致 429/403。自用最简做法是在 settings.yml 中关闭 limiter,或为 DSH 主机 IP 配置白名单(详见仓库 README「2.2 放行 DSH 主机的请求」)。

3、用 curl 确认可达

将占位地址换成你的实例:

curl -s -o /dev/null -w '%{http_code}\n' 'http://searxng.example:8888/search?q=test&format=json'

返回 200 表示 JSON 搜索就绪;403 则回到 JSON 格式配置。

安装与启用

安装前须把 baseURL 指向真实 SearXNG 实例(见下一节配置项)。仓库默认占位符未改时,提供方的 available() 为 false,web_search 会报 WEB_PROVIDER_CONFIGURED_UNAVAILABLE。

桌面端:插件管理器

  1. 打开 DSH Web 界面 → 侧栏 插件 → 添加插件。
  2. 粘贴本仓库绝对路径,或粘贴 Git 地址:
https://github.com/mimoxh/dsh-searxng-search
  1. 安装完成后等待 pnpm 结束。
  2. 完全退出并重启 DSH(关窗口不算,需确认进程退出);组合包 patch 在启动时生效。

本包尚未发布到 npm;发布后 README 给出的命令形如:

dsh plugin --profile <profile> add dsh-searxng-search

命令行:指定 profile(web / tui / headless 常用)

dsh plugin --profile web add github:mimoxh/dsh-searxng-search

本地目录示例(路径按你的环境替换):

dsh plugin --profile web add "D:/path/to/dsh-searxng-search"

bundles 末尾追加本包后,patch 会覆盖默认 searchProvider;通常只差实例地址。

用 overlay 覆盖 baseURL(不改 profile 文件)

前提:对应 profile 已安装本包。示例来自仓库 examples/dsh-searxng.overlay.yml:

export SEARXNG_BASE_URL=http://192.168.1.20:8086
dsh web      --patch ./examples/dsh-searxng.overlay.yml
dsh tui      --patch ./examples/dsh-searxng.overlay.yml
dsh headless --patch ./examples/dsh-searxng.overlay.yml "搜索今天的新闻"

overlay 在组合期读取 SEARXNG_BASE_URL;未设置时占位地址会使 provider 不可用,而不是静默回退到 DeepSeek 通道。

Web 类 surface 的额外注意

在 dsh web 与桌面端,除 provider 外还需确认当前 session 使用的 agent preset 挂载了 tool-web;否则 seam 里虽有 searxng,也没有工具调用它。dsh tui / dsh headless 走 host plane 上的 tool-web,语义与重启行为见 README「装到其他 surface 时的两个坑」。

配置项

配置位于组合包 cordis.patch.yml 中 web-search-searxng 行的 config:

字段 默认 说明
baseURL 无(可用环境变量 SEARXNG_BASE_URL) SearXNG 地址,含协议/端口/路径前缀,不要结尾斜杠
apiPath /search JSON API 路径
language 不发送 如 zh-CN、en-US、all
categories 不发送 如 general、general,news
engines 不发送 如 google,bing
timeRange 不发送 day / week / month / year
safeSearch 不发送 0 / 1 / 2
timeoutMs 15000 单次搜索超时
maxResults 10 提供方上限;seam 还会按 web_search 请求再截断

典型用法

经过上面的安装与 baseURL 配置并重启 DSH 后,在对话中像平时一样让模型使用 web_search 即可,无需新工具名。检索请求会发往你在 baseURL(或 SEARXNG_BASE_URL)配置的 SearXNG 实例;页面抓取仍走内置 web_fetch。

headless 一次性任务示例(与 README 一致):

export SEARXNG_BASE_URL=http://192.168.1.20:8086
dsh headless --patch ./examples/dsh-searxng.overlay.yml "搜索今天的新闻"

适用场景与注意

适合谁:已部署或可访问 SearXNG、希望 DSH 联网检索走自建/内网聚合搜索、且要保持 web_search 契约不变的 DSH 开发者。

安装前建议:插件以当前 DSH 进程的权限运行,会向配置的 SearXNG 发起 HTTP 请求;安装前应阅读 源码与 LICENSE,确认实例地址与 SearXNG 安全策略符合你的环境。

验证:仓库提供 npm test 离线自测;集成问题可对照 README「排错」「已知的 DSH 侧问题」。备选路径(MCP)见 README 第 8 节。

链接

社区插件目录为独立站点,与 DeepSeek / 幻方无官方从属关系;本文事实以仓库 README 与 package.json 为准。

羽毛球分组比赛记分
小程序二维码

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

Xiaoye