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

工作原理

当你选择启用 TodoListMiddleware 时,深度代理可以暴露一个 todos 状态通道。该中间件添加了 write_todos 工具,并在代理执行其计划时持久化任务进度。随着代理的执行,它将每个待办项的状态从 "pending"(待处理)更新为 "in_progress"(进行中),再到 "completed"(已完成)。useStream 钩子通过 stream.values.todos 暴露此状态,你的用户界面将对其进行响应式渲染。
任务规划是可选启用的。如果没有 TodoListMiddleware,stream.values.todos 将不存在。请参阅 任务规划。
其流程如下:
  1. 用户提交请求
  2. 代理创建计划并在其状态中填充 todos
  3. 代理开始执行每个待办项,状态经历 pending(待处理)→ in_progress(进行中)→ completed(已完成)的转换
  4. 随着代理进度推进,stream.values.todos 实时更新
  5. 你的用户界面使用当前状态重新渲染待办列表

设置 useStream

在代理上启用 TodoListMiddleware。
然后将 useStream 指向该代理,并从 stream.values 中读取 todos。
The code examples use useStream<typeof myAgent> for type-safe stream state. See Type inference for Python or JavaScript backends.

构建 TodoList 组件

待办列表为每个项目渲染一个状态图标、颜色编码以及反映当前状态的视觉样式:

进度条

一个可视化的进度条让用户一眼就能了解整体完成情况:

单个待办项

每个待办项都有一个状态图标、颜色编码的文本,并且已完成的任务带有删除线样式:
in_progress(进行中)的图标使用 animate-pulse 动画来吸引对当前活动任务的注意。

计算进度

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

与聊天消息结合

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

用例

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

处理空状态和加载状态

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

最佳实践

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