Skip to main content
当协调器代理生成专家子代理(研究员、分析师、撰稿人)时,您需要将协调器的消息与每个子代理的流式输出分开渲染。在 useStream 中设置 filterSubagentMessages: true 以清晰地分割这两个流,然后使用 getSubagentsByMessage 将每个子代理的进度卡片附加到触发它的协调器消息上。

为何要过滤子代理消息

如果不进行过滤,每个子代理产生的每个令牌都会交错出现在协调器的消息流中,使其难以阅读。设置 filterSubagentMessages: true 后:
  • stream.messages 仅包含协调器的消息
  • 每个子代理的内容可通过 stream.subagentsstream.getSubagentsByMessage 访问
  • UI 保持整洁:协调器的推理过程与专家的工作分离
这种分离使您可以在一个地方渲染协调器的消息,并将每个子代理的进度卡片精确地附加到其所属位置:即生成它的协调器消息下方。

设置 useStream

始终设置 filterSubagentMessages: true。这会从主消息流中移除子代理令牌,以便您可以独立渲染协调器的消息和子代理输出。 定义一个与您的代理状态模式匹配的 TypeScript 接口,并将其作为类型参数传递给 useStream,以实现对状态值的类型安全访问。在下面的示例中,请将 typeof myAgent 替换为您的接口名称:

使用子图流式处理进行提交

提交消息时,启用子图流式处理并设置适当的递归限制。深度代理工作流通常涉及多层嵌套的子图,因此更高的递归限制可以防止过早终止:
DeepAgents 设置了默认递归限制为 10,000,这对于大多数多专家设置来说已经足够。如果需要,您可以通过 config.recursion_limit 覆盖此设置。

SubagentStreamInterface

每个子代理都暴露一个 SubagentStreamInterface,其中包含有关子代理任务、状态和时间的元数据:

将子代理链接到消息

getSubagentsByMessage 方法返回由特定 AI 消息生成的子代理。这使您可以将子代理卡片直接渲染在触发它们的协调器消息下方:
这将返回一个 SubagentStreamInterface 对象数组。如果该消息没有生成任何子代理,则返回一个空数组。

构建 SubagentCard

每个子代理卡片显示专家的名称、任务描述、流式内容或最终结果以及时间信息:

状态图标和徽章

一致的视觉指示器可帮助用户一目了然地解析子代理状态:

进度跟踪

显示进度条和计数器,以便用户了解有多少子代理已完成:

使用子代理卡片渲染消息

关键的布局模式是渲染每个协调器消息,如果该消息生成了子代理,则在其下方立即渲染它们的卡片:

综合指示器

所有子代理完成后,协调器需要时间将它们的结果综合成最终响应。在此阶段显示清晰的指示器:
对于复杂的多专家工作流,综合阶段可能需要几秒钟。清晰的“正在综合结果…”指示器可以防止用户认为代理已停滞。

调试未过滤的输出

在开发过程中,您可以临时设置 filterSubagentMessages: false,以查看主消息流中来自所有子代理的原始交错输出。这对于验证子代理令牌是否正确流动很有用,但不应在生产 UI 中使用。

用例

当您的代理工作流涉及以下情况时,深度代理子代理卡片是正确的选择:
  • 深度研究,协调器派遣研究人员调查问题的不同方面,然后综合他们的发现
  • 多专家分析,例如领域专家(法律、财务、技术)各自贡献他们的观点
  • 复杂任务分解,规划者将大型任务分解为子任务,并将每个子任务分配给专家工作者
  • 代码审查管道,不同的代理处理安全审查、样式检查、性能分析和文档审查

访问完整的子代理映射

除了按消息查找外,您还可以通过 stream.subagents 一次性访问所有子代理:
这对于构建全局进度指示器或仪表板非常有用,这些指示器或仪表板可以总结所有子代理活动,无论它们是由哪个协调器消息生成的。

最佳实践

  • 始终设置 filterSubagentMessages: true。未过滤的流会产生协调器和子代理令牌的不可读交错。
  • 显示任务描述toolCall.args.description 字段告诉用户每个子代理被要求做什么。始终突出显示此信息。
  • 使用可折叠卡片。在包含 5 个以上子代理的工作流中,自动折叠已完成的卡片,以便用户可以专注于活动工作。
  • 显示时间数据。显示每个子代理花费的时间有助于用户了解性能特征并识别瓶颈。
  • 设置适当的递归限制。具有嵌套子图的深度代理工作流需要比默认值 25 更高的限制。从 100 开始。
  • 按子代理处理错误。一个子代理失败不应导致整个 UI 崩溃。在该子代理的卡片中显示错误,同时其他子代理继续运行。