前言¶
在 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 和一次性模型选择形成互补。进一步了解可查看: