Skip to main content
并非每次智能体交互都是聊天。有时智能体正在执行多步骤计划,展示进度的最佳方式是一个实时更新的待办列表。深度智能体待办列表模式直接从智能体状态读取 todos 数组,在智能体执行计划时渲染每个项目及其当前状态。它是构建在你用于聊天的同一个 useStream hook 之上的进度面板。它表明智能体状态可以驱动任何 UI,而不仅仅是消息气泡。

工作原理

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

设置 useStream

无需特殊配置。将 useStream 指向你的智能体并从 stream.values 中读取 todos 定义一个与你的智能体状态 schema 匹配的 TypeScript 接口,并将其作为类型参数传递给 useStream,以获得对状态值(包括像 todos 这样的自定义状态键)的类型安全访问。在下面的示例中,将 typeof myAgent 替换为你的接口名称:

Todo 接口

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

构建 TodoList 组件

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

进度条

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

单个待办项

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

计算进度

直接从 todos 数组派生进度指标:
这些值随着智能体修改其状态而响应式更新,保持进度条和计数器同步。

与聊天消息结合

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

待办项之外的自定义状态

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

过渡动画

待办项状态过渡是实时发生的,平滑的动画使这些变化看起来更加精致而不是突兀:
transition-all duration-300 类确保颜色变化、删除线和透明度变化都平滑地动画过渡。

使用场景

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

处理空状态和加载状态

处理智能体尚未创建计划之前的初始状态:

最佳实践

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