# Bug:subagent 在无显式覆盖时静默使用与父 Agent 不同的模型
#3741
Replies: 2 comments
|
父会话是 没有 |
|
补一条可立即落地、并且可以从 session 日志审计最终路由的替代方案。边界先说清:它不改变 DSH 原生 dsh plugin --profile <你的-profile> add pi2dsh
dsh plugin --profile <你的-profile> add @tintinweb/pi-subagents未指定覆盖时,子代理默认 route 来自父会话最后一次真实请求,而不是创建时的全局默认;provider/model 作为一对继承。每个子会话仍有自己的 stock TUI 真机测试已经做过“父会话官方模型 → |
Uh oh!
There was an error while loading. Please reload this page.
Bug:
subagent在无显式覆盖时静默使用与父 Agent 不同的模型摘要
一个运行在
basecq/gpt-5.6-sol(部分后续回合为basecq/gpt-5.6-terra)上的 DSH 父 Agent,调用普通subagent后,创建的子代理实际运行在base/glm-5.3。父 Agent 的
subagent调用参数不含provider、model或agentOptions。但子会话持久化 descriptor 明确记录:{ "origin": "subagent", "delegationDepth": 1, "agentProvider": "base", "agentModel": "glm-5.3" }这不符合 DSH 当前子代理实现的默认继承逻辑:未提供
request.agentOptions时,子会话应继承父会话的 provider/model。并且,用户无法在委派时发现模型改变,历史会话也没有保存覆盖来源。预期行为
普通
subagent调用不携带模型路由参数时:若某个配置组件有意覆盖子代理路由,DSH 应明确显示并持久化该覆盖的来源、规则和最终路由。
实际行为
该差异在约 50 分钟内产生 50 条
glm-5.3上游 API 调用。用户没有手动在 GUI 中选择 GLM,也没有手动创建这些子会话。影响
basecq,实际任务被委派到base/glm-5.3。证据
以下数据均来自本地 DSH session 持久化与已安装 DSH 源码。已删除凭据、完整提示词和服务器敏感信息。
1. 父会话使用
basecq,不是 GLM父 session(脱敏):
session-cecd679c-…。持久化
request/header:{ "config": { "provider": "basecq", "model": "gpt-5.6-sol", "reasoningEffort": "max" } }后续回合:
{ "config": { "provider": "basecq", "model": "gpt-5.6-terra", "reasoningEffort": "medium" } }2. 父 Agent 调用了不带模型覆盖的普通
subagent约
09:08:39,父会话发出两条调用(任务正文已脱敏):{ "name": "subagent", "arguments": { "description": "设计现状适配方案", "prompt": "...", "run_in_background": true } }{ "name": "subagent", "arguments": { "description": "审查风险迁移路径", "prompt": "...", "run_in_background": true } }参数中均无
agentOptions、provider或model。后续独立设计/复核子代理也出现同样不一致。3. 子会话明确记录为
base/glm-5.3代表性子会话:
{ "id": "30784a97-…", "parentSession": "session-cecd679c-…", "origin": "subagent", "delegationDepth": 1 }{ "type": "subagent/descriptor", "data": { "mode": "continuable", "provider": "spawn", "label": "审查风险迁移路径", "agentProvider": "base", "agentModel": "glm-5.3" } }子会话的
request/header:{ "config": { "provider": "base", "model": "glm-5.3" } }同一时间启动的
8181a615-…及同父任务后续多个子会话,也记录为base/glm-5.3。4. 上游用量记录佐证
网关日志在本地时间
09:08:50–09:58:54记录到 50 条glm-5.3调用,均为 OpenAI-compatible Chat Completions 路径,时间与子会话活动一致。该记录仅作佐证;父/子 session 元数据和工具调用已经直接证明了自动委派及最终路由。
5. DSH 当前源码的默认继承逻辑
已安装版本的
@deepseek-ai/dsh-subagent/lib/index.js:因此,在父调用未传
agentOptions的前提下,跨模型路由意味着:有效执行路径中某处提供了不同的request.agentOptions,或在该解析前/解析过程中存在缺陷。标准
@deepseek-ai/dsh-tool-subagent工具 schema 仅暴露:环境
deepseek-harness/0.1.0-rc.8webprofilebasecq/gpt-5.6-sol,后续basecq/gpt-5.6-terrabase/glm-5.3subagent工具启用;安装中同时存在自定义/注入插件和 Agent presettool-subagent的agentOptions覆盖已知与未知
已知
subagent。origin: "subagent"、delegationDepth: 1。request.agentOptions时应继承父路由。未知
历史 session 仅保存解析完成后的子模型,未保存路由覆盖来源。该覆盖可能来自运行时 preset、注入插件、router 或其他 wrapper;静态 profile YAML 未能确认来源。
“路由覆盖来源缺失”本身是本 Issue 请求修复的可观测性问题。
最小复现建议
A/model-A和B/model-B。A/model-A启动父 Agent。subagent(provider: spawn,不设置agentOptions)。subagent({ description, prompt, run_in_background: true }),不传路由覆盖。subagent/descriptor、request/header和父/子agent.options。预期: 子会话为
A/model-A。本安装观察到: 子会话为
B/model-B。请求的修复
1. 默认继承断言
subagent未收到显式agentOptions时,断言子会话 provider/model 等于父会话。若不同,不应静默继续,应输出结构化错误或警告。2. 持久化路由来源
建议将如下信息写入子会话 descriptor 或 request header:
{ "modelRoute": { "parent": { "provider": "basecq", "model": "gpt-5.6-sol" }, "resolved": { "provider": "base", "model": "glm-5.3" }, "source": "plugin-or-config-id", "ruleId": "optional-rule-id", "explicitOverride": false } }至少需区分覆盖来自调用方、工具配置、preset 或拦截层。
3. UI 显示跨 provider 委派
子代理创建前/创建时显示最终 provider/model;跨 provider/model 路由应明确区别于普通继承。
4. 回归测试
建议覆盖:
agentOptions:继承父 provider 与 model;临时规避
在根因和来源追踪修复前,需要禁止隐式跨 provider 委派的用户,可禁用
tool-subagent/ 相关 Agent preset,或使用能够显式固定子代理路由的配置。可提供的脱敏附件
subagenttool/call事件;subagent/descriptor与request/header;由5.6sol整理
All reactions