前言¶
在 DSH(DeepSeek Harness)裏跑「多路候選、擇優上報」的推理模式時,常見的做法是手寫 preset,把並行數量和遞歸層數寫死在模板裏。問題是:並行開得太多會瞬間佔滿子代理併發名額,遞歸層數太深又收不回來,兩者互相牽連,調參基本靠試錯。
下面介紹的插件把這兩個值交給用戶設置。倉庫 xiong4huo/dsh-recursive-best-of-n(維護者 xiong4huo,分類「工作流」)是一個 DSH bundle,新增 agent preset recursive-best-of-n:代理數量、並行寬度、遞歸深度全部讀取「設置 → Plugins → Subagent」裏的兩個設置,插件自身不寫死任何數字。它屬於社區目錄 SkillHub 收錄的第三方插件,與 DeepSeek / 幻方無官方從屬關係。
這是什麼¶
一句話定位:一個 DSH 插件(bundle),聲明名爲 recursive-best-of-n 的 agent preset,主 agent 在每條助手消息裏並行派發多個子代理,每個內部節點逐份等待提交、全部到齊後擇優上送,最底層葉子真正執行任務。
它解決的是「多路採樣 + 遞歸擇優」在 DSH 裏的落地問題:樹的形狀不靠人手寫 prompt,而是由兩個用戶設置自動換算,並且嚴格不超出子代理的併發容量。
核心功能:兩個設置換算出整棵樹¶
插件每次請求讀取兩個值:
- 最大遞歸深度(
maxDepth) - 子智能體並行數量上限(
maxActiveSubagents)
一棵按層展開的樹,若每層並行 f 個、深度 d,同時在線的子代理最多是 f + f² + … + f^d(父級在子級運行期間仍駐留、佔名額)。所以插件按三步換算:以最小並行寬度 2 求並行上限內可達的最大有效深度;在該深度下求仍放得下的最大並行寬度 f;把 depth、fanout 以及「設置深度被容量折算」的說明寫進每個節點的運行時上下文。
以並行上限 40(當前 Desktop profile 的設置)爲例:
| 用戶設置的最大深度 | 自動得到:每層並行 f | 有效深度 | 同時在線子代理峯值 | 一次請求代理總數 |
|---|---|---|---|---|
| 1 | 40 | 1 | 40 | 41 |
| 2 | 5 | 2 | 30 | 31 |
| 3 | 3 | 3 | 39 | 40 |
| 4 或更大(當前 10) | 2 | 4 | 30 | 31 |
幾個要點:
- 最大深度很大時自動變窄。例如當前的 10,若要每層 2 個、10 層,需要約 2046 個同時在線子代理,超出 40 的上限,所以運行時上下文會註明
configured maximum depth 10 is capacity-limited to 4。 - 想讓主 agent 一次開更多,把「最大遞歸深度」調小。設爲 1 就是一次並行開 40 個(一層平鋪、主 agent 直接擇優);設爲 2 則每層 5 個;設爲 3 則每層 3 個。
- 兩項設置在每個新請求讀取,改完下一輪請求即生效。
- 想真正遞歸 10 層,需要把並行上限提高到 ≥2046(或接受每層 1 個的退化形態)。
運行協議上,所有內部節點(含主 agent,即 remaining > 0)的主協議是:在同一條助手消息裏把本節點該開的 N 個 subagent 調用一起發出,每個 prompt 逐字包含完整任務 + 一句「你的回答會和其他獨立答案比較」;隨後只回一行狀態結束回合等待;子代理提交以 Background subagent ... finished 通知形式到達,逐份計數,未到齊時只回一行狀態,不回答、不追加派發、不調用消磨時間的工具;全部到齊後比較、選最好的一個,原樣轉發。葉子(remaining == 0)才用工具真正執行任務,產出完整自洽的答案。所有深度都不向用戶提問、不停留在計劃、不越界改文件或提交。
其餘實現要點:註冊 preset 的模塊是 preset-recursive-best-of-n(來自 @deepseek-ai/dsh-agent-preset,id: recursive-best-of-n,order 5);persona 承載並行多開與擇優上報協議;本插件自帶的 JS 插件 recursion-context(index.js)負責讀設置、算樹形、注入運行時上下文;tool-subagent 使用 provider: spawn、toolName: subagent,不配置 maxDepth,因此服務在每次委派時讀取用戶設置的 subagent.maxDepth 作爲硬上限,子代理不指定 agentPreset,自動繼承父代理當前 preset 版本。葉子可用的工具包括 tool-bash / tool-pwsh(按平臺)、tool-fs / tool-fs-search / tool-jobs / tool-web / tool-skill / tool-todo,另有 agent-instructions / time-context 和 compaction 組處理長任務的上下文壓縮。
安裝與啓用¶
本倉庫根目錄就是插件包根目錄(package.json 的 dsh.bundle.patch 指向 cordis.patch.yml),因此可以直接從 GitHub 安裝,不需要 &path: 子目錄參數。
從 npm 安裝(推薦):
dsh plugin --profile desktop add dsh-recursive-best-of-n@1.4.0
從 GitHub 安裝:
dsh plugin --profile desktop add "git+https://github.com/xiong4huo/dsh-recursive-best-of-n.git#v1.4.0"
也可以克隆倉庫後,在 GUI 的插件管理裏安裝本地 bundle 目錄(link: 安裝,便於改代碼)。
安裝後在 Web GUI 裏啓用:
- 打開 設置 → 通用 → Agent 預設(或新會話的 preset 選擇器),選擇 Recursive Best-of-N(遞歸擇優樹)。
- 新建會話後發任意請求,會話樹 / 右側 subagent 目錄可以看到並行開出的子代理。
- 想讓主 agent 一次開更多,先按「設置如何換算成樹」調整「設置 → Plugins → Subagent」,變化對下一輪請求生效。
兩點注意。若 GUI 裏暫時看不到該預設,先刷新頁面;仍看不到時重啓一次 DeepSeek Harness(插件包含 JS 插件模塊)。用 Git 地址安裝時,plugin_manager 會先用 git ls-remote 檢查倉庫連通性,本機需要能訪問 github.com;直連受限時請給 Git 配置代理。npm 安裝沒有這個檢查。
典型用法:用一次實測驗證樹的形狀¶
GUI 手動驗證的做法:在「設置 → Plugins → Subagent」把最大深度設成 2、並行上限設成 14(或任意值),新會話選擇 Recursive Best-of-N,發送「37×3 等於幾?只回答數字」。預期主 agent 一條消息裏同時出現 3 個 subagent 調用;隨後 3 個一級子會話各帶 3 個二級子會話;主 agent 先顯示「已啓動 3 個…」,逐份收到提交(1/3、2/3、3/3)後只輸出一個答案。
README 記錄的最近一次命令行端到端實測(2026-10-24,deepseek-account/deepseek-flash,測試 profile 的 Subagent 設置爲最大深度 2 / 並行上限 14)結果如下:
- 插件按設置算出
fanout=3、有效深度2(f + f² = 3 + 9 = 12 ≤ 14)。 - 子代理樹:主代理 3 個一級子代理,每個一級再各 3 個葉子,共 12 個子代理。
- 主代理在同一條助手消息裏發出 3 個
subagent調用;狀態依次爲「已啓動 3 個…」→「已收到 3 份中的 1 份」→「2 份」→ 3 份到齊後輸出111。 - 一級節點同樣一條消息並行開 3 個葉子、逐份等待、擇優上報;葉子直接輸出
111。 - 整輪約 9–11 秒,無報錯。
該實測由 verification/ 目錄下的端到端驗證工具完成:用一次性臨時 profile(dsh-base + dsh-web-app + 本插件 + 測試 bundle)啓動獨立 Web Host,測試插件直接創建綁定 recursive-best-of-n 的會話、提交任務、等待整棵樹 settle 並記錄子代理樹,不經過 GUI。逐層軌跡見 verification/README.md。該目錄僅用於驗證,不要把 dsh-recursive-e2e 安裝到日常 profile。
一次請求的代理總數計算公式爲 1 + f + f² + … + f^d,(f, d) 由兩個設置自動算出。並行展開的層同時跑,牆鍾時間約爲「深度次葉子任務 + 各級擇優」。當前 Desktop 設置(10 / 40)下的自動解是每層 2 個、4 層,約 31 個代理;把最大深度調到 1 則是一次 40 個平鋪候選、41 個代理。這屬於「值得多花 token 換更好答案」的模式,閒聊也會完整走樹。
適用場景與注意¶
適合的場景:需要在 DSH 裏做多路採樣擇優、又不想自己寫分支和計數邏輯的開發者;希望並行數量和遞歸層數隨環境調整、而不是寫死在 preset 裏的人。只要把兩個設置調小,就能在一次請求裏得到幾十路平鋪候選,適合對穩定性要求高的核心任務。
需要留意的限制,均來自 README:
- 兩個設置是上限,插件取的是「深度儘量深、容量內最寬」的可行解,不是「每層都開滿並行上限」——那會瞬間佔滿容量,無法繼續遞歸。
- 每層會產生過程消息(「已啓動…/已收到 k 份」),這是模式本身的可視化,不是失敗。
- 子代理是 in-process 新會話,看不到父會話上下文;父代理必須在 prompt 裏逐字帶上完整任務(協議已要求)。
- 子代理權限在啓動時固定,不能從內部提權;需要審批的操作會在子代理內被拒絕。
- 該 preset 依賴 Web/Desktop profile 的 Host 服務(
subagents+spawnprovider、agentPresets、systemPrompt等),不適用於不組合這些服務的 headless/SDK profile。 - 想自定義形狀時只有兩個旋鈕可調,即那兩項設置;若要增刪葉子工具,直接編輯
cordis.patch.yml的plugins列表,模型選擇可在tool-subagent.config裏擴展modelSelectionSettings等字段。
另外需要明確:插件以安裝它的 DSH 進程的當前權限運行,安裝前建議先檢查源碼與許可證。倉庫使用 MIT 許可證,配置項與安裝命令見前文「安裝與啓用」。
卸載方式是在 GUI 的插件管理裏移除 dsh-recursive-best-of-n,或調用 plugin_manager 的 remove_bundle。移除後該預設從列表消失;已存在的會話保留它們啓動時的組合。
結尾¶
這個插件的價值在於把「多路採樣 + 遞歸擇優」的樹形計算從 prompt 裏搬出來,交給兩個用戶設置:容量以內自動求最深可行深度,在該深度下自動求最寬並行寬度,運行時上下文裏註明折算結果。對需要在 DSH 裏跑 Best-of-N 類推理的開發者,它省掉了自己維護計數與等待邏輯的成本。
目錄頁:https://www.skillhub.cn/plugins/xiong4huo/dsh-recursive-best-of-n
源碼與文檔:https://github.com/xiong4huo/dsh-recursive-best-of-n