用 dsh-web-search-exa 給 DeepSeek Harness 接上零配置的 Exa 搜索

前言

DeepSeek Harness(dsh)把聯網搜索做成可替換的能力,而不是寫死在智能體循環裏。模型側始終調用同一套 web_search / web_fetch,真正去網上查資料的是 ctx.web 上註冊的搜索提供方。官方倉庫裏已經有 @deepseek-ai/dsh-web-search-exa:它走 Exa 的 POST /search REST 接口,但沒有 API 密鑰時提供方直接不可用

很多本地試用、臨時排查、不想先去申請密鑰的場景,會卡在這一步。社區維護者 TonyDua 做了 @tonydua/dsh-web-search-exa(倉庫名 dsh-web-search-exa):無密鑰時走 Exa 託管的匿名 MCP,配了 EXA_API_KEY 再自動切回 REST。本文按插件目錄頁、GitHub README / package.json、DeepSeek Harness 官方文檔和 Exa MCP 說明交叉覈對後整理。

DeepSeek Harness 的核心理念是「一切皆插件」。文中用到的 DSH 插件庫 是獨立社區站點,與 DeepSeek / 幻方沒有官方從屬關係,不要把它當成官方應用商店。

這是什麼

dsh-web-search-exa 是一款 DeepSeek Harness 工具與能力插件,由 TonyDua 維護,許可證 MIT,主要語言 JavaScript,要求 Node.js 18 及以上。GitHub 倉庫爲 TonyDua/dsh-web-search-exa,npm 包名 @tonydua/dsh-web-search-exa。目錄頁與 GitHub 在本文覈對時均顯示 6 顆星;倉庫創建於 2026-08-14,目錄收錄日期同日。

它解決的問題很具體:給 ctx.web 註冊一個 Exa 搜索提供方,讓已有的模型工具、提示詞區和結果卡片不用改,就能用上網頁搜索。它不是官方包的替代品,而是官方包的零配置變體——官方實現只走帶密鑰的 REST;本包補上匿名 MCP 兜底,帶密鑰時的 REST 行爲與官方路徑一致。

倉庫 package.json 當前版本爲 0.1.3。npm 頁面在本文檢索時列出的最新發布仍是 0.1.2。0.1.3 的變更是:bundle 補丁不再重複定義官方已經佔用的 web 行,避免 dsh plugin add 後出現 duplicate loader entry id: web 啓動失敗。從 GitHub 安裝會拿到含該修復的源碼。

核心功能

默認免密鑰,走匿名 MCP

未配置 apiKey 或環境變量 EXA_API_KEY 時,搜索走 Exa 託管 MCP:https://mcp.exa.ai/mcp,JSON-RPC 2.0 調用 web_search_exa,請求裏不帶憑據。來源標識放在 x-exa-source: dsh-anything 頭裏。

Exa 自己的 MCP 頁面寫明:連接 https://mcp.exa.ai/mcp 不需要 API 密鑰。匿名調用有限流;HTTP 429 會以 WEB_PROVIDER_ERROR 返回,並提示去配置密鑰。

配了密鑰自動切 REST

設置了 EXA_API_KEY(或配置裏的字面量 apiKey)之後,提供方改走 https://api.exa.ai/searchPOST /searchAuthorization: Bearer)。倉庫說明這條路徑額度更高,對模型側的工具行爲沒有額外改動。REST 檢索模式 searchType 默認爲 auto,也可設爲 keywordneural

即插即用,不改模型工具

它只向 ctx.web 註冊 WebSearchProvider,不擁有 ctx.web 這個鍵,也不自己註冊面向模型的工具。工具名、參數、提示詞和結果卡片仍由 @deepseek-ai/dsh-tool-web 負責。返回結果會規範成 seam 的 WebSearchSourceurltitlesnippetpublishedAtmaxResults 由 seam 在返回路徑上截斷。

DeepSeek Harness 文檔對選擇規則寫得很清楚:沒有配置提供方 id、且當時只有一個可用搜索提供方時,seam 會自動選中它。無密鑰時官方 DeepSeek 搜索提供方不可用,因此本插件可以在零配置下被自動選中。

可與官方 Exa 包共存

默認 provider id 是 exa,Cordis 插件名是 web-search-exa,和官方 @deepseek-ai/dsh-web-search-exa 相同。seam 遇到重複 id 會拋 WEB_DUPLICATE_PROVIDER兩個包直接裝進同一個 profile 會在啓動時報錯,沒有靜默覆蓋。本包可用 providerId 改成例如 exa-anon,再在 web 配置裏顯式選擇。

主要配置項

配置鍵 默認值 含義
providerId exa 註冊到 ctx.web 的提供方 id;與官方包共存時才需要改
apiKey 未設置 Exa 密鑰字面值;爲空則走匿名 MCP
apiKeyEnv EXA_API_KEY 未寫字面 apiKey 時讀取的環境變量名
apiURL https://api.exa.ai/search 帶密鑰時的 REST 端點
mcpURL https://mcp.exa.ai/mcp 匿名 MCP 端點
searchType auto REST 檢索模式:auto / keyword / neural
numResults 未設置 請求未帶 maxResults 時的默認條數
highlightsPerResult 1 REST 路徑每個結果請求的高亮句子數

apiKey 標記了 role('secret'),不會出現在 describe() 響應裏。

