dsh-web-search-ddg:爲 DSH 提供免 API Key 的 DuckDuckGo 網頁搜索後端

前言

在 DeepSeek Harness(DSH)裏,模型側通常通過內置的 web_search 工具聯網檢索。默認實現往往依賴官方搜索能力或第三方 API,需要配置密鑰,有時還會爲單次查詢額外消耗模型輪次或計費 token。對本地部署、內網環境或「能搜就行、不想維護搜索 Key」的場景,這類成本並不總是可接受。

下面介紹社區插件 dsh-web-search-ddg(維護者 korosu):它不改模型看到的 web_search 工具形態,只在 ctx.web 接縫處把搜索後端換成對 DuckDuckGo 靜態 HTML 結果頁的抓取解析,實現無 API Key、無輔助模型請求、一條命令安裝。

這是什麼

dsh-web-search-ddg 是一個 out-of-tree DSH bundle,在聯網工具分類下發布。它在接縫上註冊名爲 ddg 的 search provider,並可通過 bundle 內的 patch 將 profile 的 searchProvider 固定爲 ddg。面向模型的工具仍由 dsh-tool-web 提供;本包只貢獻搜索後端。

與「自備搜索 API」相比,它的取捨是:用 HTML 抓取代替正式搜索 API,不持有任何憑證;當 DuckDuckGo 側限流或異常頁出現時,插件會按失敗預算暫時標記自身不可用,讓接縫上的 provider 選擇邏輯有機會切換到其它已註冊後端,而不是長期返回空結果。

核心功能

接縫與工具形態

