Skip to main content
消息队列允许用户快速连续发送多条消息,而无需等待代理完成当前消息的处理。每条消息在服务器端入队并按顺序处理,使您能够完全查看和控制待处理队列。
此功能需要 LangGraph Agent Server。请在本地使用 langgraph dev 运行您的代理,或将其部署到 LangSmith 以使用此模式。

为什么需要消息队列?

在典型的聊天界面中,用户必须等待代理完成响应后才能发送另一条消息。这在以下几种场景中会造成不便:
  • 批量提问:用户希望一次性提出五个相关问题,而不是等待每个答案
  • 后续链:在代理仍在工作时提交澄清或额外上下文
  • 自动化测试序列:以编程方式发送一系列提示以验证代理行为
  • 数据录入工作流:连续输入结构化输入以进行处理
消息队列通过立即接受所有提交并按顺序处理来解决这个问题。

工作原理

在底层,LangGraph 使用 multitaskStrategy: "enqueue" 来管理并发提交。当代理正在处理消息时提交新消息,它会被添加到服务器端队列中。当前运行完成后,下一个排队的消息会自动被拾取。 useStream 钩子暴露了一个 queue 属性,提供对挂起消息的实时可见性: 每个 QueueEntry 对象包含:

设置 useStream

定义一个与代理状态模式匹配的 TypeScript 接口,并将其作为类型参数传递给 useStream,以实现对状态值的类型安全访问。在下面的示例中,请将 typeof myAgent 替换为您的接口名称:

显示队列

构建一个 QueueList 组件,显示每条待处理消息并带有取消按钮。这使用户能够查看等待中的内容,并能够移除不再需要的项目。
显示每条排队消息的前几个字符作为预览,以便用户无需阅读完整消息即可快速识别要取消的项目。

取消排队消息

您有两个级别的取消操作:

取消单个条目

通过 ID 从队列中移除特定消息。代理将跳过它并处理下一个条目。

清除整个队列

一次性移除所有待处理消息。当用户更改上下文或想要重新开始时很有用。
取消队列条目仅影响尚未开始处理的消息。如果代理已经在处理某条消息,从队列中取消它不会产生任何效果。请使用 stream.stop() 来中断当前运行。

使用 onCreated 链接后续提交

onCreated 回调在创建新运行时触发,为您提供一个钩子以编程方式提交后续消息。这对于构建多步骤工作流很有用,其中下一个问题取决于前一个提交已被接受。
此模式自然地填充队列。第一条消息立即开始处理,后续消息则在其后排队。

开始新线程

当用户想要开始新的对话时,使用 switchThread(null) 创建一个新线程。这会清除当前的消息历史记录和队列。

完整示例

将所有内容整合在一起,这是一个带有队列管理的完整聊天组件:

最佳实践

  • 限制队列大小:虽然客户端对队列大小没有硬性限制,但请注意过大的队列会降低用户体验。考虑在队列超过合理阈值(例如 10 个项目)时显示警告。
  • 显示队列位置:为每个排队项目编号,以便用户了解处理顺序。
  • 保持输入焦点:提交后保持输入框聚焦,以便用户可以立即输入下一条消息。
  • 动画过渡:当项目开始处理时,平滑地将它们从队列面板移动到消息列表中。
  • 优雅地处理错误:如果排队消息失败,请显示错误而不阻塞后续队列条目。
  • 对快速提交进行去抖动:对于自动化或编程提交,在消息之间添加一个小延迟,以避免使服务器不堪重负。