LangChain 前端流式输出(Frontend Streaming)

LangChain 与 LangGraph 提供了强大的前端流式支持,主要通过 React Hook useStream 实现。该 Hook 与 LangGraph 的流式功能无缝集成,处理流式传输、状态管理以及分支逻辑的复杂性,帮助开发者专注于构建优秀的生成式 UI 体验。

useStream 的核心特性包括:

  • 消息流式传输:处理消息片段流,形成完整消息。
  • 自动状态管理:管理消息、中断、加载状态和错误。
  • 对话分支:从聊天历史中的任意点创建备用对话路径。
  • UI 无关设计:支持自定义组件和样式。

本文档基于 LangChain 官方文档(Frontend Streaming),系统介绍 useStream Hook 的安装、使用方法及高级特性。

安装

在 React 应用中使用 useStream Hook 前,需要安装 LangGraph SDK:

pip install langgraph-sdk # 或通过 npm/yarn 安装对应的 JS 包(文档中未明确指定,但通常为 @langchain/langgraph-sdk)

useStream 可连接本地运行的 LangGraph 图,或通过 LangSmith 部署的生产环境。

基本用法

import{ useStream }from"@langchain/langgraph-sdk/react";functionChat(){const stream =useStream({ assistantId:"agent",// 本地开发 apiUrl:"http://localhost:2024",// 生产部署(LangSmith 托管)// apiUrl: "https://your-deployment.us.langgraph.app"});consthandleSubmit=(message:string)=>{ stream.submit({ messages:[{ content: message, type:"human"}]});};return(<div>{stream.messages.map((message, idx)=>(<div key={message.id ?? idx}>{message.type}:{message.content}</div>))}{stream.isLoading &&<div>Loading...</div>}{stream.error &&<div>Error:{stream.error.message}</div>}</div>);}

建议将代理部署到 LangSmith 以获得生产级托管、观测性、认证和扩展能力。

useStream 参数详解

参数名类型默认值/必填说明
assistantIdstring必填连接的代理 ID。在 LangSmith 部署中需与仪表板一致。
apiUrlstringlocalhost:2024LangGraph 服务器 URL。
apiKeystring-LangSmith 部署时的认证密钥。
threadIdstring-连接现有线程,用于恢复对话。
onThreadId(id: string) => void-新线程创建时的回调,用于持久化线程 ID。
reconnectOnMountboolean(() => Storage)-
onCreated(run: Run) => void-新运行创建时的回调。
onError(error: Error) => void-错误回调。
onFinish(state: StateType, run?: Run) => void-流完成回调。
onCustomEvent(data: unknown, context: { mutate }) => void-处理自定义事件。
messagesKeystring“messages”状态中消息数组的键名。
throttlebooleantrue是否批量更新状态以提升渲染性能。
initialValuesStateTypenull-

useStream 返回值

属性名类型说明
messagesMessage[]当前线程的所有消息。
valuesStateType当前图状态值(类型推断)。
isLoadingboolean是否正在流式传输。
errorErrornull
interruptInterruptundefined
toolCallsToolCallWithResult[]所有工具调用及其结果。
submit函数提交新输入,支持分支、乐观更新等选项。
stop函数立即停止当前流。
joinStream函数通过 run ID 恢复现有流。
setBranch函数切换到对话历史的不同分支。

线程管理

通过 threadIdonThreadId 回调管理对话线程,便于持久化和恢复。

const[threadId, setThreadId]=useState<string|null>(null);const stream =useStream({// ... threadId, onThreadId: setThreadId,});

推荐将 threadId 存储到 URL 参数或 localStorage。

页面刷新后恢复

设置 reconnectOnMount: true 可自动恢复运行流:

const stream =useStream({// ... reconnectOnMount:true,// 默认使用 sessionStorage});

支持自定义存储,或手动通过 onCreatedjoinStream 控制恢复。

乐观更新(Optimistic Updates)

在网络请求前乐观更新客户端状态,提供即时反馈。

stream.submit({ messages:[newMessage]},{optimisticValues:(prev)=>({...prev, messages:[...(prev.messages ??[]), newMessage]})});

乐观线程创建

预先生成线程 ID,实现即时导航。

const optimisticThreadId = crypto.randomUUID(); stream.submit({ messages:[...]},{ threadId: optimisticThreadId });

缓存线程显示

使用 initialValues 立即显示缓存数据。

分支(Branching)

通过编辑历史消息或重新生成 AI 响应创建分支。使用 getMessagesMetadata() 获取检查点信息。

类型安全流式(Type-safe Streaming)

支持与 createAgentStateGraph 和 Annotation 类型结合,实现类型推断。

高级特性

  • 渲染工具调用:显示工具调用状态。
  • 自定义流式事件:通过 writer 发送自定义数据。
  • 事件处理:多种回调处理更新、元数据等。
  • 多代理流式:支持多代理协作。
  • 人与循环(Human-in-the-Loop):处理中断和用户输入。
  • 自定义状态类型与传输:灵活扩展。

总结

useStream Hook 极大简化了 LangGraph 在前端的流式集成,提供完整的消息管理、线程持久化、分支持和乐观更新等功能。开发者可结合 LangSmith 部署快速构建生产级生成式聊天界面。建议参考官方示例(如 session-persistence)进行实践。

参考文档:https://docs.langchain.com/oss/python/langchain/streaming/frontend

Read more

【Nginx】——从0到1,带你玩转Nginx,掌握其中的技巧以及配置

【Nginx】——从0到1,带你玩转Nginx,掌握其中的技巧以及配置

🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大三学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL,Java基础,Rust】 🎈热门专栏:🎊【Python,Javaweb,Springboot】  感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持!❤️ 目录 🎈概念 🎈下载 🎈上传安装 ✨开始安装 ✨ 目录结构 🎈 常用命令  ✨ 开启nginx  ✨ 看一下文件日志  ✨ 重新加载配置文件 ✨ 配置文件  🎈 配置文件结构 🎈具体应用 ✨ 部署静态资源 ✨ 反向代理 ✨ 负载均衡 🎈概念         Nginx(engine x)由俄罗斯的程序设计师Igor Sysoev所开发,官方测试显示Nginx能够支撑高达5万并发连接数。Nginx不仅可以作为HTTP服务器使用,处理静态页面或支持FastCGI、SCGI、uWSGI等协议的动态语言,还能充当反向代理服务器,实现负载均衡,以及提供IMAP/

By Ne0inhk
【Claude Code】无需sudo!无魔法!Linux 普通用户也能装 Claude Code 全流程

【Claude Code】无需sudo!无魔法!Linux 普通用户也能装 Claude Code 全流程

🐧 无需 sudo!无魔法!Linux 普通用户也能装 Claude Code 全流程 🚀 环境:Ubuntu / CentOS / Arch 等任意发行版 权限:❌ 不需要 root,❌ 不需要 sudo,✅ 只要你能登录就行! 文章目录 * 🐧 无需 sudo!无魔法!Linux 普通用户也能装 Claude Code 全流程 🚀 * 🌈 最终效果 * 📦 1. 准备用户级目录 * 🔍 2. 一键获取“最新 20.x LTS”真实下载地址 * ⬇️ 3. 下载 + 解压(一条命令搞定) * 📁 4. 把 Node 塞进自己的 PATH * 🪣 5. 给 npm

By Ne0inhk
Linux 文件描述符与重定向实战:从原理到 minishell 实现

Linux 文件描述符与重定向实战:从原理到 minishell 实现

🔥草莓熊Lotso:个人主页 ❄️个人专栏: 《C++知识分享》《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受! 🎬 博主简介: 文章目录 * 前言: * 一. 文件描述符(fd):Linux IO 的 “身份证” * 1.1 什么是文件描述符? * 1.2 默认文件描述符:0、1、2 * 1.3 文件描述符的分配规则 * 1.4 系统调用与库函数的关系 * 二. 重定向原理:修改 fd 对应的文件对象 * 2.1 重定向的本质 * 2.2 手动实现重定向:close+open * 2.3

By Ne0inhk

飞书 × OpenClaw 接入指南:不用服务器,用长连接把机器人跑起来

你想在飞书里用上一个能稳定对话、能发图/收文件、还能按规则在群里工作的 AI 机器人,最怕两件事:步骤多、出错后不知道查哪里。这个项目存在的意义,就是把“飞书接 OpenClaw”这件事,整理成一套对非技术也友好的配置入口,并把官方文档没覆盖到的坑集中写成排查清单。 先说清楚它的角色:OpenClaw 现在已经内置官方飞书插件 @openclaw/feishu,功能更完整、维护也更及时。这是好事,说明飞书 + AI 的接入已经走通。这个仓库并不是要替代官方插件,而是继续为大家提供: * 新用户:从零开始的新手教程(15–20 分钟) * 老用户:从旧版(独立桥接或旧 npm 插件)迁移到官方插件的保姆级路线 * 常见问题答疑 & 排查清单(最常见的坑优先) * 进阶场景:独立桥接模式依然可用(需要隔离/定制时再用) 另外,仓库也推荐了一个新项目

By Ne0inhk