安裝與啓用

插件目錄頁給出的安裝命令如下,在 DeepSeek Harness 終端中運行:

dsh plugin add github:TonyDua/dsh-web-search-exa

如需可復現安裝,按目錄頁說明固定 commit 哈希:

dsh plugin add github:TonyDua/dsh-web-search-exa#commit

#commit 換成實際提交哈希。倉庫 README 還提供了按 web profile、從 npm 安裝的寫法(v0.1.3 起帶 dsh.bundle manifest,bundle 補丁會插入提供方行):

dsh plugin --profile web add @tonydua/dsh-web-search-exa

裝完後重啓 dsh web。目錄頁寫明:插件以當前 dsh 進程的權限運行,安裝時可能執行代碼;安裝前應檢查源代碼倉庫和許可證。

典型用法

無密鑰、只裝這一個搜索提供方時,重啓後一般不用再改配置:官方 DeepSeek 搜索不可用,seam 會自動選中本插件。模型繼續用原來的 web_search 即可。搜索結果仍由 dsh-tool-web 渲染成來源、摘要、日期卡片,和 DeepSeek 搜索的展示方式相同。

已經配置了密鑰、希望明確走 Exa 時,在 $DSH_HOME/profiles/web/cordis.patch.yml 裏選中提供方(該文件在 bundle 補丁之後應用):

- id: web
  name: '@deepseek-ai/dsh-web'
  config:
    searchProvider: exa

也可以不改文件,用環境變量在運行時指定:

export DSH_WEB_SEARCH_PROVIDER=exa

本地開發目錄可以按 README 直接指向檢出路徑:

dsh plugin --profile web add ../plugins/dsh-web-search-exa

若要和官方 @deepseek-ai/dsh-web-search-exa 裝在同一個 profile,必須改 id。官方包的 id 固定爲 exa,給本包一個不同值,例如 exa-anon

- insert:
    - id: web-search-exa
      name: '@tonydua/dsh-web-search-exa'
      config:
        providerId: exa-anon
- id: web
  name: '@deepseek-ai/dsh-web'
  config:
    searchProvider: exa-anon

對應的環境變量是 $DSH_WEB_SEARCH_PROVIDER=exa-anon。更省事的做法是:每個 profile 只裝其中一個包,沿用默認 id。

當前版本沒有 Web 設置頁裏的可編輯卡片。Settings → Plugins 清單裏會出現 web-search-exa@tonydua/dsh-web-search-exa),服務端也註冊了 web-search-exa 配置段,但沒有客戶端卡片綁定它。內置的 “Web search” 卡片改的是官方 web-search-deepseek 命名空間,和本插件無關。改配置請編輯 cordis.patch.yml 或環境變量,然後重啓 dsh web。README 寫明下一版本計劃補 UI 卡片,本文不把它當作已經交付的功能。

適用場景與注意事項

適合這些情況:

  • 本地試用 DeepSeek Harness 的網頁搜索,暫時不想申請 Exa 密鑰
  • 已經在用 web_search,只想換搜索後端,不想動工具和提示詞
  • 需要和官方 Exa 包對比,或在同一套 profile 裏用 providerId 顯式切換

使用前注意:

  1. 匿名 MCP 有限流。 頻繁搜索遇到 429 時,按倉庫說明配置 EXA_API_KEYapiKey,提供方會切到 REST。Exa 託管 MCP 是 Exa 的官方產品,免費匿名可用,但額度由對方控制。
  2. 本插件只提供搜索,不提供抓取。 web_fetch 仍走獨立的 fetch 提供方(官方文檔裏是 dsh-web-fetch-http 這一路),不要指望它順帶讀完整網頁。
  3. 不要無改動地雙裝官方包和本包。 默認 id 衝突會直接導致啓動失敗。
  4. 當前沒有設置 UI。searchTypemcpURLproviderId 等只能走補丁文件或環境變量。
  5. 運行時單例。 README 說明 @deepseek-ai/dsh-tools 必須在一個 profile 裏解析成同一份物理實例。本插件不依賴它;若其它第三方插件把它裝成嵌套普通依賴,agent 循環可能在搜索提供方被調用前就報 Cannot read properties of undefined (reading 'prepare')。應先修那個插件的依賴聲明。
  6. 權限與許可證。 插件以當前 dsh 進程權限運行。安裝前閱讀倉庫源碼和 MIT 許可證。DeepSeek Harness 本身仍處於開發者預覽,官方 README 寫明會有破壞兼容性的變更。
  7. 選型。 已有 EXA_API_KEY、希望跟官方實現走:用 @deepseek-ai/dsh-web-search-exa。要零配置試用:用本包。

匿名 MCP 的接入方式,倉庫 README 寫明參考了 can1357/oh-my-pi 以及 @oh-my-pi/exa:有密鑰走 REST、無密鑰走 mcp.exa.ai/mcp

小結

dsh-web-search-exa 把 Exa 接到 DeepSeek Harness 的 ctx.web 上:沒密鑰時用官方託管的匿名 MCP,有密鑰時自動升到 REST,模型側的 web_search 不用改。它是社區維護的零配置變體,不是官方包,也不是 DeepSeek 官方商店裏的「認證插件」。

目錄頁:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-web-search-exa/

GitHub:https://github.com/TonyDua/dsh-web-search-exa

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

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

小夜