前言¶
DeepSeek Harness(dsh)把模型、工具、會話、子智能體和界面都做成可替換插件,官方說法是「一切皆插件」。標準能力裏已經能 spawn / fork 子 Agent,但一次複雜目標往往還缺幾件事:誰當隊長、任務之間誰先誰後、成員空閒了能不能自動接下一項、中途打斷後會不會把舊結果蓋到新進度上。
dsh-agent-teams 補的就是這一層。它不另起一套 workflow 引擎,而是把當前會話變成隊長,按角色拉可續聊的子 Agent,把目標拆成帶依賴的任務,再用持久化郵箱和共享調度器把人串起來。本文按社區目錄頁、GitHub 倉庫 README、docs/usage.md 和 package.json 覈對後整理:它是什麼、裝哪條命令、怎麼用、邊界在哪。
社區插件目錄 deepseek-harness-plugin.com 是獨立站點,和 DeepSeek / 幻方沒有官方從屬關係。官方發現渠道仍是 GitHub 的 dsh-plugin 話題。目錄頁方便檢索和複製安裝命令,真正的行爲以倉庫源碼爲準。
這是什麼¶
dsh-agent-teams 是 DeepSeek Harness 的工作流與自動化插件,GitHub 倉庫爲 NanmiCoder/dsh-agent-teams,維護者是 NanmiCoder(package.json 作者字段寫的是程序員阿江 Relakkes)。許可證 MIT,主要語言 TypeScript,npm 包名 @nanmicoder/dsh-agent-teams。截至 2026-08-17,GitHub 顯示 421 星;社區目錄頁當時寫的是 291,星標以倉庫爲準。
它解決的問題可以收成一句話:用自然語言提出目標,當前 dsh 會話成爲隊長,把多個可續聊子 Agent 編成一支有任務依賴、有直達消息、狀態落盤的團隊。
倉庫 README 寫明,插件提供團隊協議、10 個協作工具、持久化狀態、自動共享任務調度,以及 Web 界面上的即時活動面板。package.json 裏客戶端聲明 platform 爲 web,活動面板走 Web UI;使用前需要已經裝好 DeepSeek Harness。Node 引擎要求是 ^22.19.0 || >=24。當前 npm 版本爲 0.1.6(以 package.json 爲準)。
核心功能¶
隊長、成員、任務、郵箱¶
工作方式按 README 可以拆成六步:
- 當前會話創建團隊,自己成爲隊長。一個隊長同一時間只能帶一個活動團隊。
- 隊長按角色添加成員。成員是 DSH 的可續聊子 Agent(
startContinuable),不是一次性跑完就丟的子進程。 - 目標被拆成任務,帶負責人和顯式依賴。
- 共享調度器按成員真實的
running / idle / ready狀態,給每個空閒成員原子領取一項就緒任務並喚醒;中斷或進程重啓後若仍持有開放任務,會生成新的attempt再跑。 - 成員更新任務時必須帶當前
attempt_id。轉派或隊長接管會先讓舊 attempt 失效、等原成員安靜,再開新 attempt,遲到的舊結果蓋不住新進度。 - 隊長彙總結果,調用結束接口把整支隊伍歸檔,而不是直接刪掉歷史。
任務狀態機在 docs/usage.md 裏寫得很清楚:pending → claimed → in_progress → completed | failed | cancelled。依賴沒完成不能領取,一個成員也不能同時佔兩個未完成任務。
團隊狀態落在工作區目錄裏,面板讀的是磁盤上的這份真相:
<workspace>/.agent-teams/<teamId>/
├── team.json
└── inbox/
├── captain.jsonl
└── <member>.jsonl
成員之間發消息走各自的 JSONL 郵箱,直接投遞給對方並喚醒,不經過隊長轉發。暫時送不出去的消息會留在郵箱裏,等後續狀態邊界再投。
十個協作工具¶
插件往 ctx.tools 註冊 10 個 agent_teams_* 工具,和 DSH 自帶的 tool-workflow 走同一條註冊路徑。模型按提示段裏的協議調用,用戶通常只要說目標,不必自己記工具名。工具職責如下:
| 工具 | 作用 |
|---|---|
agent_teams_create |
建團隊,調用者成爲隊長 |
agent_teams_add_member |
拉成員(可續聊子 Agent + persona) |
agent_teams_remove_member |
安全移除:撤 attempt、回收未完成任務、再調度 |
agent_teams_create_task |
建任務,可聲明 dependencies 和 assignee |
agent_teams_reassign_task |
原子轉派;assignee=captain 表示隊長接管 |
agent_teams_claim_task |
領取任務(先校驗依賴) |
agent_teams_update_task |
帶 attempt_id 推進狀態,拒絕舊 attempt 覆蓋 |
agent_teams_send_message |
成員直達隊友或隊長,拒絕冒名 from |
agent_teams_status |
全景:成員活動、任務、郵箱未讀 |
agent_teams_delete |
結束並歸檔,目錄挪到 archive/ |
拉成員默認是零交互:插件會快照隊長當前這一步真正在用的 LLM provider、model 和思考強度,後續續跑仍用這份快照。只有你明確說「後端用 A 家的模型 X、前端用 B 家的模型 Y」時,纔會給該成員傳 provider + model。不會逐個彈窗選模型。
這裏有個容易混的名字:配置項 memberProvider 指子 Agent 運行後端(spawn / fork),不是 LLM 供應商。跨模型路由走的是 agent_teams_add_member 的可選 provider + model。
Web 活動面板¶
裝進 Web profile 之後,團隊創建會在右上角展開活動面板(body portal 浮層):隊長信息、分段進度、可摺疊成員樹、可交互的任務 DAG。DAG 用 SVG 連依賴,懸停或鍵盤聚焦能看上下游,點選節點會顯示負責人、未滿足的前置和下游解鎖情況。成員行帶角色、即時狀態和當前任務,點擊可打開該成員的子會話。
面板只顯示當前會話的團隊(按 captainSessionId 匹配)。新建會話時面板收起,切回原會話再展開。結束團隊時 agent_teams_delete 做的是歸檔:成員、任務、依賴圖和郵箱完整留在 archive/,打開歷史會話還能看到當時的成員樹和 DAG。
docs/usage.md 也寫了限制:面板按磁盤狀態 1 秒輪詢渲染;模型有時做完活卻沒調用 agent_teams_update_task,這時面板不會「腦補」完成,隊長應以 agent_teams_status 和文件爲準。
安裝與啓用¶
目錄頁給出的安裝命令是:
dsh plugin add github:NanmiCoder/dsh-agent-teams
需要可復現安裝時,目錄頁要求固定 commit:
dsh plugin add github:NanmiCoder/dsh-agent-teams#<commit>
把 <commit> 換成倉庫裏的完整哈希,不要用浮動的分支名當鎖定依據。
倉庫 README 面向 Web 界面,寫的是 npm 包安裝(注意 profile):
dsh plugin --profile web add @nanmicoder/dsh-agent-teams
活動面板依賴 Web UI。只裝進默認 profile、不啓 web,工具協議仍可能掛上,但 README 驗證步驟是檢查 web 配置並啓動 Web:
dsh --profile web --dump-config
dsh web
從源碼安裝(改插件或跟最新提交時):
git clone https://github.com/NanmiCoder/dsh-agent-teams.git
cd dsh-agent-teams
pnpm install
pnpm build
dsh plugin --profile web add .
改源碼後要再跑一次 pnpm build。本地安裝會鏈到當前檢出目錄。
目錄頁和倉庫都提醒:插件以當前 dsh 進程的權限運行,安裝時可能執行代碼。裝之前應閱讀源碼和 MIT 許可證,確認倉庫就是 NanmiCoder/dsh-agent-teams。
典型用法¶
裝好並重啓 Web 之後,不必先手寫 YAML。README 的示例是直接用自然語言:
使用 AgentTeams 審查 v0.5.3 之後的提交,分別從性能、安全和產品角度分工,最後輸出一份彙總報告。
按協議,模型會:建團隊 → 按角色拉成員 → 拆任務並聲明依賴 → 調度器給空閒成員領任務並喚醒 → 隊長盯進度,阻塞時轉派或接管 → 彙總後 agent_teams_delete 歸檔。
默認配置可以不改。若要在受信任的 profile 裏覆蓋成員行爲,倉庫給出的示例是寫在 cordis.patch.yml:
- id: agent-teams
config:
stateDir: .agent-teams
memberProvider: spawn
memberModel: deepseek-v4
memberMaxDepth: 1
maxMembers: 8
含義按文檔:
stateDir:工作區下的狀態目錄名,默認.agent-teamsmemberProvider:spawn或fork,不是 LLM 名memberModel:全體成員的模型默認值;成員自己帶了provider/model時優先生效memberMaxDepth:成員再委派深度,0表示禁止maxMembers:人數上限,示例爲 8
生效順序是:成員顯式 provider + model → memberModel → 隊長當前路由。思考強度默認繼承隊長;目標 provider/model 不兼容時,成員創建會失敗,而不是悄悄降級。最終生效的 provider、model、思考強度會寫入 team.json,供查詢和冷恢復使用。
更細的工具參數、UI 行爲和驗證步驟見倉庫 docs/usage.md。同一倉庫還附帶一份面向插件開發的 Agent Skill dsh-plugin-development,和團隊編排不是同一件事,需要寫 DSH 插件時再單獨看。
適用場景與注意事項¶
更適合目標能按角色切開、步驟之間有先後依賴、又希望過程可看、可續、可歸檔的工作。官方示例本身就是多視角代碼審查再彙總。成員是可續聊子 Agent,適合一輪做不完、需要帶着上下文被再次喚醒的任務。
不適合的情況文檔也寫了,不要略過:
- 一個隊長同時只能有一個活動團隊。要開新隊,先結束並歸檔當前隊。
- 調度是事件驅動,不是常駐輪詢。隊長離線時不能給成員做冷恢復;任務和消息留在磁盤,等隊長回來或調用狀態工具後再投遞。
- 狀態是文件級持久化,同一
dsh進程內有鎖串行化;多個進程同時改同一團隊不保證一致。 - 成員 persona 會替換默認 persona,但成員仍持有 bash、文件系統、聯網等完整工具集,權限面和隊長同一進程。
- 活動面板反映磁盤真相;模型漏調更新工具時,界面上的任務可能仍停在舊狀態。
- 插件以當前
dsh進程權限運行。安裝前檢查源碼、許可證和倉庫地址;生產或共享工作區建議用#<commit>釘死版本。
docs/usage.md 還提到內測版本里服務鍵有過一次更名:npm latest(0.0.1-rc.1)用 ctx.httpServer / ctx.workspace,後續 next(rc.2)改爲 ctx.webServer / ctx.workspaceRegistry。插件對兩組鍵都做了探測,新鍵優先、舊鍵回退。若面板路由沒掛上,先覈對 DSH 版本和 --dump-config 裏是否真的裝進了 web profile。
小結¶
dsh-agent-teams 把 DSH 已有的子 Agent 能力收成可觀察的團隊:隊長在當前會話,成員可續聊,任務帶依賴,消息走郵箱,狀態寫在 .agent-teams/,Web 上能看到 DAG 和進度。它不是官方應用商店裏的「官方插件」,而是 NanmiCoder 維護的 MIT 社區項目;目錄頁只負責收錄和給出安裝命令。
目錄頁:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-agent-teams/
GitHub:https://github.com/NanmiCoder/dsh-agent-teams