Skip to main content
并非每次代理交互都是聊天。有时代理正在执行一个多步骤计划,而展示进度的最佳方式是一个实时更新的待办事项列表。深度代理待办事项列表模式直接从代理的状态中读取一个 todos 数组,并在代理执行计划时,根据每个项目的当前状态进行渲染。这是一个基于你用于聊天的同一个 useStream 钩子构建的进度仪表板。它表明代理状态可以驱动任何用户界面,而不仅仅是消息气泡。

工作原理

在 LangGraph 代理中,状态不仅限于消息。你可以定义自定义状态键来保存任意数据。在这个例子中,是一个 todos 数组。当代理执行其计划时,它会将每个待办事项的状态从 "pending" 更新为 "in_progress",再到 "completed"useStream 钩子通过 stream.values 暴露这些自定义状态值,你的用户界面会响应式地渲染它们。 流程如下:
  1. 用户提交一个请求
  2. 代理创建一个计划并在其状态中填充 todos
  3. 代理开始执行每个待办事项,状态依次经历 pendingin_progresscompleted
  4. 随着代理的进展,stream.values.todos 实时更新
  5. 你的用户界面使用当前状态重新渲染待办事项列表

设置 useStream

无需特殊配置。将 useStream 指向你的代理,并从 stream.values 中读取 todos 导入你的代理,并将 typeof myAgent 作为类型参数传递给 useStream,以实现对状态值的类型安全访问:

Todo 接口

数组中的每个待办事项都有一个简单的结构:
代理在创建计划时填充此数组,然后在执行每个步骤时更新各个项目。

构建 TodoList 组件

待办事项列表使用状态图标、颜色编码和反映当前状态的视觉样式来渲染每个项目:

进度条

一个可视化的进度条让用户一目了然地了解整体完成情况:

单个待办事项

每个项目都有一个状态图标、颜色编码的文本,以及已完成任务的删除线样式:
in_progress 图标使用 animate-pulse 来吸引对当前活动任务的注意。

计算进度

直接从待办事项数组派生进度指标:
当代理修改其状态时,这些值会响应式更新,使进度条和计数器保持同步。

与聊天消息结合

待办事项列表与常规聊天界面并行工作。一个实用的布局是将待办事项列表显示为持久的侧边栏或顶部面板,聊天消息显示在下方:
仅在 todos.length > 0 时显示待办事项列表。在代理创建其计划之前,没有内容可显示。显示一个空组件会浪费空间。

超越待办事项的自定义状态

这个模式展示了一个强大的原则:stream.values 可以暴露你的代理定义的任何自定义状态,而不仅仅是消息。todos 数组只是一个例子。你可以使用相同的方法来处理:
  • 进度指标stream.values.progress 包含数字完成数据
  • 生成的工件stream.values.document 包含代理正在构建的结构化文档
  • 决策日志stream.values.decisions 跟踪代理做出的每个选择
  • 资源列表stream.values.sources 包含代理找到的链接和参考文献
自定义状态键在你的 LangGraph 图的状态模式中定义。useStream 钩子会自动将它们包含在 stream.values 中,无需任何额外的客户端配置。

动画过渡

待办事项状态转换是实时发生的,平滑的动画使这些变化感觉精致而非突兀:
transition-all duration-300 类确保颜色变化、删除线和不透明度变化都能平滑地动画化。

用例

待办事项列表模式适用于代理执行结构化计划的任何场景:
  • 项目规划:代理将项目分解为任务并按顺序处理
  • 研究工作流:每个研究问题成为一个待办事项,代理进行调查并完成
  • 数据处理:摄取、验证、转换和导出等步骤各自有自己的待办事项
  • 入门流程:代理逐步完成设置步骤,在配置服务时勾选每个步骤
  • 报告生成:报告的各个部分成为待办事项:收集数据、分析趋势、撰写摘要、格式化输出

处理空状态和加载状态

处理代理创建计划之前的初始状态:

最佳实践

  • 突出显示待办事项列表。它是基于计划的代理的主要进度指示器。不要将其埋在折叠区域下方。
  • 为状态转换添加动画。平滑的过渡使代理感觉更响应迅速。对背景颜色、文本装饰和不透明度使用 CSS 过渡。
  • 仅高亮一个 in_progress 项目。代理通常一次处理一个任务。如果多个项目显示为 in_progress,用户界面会变得杂乱。考虑仅对第一个项目使用脉冲效果。
  • 折叠或淡化已完成的项目。随着列表增长,已完成的项目变得不那么相关。减少它们的视觉权重,以便用户专注于仍在进行的任务。
  • 显示进度百分比。像“67% 完成”这样的单个数字即使从远处也能立即理解。
  • 保持待办事项列表同步。因为 stream.values 是响应式更新的,所以待办事项列表会自动保持最新。不要添加手动轮询或刷新逻辑。