前言¶
DeepSeek Harness(dsh)把智能體運行時拆成可插拔的能力:模型、工具、會話、沙箱、界面都是插件。官方倉庫的說法是「一切皆插件」(Everything is a Plugin),由 Cordis 負責掛載和組合。子代理(subagent)也在這條鏈路上:父代理把一段自包含任務交給子代理,子代理在自己的上下文裏跑完,再把結果交回來。
官方自帶的 tool-subagent 走 spawn 路徑,面向模型的工具名就是 subagent。它能委派,但默認只有一套行爲:模型、人設、工具過濾、後臺策略都跟着當前部署走。實際用的時候經常會碰到另一類需求:調研用快模型、改代碼用人設更嚴的模型、某些任務還要收窄工具權限。如果每套策略都做成一個新工具,模型側的工具表會越來越長,也容易和官方工具重名。
dsh-plugin-yet-another-subagent 走的是另一條路:仍然只暴露一個 subagent 工具,用 profile 參數選配置。社區插件庫把它歸在「界面增強」,維護者是 HuanLinOTO。本文按目錄頁、GitHub 倉庫和 npm 包交叉覈對後的內容來寫,不把社區目錄寫成 DeepSeek / 幻方的官方應用商店。
這是什麼¶
dsh-plugin-yet-another-subagent 是面向 DeepSeek Harness 的社區插件。npm 包名是 @huanlin/dsh-plugin-yet-another-subagent,插件 id 是 yet-another-subagent。倉庫 README 的定位是:可配置的子代理 profile 系統,提供單一 subagent 工具 + profile 參數,並帶 Web UI 設置、即時進度(工具調用 / token / 活動)、子代理樹標籤頁,以及點擊跳轉到子會話。
它解決的問題可以概括成三點:
1、模型側工具面保持扁平。profile 增刪只改 profile 枚舉,不改工具名集合。
2、每套 profile 可以單獨指定模型、人設、工具過濾、遞歸深度和後臺模式。
3、Web 界面能看見子代理在幹什麼,而不只是等一條最終回覆。
package.json 裏 dsh.client.platform 寫的是 web,也就是說界面部分掛在 Web UI 上。GitHub 倉庫頁面當前 11 星(社區目錄頁仍顯示 7 星,以倉庫頁面爲準)。LICENSE 與 package.json 聲明爲 AGPL-3.0;目錄頁因 GitHub SPDX 識別爲 NOASSERTION,安裝前應對照倉庫許可證原文。
核心功能¶
按照倉庫 README 和 src/index.ts / src/tool-factory.ts 的實現,插件是一個單 bundle、三入口結構:host(.)、invariant(./invariant)、client(./client)。
1、單一 subagent 工具
host 側註冊一個名爲 subagent 的工具,用 profile 枚舉選擇配置。未傳 profile 時,源碼默認落到內置的 general。工具複用官方 spawn provider,支持前臺(foreground)和後臺兩種跑法;後臺策略由當前 profile 的 backgroundMode 決定,可以是 continuable(保留子會話,後續用 send_message 繼續派活)或 one-shot(返回 job id,用 job_output / job_kill 收結果或中止)。
cordis.patch.yml 只禁用官方 tool-subagent(spawn 路徑,工具名同樣是 subagent),保留 tool-subagent-fork(工具名 subagent_fork),避免名稱衝突。fork 委派仍然可用。
2、Web UI 設置頁
client 側往設置面板註冊 settings.section(id ya-subagent),用來增刪改 profile。狀態通過 settings seam 寫到 $DSH_HOME/settings.yaml 的 ya-subagent 命名空間。cordis.patch.yml 裏的 profiles 只是首次啓動的種子(composition base);之後在設置頁改的內容以用戶層爲準。沒有 settings provider 的無頭組裝會退回內存狀態,只保留種子配置,不持久化。
3、即時進度和子代理樹
工具調用卡片(tool.call.toolview,key 爲 subagent)會展示子代理進度。底層靠兩個 session projection:父會話上的 subagentProfile(childId→profileId、callId→childId),子會話上的 yaSubagentProgress(即時 toolcall / token / 活動)。會話視圖裏還有 subagent-tree 標籤頁,點卡片可以跳到對應子會話。
4、默認 profile
安裝後會帶一個內置 general:模型 auto(繼承父代理)、人設 inherit、不過濾工具、maxDepth 爲 3、backgroundMode 爲 continuable。generalFixed: true 表示這個內置項按固定種子處理。
安裝與啓用¶
社區目錄頁給出的安裝命令如下,在 DeepSeek Harness 終端裏運行即可:
dsh plugin add github:HuanLinOTO/dsh-plugin-yet-another-subagent
需要可復現安裝時,目錄頁建議固定 commit 哈希,把下面的 commit 換成具體哈希。倉庫 master 在 2026-08-15 的最新提交是 1d2d2d4a93b6226740a0ae1d61ef9d95e4447f67:
dsh plugin add github:HuanLinOTO/dsh-plugin-yet-another-subagent#1d2d2d4a93b6226740a0ae1d61ef9d95e4447f67
倉庫 README 還給出了按 web profile 從 npm 安裝的寫法(README 標註爲推薦):
dsh plugin --profile web add @huanlin/dsh-plugin-yet-another-subagent
npm 頁面當前最新版本是 0.1.2(倉庫 package.json 仍寫 0.1.1,以 npm 頁面爲準)。安裝完成後按 README 重啓 dsh web,瀏覽器硬刷新(Ctrl+Shift+R)。
插件以當前 dsh 進程的權限運行,安裝時可能執行代碼。安裝前應檢查源代碼倉庫和許可證。
配置與用法¶
bundle 自帶的 patch 大致如下(摘自倉庫 cordis.patch.yml):
- id: tool-subagent
disabled: true
- insert:
- id: yet-another-subagent
name: '@huanlin/dsh-plugin-yet-another-subagent'
config:
profiles:
- id: general
label: General
model: { kind: 'auto' }
persona: { kind: 'inherit' }
toolFilter: { kind: 'none' }
maxDepth: 3
builtin: true
generalFixed: true
日常改 profile 不必手改這份 yaml。打開 Web UI 設置裏的 yet-another-subagent 一節即可增刪改;外部直接改 $DSH_HOME/settings.yaml 時,host 會通過 scope.watch 熱重載並重新註冊工具。
README 給出的 profile 字段如下:
| 字段 | 說明 |
|---|---|
id |
唯一標識,小寫字母 / 數字 / 連字符,1–32 字符 |
label |
顯示名 |
model.kind |
auto 繼承父代理模型;manual 再填 provider 和 model |
persona.kind |
inherit 跟隨部署人設;custom 使用 persona.text |
toolFilter.kind |
none / allow / deny,列表寫在 toolFilter.tools |
maxDepth |
最大遞歸深度,默認 3 |
backgroundMode |
continuable 或 one-shot,在 run_in_background: true 時生效 |
builtin |
是否爲內置 profile,僅展示用 |
模型調用 subagent 時,參數來自 src/tool-factory.ts:
profile:可選,枚舉當前 profile id,省略則用generaldescription:必填,3–5 個詞的任務短標籤,用於界面展示prompt:必填,給子代理的完整、自包含任務。子代理看不到父會話上下文run_in_background:可選。true時按該 profile 的backgroundMode走後臺
例如先在設置頁加一個 id 爲 research、模型 manual、工具過濾更窄的 profile,再讓模型委派時帶上 profile: "research"。工具描述裏會列出當前可用 profile,模型按任務性質選擇即可。
界面側可以按這個順序看效果:
1、重啓 dsh web 並硬刷新後,設置頁應出現 profile 編輯入口。
2、父代理調用 subagent 後,對話裏的工具卡片會顯示進度;打開 subagent-tree 標籤頁可以看到子代理樹。
3、點擊卡片跳轉到對應子會話。
適用場景與注意事項¶
比較適合已經在用 dsh Web UI、並且會把工作拆給子代理的人:同一條主會話裏既要調研、又要改代碼、還要限制某些子任務能碰哪些工具。它不替代 fork 路徑上的 subagent_fork,也不給無頭組裝提供 Web 進度面板。
使用前有幾處邊界需要知道:
1、它會禁用官方 spawn 路徑的 tool-subagent,接管 subagent 這個工具名。如果當前 profile 還依賴官方那套默認行爲,裝之前先確認可以替換。
2、client 明確標了 platform: web。無頭模式沒有 settings provider 時,profile 只存在內存裏,重啓即丟。
3、README 寫明舊會話不兼容:結果文本的 render 格式變更後,舊會話裏的卡片可能無法被 parseResult 匹配,因而不可點擊;需要 host 重啓後的新會話才正常。yaSubagentProgress 的 stateVersion 2(activity 字段等)同樣要 host 重啓後才生效。
4、倉庫 engines 要求 Node.js >=22.0.0。
5、倉庫裏的 AGENTS.md 仍有「每個 profile 註冊一個 subagent_<id> 工具」「同時禁用 fork」等舊描述,與當前 README、cordis.patch.yml 和 src/index.ts 不一致。以 README 和源碼爲準。
插件以當前 dsh 進程權限運行。社區目錄是獨立站點,和 DeepSeek / 幻方沒有官方從屬關係;dshfind 也收錄了該插件,同樣屬於社區索引。安裝前檢查源碼、許可證和依賴,重要工作區建議先在一次性 profile 裏試裝。
小結¶
dsh-plugin-yet-another-subagent 把「多套子代理策略」收成一個工具上的 profile 參數,並在 Web UI 裏補上設置頁、即時進度和子代理樹。它複用官方 spawn,不碰 subagent_fork。需要多套模型 / 人設 / 工具權限、又不想把工具表拆散的話,可以按目錄頁命令裝一份,看設置頁和子代理樹是否符合自己的工作流。
目錄頁:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-plugin-yet-another-subagent/
GitHub:https://github.com/HuanLinOTO/dsh-plugin-yet-another-subagent