dsh-searxng-search:給 DSH 接一個免 API key 的本地搜索引擎

前言

DSH 自帶的 web_search 默認把 ctx.web 釘在 deepseek-official provider 上,這個 provider 需要 DEEPSEEK_API_KEY。沒有這個憑據時 searchReady() 返回 false,web_search 會被扣下,模型每一步只剩 web_fetch。想自建搜索又不想交密鑰的人,面對的就是這個門檻。

下面介紹的 Jfreey/dsh-searxng-search 補的正是這個缺口:在本機裝一個 SearXNG,把它跑起來,再把 web_search 指過去。

它是什麼

一個 DeepSeek Harness 插件,維護者 Jfreey,屬於聯網工具分類。它沒有繞過 DSH 的搜索接口,而是在 ctx.web 上註冊一個名爲 searxng 的 provider,自帶的 web_search 保持原有 schema、格式和結果卡片不變。

用戶不需要申請 API key,也不用按查詢量付費。SearXNG 自託管,聚合 Bing、Sogou、360search 等引擎,沒有廣告、沒有追蹤、沒有跳轉包裝。

核心能力

README 把插件拆成五塊,各自職責如下:

  • Provider:註冊 searxng provider。既有的 web_search 工具保持 schema、格式與結果卡片不變。
  • Supervision:每次搜索前探 /healthz;服務器掛了就通過 launchd、systemd、Windows 任務或插件自己擁有的子進程把它拉起來。
  • Installer:scripts/bootstrap-searxng.sh(macOS、Linux)和 scripts/bootstrap-searxng.ps1(WSL)以冪等方式安裝或修復實例,從不覆蓋已有 settings 文件。
  • Settings page:按類別分組的引擎表,一鍵探測本機可達的引擎、一份推薦名單,以及出站代理設置。
  • Proxy:讀寫 SearXNG 的 outgoing.proxies.all://,讓引擎請求經過本地代理。

安裝與啓用

順序是先準備 SearXNG,再裝插件。

# 1. 準備一個可指向的 SearXNG(已自行運行時可跳過)
./scripts/bootstrap-searxng.sh            # macOS / Linux
./scripts/bootstrap-searxng.sh --print    # 先看計劃再執行

# 2. 把插件裝進 DSH profile
#    在 DSH 裏走 Plugins → install from a directory,或
dsh plugin install /path/to/dsh-searxng-search

安裝腳本要求環境有 git、Python 3.11+,以及 macOS、Linux 或 WSL。SearXNG 還必須開啓 JSON 輸出,即 search.formats 裏包含 json。

指向已有實例時改 config.baseUrl 即可;指向另一臺機器時,用 ensure.enabled: false 把監督關掉,避免插件去拉遠端機器的進程。

端口是兩邊必須一致的隱式約定。安裝腳本遇到端口被不屬於 SearXNG 的進程佔用時直接拒絕,並打印是誰佔着:

Port 8888 is taken by another process:
  python3.1 (pid 835)
Nothing was installed. Use another port, and set the plugin's baseUrl to match:
  SEARXNG_PORT=8899 ./scripts/bootstrap-searxng.sh
  config.baseUrl: 'http://127.0.0.1:8899'

改成另一個端口時,腳本里傳 SEARXNG_PORT,插件側同步改 config.baseUrl。沒有自動端口回退:腳本和插件得就同一個端口達成一致。如果插件指向的端口是死的,它會掃描 8888–8896,找出既回答 /healthz 又能從 /config 返回引擎列表的實例,並提示應該用的地址。

配置

插件配置位於 profile 裏,一段完整的寫法如下:

- id: searxng-search
  name: 'dsh-searxng-search'
  config:
    baseUrl: 'http://127.0.0.1:8888'
    settingsPath: '~/.local/share/searxng/searxng.yml'   # 可選,這是默認值
    id: searxng              # web 服務釘住的 provider id
    maxResults: 20           # provider 側下限,工具還會再封頂一次
    timeoutMs: 20000
    safesearch: 0
    probeTimeoutMs: 12000    # 單次引擎探測
    # 可選的 SearXNG 查詢參數,爲空時省略:
    # language: zh-CN
    # categories: general
    # engines: google,bing
    ensure:
      enabled: true
      healthPath: /healthz
      probeTimeoutMs: 1500
      startupTimeoutMs: 20000
      probeIntervalMs: 400
      retryCooldownMs: 15000
      launchAgent: com.searxng.server   # macOS
      systemdUnit: ''                   # Linux,例如 searxng.service
      windowsTask: ''                   # Windows(僅 WSL)
      windowsService: ''
      command: ''                       # 通用兜底,由插件擁有
      args: []
      cwd: ''
      env: {}

