前言¶
DeepSeek Harness(DSH)裏 Agent 常用的聯網入口是內置的 web_search,默認走後端 deepseek-official。如果你希望改用 AnySearch 的 MCP 檢索,又不想改工具名、參數或提示詞,就需要在 Host 側註冊新的 search provider,並在客戶端裏方便地切回官方搜索。
下面介紹社區插件 dsh-web-search-anysearch(維護者 sheen945):它只替換 web_search 的後端,並在 設置 → 插件 提供一張卡片,在 AnySearch 與 DeepSeek 官方之間即時切換。
這是什麼¶
dsh-web-search-anysearch 是一個 DSH Host 插件 bundle,分類屬於聯網工具。它向 ctx.web 註冊 id 爲 anysearch 的搜索 provider,通過 https://api.anysearch.com/mcp(MCP streamable HTTP,JSON-RPC 2.0)調用 AnySearch 的 search 工具;同時在瀏覽器端註冊設置頁卡片,讀寫與內置「網頁搜索」相同的 web 配置命名空間。
插件當前版本 1.2.1(MIT),面向 DeepSeek Harness 0.2.1-rc.2 或兼容版本;profile 目錄默認 ~/.dsh/profiles/desktop。項目與 AnySearch、DeepSeek 無隸屬關係,只是把公開 MCP 端點接到 Harness 的搜索 seam 上。
核心功能¶
不改工具契約,只換後端¶
web_search 的名稱、參數、返回結構保持原樣。插件把 AnySearch 返回的 markdown 結果塊(### N. 標題、- **URL**:、摘要行)映射爲 WebSearchSource { url, title, snippet },並按 URL 去重。網頁正文抓取仍由 fetchProvider: http 負責;本插件只替換搜索 provider。
Host 與 patch 行爲¶
index.js 註冊 provider;cordis.patch.yml 會:
insert註冊插件行web-search-anysearch(inject: [web])。- 覆蓋內置
web行:searchProvider: anysearch、fetchProvider: http。原web-search-deepseek仍註冊但不再被選中;刪掉覆蓋即可回滾。
設置頁卡片¶
client.js 在 設置 → 插件 註冊 id 爲 anysearch 的卡片(order 21)。兩個選項:
- AnySearch —— 寫入
web.searchProvider = anysearch;若已是部署默認則清除本地冗餘覆蓋。 - DeepSeek 官方 —— 寫入
deepseek-official,回退內置搜索。
卡片僅依賴 react 與 ctx.configForms(官方 ConfigFormController),不 import Harness 客戶端包。內置「網頁搜索」卡片與本卡片讀寫同一 web 命名空間,任一處改提供方都會覆蓋另一處,屬預期行爲。
限流、重試與錯誤碼¶
AnySearch 約 20 QPS,超限可能返回 403/429。插件按 retryDelayMs × attempt 指數退避重試(默認共 3 次嘗試)。交給 seam 的錯誤碼與內置 provider 同構:WEB_PROVIDER_ERROR、WEB_PROVIDER_RATE_LIMITED、WEB_PROVIDER_TIMEOUT。實現零第三方依賴,使用全局 fetch / AbortController 與 Node 內置模塊。
安裝與啓用¶
安裝前請自行查看倉庫源碼與 MIT 許可證;插件以當前 DSH 進程權限運行,密鑰與網絡訪問需你評估是否可接受。
需要 Harness 0.2.1-rc.2 或兼容版本。
方式一:讓 Agent 裝(README 推薦)
通過 plugin_manager 安裝 bundle,target 爲倉庫 URL:
plugin_manager → install_bundle → target: https://github.com/sheen945/dsh-web-search-anysearch
也可指定本地目錄絕對路徑,安裝爲目錄鏈接(link:);改代碼即時生效,移動目錄會失效。
方式二:手動裝
在 profile 的 package.json 增加依賴並 pnpm install,再在 profile 的 cordis.patch.yml(或 bundle 列表)中啓用本包;可用 plugin_manager 的 list_bundles / set_bundle 完成啓用。README 中完整步驟含從 GitHub 克隆倉庫,此處從略,見 倉庫 README。
方式三:只要遠端 provider,不要設置卡片
將 cordis.patch.yml 裏 insert 段抄入自己的 profile patch;不加載 client.js 時 provider 仍可用。
配置密鑰¶
倉庫不含任何憑據。密鑰按順序解析,命中即用:
- 插件行
apiKey(cordis.patch.yml默認留空) - 環境變量
ANYSEARCH_API_KEY - 文件
~/.dsh/anysearch.key(Windows:%USERPROFILE%\.dsh\anysearch.key)
文件方式示例:
# macOS / Linux
printf 'as_sk_你的密鑰' > ~/.dsh/anysearch.key && chmod 600 ~/.dsh/anysearch.key
# Windows PowerShell
"as_sk_你的密鑰" | Set-Content -NoNewline "$env:USERPROFILE\.dsh\anysearch.key"
密鑰可在 anysearch.com 控制台獲取。AnySearch 支持匿名低額度訪問,但無密鑰時插件 available() === false,web_search 會報 WEB_PROVIDER_CONFIGURED_UNAVAILABLE。
其餘可調項(插件行):
| 鍵 | 默認 | 說明 |
|---|---|---|
endpoint |
https://api.anysearch.com/mcp |
MCP 端點 |
apiKey |
空 | 優先級最高的密鑰來源 |
client |
mcp/1.0.0 |
X-Anysearch-Client 頭 |
timeoutMs |
60000 |
單次搜索超時 |
maxAttempts |
3 |
含首次的總嘗試次數 |
retryDelayMs |
1500 |
退避基數(毫秒) |
典型用法與驗證¶
- 配置好密鑰後,讓 Agent 執行一次
web_search:返回含Sources:列表且來源爲 AnySearch 檢索結果,即表示 provider 生效。 - 打開 設置 → 插件,應看到「網頁搜索 · AnySearch」卡片,當前值爲
AnySearch。 - 臨時回退:卡片選 DeepSeek 官方;或
plugin_manager → remove_bundle dsh-web-search-anysearch;或將 profile 裏web.searchProvider改回deepseek-official。
常見報錯對照(README):
WEB_PROVIDER_CONFIGURED_MISSING/UNAVAILABLE—— 密鑰未落到上述三處任一處。WEB_PROVIDER_RATE_LIMITED—— 撞上約 20 QPS,可調大maxAttempts或降低併發。
本地開發可跑 node --test(7 個用例,不觸網)。
適用場景與注意¶
適合誰: 已有 AnySearch API key、希望 web_search 走 AnySearch MCP,又要在 UI 裏一行切回 DeepSeek 官方;偏好零第三方依賴、倉庫不帶憑據、設置頁分段切換的實現(README 中與生態內其他 AnySearch 相關插件做了取捨說明)。
需要注意:
- 搜索結果條數上限 10(AnySearch 側限制),請求更多時會截斷。
- 目錄鏈接安裝依賴源目錄存在;tarball 安裝無此約束(
package.json中install.preferred爲tarball)。 - 密鑰文件爲明文,多用戶機器建議環境變量或系統密鑰環注入
ANYSEARCH_API_KEY。 - 插件以 DSH 進程權限訪問網絡與讀密鑰文件,安裝前請審查源碼。
結尾¶
dsh-web-search-anysearch 把 Harness 的 web_search 接到 AnySearch 遠端 MCP,並通過設置頁卡片在 AnySearch 與 DeepSeek 官方搜索之間切換,工具面不變、回滾路徑清晰。