插件掛載後,模型側 web_search 的 schema 與展示保持不變,僅底層搜索實現變爲 DuckDuckGo html.duckduckgo.com 結果頁的解析(默認 endpoint 爲 https://html.duckduckgo.com/html/,請求時追加 ?q=)。

無密鑰、無額外模型輪次

README 明確說明:不需要 API key,不爲每次查詢單獨發起輔助模型請求,也不按查詢計費 token。配置表中沒有憑證類字段,也沒有 settings 卡片式的 Key 填寫步驟。

失敗預算與冷卻

連續出現若干次「瞬時失敗」(含超時等)後,provider 會報告不可用,並在可配置的冷卻時間內讓出接縫,便於其它已註冊的 search provider 被選中。相關可調項包括 failureThreshold(默認 3)、cooldownMs(默認 300000,即 5 分鐘)等,見下文配置節。

預構建產物與安裝

倉庫提交預構建的 lib/,安裝時不執行本包的 build 生命週期,一般也無需在 profile 側額外聲明 allowBuilds。依賴包括 cheerio(解析 HTML)與 @deepseek-ai/schemastery。

安裝與啓用

安裝目標爲 web profile。任選下列一種方式,三種形式安裝的是同一套預構建 lib/,僅來源不同。

從 GitHub 引用安裝(README 原文):

dsh plugin --profile web add github:korosu/dsh-web-search-ddg

本地目錄(需在該目錄內曾執行過 pnpm install,以便 cheerio 等從插件真實路徑解析):

dsh plugin --profile web add /path/to/dsh-web-search-ddg

固定 release 包(latest 可換成具體 tag 以鎖定版本,例如 v0.2.0):

dsh plugin --profile web add https://github.com/korosu/dsh-web-search-ddg/releases/latest/download/dsh-web-search-ddg.tgz

dsh plugin add 會初始化 $DSH_HOME/profiles/web(若不存在)、在 profile 目錄用 pnpm 安裝依賴、讀取 bundle 的 dsh.bundle.patch 並把 dsh-web-search-ddg 寫入 dsh.profile.bundles,再由 loader 應用 cordis.patch.yml:掛載 provider 並將 searchProvider 設爲 ddg。不要去改 profile 自有的 cordis.patch.yml 來重複聲明同一層,否則會 shadow bundle 的 patch。

安裝後在不啓動完整會話的情況下可先覈對配置層:

dsh --profile web --dump-config | grep -A2 searchProvider
dsh web

輸出中應能看到標記爲 # == dsh-web-search-ddg 的層,且 searchProvider: ddg。Host 側插件行不支持熱加載,改完後需重啓 host。

用環境變量指定 provider

除 bundle 內對 searchProvider: ddg 的固定外,接縫還支持環境變量(README 截斷處起筆):

export DSH_WEB_SEARCH_PROVIDER=ddg

可在不修改 patch 語義的情況下表達「使用 ddg 後端」的意圖;具體與 profile patch 的優先級以 DSH / dsh-web 文檔爲準。

恢復默認或其它後端

移除 bundle:

dsh plugin --profile web remove dsh-web-search-ddg

或保留 bundle,在 profile 自有的 cordis.patch.yml 中把 web 行的 searchProvider 改回官方後端(README 示例爲 deepseek-official,並需同時寫全 fetchProvider: http,因 patch 行會整行替換 config,不做深合併)。

Profile 級 peer 警告

profile 是 pnpm workspace 且 autoInstallPeers: false,安裝時可能出現 @deepseek-ai/cordis、@deepseek-ai/dsh-web 未在 profile 層找到的警告。README 說明運行中的 host 會自帶這些依賴,警告通常可忽略;若需靜默,可在 profile 的 pnpm-workspace.yaml 中配置 peerDependencyRules.ignoreMissing(README 給出示例)。

配置項

所有鍵均爲可選,寫在 bundle insert 行對應的 config 中(通過擴展 patch 或文檔約定方式寫入,以你使用的 DSH 版本爲準)。

鍵 默認值 說明
endpoint https://html.duckduckgo.com/html/ 結果頁 URL,須爲絕對 http(s) 地址
maxResults 未設置 在過濾空標題、無效 URL、贊助行與重複項之後,對「可用」條目的上限;僅當請求未帶 maxResults 時生效
userAgent 桌面 Chrome 124(README 寫爲 live 驗證過的 UA) 請求 User-Agent;異常或過舊 UA 可能觸發 bot 判定
acceptLanguage 未設置 若設置則發送 accept-language 頭
timeoutMs 30000 單次請求超時(毫秒);超時計爲瞬時失敗並消耗失敗預算
minIntervalMs 0 兩次請求起始的最小間隔;一次 web_search 批量多查詢時會連續發請求,README 建議適當加大以降低異常頁概率
failureThreshold 3 連續瞬時失敗次數,達到後 provider 暫時不可用
cooldownMs 300000 上述不可用狀態的持續時間(毫秒)

典型用法

安裝並重啓 host 後,在已啓用 web profile 的 DSH 會話中,模型調用方式與使用默認搜索後端時相同:仍通過內置 web_search 工具發起查詢,無需改 prompt 或工具名。開發者側的主要工作是指定 web profile、完成安裝、確認 searchProvider 爲 ddg,必要時按網絡環境調整 timeoutMs、minIntervalMs 或 userAgent。

若需固定安裝版本,可對 GitHub 源使用 commit SHA(github:korosu/dsh-web-search-ddg#<sha>),或使用 release tarball 的 tag URL。

適用場景與注意

更適合: 沒有搜索 API Key、希望零 token 搜索後端、可接受 HTML 抓取穩定性與 DuckDuckGo 頁面策略變化的部署;與 DSH ctx.web 接縫模型一致,需要保持 web_search 工具對外形態不變時。

需要知曉的限制:

  1. 抓取 HTML 結果頁受目標站點反爬、限流與頁面結構變更影響;插件通過失敗預算與冷卻降級,但不能保證與商業搜索 API 同等的 SLA。
  2. 插件在 當前 dsh 進程權限 下發起 HTTP 請求;安裝前應閱讀源碼與 MIT 許可證,確認 outbound 訪問與依賴(cheerio 等)符合你的安全與合規要求。
  3. 社區目錄 SkillHub 是獨立生態站點,與 DeepSeek / 幻方無官方從屬關係;插件爲社區維護,星標與活躍度以 GitHub 頁面爲準。
  4. HTML 抓取僅適用於 DuckDuckGo 公開靜態結果頁場景;若你的策略禁止對外抓取或要求可審計的搜索合同,應繼續使用官方或自備 API backend。

結尾

dsh-web-search-ddg 把 DSH 的 web_search 後端換成免 Key 的 DuckDuckGo HTML 解析,一條 dsh plugin --profile web add 即可完成 profile 初始化、依賴安裝與 searchProvider: ddg 切換,適合在 web profile 下快速獲得可降級、可配置的聯網搜索能力。

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

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

小夜