前言¶
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:註冊
searxngprovider。既有的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 秒),再執行搜索:
- 本平臺的監督器,前提是已配置且已安裝。由該管理器擁有進程,插件不會去 kill 它。
- 否則用
ensure.command,插件通過ctx.subprocess啓動它,並擁有它,卸載插件時終止。 - 兩者都沒有時搜索失敗,錯誤信息列出試過哪些方式、該改哪個配置或裝哪部分。
啓動失敗會被記住 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