此功能需要 LangGraph Agent Server。使用
langgraph dev 在本地运行您的代理,或 将其部署到 LangSmith 以使用此模式。为什么需要加入与重新加入?
传统的流式 API 将客户端和服务器紧密耦合:如果客户端断开连接,流就会丢失。加入与重新加入打破了这种耦合,实现了几个重要的模式:- 网络中断:在蜂窝基站或 Wi-Fi 网络之间移动的移动用户可以无缝恢复
- 页面导航:用户离开聊天页面并在稍后返回,不会丢失进度
- 移动端后台运行:被操作系统挂起的应用可以在回到前台时重新加入流
- 长时间运行的任务:智能体执行多分钟的操作(研究、代码生成、数据分析),用户无需保持页面打开
- 多设备切换:在手机上开始对话,在桌面上重新加入
核心概念
加入/重新加入模式涉及三个关键机制:stream.stop() 与取消运行有根本区别。停止仅断开客户端的连接。智能体在服务器端继续处理。要实际取消智能体的执行,应使用中断或取消机制。设置 useStream
关键设置步骤是从 onCreated 回调中捕获 run_id,以便稍后重新加入。
定义一个与你的智能体状态模式匹配的 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:没有它,重新加入是不可能的。同时使用组件状态和持久化存储以提高弹性。
- 显示清晰的连接状态:用户应始终知道他们是在接收实时更新还是在查看快照。
- 在可见性变化时自动重新加入:使用页面可见性 API 在用户返回标签页时自动重新加入。
- 设置合理的超时:如果重新加入尝试耗时过长,则回退到获取线程历史记录。
- 清理已完成的运行:当智能体完成时,移除持久化的运行 ID,以避免尝试重新加入过期的运行。
Connect these docs to Claude, VSCode, and more via MCP for real-time answers.

