SSD Nodes Learn Hosting plans →
指南 Matt Connor作者: Matt Connor · 已更新 2026-08-30

DeepSeek Harness 值得安裝的 5 個外掛

整理 5 個 DeepSeek Harness 外掛:設定支出上限、限制工具權限、掃描 prompt injection 與 secret、保存跨工作階段記憶,並提供 LAN 存取;但 LAN 外掛須先決定驗證方式。

值得安裝哪些 DeepSeek Harness 外掛程式

DeepSeek Harness 外掛程式是會在代理程式內執行的第三方程式碼,使用代理程式的權限,並執行於由您付費租用的機器上。社群清單涵蓋超過 twenty 個類別與 over a thousand 個項目。在租用的虛擬私有伺服器(VPS)上,您需要 five 個:dsh-budget 用於設定支出上限、dsh-permission-rules 用於限制工具使用、dsh-defend 用於掃描注入內容與 secret、dsh-memory 用於保存跨越工作階段的資訊,以及 dsh-web-lan-access,但只有在您決定驗證方式後才能安裝。

此 harness 是 dsh,也是 DeepSeek 的開放原始碼代理程式 harness,設計上所有功能都是外掛程式。其 README 將此專案稱為開發者預覽版,並警告 THERE WILL BE COMPATIBILITY-BREAKING CHANGES。這項事實會影響以下每個選擇。為已安裝的項目鎖定版本,預期升級可能導致其失效,並將集合維持在足夠小的規模,以便您確實讀完所有程式碼。如果 harness 尚未執行,請先從 在 VPS 上安裝 DeepSeek Harness 開始,再回到這裡。如果這些外掛程式所連接的部分,也就是代理程式迴圈、工具與記憶體,您仍不熟悉,請先 完成基礎概念的學習,因為了解各層的作用後,會更容易判斷以下每個選擇。

dsh 如何安裝插件,以及設定檔的存放位置

dsh 由 Cordis 插件組合而成,因此執行中的實例是插件樹,而不是單一程式。設定檔是這些插件的具名組合。兩個範本是 web 和 headless。$DSH_HOME 預設為 ~/.dsh,而設定檔位於 $DSH_HOME/profiles/<name>/,其中包含專屬的 package.json、dsh.profile manifest,以及 cordis.patch.yml。

dsh plugin --profile web list
dsh plugin --profile web add dsh-budget
dsh plugin --profile web remove dsh-budget

