前言¶
DeepSeek Harness(DSH)裏,智能體要通過 ctx.web 做聯網搜索時,默認會走內置的 web-search-deepseek:它調用公網 api.deepseek.com 上的 web_search_20250305 工具,並且必須配置一把有效的公網 DeepSeek API key。實際部署裏,對話模型經常走內網網關,公網 key 失效或未配置時,搜索只會返回 HTTP 401,對話裏表現爲「搜不了網」。社區插件 dsh-web-search-tavily(維護者 liufeicc,分類:聯網工具)把 Tavily 接到同一套 web 接縫上,默認 keyless,不註冊賬號、不寫 API key 也能先試;需要穩定用量時再切到官方免費 key,配置不必改代碼路徑。
這是什麼¶
dsh-web-search-tavily 是 Tavily 的 WebSearchProvider 實現:只負責搜索,網頁抓取仍由內置 http 的 fetchProvider 承擔。它替換的是依賴公網 DeepSeek API key 的內置搜索 provider,而不是整包重寫 ctx.web。
| 項目 | 說明 |
|---|---|
| 目錄頁 | https://www.skillhub.cn/plugins/liufeicc/dsh-web-search-tavily |
| 源碼 | https://github.com/liufeicc/dsh-web-search-tavily |
| 包名 | @local/dsh-web-search-tavily(本地 link: 引用) |
| 許可證 | MIT(見倉庫 package.json) |
插件在 DSH 進程內以當前 profile 的權限運行;安裝前建議自行瀏覽源碼與許可證。
爲什麼需要它:內置搜索與 keyless 路徑¶
內置 web-search-deepseek 在鑑權失敗時典型報錯爲:
DeepSeek API error (HTTP 401): Authentication Fails
本插件走 Tavily API。官方提供 keyless 通道,請求時加上請求頭即可,返回 schema 與帶 key 時一致:
X-Tavily-Access-Mode: keyless
官方將 keyless 定位爲 exploration / light use,有速率上限;觸頂後註冊免費 key(README 寫明約 1000 credits/月、無需信用卡),把 accessMode 改爲 api-key 並配置 key,無需改插件業務代碼。
核心功能¶
搜索接縫¶
- 實現 DSH
WebSearchProvider,對接searchProvider: tavily。 - 單次結果條數、搜索深度、超時等可在 profile 的插件
config裏調節(見下節)。 - 返回的
content摘要截斷到 600 字符,避免佔滿上下文;需要正文可繼續用web_fetch(須保留fetchProvider: http)。
超時與取消(兩道保險)¶
DSH 的 timeout-policy 是協作式:只 abort 一個 AbortSignal,下游未接力時會一直掛起。本插件合併調用方信號與本地硬超時:
AbortSignal.any([callerSignal, AbortSignal.timeout(timeoutMs)])
callerSignal:用戶點停止,或工具層 60s 預算;AbortSignal.timeout(...):插件本地上限(默認timeoutMs20000)。
README 記載:取消約 513ms 返回 WEB_ABORTED;1s 硬超時約 1023ms 返回 WEB_PROVIDER_ERROR。即使上層取消鏈路斷了,單次搜索也會在 timeoutMs 內結束並返回明確錯誤。
已知限制(README)¶
- keyless 有速率上限,官方未給具體數字;高頻請用免費 key。
- 僅搜索,不實現抓取;
web_fetch依賴內置 http provider。
配置項¶
在 profile 的 cordis.patch.yml 裏,給插件行寫 config(字段以 README 爲準):
| 字段 | 默認值 | 說明 |
|---|---|---|
accessMode |
keyless |
keyless 或 api-key |
apiKey |
— | 正式 key;僅 api-key 模式 |
apiKeyEnv |
TAVILY_API_KEY |
apiKey 未配置時從該環境變量讀取 |
baseURL |
https://api.tavily.com |
可指向代理或自建網關 |
searchDepth |
basic |
basic = 1 credit/次;advanced = 2 credits/次 |
timeoutMs |
20000 |
本地硬超時(毫秒) |
maxResults |
8 |
單次搜索來源上限 |
安裝與啓用¶
官方 README 未提供 dsh plugin add github:... 一類命令,而是 本地目錄 + link: 依賴 + Cordis patch。下面步驟與倉庫一致,路徑請換成你的環境。
-
將倉庫放到固定目錄,例如
$HOME/data/claude-workspace/dsh/dsh-web-search-tavily/。 -
在 profile 的
package.json增加依賴(路徑改爲絕對路徑):
"@local/dsh-web-search-tavily": "link:/absolute/path/to/dsh-web-search-tavily"
- 在 profile 的
cordis.patch.yml末尾追加:
- insert:
- id: web-search-tavily
name: '@local/dsh-web-search-tavily'
- id: web
config:
searchProvider: tavily
fetchProvider: http
- id: web 表示覆蓋整行、config 整體替換。searchProvider 與 fetchProvider 都要寫全;只寫 searchProvider 會抹掉 fetchProvider,連帶 web_fetch 失效。
- profile 若爲
patchReload: live,改完 patch 即熱加載,無需重啓 dsh。
peer 依賴與插件目錄裏的 node_modules¶
插件 import @deepseek-ai/schemastery 與 @deepseek-ai/dsh-web。profile 通過 link: 引用時,pnpm 不會在插件目錄安裝 peer,Node 從插件真實路徑向上解析可能 ERR_MODULE_NOT_FOUND。倉庫說明:在插件目錄用符號鏈接指向 $DSH_HOME/profiles/node_modules/@deepseek-ai/ 下的對應包;換 DSH_HOME 或升級 DSH 後若報錯,重建鏈接即可。
典型用法¶
啓用後,智能體側仍通過 DSH 統一的 web 工具使用搜索,無需爲 Tavily 單獨寫調用代碼。運維側常見做法是:
- 先用默認
accessMode: keyless驗證接縫與超時行爲; - 遇到速率限制時,註冊 Tavily 免費 key,設
accessMode: api-key,配置apiKey或環境變量TAVILY_API_KEY; - 內網需出網代理時,調整
baseURL; - 對實時性要求高的任務,酌情調小
timeoutMs,並確認取消能較快得到WEB_ABORTED。
摘要被截斷時,對命中 URL 再發起 web_fetch(依賴上節保留的 fetchProvider: http)。
適用場景與注意¶
適合誰: 已用 DSH 做智能體或自動化,聊天模型走內網或不想維護公網 DeepSeek key,但仍需要聯網檢索;願意用社區「一切皆插件」方式改 profile,而不是改 DSH 核心。
注意:
- 插件與 profile 同進程、同權限;安裝前核對 GitHub 源碼與 MIT 許可證。
- 社區目錄站點(如 skillhub.cn)與 DeepSeek / 幻方無官方從屬關係,本文檔描述的是社區維護的聯網工具插件,非官方應用商店條目。
- GitHub 公開星標爲 0(截至撰寫時線索);功能事實以 README 與
package.json爲準。
結尾¶
dsh-web-search-tavily 把 Tavily 接到 DSH 的 ctx.web 搜索接縫:默認 keyless、可漸進升級到 API key,並用 AbortSignal.any 補上本地硬超時,緩解「點停止仍轉圈」這類協作取消斷鏈問題。按 README 完成 link: 安裝與 cordis.patch.yml 後,即可在不依賴公網 DeepSeek 搜索 key 的前提下恢復聯網檢索。
- 目錄頁:https://www.skillhub.cn/plugins/liufeicc/dsh-web-search-tavily
- 源碼:https://github.com/liufeicc/dsh-web-search-tavily