tool-agent-team:agent/created 时序竞态会随机杀死一次性子代理(TEAM_NOT_MEMBER) #5660
Replies: 2 comments
|
源级验证完毕——你的根因分析在 0.1.3-alpha.1 源码上全部成立,我逐行核对如下: 印证链
修复方向(我的权重排序)
我倾向于方案 1 先落地(1 行、可独立提交、立即消除随机死亡),方案 2 作为后续根治。 附带诉求(SpawnTeammateRequest 暴露 agentOptions):这条我完全赞同。你指出的矛盾点很关键——continuable descriptor 有 需要的话我可以给方案 1 出一份 reference patch(含对齐 |
|
只补两点,都是确认性的——你这篇的根因分析我这边独立复现了,机制链条和你写的一致。
另外顺带一个观察,不知道和你那边是否一致:后台调用( 影响的能力
|
Uh oh!
There was an error while loading. Please reload this page.
症状
挂载
@deepseek-ai/dsh-experimental-agent-team-profile后,任何一次性subagents.start('spawn', …)子代理(我们的是一个只读评审批评者;同样的路径也服务无状态的顾问子代理)会概率性地在迈出第一步之前死亡。子代理
回合以
stopReason: "error"结束,错误详情:卸载 team profile 后,同样的 spawn 恢复稳定。在本地 0.1.3-alpha.1 构建上
复现,spawn 带不带
toolFilter都会触发。根因(据我们排查)
packages/experimental/agent-team/src/roster.ts中,descriptor 发布与agent/created观察者之间存在竞态:tool-agent-team通过agent/created上的maybeInstall按代理安装团队工具(
packages/experimental/tool-agent-team/src/index.ts),由
roster.tryMembership(agent)把关。tryMembership调用subagentDescriptor(agent)——它折叠子会话自身后缀(
snapshotEvents(inheritedEventCount))来识别「服务商拥有的子代理 descriptor」。
agent/created这一刻,descriptor 事件在后缀里尚不可见,探针返回 false。于是一个父代理存活、但父代理不在团队名册里的一次性
子代理,落入「隐式 lead」分支,被装上了团队工具和
team:policy系统提示节。
text()调用的是抛错版roster.membership(agent)。此时 descriptor 已可见,tryMembership返回 undefined,
membership()抛出TEAM_NOT_MEMBER——整个回合失败。即:安装器在创建时刻把子代理误判为 Lead,prompt 节在装配时刻身份翻转后
把它杀死。
修复方向(建议)
发现 / prompt 装配时分类,而不是
agent/created);或team:policy提示节非抛错(用tryMembership解析,成员身份消失时渲染为空),使过期的安装无害化;或
maybeInstall在 descriptor 出现时复查并卸载。如需要,我们可以提供复现现场的子会话日志(
session.v2.jsonl.zstd)。附带诉求:spawnTeammate 的路由桥接
我们在做一个spawn一次性子代理的插件时撞上这个问题。目前的绕行方案是
不挂载 team profile——但这也意味着我们无法试用(本来很有前途的)
teammate 邮箱进展通道:
SpawnTeammateRequest不支持按次 pin 模型路由(其中
provider字段选择的是 subagent 提供方,LLM 路由活在 team 包的profile 配置层),而底层 continuable descriptor 明明有
agentProvider/agentModel/agentReasoningEffort字段。如果SpawnTeammateRequest能暴露 agentOptions,我们这边第二个使用场景(批评者 teammate 化 + 邮箱叙事进展)就能解锁。
All reactions