useStream 中设置 filterSubagentMessages: true 以清晰地分离这两个流,然后使用 getSubagentsByMessage 将每个子智能体的进度卡片附加到触发它的协调器消息上。
为什么要过滤子智能体消息
不进行过滤时,每个子智能体产生的每个 Token 都会交错出现在协调器的消息流中,使其不可读。设置filterSubagentMessages: true 后:
stream.messages仅包含协调器的消息- 每个子智能体的内容可通过
stream.subagents和stream.getSubagentsByMessage访问 - UI 保持整洁:协调器的推理与专家的工作分离
设置 useStream
始终设置filterSubagentMessages: true。这将从主消息流中移除子智能体的 Token,以便你可以独立渲染协调器的消息和子智能体的输出。
定义一个与你的智能体状态 schema 匹配的 TypeScript 接口,并将其作为类型参数传递给 useStream,以获得对状态值的类型安全访问。在下面的示例中,将 typeof myAgent 替换为你的接口名称:
提交并启用子图流式传输
提交消息时,启用子图流式传输并设置适当的递归限制。深度智能体工作流通常涉及多层嵌套子图,因此较高的递归限制可防止过早终止:深度智能体默认递归限制为 10,000,对大多数多专家设置已经足够。如需要,可以通过
config.recursion_limit 覆盖。SubagentStreamInterface
每个子智能体暴露一个SubagentStreamInterface,包含有关子智能体任务、状态和时间的元数据:
将子智能体链接到消息
getSubagentsByMessage 方法返回特定 AI 消息生成的子智能体。这使你可以将子智能体卡片直接渲染在触发它们的协调器消息下方:
SubagentStreamInterface 对象数组。如果消息没有生成任何子智能体,则返回空数组。
构建 SubagentCard
每个子智能体卡片显示专家的名称、任务描述、流式内容或最终结果,以及时间信息:状态图标和徽章
一致的视觉指示器帮助用户一目了然地解析子智能体状态:进度跟踪
显示进度条和计数器,让用户知道有多少子智能体已完成:渲染带有子智能体卡片的消息
关键布局模式是渲染每条协调器消息,如果该消息生成了子智能体,则在其正下方渲染它们的卡片:综合指示器
当所有子智能体完成后,协调器需要时间将它们的结果综合为最终响应。在此阶段显示清晰的指示器:调试未过滤的输出
在开发过程中,你可以临时设置filterSubagentMessages: false 来查看所有子智能体在主消息流中的原始交错输出。这对于验证子智能体 Token 是否正确流动很有用,但不应在生产 UI 中使用。
使用场景
深度智能体子智能体卡片适用于以下智能体工作流场景:- 深度研究:协调器派遣研究员调查问题的不同方面,然后综合他们的发现
- 多专家分析:领域专家(法律、金融、技术)各自贡献他们的视角
- 复杂任务分解:规划者将大任务分解为子任务并将每个分配给专家工作者
- 代码审查流水线:各个智能体分别处理安全审查、风格检查、性能分析和文档审查
访问完整的子智能体映射
除了按消息查找之外,你还可以通过stream.subagents 一次访问所有子智能体:
最佳实践
- 始终设置
filterSubagentMessages: true。未过滤的流会产生协调器和子智能体 Token 不可读的交错。 - 显示任务描述。
toolCall.args.description字段告诉用户每个子智能体被要求做什么。始终突出显示。 - 使用可折叠卡片。在有 5 个以上子智能体的工作流中,自动折叠已完成的卡片,让用户关注活跃的工作。
- 显示计时数据。显示每个子智能体花费了多长时间,帮助用户了解性能特征并识别瓶颈。
- 设置适当的递归限制。具有嵌套子图的深度智能体工作流需要比默认值 25 更高的限制。从 100 开始。
- 按子智能体处理错误。一个子智能体失败不应该导致整个 UI 崩溃。在该子智能体的卡片中显示错误,同时其他子智能体继续运行。
连接这些文档到 Claude、VSCode 等工具,通过 MCP 获取实时答案。

