xiong4huo/dsh-recursive-best-of-n:遞歸擇優樹 agent preset 插件介紹

前言

在 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

幾個要點:

  1. 最大深度很大時自動變窄。例如當前的 10,若要每層 2 個、10 層,需要約 2046 個同時在線子代理,超出 40 的上限,所以運行時上下文會註明 configured maximum depth 10 is capacity-limited to 4。
  2. 想讓主 agent 一次開更多,把「最大遞歸深度」調小。設爲 1 就是一次並行開 40 個(一層平鋪、主 agent 直接擇優);設爲 2 則每層 5 個;設爲 3 則每層 3 個。
  3. 兩項設置在每個新請求讀取,改完下一輪請求即生效。
  4. 想真正遞歸 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 裏啓用:

  1. 打開 設置 → 通用 → Agent 預設(或新會話的 preset 選擇器),選擇 Recursive Best-of-N(遞歸擇優樹)。
  2. 新建會話後發任意請求,會話樹 / 右側 subagent 目錄可以看到並行開出的子代理。
  3. 想讓主 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)結果如下:

  1. 插件按設置算出 fanout=3、有效深度 2(f + f² = 3 + 9 = 12 ≤ 14)。
  2. 子代理樹:主代理 3 個一級子代理,每個一級再各 3 個葉子,共 12 個子代理。
  3. 主代理在同一條助手消息裏發出 3 個 subagent 調用;狀態依次爲「已啓動 3 個…」→「已收到 3 份中的 1 份」→「2 份」→ 3 份到齊後輸出 111。
  4. 一級節點同樣一條消息並行開 3 個葉子、逐份等待、擇優上報;葉子直接輸出 111。
  5. 整輪約 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:

  1. 兩個設置是上限,插件取的是「深度儘量深、容量內最寬」的可行解,不是「每層都開滿並行上限」——那會瞬間佔滿容量,無法繼續遞歸。
  2. 每層會產生過程消息(「已啓動…/已收到 k 份」),這是模式本身的可視化,不是失敗。
  3. 子代理是 in-process 新會話,看不到父會話上下文;父代理必須在 prompt 裏逐字帶上完整任務(協議已要求)。
  4. 子代理權限在啓動時固定,不能從內部提權;需要審批的操作會在子代理內被拒絕。
  5. 該 preset 依賴 Web/Desktop profile 的 Host 服務(subagents + spawn provider、agentPresets、systemPrompt 等),不適用於不組合這些服務的 headless/SDK profile。
  6. 想自定義形狀時只有兩個旋鈕可調,即那兩項設置;若要增刪葉子工具,直接編輯 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

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

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

小夜