This feature requires the LangGraph Agent Server. Run your agent locally with
langgraph dev or deploy it to LangSmith to use this pattern.为什么需要加入和重新加入?
传统的流式 API 将客户端和服务器紧密耦合:如果客户端断开连接,流就丢失了。加入和重新加入打破了这种耦合,支持多种重要场景:- 网络中断:在基站或 Wi-Fi 网络之间移动的移动用户可以无缝恢复
- 页面导航:用户离开聊天页面后返回,不会丢失进度
- 移动端后台运行:被操作系统挂起的应用在前台恢复时可以重新加入流
- 长时间运行的任务:智能体执行多分钟操作(研究、代码生成、数据分析)时用户无需保持页面打开
- 多设备交接:在手机上开始对话,在桌面上重新加入
核心概念
加入/重新加入模式涉及三个关键机制:stream.stop() 与取消运行有本质区别。停止仅断开客户端。智能体继续在服务器端处理。要真正取消智能体的执行,你需要使用中断或取消机制。设置 useStream
关键的设置步骤是从 onCreated 回调中捕获 run_id,以便稍后重新加入。
定义一个与你的智能体状态 schema 匹配的 TypeScript 接口,并将其作为类型参数传递给 useStream,以获得类型安全的状态值访问。在以下示例中,将 typeof myAgent 替换为你的接口名称:
使用可恢复选项提交
提交消息时,传递onDisconnect: "continue" 和 streamResumable: true 以启用加入/重新加入流程:
断开流连接
调用stream.stop() 断开客户端。智能体继续在服务器端处理。
stop() 后:
stream.isLoading变为false- 消息列表保留到断开点为止收到的所有消息
- 智能体继续在服务器上运行
- 在重新加入之前不会收到新消息
重新加入流
使用保存的运行 ID 调用stream.joinStream(runId) 重新连接:
stream.isLoading再次变为true- 断开期间生成的所有消息都会被传递
- 新的流式消息实时恢复
- 如果智能体已经完成,你会立即收到最终状态
构建连接状态指示器
视觉指示器帮助用户了解他们是否正在从智能体接收实时更新。断开和重新加入控件
提供明确的按钮用于断开和重新加入,让用户拥有完全控制权:持久化运行 ID
对于跨会话重新加入(例如用户关闭浏览器后返回),将运行 ID 持久化到存储中:当运行完成时应清理持久化的运行 ID。监听流完成并移除已存储的 ID,以避免尝试重新加入已完成的运行。
错误处理
如果运行已过期、被删除或服务器已重启,重新加入可能会失败。优雅地处理这些情况:完整示例
最佳实践
- 始终保存运行 ID:没有它就无法重新加入。同时使用组件状态和持久存储以增强鲁棒性。
- 显示清晰的连接状态:用户应始终知道他们是在接收实时更新还是在查看快照。
- 在可见性变化时自动重新加入:使用 Page Visibility API 在用户返回标签页时自动重新加入。
- 设置合理的超时:如果重新加入尝试耗时太长,回退到获取线程历史。
- 清理已完成的运行:智能体完成时移除持久化的运行 ID,以避免过期的重新加入尝试。
将这些文档连接到 Claude、VSCode 等工具,通过 MCP 获取实时答案。

