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

DeepSeek Harness 值得安裝的 5 個外掛程式

整理 5 個適合 VPS 的 DeepSeek Harness 外掛程式:設定支出上限、控管工具權限、掃描提示注入與 secret、保存持久記憶,以及開放 LAN 存取。

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

DeepSeek Harness 外掛程式是會在代理程式內執行的第三方程式碼,使用代理程式的權限,並執行於由您付費的機器上。社群清單涵蓋超過二十個類別與一千多個項目。在租用的虛擬私有伺服器(VPS)上,您需要五類外掛程式: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 外掛程式組成,因此執行中的執行個體是外掛程式樹,而不是單一程式。設定檔是這些外掛程式的具名組合。兩個範本是 webheadless$DSH_HOME 預設為 ~/.dsh,而設定檔位於 $DSH_HOME/profiles/<name>/,其中包含專屬的 package.jsondsh.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,再來是 home 層級的 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.50.1.0-rc.6。這種差距在此生態系統中很常見,也是外掛程式停止載入的通常原因:harness 的更新速度比周邊外掛程式快。請刻意升級 harness,然後一次測試一個外掛程式。

閱讀外掛程式後再信任它

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

請依下列順序檢查 4 件事:

  • 它掛接哪些擴充點。 tools/pre-execute 表示它能看見每次工具呼叫並加以阻擋。agent/pre-step 表示它能看見你的訊息。webServer.tapIndex 表示它能改寫提供給瀏覽器的頁面。不掛接上述任何擴充點的外掛程式能做的事情很少;同時掛接全部擴充點的外掛程式就是你的安全邊界
  • 它是否與網路通訊。 在原始碼中搜尋 fetchhttp 及任何硬式編碼的主機名稱。會回傳資料的費用計量器,會將你的使用模式傳送到某個地方。
  • 它是否讀取認證資訊。 任何存取 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 USD,以及每月 500 USD。這些設定適合有經費支援的團隊。對個人伺服器而言,上限高到失控的迴圈可能在限制生效前就已經完成,因此應在第一天就調低。

Chartdsh-budget default caps and a lower starting point for one small VPS (USD)
The data behind this chart
[
  {
    "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 map 中改用較便宜的模型。當工作必須完成,但不需要使用最佳模型時,這種模式很適合。warnRatio 的預設值為 0.8,因此達到上限的 80 percent 時就會收到通知。

有兩項需要明確了解的限制。費用是依你提供的價格計算:prices 預設為空白,而 defaultPrice 會退回使用每 million input tokens 1.0 USD、每 million output tokens 3.0 USD 的價格。請填入各模型的實際價格,否則儀表板上的數字只是經過測量包裝的估算。其次,plugin 會從 session event stream 在執行中的 process 內彙總資料,因此 harness 重新啟動時,總量也會重設。crash loop 或會重新啟動 dsh 的 supervisor 都會重設每日上限。將 dsh-budget 視為防止自己的工作持續執行的護欄,並在 provider account 上設定 spend limit,作為真正的最高限制;這也是 控制 VPS 上的 AI agent 成本 中更廣泛的原則。

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

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

dsh-permission-rules 會在 tools/pre-execute waterfall 上套用宣告式規則,因此工具執行前就會先評估規則。共有 3 種動作。allow 會放行呼叫,deny 會阻擋呼叫並回傳模型可讀取的原因,ask 則會將呼叫導向正式的核准管道。

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

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

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.injectionActiondetection.jailbreakActiondetection.secretAction 都是 ask,而 detection.secretBlockCriticaltrue,因此無論其他設定為何,關鍵機密都會遭到阻擋。在無人值守的主機上,請將需要處理的動作改為 block,因為 ask 在無人詢問時並不算決策。

其稽核設計值得肯定。defend/detection 事件會記錄規則 ID、系列、類別、嚴重性、決策與掃描資訊,但不會記錄符合的文字;機密只會依類型記錄。因此,啟用稽核日誌不會產生另一份你原本想保護的憑證副本。

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

dsh-memory:代理程式明天記得什麼?

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

我會在小型伺服器上使用 SQLite 版本。它會註冊為 memory,在 $DSH_HOME/memory/memory.db 保留一個供各設定檔共用的檔案,並提供 memory_writememory_searchmemory_forget。搜尋會依據儲存的文字與標籤進行關鍵字比對。它不需要 embedding 服務、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 搜尋搭配自動 prompt 注入,透過 dsh plugin --profile web add github:towzai/dsh-memory 安裝。它需要本機 ollama 執行個體與 embedding 模型;預設使用 qwen3-embedding:0.6b,也可透過 DSH_MEMORY_EMBED_MODEL 覆寫。語意回憶的效果優於關鍵字回憶,但這也代表同一台伺服器上必須多執行一個服務,並常駐一組模型權重。對小型方案而言,這些記憶體會減少可用於實際工作負載的資源。只有在記憶體充足時才應選用此版本。如需了解回憶品質與常駐成本之間的一般取捨,請參閱 代理程式的本機記憶體

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

npx @deepseek-ai/dsh web127.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(transport layer security)憑證,以及加密的稽核日誌。請將它視為平台而非 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 或更新版本。
  • dsh-permission-rules,位於 b30b4fb,17 August 2026。Apache 2.0。宣告 dsh 0.1.0-rc.50.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。

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

FAQ

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

先安裝 dsh-budgetdsh-permission-rules。設定 overLimit: block 預算可避免無人值守的執行程序整晚持續支出,設定 .dsh/rules.yaml 檔案則可阻止執行你從未核准的工具呼叫。只要代理程式會讀取公用網路內容,就加入 dsh-defend;如果你發現自己在每個工作階段都貼上相同的內容,再加入 dsh-memory。略過主題和狀態標籤。它們會在代理程式的權限下額外執行程式碼,卻不會改變機器的行為。

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

不是。外掛程式會載入與 harness 相同的 Cordis 樹狀結構,於相同的程序中執行,使用相同的作業系統使用者、相同的模型憑證和相同的工作樹。攔截 tools/pre-execute 的外掛程式可以看見並阻擋每個工具呼叫;攔截 agent/pre-step 的外掛程式則可以看見你的訊息。因此,請閱讀原始碼、檢查授權條款與最後提交日期,並以 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,刪除該外掛程式留下的任何 insert 區塊,因為該項目會載入外掛程式。重新啟動 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)會固定使用 loopback,並對遠端來源回傳 403。這雖能降低損害,但無法完全阻止連線。請使用 SSH port forward、ssh -N -L 3080:127.0.0.1:3080 you@your-server,或將該埠放在私有網路介面後並搭配防火牆規則,並在允許外部連線前加入真正的驗證機制。