This feature requires the LangGraph Agent Server. Run your agent locally with
langgraph dev or deploy it to LangSmith to use this pattern.为什么使用消息队列?
在典型聊天界面中,用户必须等待代理完成响应后才能发送下一条消息。这会在几种场景中造成阻力:- 批量问题:用户想一次提出五个相关问题,而不是等待每个答案
- 后续追问链:在代理仍在工作时提交澄清或额外上下文
- 自动化测试序列:以编程方式发送一系列 prompt 来验证代理行为
- 数据录入工作流:逐个输入结构化数据进行处理
工作原理
当你希望某次提交排在当前正在运行的请求之后等待时,传入multitaskStrategy: "enqueue"。代理处理期间,排队提交会加入活动线程的队列。当前运行完成后,下一条排队消息会自动分发。
使用对应框架的队列 helper 读取队列状态:
| 属性 | 类型 | 描述 |
|---|---|---|
queue.entries | SubmissionQueueEntry[] | 所有待处理队列条目的数组 |
queue.size | number | 当前队列中的条目数 |
queue.cancel(id) | (id: string) => Promise<void> | 按 ID 取消指定队列条目 |
queue.clear() | () => Promise<void> | 取消所有队列条目 |
| 字段 | 类型 | 描述 |
|---|---|---|
id | string | 该队列条目的唯一标识符 |
values | object | 已提交的输入值(包括消息) |
options | object | 随提交传入的任何额外选项 |
createdAt | string | 创建该条目的 ISO 时间戳 |
设置 useStream
将 useStream 连接到你的代理,然后搭配对应框架的提交队列 helper。运行正在进行时调用 stream.submit() 发送消息;对需要排在活动请求之后等待的提交传入 multitaskStrategy: "enqueue"。读取 queue.entries 和 queue.size 渲染待处理工作,并使用 queue.cancel() 或 queue.clear() 在条目开始处理前移除它们。
The code examples use
useStream<typeof myAgent> for type-safe stream state. See Type inference for Python or JavaScript backends.显示队列
构建一个QueueList 组件,用取消按钮显示每条待处理消息。这让用户看到正在等待的内容,并能移除不再需要的条目。
取消排队消息
你有两种级别的取消:取消单个条目
按 ID 从队列中移除指定消息。代理会跳过它并移动到下一个条目。清空整个队列
一次移除所有待处理消息。当用户切换上下文或想重新开始时,这很有用。取消队列条目只影响尚未开始处理的消息。如果代理已经在处理某条消息,从队列中取消它不会产生效果。使用
stream.stop() 中断当前运行。使用 onCreated 串联后续提交
创建新运行时会触发 onCreated 回调,让你可以通过 hook 以编程方式提交后续消息。这适合构建多步工作流,其中下一个问题依赖前一个提交已被接受。
启动新线程
当用户想开始新对话时,更新传入流的响应式threadId。传入 null 会清除当前线程绑定;下一次提交会创建新线程。
最佳实践
- 限制队列大小:虽然客户端没有硬性队列大小限制,但很大的队列可能降低用户体验。可以考虑在队列超过合理阈值(例如 10 个条目)时显示警告。
- 显示队列位置:为每个排队条目编号,让用户知道处理顺序。
- 保留输入焦点:提交后保持输入框聚焦,让用户可以立即输入下一条消息。
- 添加过渡动画:条目开始处理时,将它们从队列面板平滑移动到消息列表中。
- 优雅处理错误:如果排队消息失败,显示错误且不阻塞后续队列条目。
- 对快速提交做防抖:对于自动化或编程式提交,在消息之间添加小延迟,避免压垮服务器。
Connect these docs to Claude, VSCode, and more via MCP for real-time answers.

