前言¶
DeepSeek Harness(dsh)是 DeepSeek 開源的智能體運行時,官方定位是開發者預覽版,口號是「一切皆插件」:模型適配、工具註冊、會話日誌、Agent 循環,都可以用插件替換,而不必改運行時源碼。啓動 Web UI 的官方入口是:
npx @deepseek-ai/dsh web
真正動手時,另一個缺口很快出現:不少主力模型本身沒有聯網,或者官方搜索只覆蓋網頁、不覆蓋指定頁面和 X(Twitter)。問「今天 Node.js LTS 是哪一版」、貼一篇博客讓它概括、追一條推文討論,模型只能憑訓練數據猜。dsh 雖然自帶 web_search 接縫,默認釘在 DeepSeek 帶 key 的搜索 API 上;自帶的 web_fetch 則默認關閉。
社區目錄 deepseek-harness-plugin.com 是獨立站點,與 DeepSeek / 幻方沒有官方從屬關係。它把擴展按分類收錄,其中「界面增強」下有一個插件:modsearch。名字看起來像皮膚,實際做的是把搜索接到 dsh 已有的 Web 接縫上,並保留 Web UI 的引用卡片。
本文按該目錄詳情頁、GitHub 倉庫 README / INSTALL.md / 宿主接入文檔 / CLI 手冊 / 輸出契約 / 安全說明,以及 DeepSeek Harness 官方倉庫覈對後整理:它是什麼、裝完能做什麼、命令怎麼寫、結果長什麼樣。
這是什麼¶
modsearch 是由 liustack(package.json 作者署名爲 Leon Liu)維護的聯網搜索插件,npm 包名 @liustack/modsearch,許可證 MIT,主要語言 TypeScript。寫作時倉庫 package.json 版本爲 5.4.2(2026-08-17),要求 Node.js >= 22.13。社區目錄把它分在「界面增強」,收錄日期 2026-08-15;GitHub 倉庫在 2026-08-17 顯示 113 star(目錄頁快照爲 100,星標以倉庫頁面爲準)。
目錄頁的一句話是:DeepSeek Harness 的聯網搜索橋接,讓沒有原生聯網能力的模型也能問網頁或 X,拿到結構化答案。倉庫 README 中英對照同一件事:搜索、抓取、引用,輸出機器可讀的 JSON 證據。
在 dsh 裏,它不是一份靠提示詞觸發的 Skill。宿主接入文檔寫得很明確:這個包本身是 dsh bundle,以原生插件接入。bundle 做三件事:把 modsearch 引擎鏈註冊爲 web_search 的 provider,並把接縫指過來(searchProvider: modsearch);另外註冊兩個 dsh 沒有接縫的工具——搜 X 的 x_search,以及帶焦點讀單頁的 read_page。模型繼續用原來的 web_search schema,Web UI 的引用卡片也保留。
同一套引擎也以 Agent Skill 形式出現在 Claude Code、Codex、Pi、OpenCode 上,配置都寫在 ~/.modsearch/config.json。本文以 dsh 爲主。
核心功能¶
1. 把內置 web_search 接到引擎鏈上¶
dsh 本就有一條 Web 能力接縫:ctx.web 上的搜索與抓取,再由 dsh-tool-web 暴露成模型可調用的 web_search / web_fetch。modsearch 不另起一個競爭工具,而是註冊 id 爲 modsearch 的 search provider。cordis.patch.yml 把 web 這一層的 searchProvider 從默認的 deepseek-official 改成 modsearch。
效果是:只要本機配好了下面任一搜索引擎,web_search 就可以在沒有 DeepSeek 搜索 key 的情況下跑起來;引用卡片仍走宿主原來的展示。想切回去,在更後面的 profile patch 裏把 searchProvider 釘回其他 provider 即可。
插件啓動 CLI 子進程時,用的是包內 dist/main.js,不查 PATH、不走 npx,插件和引擎版本鎖在一起。dsh 跑在 Electron 桌面宿主裏時,會顯式設置 ELECTRON_RUN_AS_NODE=1,避免把 CLI 路徑重新交給桌面應用。
2. x_search 和 read_page¶
網頁接縫覆蓋不到的兩塊,插件做成獨立工具,schema 隨每次請求發給模型,不靠關鍵詞啓發式。
x_search:查詢 X(Twitter)上的帖子、線程、賬號或討論。Grok Build 已安裝並登錄時,路由給它;否則用網頁引擎頂替,並在輸出裏標成degraded,不會無聲假裝搜過 X。read_page:讀一個 http(s) URL,返回摘要、提取正文、外鏈和不確定項,可用query指定閱讀焦點。宿主接入文檔說明:dsh 自帶的web_fetch默認關閉,因爲它把 SSRF 防護推給別人;modsearch 的抓取默認攔截私網目標,且這個工具不暴露繞開開關。
3. 多引擎,自動故障轉移¶
倉庫 README 列出六條通道,配好其中一個就能用。key 存在 ~/.modsearch/config.json(權限 0600,展示時打碼),也可以走環境變量 TAVILY_API_KEY、EXA_API_KEY、FIRECRAWL_API_KEY。
| 引擎 | 能做什麼 | 倉庫寫明的免費條件 | 怎麼開 |
|---|---|---|---|
Antigravity CLI(agy) |
網頁搜索 + 單頁抓取 | 免費,瀏覽器登錄 | 安裝 agy 並登錄 |
| Tavily | 網頁搜索 | 每月 1,000 credits,文檔寫註冊不綁卡 | modsearch config set tavily.apiKey <key> |
| Exa | 網頁搜索 | 每月約 1,400 次($10 循環額度),文檔寫註冊不綁卡 | modsearch config set exa.apiKey <key> |
| Firecrawl | 網頁搜索 + 單頁抓取 | 每月 1,000 credits;文檔寫搜索甚至可以無 key | modsearch config set firecrawl.apiKey <key> |
| Grok Build | X(Twitter)搜索 | 隨 SuperGrok 或 X Premium | 安裝 grok 並登錄 |
| local | 單頁抓取 | 內置 | 無需配置 |
配了多個引擎就按優先級自動切換:一個通道失敗或額度耗盡時,下一個接手。額度冷卻故障轉移默認開,modsearch config set cooldown off 可關。兼容 Tavily / Exa / Firecrawl 的第三方或自建端點,可以用 modsearch config set tavily.baseURL <url> 這類命令改地址。
local 抓取器默認拒絕私網和雲 metadata 地址,並對每次 DNS 解析做 IP 釘扎,避免重綁定。VPN 把公網主機映射進保留地址段時,可用 --allow-private-network 或 modsearch config set allowPrivateNetwork true 打開,文檔明確說這是給本地抓取器放行,不是把內網主機名交給雲端服務。
4. 結構化 JSON,而不是一段無法覈驗的散文¶
CLI 每次向 stdout 打一個信封。搜索模式的外形來自官方輸出契約(文檔裏的示例):
{
"mode": "search",
"query": "current Node.js LTS",
"url": null,
"results": [
{
"source": "web",
"requestedSource": "web",
"engine": "antigravity-cli",
"status": "ok",
"summary": "The current Node.js LTS is v24.19.0 (Krypton), released 2026-08-03.",
"items": [
{
"title": "Node.js v24.19.0 release",
"url": "https://nodejs.org/en/blog/release/v24.19.0",
"snippet": "Krypton is the active LTS line.",
"published_at": "2026-08-03"
}
],
"uncertainty": [],
"warnings": [],
"attempts": []
}
]
}
幾個字段要分開讀:
summary+items:摘要和帶來源 URL 的條目,items順序表示相關度,沒有數值分(文檔說模型很容易把分數編圓,v2 已刪掉)uncertainty:引擎對事實沒把握的地方(衝突來源、可能過時的數字、頁面太薄)warnings:答案是怎麼來的(回退、X 被網頁頂替、重定向)status:ok/degraded/unavailable。X 不可達時,網頁頂替必須標degraded,不能當成 X 覆蓋
抓取模式(-u)把 items 換成 content(正文)和最多 20 條 links。agy 給出的是 markdown 正文;local 引擎不跑 JavaScript,也不做綜述。
安裝與啓用¶
社區目錄給出的命令¶
插件詳情頁上的安裝命令原文是:
dsh plugin add github:liustack/modsearch
需要可復現安裝時,目錄頁要求固定 commit 哈希:
dsh plugin add github:liustack/modsearch#<commit>
目錄頁同時提示:插件以當前 dsh 進程的權限運行,安裝時可能執行代碼;安裝前應檢查源代碼倉庫和許可證。
倉庫針對 dsh 的版本釘死寫法¶
docs/harness-setup.md 給 dsh 用戶的命令是另一條。寫作時釘在 5.4.2:
npx -y @deepseek-ai/dsh plugin --profile web add @liustack/modsearch@5.4.2
倉庫刻意不用 @latest:pnpm 11 默認開啓 minimumReleaseAge(24 小時),dist-tag 只在過了冷靜期的版本里解析,@latest 可能靜默裝到一天前的舊版。點名版本號是明確指定。更新也用 add 而不是 update:update 只在已記錄的 semver 請求內移動,還會再次經過發佈時長過濾。
當前版本可用下面命令查詢,再把命令裏的版本號換成輸出值:
npm view @liustack/modsearch version
裝完重啓 dsh,確認實際裝到了什麼:
npx -y @deepseek-ai/dsh plugin --profile web list
若出現 declares no dsh.bundle,倉庫的判斷是發佈冷靜期裝到了舊包,按宿主接入文檔的「保持更新」一節處理,不要改去拷貝 Skill 目錄。
web 只是文檔裏的示例 profile。實際 profile 名以本機爲準,把 --profile 換成自己的即可。
先準備一個搜索引擎¶
插件能掛上工具,但真正搜網頁的是引擎。默認通道 Antigravity CLI 需要本人在瀏覽器完成登錄,這是倉庫說的「唯一需要你親手做的一步」:
curl -fsSL https://antigravity.google/cli/install.sh | bash
agy
在瀏覽器完成登錄後退出。不想裝 agy,就按上一節表格註冊 Tavily、Exa 或 Firecrawl 的免費 key,再 modsearch config set ...。只需要讀頁面時,內置 local 抓取器已經可用,不必配搜索引擎。要搜 X,還得另裝並登錄 Grok Build。
無圖形界面、SSH 無桌面的環境,文檔建議不要走 agy 的瀏覽器登錄,改用 API key。
體檢¶
npx @liustack/modsearch doctor
它不花額度、不髮網絡請求。健康機器上(agy 已登錄)報告大致長這樣(摘自 INSTALL.md,已精簡):
Node
version: 22.13.0
status: OK
search (search the web)
resolved: antigravity-cli
- antigravity-cli READY binary "agy" found and runnable
fetch (fetch a page)
resolved: local
- local READY built in, needs nothing installed
social (search X)
resolved: (none available)
Node status: TOO OLD 就停下來升級。search resolved: (none available) 說明還沒配搜索引擎。social 爲 (none available) 只表示 Grok Build 沒裝,不影響網頁搜索。加 --json 可拿到機器可讀報告。
端到端試一次(會消耗一次搜索額度):
modsearch -q "current Node.js LTS version"
預期 stdout 是 JSON:results 數組裏第一條帶 engine 和帶 url 的 items。超時可把 --timeout 提到 300000;文檔說 agy 一次通常 10–30 秒。
典型用法¶
裝進 dsh 之後,正常對話即可:問需要查證的問題,或貼一個 URL。下面幾條都來自倉庫文檔和目錄頁,不是另行編造的案例。
1. 直接驅動 CLI¶
本機已有 Node 時,也可以不經過對話,自己跑:
modsearch -q "current Node.js LTS version"
modsearch -u "https://nodejs.org/en/about"
modsearch -q "reactions on X" --source x
modsearch -q "TypeScript 5.9 release notes" -o search.json --max-results 6
-u 可以再加 -q,把提取焦點傳給引擎。--source 可以是 web、x 或 web,x。-e 釘死某個引擎時,失敗就報錯,不再換通道。
2. 在 dsh 裏問需要聯網的問題¶
選 DeepSeek-V4-Flash 這類自身不能聯網、或聯網偏弱的條目,直接問時事或版本號。模型調用宿主原來的 web_search,後端已經是 modsearch 引擎鏈。目錄頁把這個變化概括成:沒有原生聯網能力的模型也能問網頁,拿到結構化答案。
3. 貼一個鏈接,讀這一頁¶
把文檔、changelog、博客 URL 丟進對話,需要時帶一句關注點(例如「速率限制是多少」)。模型走 read_page,返回摘要、正文提取和外鏈,而不是整頁塞進上下文。
宿主接入文檔在講 Codex 時給過一筆對照(這是倉庫自己的實測,不是第三方評測):內置搜索把整頁推進上下文,一次搜索密集的回答大約 30,000 token;結構化證據大約幾百 token。dsh 上的 read_page 走的是同一套輸出契約。
4. 倉庫 README 裏的實測記錄¶
這些是 README 標明的原樣記錄,在 Codex 桌面 App 裏驅動自身不能聯網的 DeepSeek-V4-Flash,用來說明粒度,不是評測榜:
- 給出一篇博客鏈接,問文章寫了什麼:約 25 秒後返回全文結構化摘要,過程中沒有打開瀏覽器
- 不指定目標,只問「今天有什麼有趣的 AI 新聞」:約 36 秒後返回六條帶來源的結果,結尾說明哪些細節來自檢索聚合、值得再覈對——這條提醒來自
uncertainty字段
5. 同一套引擎用在其他宿主¶
Skill 安裝流程(拷貝 skills/modsearch,或 npx -y skills add liustack/modsearch)只適用於 Claude Code / Codex / Pi / OpenCode,不要在 dsh 上走那條路。在 Codex 裏如果已經打開官方 web_search = "live",文檔要求先在 ~/.codex/config.toml 裏關掉它,否則模型會先伸手夠內置搜索,Skill 輪不上。
適用場景與注意事項¶
比較適合:
- 在 dsh 裏用沒有原生聯網、或官方搜索覆蓋不到指定頁面 / X 的模型做編碼和調研
- 希望答案帶來源 URL 和不確定項,而不是一段無法覈驗的綜述
- 已經能登錄
agy,或手上有 Tavily / Exa / Firecrawl 的免費額度,不想再單獨申請 DeepSeek 搜索 key - 需要偶爾搜 X,並且本機已經有 SuperGrok 或 X Premium 對應的 Grok Build
使用前注意下面幾條,均來自目錄頁或倉庫文檔:
- 權限與許可證。 插件以當前 dsh 進程權限運行,安裝時可能執行代碼。安裝前檢查 源碼 和 MIT 許可證。社區目錄不是官方應用商店。
- dsh 仍是開發者預覽。 官方 README 寫明會有破壞性變更。modsearch 自稱接觸面很小(一次 provider 註冊、兩次原始工具註冊),接口挪了會在宿主日誌裏報錯,而不是靜默失效。
- 搜索結果和抓取正文按不可信輸入處理。 頁面裏可以寫給模型看的指令。安全文檔要求:只分析你願意打開的 URL;提示詞會要求引擎把頁面當數據而不是指令,但這只是緩解,不是保證。URL 不受你控制時,在沙箱工作目錄裏跑。
- SSRF 與私網。
local抓取器拒絕私網、保留地址和雲 metadata,並釘扎 DNS 解析後的 IP。不要用--allow-private-network去打真正的內網地址。read_page工具不暴露這個開關。 - 本機運行時。 需要 Node 22.13+。macOS / Linux 在 CI 的 Node 22 和 24 上跑全量測試;Windows 跑同一套 typecheck / 測試 / 構建,但
agy和grok只在 PATH 上有原生可執行文件時可用,npm 風格的.cmd墊片不可用。 - 不要用
@latest更新。 查出當前版本號再點名add。Skill 安裝流程不要用在 dsh 上。 - 倉庫不接受 Pull Request。 作者說明是單人審閱全部代碼。反饋走 Issues;MIT 下可以自行 fork。
- 上游額度自負。 Antigravity CLI、Tavily、Exa、Firecrawl、Grok Build 各有條款和配額,遵守這些約束由使用者負責。README 裏的「完全免費」指默認
agy通道和三家備用引擎的月度免費額度,並不覆蓋 Grok Build 所需的訂閱。 agy的權限開關。 安全文檔寫明:ModSearch 調用agy時帶了--dangerously-skip-permissions,因爲部分環境裏 prompt 模式會失敗;提示詞把 agent 限制在搜索和抓取,但仍應視爲本機額外權限。
小結¶
modsearch 要解決的問題很具體:dsh 背後的模型常常不能聯網,或官方搜索覆蓋不到指定頁面和 X。它以原生插件接入,把 web_search 接到可故障轉移的引擎鏈上,並補上 x_search 與 read_page;返回的是帶來源、不確定項和路由痕跡的 JSON,而不是一段無法覈驗的描述。默認可以走免費的 Antigravity CLI,配置集中在 ~/.modsearch/config.json,和其他宿主共用。
目錄頁與倉庫:
- 社區目錄:https://deepseek-harness-plugin.com/zh-CN/plugins/modsearch/
- GitHub:https://github.com/liustack/modsearch
- 安裝說明:https://github.com/liustack/modsearch/blob/main/INSTALL.md
- 宿主接入:https://github.com/liustack/modsearch/blob/main/docs/harness-setup.md
- CLI 手冊:https://github.com/liustack/modsearch/blob/main/skills/modsearch/references/cli.md
- 輸出契約:https://github.com/liustack/modsearch/blob/main/skills/modsearch/references/output-schema.md
- 安全說明:https://github.com/liustack/modsearch/blob/main/docs/security.md
- DeepSeek Harness:https://github.com/deepseek-ai/deepseek-harness