This feature requires the LangGraph Agent Server. Run your agent locally with
langgraph dev or deploy it to LangSmith to use this pattern.为什么需要消息队列?
在典型的聊天界面中,用户必须等待智能体回复完毕后才能发送下一条消息。这在多个场景中造成了不便:- 批量提问:用户想一次性提出五个相关问题,而不是逐个等待回答
- 追问链:在智能体仍在工作时提交澄清或额外上下文
- 自动化测试序列:以编程方式发送一系列提示词来验证智能体行为
- 数据输入工作流:逐个提供结构化输入进行处理
工作原理
底层,LangGraph 使用multitaskStrategy: "enqueue" 来管理并发提交。当智能体正在处理时提交消息,新消息会被添加到服务器端队列。当前运行完成后,下一条排队的消息会自动被处理。
useStream hook 暴露了一个 queue 属性,提供对待处理消息的实时可见性:
每个
QueueEntry 对象包含:
设置 useStream
定义一个与你的智能体状态 schema 匹配的 TypeScript 接口,并将其作为类型参数传递给 useStream,以获得类型安全的状态值访问。在以下示例中,将 typeof myAgent 替换为你的接口名称:
显示队列
构建一个QueueList 组件,显示每条待处理消息和一个取消按钮。这让用户可以看到什么在等待,并能移除不再需要的项目。
取消排队消息
你有两个级别的取消操作:取消单个条目
按 ID 从队列中移除特定消息。智能体会跳过它并处理下一个条目。清除整个队列
一次性移除所有待处理消息。适用于用户更改上下文或想重新开始的场景。取消队列条目只影响尚未开始处理的消息。如果智能体已经在处理某条消息,从队列中取消它不会产生效果。使用
stream.stop() 中断当前运行。使用 onCreated 链接追问提交
onCreated 回调在新运行创建时触发,为你提供了以编程方式提交追问消息的钩子。这对于构建多步工作流很有用,其中下一个问题取决于前一个提交被接受。
开始新线程
当用户想要开始全新的对话时,使用switchThread(null) 创建新线程。这会清除当前的消息历史和队列。
完整示例
将所有内容整合在一起,这是一个带有队列管理的完整聊天组件:最佳实践
- 限制队列大小:虽然客户端没有硬性的队列大小限制,但请注意非常大的队列会降低用户体验。考虑在队列超过合理阈值(如 10 个项目)时显示警告。
- 显示队列位置:为每个排队项目编号,让用户知道处理顺序。
- 保持输入焦点:提交后保持输入字段聚焦,使用户可以立即输入下一条消息。
- 添加过渡动画:在项目从队列面板移入消息列表时进行平滑动画处理。
- 优雅处理错误:如果排队消息处理失败,显示错误而不阻塞后续队列条目。
- 对快速提交进行防抖:对于自动化或编程提交,在消息之间添加小延迟以避免服务器过载。
将这些文档连接到 Claude、VSCode 等工具,通过 MCP 获取实时答案。

