← 返回目录

第 3 卷

第 3 / 4 卷日期:

3output: 仓库里一共 42 个文件。

子 agent 的中间过程不进父 agent 的会话,父 agent 只拿最终结果。

这个结果怎么回到父 agent 手里,两种子 agent 不一样。一次性子 agent,父 agent 直接 await 句柄的 result。

可继续子 agent 则是父 agent 不 await,等子 agent 结束时,ctx.subagents 服务往父 agent 的消息队列投一条结果通知:开头是一句总结,说明它为什么停,比如 Background

subagent <id> finished...</id>,后面接子 agent 的最终输出。投完通知, ctx.subagents 才把子 agent 从父 agent 名下拿掉。

这个先后不是随便定的:通知得在子 agent 被拿掉之前投进父 agent 的消息队列。这个子 agent 被拿掉,父 agent 名下没子 agent 了,就会被判定“可以结束了”、接着被

ctx.subagents 回收;回收之后,通知就无处可投了。

另一件事是资源释放。一次性子 agent 靠句柄的 dispose():它先取消剩余工作,等子 agent 彻底停下来,再释放资源,整个过程幂等。无论子 agent 干成没干成,父 agent 都要

调它,这是资源一定被释放的兜底。示例最后就是这一步:

复制代码 1--- 回收 ---

2子 agent 已 dispose(回收完成)

可继续子 agent 的释放不靠父 agent 手动调 dispose(),而是 ctx.subagents 自动跟踪它的驻留期(官方术语 Activation)来释放。

可继续子 agent 的释放,只释放这个进程内实例,会话还在;而一次性子 agent 的 dispose(),连会话一起删了。

驻留期由 ctx.subagents 自动判定,三个状态:running(在跑)、waiting(自己停下来了,还有子没释放)、settled(自己停下来了,子都释放干净了)。走到 settled,

ctx.subagents 就释放这个子 agent 的句柄、把它的驻留期从进程里移除。

本讲小结

我们看清了委派的三个环节:start() 把活派出去,和子 agent 互动,再把结果收回来、资源释放掉,正好是标题中的三个词。

创建:ctx.subagents 一个 seam、多个提供方(spawn 空历史、fork 带父历史);

start() 先发布、句柄到手;子 agent 组合自父级(composeFrom())继承工具和人设,还能换人设、裁工具;委派深度(delegationDepth)记在会话头里、重启不丢,

maxDepth 封顶。

协作:一次性子 agent,父 agent 只等结果;可继续子 agent 双向互动(followup() 续派、interrupt() 中断、reportFrom() 上报)。

回收:一次性子 agent 直接 await 结果、dispose() 释放(幂等,取消剩余工作、等彻底停下来);可继续子 agent 结果以通知回传(在释放前)、驻留期走到头才释放。

这背后真正的变化是一个 agent 不再只能亲力亲为,它能把活委派给子 agent,还能换人设、裁工具,覆盖子 agent 的默认继承。委派不是“放出去就不管”:深度有封顶、回收子先

于父,整棵委派树不会失控疯长,最终收得干净。

注:本讲 GitHub 链接

  1. 给 start('spawn', ...) 的 request 里加一个 maxDepth: 0,重跑,看委派是不是

被拒、报错(子 agent 的深度 1 超过了上限 0)。

  1. 在 run.dispose() 之前,再委派第二个子 agent(调一次 await

ctx.subagents.start('spawn', ...)),重跑,看两个子 agent 的 delegationDepth 是不是都是 1(说明它们是兄弟、不是父子)。

欢迎把你的运行结果分享出来。如果你觉得这节课对你有帮助,也欢迎分享给其他朋友,我们下节课再见!

© 版权归极客邦科技所有,未经许可不得传播售卖。页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。

全部留言 (1)

最新精选

图 9-1
图 9-1

彬

2026-10-11 来自广东

有两个疑惑。一个是基础设施故障 reject 后,前面的记录会保留吗?故障后父 agent 会在那傻等吗?另一个是一次性子 agent dispose 后连会话一起删,是结束那一次会话的意思吧?

日志按前面的原则应该是只增不删?也就是其实具体的区别是一次性的再消息回传后会直接结束会话,但可继续的会等到给出 settled 状态后由 ctx.subagents 释放,在那之前会保留会话

可恢复?那这个 settled 状态是子程序自己给的,然后由 ctx.subagents 来监控和处理进程?

是这样理解吗?

作者回复: 你好,这两个问题都问得很细,回答如下,如果仍有问题,欢迎继续留言讨论。

疑惑一:基础设施故障 reject 后,前面的记录保留吗?父 agent 会傻等吗?

保留,也不会傻等。

先分清两类失败:子 agent 级别的失败(模型/传输出错)不会 reject,而是 resolve 成 stopReaso

全站分卷索引 · 4 卷
  1. 1第 1 卷
  2. 2第 2 卷
  3. 3第 3 卷
  4. 4第 4 卷