監督是怎麼跑的

每次 web_search 先探 GET /healthz,預算 1.5 秒。服務器沒起來時按下面三級順序處理,然後輪詢到健康爲止(預算 20 秒),再執行搜索:

  1. 本平臺的監督器,前提是已配置且已安裝。由該管理器擁有進程,插件不會去 kill 它。
  2. 否則用 ensure.command,插件通過 ctx.subprocess 啓動它,並擁有它,卸載插件時終止。
  3. 兩者都沒有時搜索失敗,錯誤信息列出試過哪些方式、該改哪個配置或裝哪部分。

啓動失敗會被記住 retryCooldownMs,併發搜索共享一次恢復嘗試。provider 不實現 ready(),因此 web_search 始終對每次模型調用開放——服務器宕機時表現爲一條可操作的工具錯誤,而不是工具無聲消失。

平臺支持

平臺 監督器 安裝腳本 狀態
macOS LaunchAgent,launchctl kickstart -k gui/<uid>/<label> bootstrap-searxng.sh 真機驗證過安裝、自愈與乾淨卸載
Linux systemd user unit,systemctl --user restart,失敗回退 systemctl restart bootstrap-searxng.sh 安裝器、設置、JSON API 與插件往返在 Ubuntu 24.04 容器驗證過;unit 本身只用打樁的 systemctl 驗證
Windows — bootstrap-searxng.ps1 在 WSL 之外直接拒絕 不支持原生運行:SearXNG 的 searx/valkeydb.py import 了 POSIX 專屬的 pwd 模塊,進程在 import 階段就退出。改用 WSL、Docker,或用 config.baseUrl 指向 Linux/macOS 實例

插件那一半是純 Node,任何平臺都能跑;被 POSIX 綁定的只有服務器本身。

引擎頁的打分

Settings 頁打開後會立刻探測已經勾選的引擎,因此表格永遠不會空着,也可以按需重新探測。每項打分 0–100,構成如下:

組成 分值 規則
應答 55 返回合法 JSON,且沒有針對它的 unresponsive_engines 條目
延遲 25 / 18 / 10 / 4 / 0 ≤0.8s / ≤2s / ≤5s / ≤15s / 更慢
返回量 20 / 12 / 4 ≥5 條 / 1–4 條 / 無

這是可用性評分,不是準確率——沒有任何組件把引擎答案和 ground truth 做比較。沒有 labelled corpus、也沒做跨引擎一致性採樣,頁面不做這種聲稱。

分數上方會標出兩類建議:沒應答的引擎(CAPTCHA、被封、被停用)和應答慢於 5 秒的引擎,兩者都提供一鍵「select the working set」,只取消勾選這些。零結果不算建議:探測只發一條短查詢,貨幣或翻譯類引擎在 5ms 內合理地返回空但本身正常,這類只作爲 note 列出。

Apply 會爲每個引擎寫一條顯式開關(- name: "<engine>" + disabled: true|false),並刪掉 use_default_settings.engines.keep_only。白名單是單向門——寫進去之後 /config 只返回被保留的引擎,其他引擎會從頁面上消失且無法再打開。首次 apply 會把文件從它遷走;頁面也會列出從 SearXNG 自己的 searx/settings.yml 解析出的引擎,因此即便還沒遷移,目錄也是完整的。

適用場景與注意

適合這樣幾類人:

  • 想本地跑搜索、不接受第三方密鑰和按量計費的 DSH profile 使用者。
  • 已經會自建 SearXNG、需要讓 DSH 指向它的人。
  • 網絡環境裏部分引擎不通、想按自家網絡實測結果挑引擎集合的人。

需要留意的點:

  • 插件以當前 dsh 進程的權限運行,安裝前應檢查插件源碼與許可證(license 爲 MIT)。
  • Windows 原生跑不起來服務器,只能走 WSL 或 Docker,或指向遠端實例。
  • 引擎表打分只反映可達性、延遲和返回量,不代表搜索質量;要判斷質量得自己搭 labelled 語料或做一致性採樣,插件沒做這件事。

結尾

這個插件的價值不在於換一套搜索接口,而在於把「免 key 的本地搜索」變成 DSH profile 裏的一個插件開關:裝一次,web_search 就能指向自己機器上的 SearXNG,服務器宕了按配置自愈,引擎集合按本機實測結果調整。所有代碼在 GitHub 上開源,目錄頁是社區站點,與 DeepSeek / 幻方沒有官方從屬關係。

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

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

小夜