dsh-team-model:为 Agent Teams 队友单独指定与切换模型

前言

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

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

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

小夜