subagent 继承 stale 的 agent.options.provider,忽略 Web 模型选择,导致子代理用错 provider 计费 #3552
Replies: 2 comments
|
你的根因分析很完整,补充三块让机制闭环 + 修复设计评估: 1. 家族交叉验证 —— 这是同一根因的第 2 个独立报告 这个"子代理继承冻结的 2. 第三层缺口:子代理的 ctx 根本没有 ModelSelectionRef 槽(比"没对齐"更彻底) rc.8 里
所以修复不能只在"继承值"上打补丁——子代理从路由构造到请求发出,整条链都没有 live 来源。 3. 修复设计评估:
修复形态建议(按优先级):① 子代理创建时注入父代理的 live |
|
这个问题不仅是显示错误,确实会把子代理费用打到错误账户。补一个已经用持久请求日志验证过的替代路径(Pi 子代理插件路线,不是 DSH 原生 subagent 修复): dsh plugin --profile <你的-profile> add pi2dsh
dsh plugin --profile <你的-profile> add @tintinweb/pi-subagentspi2dsh 创建子代理时不再把 真机 E2E 中父会话先走官方 provider,再通过 复现与证据: |
Uh oh!
There was an error while loading. Please reload this page.
subagent 继承的是父代理创建时固定的 agent.options.provider,而非 Web 模型选择器改后的当前 provider,导致子代理用错 provider 计费。
复现、预期与验收
复现步骤:
deepseek-official。provider-A)。subagent/descriptor与真实发起的 LLM 请求。实际结果:
子代理的
subagent/descriptor.agentProvider仍是deepseek-official,其真实request/header也路由到deepseek-official(计费错误账号)。父会话request/header明明已经切到provider-A。预期结果:
子代理继承父会话当前生效的模型选择(最后一次
request/header路由或ModelSelectionRef.current),而不是创建时冻结的agent.options。环境:
@deepseek-ai/dsh-root0.1.0-rc.8;in-processspawncontinuable provider;内置deepseek-official+ 自定义 OpenAI-compatible provider。验收条件:
父会话用 Models 页切走 provider 后,新派发的子代理 provider 与父会话当前路由一致,不再落到 stale provider。
根因
两套并行的模型状态未对齐:
agent.options——packages/subagent/subagent/src/child-agent.ts:68-83的resolveChildAgentOptions读parent.options.provider;而parent.options是readonly,构造函数固定(packages/core/agent-loop/src/agent.ts:83)。agent.options——agent.ts:440const route = { provider: this.options.provider ?? '', ... }。packages/core/agent/src/model-selection.ts的ModelSelectionRef(current/assembled),在agent/request瀑布里临时覆盖 provider/model(57–68 行),从不回写agent.options。因此父代理一旦在会话中途切换 provider,
agent.options.provider永远停留在创建时的值,子代理读它就会继承到 stale provider。证据
父会话
request/header时间线(用户反复切换,已脱敏):会话结束时
agent-default-model已是provider-A,但派生的所有子代理 descriptor 都是:{"type":"subagent/descriptor", ..., "data":{"version":2,"mode":"continuable","provider":"spawn", "label":"...","agentProvider":"deepseek-official","agentModel":"deepseek-v4-pro"}}某个深度为 1 的子代理实际发起的请求全部是
{"provider":"deepseek-official","model":"deepseek-v4-pro"},跑了 122 步 / 约 3500 条 reasoning chunk,扣到deepseek-official而非用户选择的provider-A。建议修复方向
resolveChildAgentOptions从父代理当前生效的模型选择(最后一次request/header路由,或ModelSelectionRef.current)解析子路由,而非parent.options。All reactions