Repository navigation
[需求] 等待子智能体时,也应及时处理用户的新消息(wait_agent / Steer) #9214
Replies: 3 comments 1 reply
|
这条成立,而且我能把唤醒源穷举给你 —— 结论是:用户插话确实不在其中。另外你的插件方案在 master 上确实可落地,你论证的那几个公开 API 我都核了。 1.
|
| 位置 | 触发源 |
|---|---|
:89 |
new TeamJournal(ctx, (root) => { this.activity.notify(TeamId(root.id)) }) —— Team 域日志(成员 / 消息 / 任务记录) |
:94-97 |
ctx.on('agent/status', ({ agent }) => { … this.activity.notify(membership.id) }) —— 成员状态边 |
:246 |
一次 team 消息发送之后 |
:264 |
this.activity.close() —— 运行时销毁 |
用户向 Lead 收件箱插话不在其中。 ⇒ 你的实测("Steer 进入主智能体收件箱后等待仍保持未结束")与代码完全一致。
3. 为什么现有 Steer 救不了它 —— 是互等
packages/core/agent/src/runtime-types.ts:224-231:
Submit steering for the nearest step. An idle driver starts a turn; a running driver consumes it at its next step boundary. A rejected step leaves steering parked in the inbox until the next wake; …
⇒ 停在 wait_agent 的那一步内,插话只能等下一步边界;而下一步边界要等这次等待自己结束。两者互等 —— 这正是你描述的"必须按 Stop"。
同文件 :372-374 还有一句相关的:"The conclusion never short-circuits already-submitted next-step work…"。
4. 你的插件方案:我确认公开 API 足够
- 工具中间件:
packages/core/tools/src/index.ts:154 'tools/pre-execute'、:165 'tools/execute'、:177 'tools/post-execute'(均为next: () => Promise<…>形式) - 收件箱事件:
packages/core/agent/src/runtime-types.ts:288→'agent/inbox/inserted'(this: Scoped<Agent>, payload: { agent: Agent; message: UserMessage }): void;发包点在packages/core/agent-loop/src/inbox.ts:239-241→for (const message of event.data.inserted) { this.dispatch.emit('agent/inbox/inserted', { message }) } - 另有
:381 'agent/turn-stopping'(可等待、可agent.steer(...)追加)
⇒ "只结束本次等待、而不取消队友"这个目标是可以做到的,你的可行性论证成立。
5. 你想尊重的那个设置确实存在
packages/client/ui-conversation/src/client/locales.ts:73-76:
'settings.enter.title': '繁忙时的发送行为'
'settings.enter.description': '智能体运行时 Enter 键和发送按钮的行为;Cmd/Ctrl+Enter 使用另一行为'
'settings.enter.queue': '排队发送'
'settings.enter.steer': '插话发送'
(英文在 :451-454)实现为 BusyEnterBehavior:packages/client/ui-conversation/src/client/input/submission-policy.ts:48 → readonly busyEnter: SnapshotStore<BusyEnterBehavior> = createSnapshotStore(DEFAULT_BUSY_ENTER_BEHAVIOR)。
⇒ 原生支持的话不需要新增设置项 —— Queue / Steer 语义已经在了,缺的只是"让等待可被打断"。
6. 你的第 5 条(其他聊天不应唤醒这里的等待)也已成立
activity.ts:12 → private readonly waiters = new Map<TeamId, Set<Waiter>>();notify(id) 只唤醒同一 TeamId 的 waiter(:72-77)。实现时不要破坏这个隔离。
7. 建议的最小改法
把该等待从"一次工具调用内不可打断"改成"可被调用者自身的收件箱边打断的等待":让 TeamActivity.wait 同时订阅调用者 Agent 的 agent/inbox/inserted,并在唤醒结果里标注是"有新用户消息"而不是"子任务完成" —— 这正好对应你第 4 条期望。工具 schema 不用动。
短期 workaround:把 timeout_ms 压到上限附近缩短最坏延迟(工具 schema :246-249,合法区间 10000–3600000;activity.ts:23-25 同一校验)。
8. 两条边界(我不替你说满)
- 0.2.0-rc.2 →
origin/master(=dsh-v0.2.1-alpha.2)之间wait_agent的唤醒条件没有变化(waitForChange/TeamActivity结构一致)。master 只把队友之间的消息改为直接走 Agent inbox steering(agent-team/src/index.ts:241 root.steer(input)、:244 await steerHostSubagentPrompt(...))—— 那是队友发消息,与"人类 → Lead 插话"无关。 - 你自陈"远程投递链路与实际模型响应速度尚未实测" —— 那部分我无法核实,所以回答里不表态。上面第 2 节那 4 个唤醒源是穷举过的,可以放心引用。
|
确实是个不好的体验,我目前只能在提示词中让它不要等待队员 |
|
围绕这个问题补充一个已经开源、可复验的仅插件 alpha 实现:
目标是同一 Lead 收到 user Steer 后,只结束当前一次 这里有两个需要明确处理的 API 边界:当前 Inbox 插入事件不能直接区分 Steer 与 user-sourced inject;既有 wait 成功 schema 也不接受新唤醒原因。因此这个版本在插件内临时装饰公开 同一运行时实现已在本机安装的 这是社区兼容层,不是官方原生修复。正式 Desktop UI 完整链、SSH、Python PTC 和任意第三方装饰组合仍未验证;方法装饰没有稳定官方扩展契约,未来破坏性变化可能需要更新插件。建议先在隔离 profile 试用,欢迎反馈版本、发送设置、Native/PTC 模式及脱敏最小复现。 如果上游以后提供明确的投递操作 metadata 和标准 wait 用户唤醒结果,插件可以进一步收缩。这份实现主要补上公开可复验的代码与结果边界,也希望能为原生支持提供测试参考。 |
Uh oh!
There was an error while loading. Please reload this page.
希望改善的体验
我在 DSH Desktop 连接远程主机使用 Agent Teams 时,遇到主智能体停留在
wait_agent等待子智能体的情况。这时发送“还差多少”之类的新消息,感觉迟迟得不到处理。核心需求:主智能体等待子智能体期间,也应能及时处理用户的新消息。 用户应该可以随时问进度、补充要求或调整方向,无需先等待队友完成,也无需按 Stop 中断当前任务。
期望行为
wait_agent等待,让主智能体处理消息,然后根据需要继续等待。最关心的是等待期间仍能与主智能体交互、及时纠正方向。 不要求模型瞬间生成回答,但希望消息送达后不再被团队等待条件挡住。
补充验证与可行性
本机检查了 DSH 0.2.0-rc.2 的实现,并做了隔离对照测试:原始
wait_agent监听团队状态、团队邮箱和任务变化;用户 Steer 进入主智能体收件箱后,等待仍保持未结束。一个本地实验插件通过公开的工具中间件和收件箱事件,仅结束当前等待,即可让主智能体消费新消息,同时保持队友运行。单元测试和真实运行时隔离测试均通过。测试中的模型和存储使用内存适配器;远程投递链路和实际模型响应速度尚未实测。这里主要提出产品交互需求,希望官方原生支持这种响应方式;插件只是补充说明可行性。
All reactions