前言¶
在 DeepSeek Harness(DSH)裏用 Agent Teams 時,常見做法是 Lead 拉起若干隊友分工協作。內置團隊插件 @deepseek-ai/dsh-experimental-agent-team 在創建隊友時,spawn_teammate 只接受 name、description、prompt、context,本地 subagent provider 也只認 providerName,因此所有隊友會繼承 Lead 當前的路由——審查用強推理、檢索用輕量模型這類分工很難在框架默認行爲裏直接表達。內置的模型選擇還有「只生效一輪」的問題:selectionFor(agent).current 被一次請求消費後清空,下一輪又回到會話頭或默認模型。
下面介紹社區插件 dsh-team-model(維護者 Chruix,分類:模型推理)。它只使用 DSH 公開接口:新增工具、向子會話寫入 model/selection 事件、在隊友的 agent/request 上保持路由,並用 loopback RPC 支撐 Web UI,讓模型和用戶都能爲每個隊友指定模型,且切換後持續生效。
這是什麼¶
dsh-team-model 是標準 DSH bundle(package.json + cordis.patch.yml + host/client 雙入口),當前版本 0.1.1,許可證 MIT(見 GitHub 倉庫)。
它解決兩件事:一是 Lead/模型在 spawn 時就能指定隊友的 provider / model / reasoning_effort;二是用戶在 Web UI 三處入口隨時改隊友模型,且從第二輪請求起仍沿用所選路由,直到再次修改。
核心功能¶
1. 模型指定隊友模型:spawn_teammate_with_model¶
插件在 Lead 的 agent 上下文註冊工具 spawn_teammate_with_model,參數與內置 spawn_teammate 一致,並多出三項可選字段。模型會在隊友首輪請求之前寫入子會話,第一次回覆即用新路由,不會先用繼承模型跑一輪。
{
"name": "reviewer", // 必填,[a-z0-9-],≤64 字符
"description": "代碼審查", // 必填
"prompt": "審查這次改動…", // 必填
"context": "fresh", // fresh | fork
"provider": "openai", // 可選,省略則按 model 在目錄中唯一匹配
"model": "gpt-5", // 可選,省略則繼承當前會話
"reasoning_effort": "high" // 可選,模型支持時生效
}
2. 用戶在三處切換模型¶
| 入口 | slot | 說明 |
|---|---|---|
| 會話頭部膠囊 | conversation.session.header.actions |
列出本隊隊友,點開選模型 |
| 輸入框工具行 | conversation.input.right |
窄屏收成圖標 + 模型名 |
| 設置 → 隊友模型 | settings.section |
按會話分組,單個或整隊統一,含離線隊友 |
在隊友自己的會話裏打開時,UI 會聚焦該隊友(標題爲「模型」),只改其模型,不再列出整支團隊。
3. 切換後持續生效¶
插件在隊友 agent 上掛 agent/request waterfall,按會話投影 modelSelection.pending ?? lastUsed 覆寫 provider / model / reasoningEffort,因此第二輪、第三輪仍是你選的模型,直到再次修改。這與內置一次性選擇的行爲形成對比。
4. 離線隊友排隊¶
不在線的隊友沒有運行中的 Agent 時,選擇進入隊列(queued),在下次啓動、第一條請求之前寫入;界面提示「該隊友當前不在線,模型已記下,下次啓動時生效」。
安裝與啓用¶
官方 README 給出的安裝方式是將倉庫放到本地插件目錄,再在 DSH 插件管理器中安裝 bundle,或在 profile 中插入條目。
git clone https://github.com/Chruix/dsh-team-model ~/.dsh/plugins/dsh-team-model
隨後在插件管理器中對上述目錄執行 install_bundle,或在 profile 中增加:
- insert:
- id: team-model
name: dsh-team-model
Host 側依賴以下服務同時存在,否則該 profile 不會激活本插件:agents、agentTeams、tools、systemPrompt、sessionController、llm、connection、webServer。
可選配置(config 段)示例:
- id: team-model
name: dsh-team-model
config:
defaultModel: "" # 未顯式指定時的默認隊友模型
defaultProvider: "" # 默認提供方;留空則按目錄唯一匹配推斷
freshProvider: "spawn" # 沿用內置工具插件的路由名
forkProvider: "fork"
tool: true # 是否註冊 spawn_teammate_with_model
policy: true # 是否向 Lead 注入使用說明
修改代碼後需讓 loader 重新 import:
remove_bundle dsh-team-model
install_bundle /path/to/dsh-team-model
回執中出現 "application": "applied" 纔算生效。
典型用法¶
用工具拉起帶固定模型的隊友:Lead 在對話中調用 spawn_teammate_with_model,例如 name 爲 reviewer、context 爲 fresh,並填寫 provider、model 或 reasoning_effort(視目錄支持情況而定)。
在 Web UI 中改正在協作的隊友:從會話頭、輸入框右側或設置頁的「隊友模型」進入,選擇目標隊友與模型;若隊友在線,隨後多輪請求應仍走路由投影。
開發自檢(來自 README):倉庫 test/ 含 Node 冒煙測試,例如本地無需宿主即可跑客戶端渲染測試:
node test/client-smoke.cjs
對運行中宿主測 RPC 時需設置 DSH_RPC_BASE 等環境變量(詳見倉庫 README)。
架構與安全(簡要)¶
Host 端(index.js)負責工具註冊、applySelection / applyOrQueue、agent/request 鉤子,以及掛在 webServer 上的 RPC 前綴 /dsh-team-model(tm.state、tm.setModel、tm.globals、tm.setAll)。Client 端(client.js)註冊三個 UI slot,通過 ctx.connection.rpc.call('/dsh-team-model', ...) 取數。
RPC 僅監聽宿主迴環地址,並校驗 Host、Origin、Sec-Fetch-Site、Content-Type、body 大小與 rpcId 格式。模型改動以 model/selection 事件寫入對應會話日誌,與 /model 同源鏈路;插件不讀憑據、不寫會話以外存儲。
適用場景與注意¶
適合:已啓用 Agent Teams、需要按角色分配不同模型或推理強度,並希望在 Web UI 裏隨時改隊友路由且保持多輪一致的團隊協作者。
限制(README 已列):團隊按會話隔離,Lead 只能管自己會話中的隊友;一會話一支 team,成員數受內置 maxMembers 約束;滿員後只能複用已有隊友。推理強度依賴各模型在目錄中的 reasoning.efforts 聲明,不支持的提供方會拒絕並返回可讀錯誤。UI 依賴 shell 虛擬模塊 @deepseek-ai/dsh-client-ui-primitives。
安全與信任:插件以當前 DSH 進程權限運行,安裝前請閱讀源碼與 MIT 許可證,確認 RPC 邊界與團隊數據流符合你的環境要求。DSH 社區插件目錄(如 SkillHub 條目)獨立於 DeepSeek / 幻方,並非官方應用商店。
結尾¶
dsh-team-model 在公開接口之上補了「按隊友指定模型 + Web UI 三處切換 + 切換後持續生效 + 離線排隊」這一層,與內置 spawn_teammate 和一次性模型選擇形成互補。進一步瞭解可查看: