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

保姆级教程:Windows/Mac/Linux三平台OpenClaw部署,90%的坑我帮你踩完了

保姆级教程:Windows/Mac/Linux三平台OpenClaw部署,90%的坑我帮你踩完了

做OpenClaw企业落地的这大半年,我被问得最多的问题就是: 为什么我跟着网上的教程部署,要么Docker启动失败,要么面板访问不了? Windows部署WSL2报错怎么解决?Mac M芯片跑不起来是什么原因?Linux服务器部署完了外网访问不了? 毫不夸张地说,OpenClaw的部署本身极简,但90%的问题都不是OpenClaw本身的问题,而是环境配置、权限、端口、依赖兼容这些基础坑。我自己在三平台都反复部署过几十次,踩过的坑能凑成一本手册,小到中文路径导致的启动失败,大到企业内网环境的镜像拉取失败,几乎都遇见过。 这篇文章,我就把Windows/Mac/Linux三平台的部署流程,拆成保姆级的一步步操作,每一步都标注踩坑点,新手跟着走,99%能一次部署成功。同时把90%的人会遇到的问题,整理成「踩坑合集」,直接给原因+现成的解决方案,不用你再到处搜教程。 部署前必看:先搞懂这3点,少走90%的弯路 1. 硬件最低要求 很多人上来就部署,结果自己的电脑/服务器根本带不动,先看清楚硬件门槛: 配置类型最低配置推荐配置说明CPU2核4线程4核8线程纯指令执行用最低配

By Ne0inhk
打工人摸鱼新姿势!轻量斗地主服务器,内网穿透让同事远程联机不翻车

打工人摸鱼新姿势!轻量斗地主服务器,内网穿透让同事远程联机不翻车

Ratel 斗地主服务器是一款基于 Netty 和 Protobuf 开发的轻量级服务端软件,核心功能是搭建斗地主游戏服务,适配 Windows、Linux、macOS 多系统,适合职场上班族、学生群体这类想利用碎片时间休闲的人群,它的核心优点是资源占用极低,CPU 仅占 3%,内存消耗也少,还支持 AI 对手和隐藏进程,日常使用不会给设备带来负担。 使用这款软件时也有一些小细节需要注意,比如在办公场景下启动服务要注意隐藏会话,避免被察觉;和 AI 对战时不同难度模式的出牌节奏有差异,新手可以先从简单模式上手,而且软件启动后需要保持终端窗口运行,不小心关闭就会中断游戏。 不过这款软件仅靠局域网使用时,会遇到不少实际问题:比如上班族想和异地的同事联机,却因为不在同一局域网无法连接;学生在宿舍搭建好服务器,放假回家后就没法和室友继续玩,只能局限在小范围的网络环境里,大大降低了使用的灵活性。 而将 Ratel 斗地主服务器和 cpolar 内网穿透结合后,这些问题就能迎刃而解。cpolar 无需公网 IP 就能把本地的游戏服务映射到公网,

By Ne0inhk

Ubuntu新手必看:如何快速更换国内源(阿里/清华/中科大源对比)

Ubuntu 新手的第一道“加速”关:国内镜像源深度解析与实战指南 刚装好 Ubuntu,那种清爽的桌面和开箱即用的感觉确实不错。但当你兴冲冲地打开终端,准备用 apt install 装点东西时,进度条那慢如蜗牛的爬行速度,是不是瞬间浇灭了一半的热情?别急着怀疑自己的网络,这几乎是每个国内 Ubuntu 用户都会遇到的“新手墙”。问题的核心,往往不在于你的宽带,而在于系统默认连接的软件仓库服务器远在海外,网络延迟和带宽限制成了最大的瓶颈。 解决这个问题的方法,就是“换源”——将系统的软件源地址,更换为位于国内的镜像服务器。这听起来像是个简单的操作,但背后其实有不少门道:国内有哪些可靠的镜像站?阿里云、清华大学、中国科学技术大学(USTC)的源有什么区别?为什么别人的源换上去飞快,你的却报了一堆错?今天,我们就来彻底拆解这个问题。这不仅仅是复制粘贴几行命令,而是帮你理解原理、掌握选择、并能在遇到问题时自己动手排查。无论你是刚接触 Linux 的开发新手,还是希望优化工作流效率的资深用户,一个配置得当的软件源,

By Ne0inhk
时序数据库选型指南:在大数据浪潮中把握未来,为何Apache IoTDB值得关注?

时序数据库选型指南:在大数据浪潮中把握未来,为何Apache IoTDB值得关注?

文章目录 * 1 -> 引言 * 2 -> 时序数据的挑战与选型的重要性 * 3 -> 核心选型维度:超越性能参数的综合考量 * 4 -> 深入聚焦:Apache IoTDB的差异化优势 * 5 -> 选型建议与总结 1 -> 引言 在当今这个万物互联、数据驱动的时代,从工业传感器到智能电网,从车联网到金融交易,每一秒都在产生海量带有时间戳的数据——时序数据。这类数据不仅是企业运营的“脉搏”,更是驱动智能决策、优化效率、预测未来的核心燃料。面对汹涌而至的时序数据洪流,如何选择一款合适的时序数据库(Time-Series Database, TSDB),已成为大数据架构师、物联网(IoT)平台开发者和数据分析师面临的关键决策。本文将站在大数据技术演进和国产基础软件发展的视角,为您梳理时序数据库的选型要点,

By Ne0inhk