支援 4 種來源格式:單純的 npm 套件名稱、具 scope 的名稱(例如 @towzai/dsh-memory)、GitHub 參照(例如 github:PerryLink/dsh-budget#main),以及使用 link: 或 ./ 的本機路徑。建議使用 GitHub 格式,因為可以將 #main 替換為 commit,確保下個月仍能取得相同的程式碼。

dsh plugin --profile web add "github:PerryLink/dsh-budget#461d478"

各層會依固定順序套用:先依設定檔列出的順序套用每個 bundle,再套用設定檔的 cordis.patch.yml、家目錄層級的 cordis.patch.yml,以及任何 --patch overlay。順序很重要,因為後套用的層可以重新設定或移除先前層所建立的內容。因此,當插件看似已安裝卻沒有作用時,請開啟設定檔的 cordis.patch.yml,並確認兩件事:其中包含該插件的 insert 區塊,而且沒有後續層停用它。

截至 17 August 2026,npm 套件 @deepseek-ai/dsh 的版本為 0.1.0-rc.7,而以下每個插件宣告的相容版本範圍都是 0.1.0-rc.5 到 0.1.0-rc.6。這種落差在此生態系統中很常見,也是插件停止載入的通常原因:harness 的更新速度比周邊插件快。請刻意升級 harness,然後一次測試一個插件。

閱讀外掛程式後再信任它

dsh 外掛程式不會與 harness 隔離。它會以相同的作業系統使用者身分,在相同的程序中載入相同的 Cordis 樹狀結構,並存取相同的模型憑證與工作樹。安裝外掛程式更接近使用 sudo 執行他人的指令碼,而不是加入瀏覽器擴充功能。這與 Claude Code 外掛程式引發的問題相同,答案也相同:閱讀程式碼,否則不要安裝。

請依照以下順序檢查 4 件事:

  • 它使用哪些擴充點。 tools/pre-execute 表示它能看見每次工具呼叫,並可加以封鎖。agent/pre-step 表示它能看見你的訊息。webServer.tapIndex 表示它會改寫提供給瀏覽器的頁面。完全不使用這些擴充點的外掛程式能做的事很少;同時使用全部擴充點的外掛程式,就是你的安全邊界。
  • 它是否會連線到網路。 在原始碼中搜尋 fetch、http 及任何寫死的主機名稱。會向外回報資料的成本計量器,會把你的使用模式傳送到某個地方。
  • 它是否會讀取憑證。 任何存取 credentials.* 或供應商金鑰的程式,都必須在 README 中說明明確理由。
  • 授權條款與最後提交日期。 未授權、數月未更新,且所處生態系每週都在變動的外掛程式,會帶來風險。

接著,請固定使用提交版本安裝,不要使用分支,並閱讀安裝程式寫入 cordis.patch.yml 的插入區塊。該區塊會列出外掛程式 ID 與它註冊的設定,是對你剛加入的內容最簡短且如實的描述。在 harness 允許的情況下,請讓供應商金鑰遠離外掛程式可存取的範圍,做法可參考 讓秘密資訊遠離 AI 代理程式。

dsh-budget:如何避免 agent 整晚持續支出?

VPS 上的 agent 會在無人值守的情況下執行。這正是將它放在 VPS 上的目的,也是風險所在。dsh-budget 會依模型、工作階段及每日用量計算 token 數與預估費用,並針對這些總量套用上限。

dsh plugin --profile web add "github:PerryLink/dsh-budget#461d478"

預設值相當寬鬆:每個工作階段 10 USD、每天 50,以及每月 500。這些設定適合有預算的團隊。對個人伺服器而言,上限高到失控迴圈可能在上限生效前就已經耗盡額度,因此應在第一天就調低。

圖表dsh-budget default caps and a lower starting point for one small VPS (USD)
此圖表背後的資料
[
  {
    "label": "Per session",
    "plugin_default_usd": 10,
    "suggested_start_usd": 2
  },
  {
    "label": "Per day",
    "plugin_default_usd": 50,
    "suggested_start_usd": 5
  },
  {
    "label": "Per month",
    "plugin_default_usd": 500,
    "suggested_start_usd": 40
  }
]

建議欄位是單一操作者在單台主機上的起始值,不是正式發布的標準數字。使用一個完整月份後,依實際用量調高。每月上限設為 40 USD,工作階段上限設為 2,會及早明確失敗。你在熟悉此工具的用量前,這正是需要的行為。

- id: budget
  config:
    budgets:
      session: 2
      daily: 5
      monthly: 40
    warnRatio: 0.8
    overLimit: block

會改變機器行為的設定是 overLimit。其預設值為 alert,會顯示警告但繼續支出,因此此 plugin 預設上只是儀表板。將它設為 block 後,達到上限時 harness 會拒絕後續的模型呼叫。這表示夜間工作會停止,而不是持續計費到早上。degrade 是第三種模式:它會從 degradation 對應表中改用較便宜的模型。當工作必須完成,但不需要使用最佳模型時,這個模式很適合。warnRatio 的預設值為 0.8,因此達到上限的 80% 時就會收到通知。

有兩項需要明確了解的限制。費用是依你提供的價格計算:prices 預設為空,defaultPrice 則會退回使用每 1 百萬個輸入 token 1.0 USD、每 1 百萬個輸出 token 3.0 USD 的價格。請填入各模型的實際價格,否則儀表板上的數字只是偽裝成測量結果的估算值。第二,plugin 會從工作階段事件串流中,在執行中的 process 內彙總資料,因此 harness 重新啟動時總量會重設。若發生 crash loop,或 supervisor 重新啟動 dsh,每日上限也會重設。請將 dsh-budget 視為防止自身工作失控的護欄,並在 provider 帳戶上設定支出上限作為實際上限。這也是 控制 VPS 上的 AI agent 成本 中更廣泛的重點。

日常使用 /budget 查看總覽、使用 /budget models 查看各模型明細,並在決定繼續執行後使用 /budget unblock <scope> 解除封鎖。

dsh-permission-rules:哪些工具呼叫永遠不應執行?

dsh-permission-rules 會在 tools/pre-execute 流程上套用宣告式規則,因此工具執行前就會先評估規則。共有 3 種動作。allow 會放行呼叫,deny 會封鎖呼叫並返回模型可讀取的原因,ask 會將呼叫轉送至正式的核准介面。

dsh plugin --profile web add "github:PerryLink/dsh-permission-rules#b30b4fb"

規則位於工作階段工作目錄下的 .dsh/rules.yaml,也可設定全域的 fallbackPath,以及選用的 searchUp,逐層向上查找直到檔案系統根目錄。比對條件包括工具名稱 glob、參數鍵和值 glob、相對於工作區的路徑 glob、main 或 subagent 等代理程式選擇器,以及網路目標。

rules:
  - match: { tools: [bash], params: { command: "rm -rf*" } }
    action: deny
    reason: "No recursive deletes"
  - match: { tools: [edit, write], paths: ["**/.env*", "**/secrets/**"] }
    action: ask
    reason: "Secret files need confirmation"
  - match: { tools: ["mcp__*"] }
    action: ask
    reason: "MCP tools need confirmation"

規則採用第一個符合者優先,因此若在上方放置寬泛的 allow,會悄悄取消其下所有較精確的規則。請先撰寫拒絕規則,最後再加入允許規則。工具名稱 glob 涵蓋 mcp__*。這可用來控管來自 model context protocol (MCP) 伺服器、而非 harness 本身的工具;只要在 VPS 上執行 MCP 伺服器,這項設定就很重要。

請預先規劃一項行為:ask 需要有人回覆。在 headless 設定檔中,可能沒有人持續監看,因此 ask 規則可能會讓執行工作暫停,直到有人出現。對於永遠不會核准的項目,請使用 deny;對於需要由你親自監看的設定檔,請保留 ask。如果要讓核准流程在無人值守時運作,就需要實際的回覆路徑;相關內容請參閱 透過核准控管 AI 代理程式動作。

dsh-defend:提示注入與機密外洩呢?

dsh-defend 會在三個位置進行掃描:agent/pre-step 上的輸入訊息、tools/pre-execute 上的工具引數(包括防止破壞性刪除的防護),以及 tools/post-execute 上的工具結果。最後一項尤其重要,因為從網頁擷取的內容會先在這裡接受檢查,之後模型才會依據該內容執行動作。

dsh plugin --profile web add "github:PerryLink/dsh-defend#7ba3427"

預設值偏向審慎,而非嚴格:detection.injectionAction、detection.jailbreakAction 和 detection.secretAction 都是 ask,而 detection.secretBlockCritical 是 true,因此無論其他設定為何,關鍵機密都會遭到封鎖。在無人值守的主機上,請將你在意的動作改為 block,因為 ask 在無人詢問的情況下並不算決策。

這項稽核設計值得肯定。defend/detection 事件會記錄規則 ID、類別、分類、嚴重性、決策與掃描資訊,但不會記錄相符的文字;機密只會依類型記錄。因此,啟用稽核日誌不會在原本要保護的認證資料之外,再建立一份副本。

請清楚了解這項功能能提供什麼。偵測採用規則式方法,README 也明確說明,新穎的措辭與多步驟攻擊可能繞過偵測。它能降低明顯攻擊的發生率,但不會讓代理程式適合直接處理不受信任的內容。因此,仍應在其下方保留權限規則。

dsh-memory:agent 明天記得什麼?

有兩個不同的外掛都稱為 dsh-memory。在輸入安裝命令前,請先確認這一點。請明確指定來源安裝,才能取得你閱讀的那個版本。

我會在小型伺服器上使用 SQLite 版本。它註冊為 memory,在 $DSH_HOME/memory/memory.db 保留一個供各設定檔共用的檔案,並提供 memory_write、memory_search 和 memory_forget。搜尋會根據儲存的文字與標籤進行關鍵字比對。它不需要 embedding service、API key 或額外程序。

dsh plugin --profile web add "github:ben7am1n/dsh-memory#def7c6a"

你需要調整的設定不多:path 指定資料庫檔案,promptRecentCount(預設為 10)指定注入的未釘選記憶數量,promptMaxChars(預設為 2000)指定呈現內容的預算。它依賴 node:sqlite。Node 22 和 24 仍將此功能標示為實驗性功能,因此升級 Node 前應先測試,不能直接假設可用。

以下是記憶功能對這台機器的實際影響:每一輪注入的記憶都會放入 system prompt。2000 個字元的預算,代表每一個請求都會永久增加數百個輸入 token。這會直接反映在帳單上,因此應先在這台主機上設定 dsh-budget,再設定 dsh-memory。請將 promptMaxChars 維持在較小值,並使用 memory_forget 清理記憶,避免檔案持續增長。

另一個版本會將記憶儲存在 YAML 檔案中,並使用 embedding search 搭配自動 prompt injection,透過 dsh plugin --profile web add github:towzai/dsh-memory 安裝。它需要本機 ollama instance 和 embedding model;預設使用 qwen3-embedding:0.6b,也可透過 DSH_MEMORY_EMBED_MODEL 覆寫。語意回憶效果比關鍵字回憶更好。但這也代表同一台伺服器上要多執行一項服務,並常駐一組 model weights。對小型方案而言,這些記憶體會排擠你租用這台主機原本要執行的工作。只有在記憶體充足時才選擇此版本。agent 的本機記憶 說明了回憶品質與常駐成本之間的一般取捨。

dsh-web-lan-access:Web UI 是否應監聽 loopback 以外的介面?

npx @deepseek-ai/dsh web 在 127.0.0.1:3080 提供介面。瀏覽器只會在安全內容環境中公開 crypto.randomUUID(),因此從另一台機器透過一般 HTTP 載入同一頁面會失敗。dsh-web-lan-access 會攔截 webServer.tapIndex 以注入小型 polyfill,並將伺服器繫結至 0.0.0.0。

安裝前請先閱讀它自己的警告。繫結 0.0.0.0 會讓同一個區域網路(LAN)上的任何人無須驗證即可連線至 agent;若伺服器具有公開 IP 位址,這就代表整個網際網路。少數敏感方法(settings.*、credentials.*、llm.discoverModels)會繼續繫結至 loopback,並對遠端來源回傳 403,因此能限制損害範圍。但這無法完全防止問題,因為工具呼叫介面仍對任何找到該埠的人開放。

大多數情況下,完全不需要這個 plugin。改用 SSH 轉送該埠。

ssh -N -L 3080:127.0.0.1:3080 you@your-server

接著在本機瀏覽器中開啟 http://127.0.0.1:3080。harness 只會繼續監聽 loopback,因此不會暴露任何服務;而且由於瀏覽器會將 127.0.0.1 視為安全來源,crypto.randomUUID() 可直接使用,不需要 polyfill。一個指令即可完成,不需要 plugin,也不會增加新的攻擊面。

只有在無法使用轉送時才安裝 plugin,例如同一個網路上的手機必須連線至 UI。若確實需要使用,請將它繫結在私有網路介面後方,保留只允許該介面的防火牆規則,並在 web-runtime 項目的 trustedHosts 下列出要使用的名稱。若需要真正的多使用者存取,可使用 dsh-passwords。它提供 subuser 權限、每個 subuser 每小時的 token 配額與每日時間配額、透過 Let’s Encrypt 自動申請 TLS(傳輸層安全性)憑證,以及加密的 audit log。請將它視為平台,而不是 plugin:它需要 80 和 443 埠,附帶自己的安裝程式,而文件中的快速做法會將網路上的 shell script 直接管線傳送至 bash。建議先執行 npm install -g dsh-passwords,再執行 dsh-passwords install,讓程式碼先保存在磁碟上,方便檢閱後再執行。

如何乾淨移除外掛程式

解除安裝分為兩個步驟,但很多人會略過第二步。

dsh plugin --profile web remove dsh-budget
dsh plugin --profile web list

list 不應再顯示該外掛程式。接著開啟 $DSH_HOME/profiles/web/cordis.patch.yml,刪除任何指名該外掛程式的剩餘插入區塊,因為該項目會將外掛程式載入樹狀結構。重新啟動 harness,讓系統重建樹狀結構;已載入的外掛程式會持續運作,直到重新啟動為止。最後請記住,資料的生命週期長於程式碼。解除安裝後,$DSH_HOME/memory/memory.db 和 .dsh/rules.yaml 仍會保留。若移除資料才是目的,請自行刪除這些項目。

我閱讀的內容與時間

這裡的每個參照都是 commit,而不是 branch,因為等到你閱讀時,main 的程式碼會不同。我在 17 August 2026 閱讀了全部內容,當天 npm 上的 harness 本身則位於 0.1.0-rc.7。

此清單所依據的確切 commit
  • 社群 plugin 清單,位於 f2918fb,17 August 2026。刻意只連結一次。它是目錄,不代表推薦。
  • dsh-budget,位於 461d478,17 August 2026。Apache 2.0。宣告 dsh 0.1.0-rc.6,需要 Node 22.19 或 24 以上版本。
  • dsh-permission-rules,位於 b30b4fb,17 August 2026。Apache 2.0。宣告 dsh 0.1.0-rc.5 至 0.1.0-rc.6。
  • dsh-defend,位於 7ba3427,17 August 2026。Apache 2.0。宣告 dsh 0.1.0-rc.6。
  • dsh-memory,位於 def7c6a,13 August 2026。MIT。SQLite build。
  • dsh-web-lan-access,位於 e27e909,16 August 2026。MIT。

複製 command 前,請重新確認這些 pin。在 developer-preview 生態系統中,只有附帶日期的版本號才具有實際意義。

FAQ

我應先在 VPS 上安裝哪些 DeepSeek Harness 外掛程式?

先安裝 dsh-budget 和 dsh-permission-rules。設定 overLimit: block 預算可避免無人看管的執行工作整晚持續花費,而 .dsh/rules.yaml 檔案可阻止原本不會核准的工具呼叫。在代理程式讀取公開網頁內容後,再加入 dsh-defend;如果你發現自己每次工作階段都貼上相同的內容,則加入 dsh-memory。略過主題與狀態標籤。它們會在不改變機器行為的情況下,讓具備代理程式權限的程式碼繼續執行。

dsh 外掛程式是否與 harness 隔離?

不是。外掛程式會載入與 harness 相同的 Cordis 樹狀結構,執行於相同程序、相同作業系統使用者、相同模型憑證及相同工作樹中。攔截 tools/pre-execute 的外掛程式可以查看並阻擋每個工具呼叫;攔截 agent/pre-step 的外掛程式則可以查看你的訊息。因此,請閱讀原始碼、確認授權條款與最近一次 commit 日期,並依 commit 安裝,不要依 branch 安裝,以免程式碼在你使用期間自行變更。

dsh-budget 真的會停止代理程式,還是只會發出警告?

這取決於 overLimit。預設值是 alert,會在 warnRatio 時發出警告,但仍繼續花費。達到上限後,block 會拒絕後續的模型呼叫;選擇繼續後,/budget unblock <scope> 會解除限制。degrade 會依 degradation 對應表切換至較便宜的模型。請注意一項限制:總額是由執行中的程序,根據工作階段事件串流累計而來。因此,重新啟動 harness 會重設總額,而反覆重新啟動也會規避每日上限。請在供應商帳戶上設定支出上限,作為真正的最高限制。

如何完整移除 dsh 外掛程式?

執行 dsh plugin --profile web remove <package-name>,以 dsh plugin --profile web list 確認,接著開啟 $DSH_HOME/profiles/web/cordis.patch.yml,刪除該外掛程式留下的任何插入區塊,因為該項目就是載入外掛程式的設定。重新啟動 harness,讓系統重建外掛程式樹。外掛程式寫入的資料仍會留在磁碟上:$DSH_HOME/memory/memory.db 和 .dsh/rules.yaml 都會在解除安裝後保留,直到你手動刪除為止。

將 dsh Web UI 暴露在網路上是否安全?

單獨這樣做並不安全。dsh web 會監聽 127.0.0.1:3080,而 dsh-web-lan-access 會將此繫結變更為 0.0.0.0。其 README 明確指出,這會讓同一網路上的任何人不經驗證即可連線至代理程式;若使用公開 IP 位址,代表整個網際網路都能連線。部分方法(settings.*、credentials.*、llm.discoverModels)會固定使用迴路位址,並對遠端來源回傳 403。這雖能降低損害,但無法完全阻止風險。請使用 SSH port forward、ssh -N -L 3080:127.0.0.1:3080 you@your-server,或將該埠置於私有網路介面後並搭配防火牆規則;在任何內容可從外部連線前,請加入真正的驗證機制。