对于新应用,我们推荐事件流——这是 LangGraph v1.2 中引入的类型化投影 API。事件流为每个投影(消息、值、子图、输出)提供独立的迭代器,这样您就可以独立消费它们,而无需基于 stream_mode 块进行分支处理。
本页面介绍 LangGraph 的流模式 API。它通过 updates、values、messages、custom、checkpoints、tasks 和 debug 等流模式暴露图执行过程。当您需要直接访问图运行时事件或特定流模式输出时,请使用此 API。

开始使用

基本用法

LangGraph 图暴露了 stream 方法,以迭代器的形式生成流式输出。
使用 LangSmith 调试流事件、检查逐个 token 的 LLM 输出并监控延迟。按照追踪快速入门进行设置。

流模式

向 stream 方法传递以下一个或多个流模式(作为列表):

图状态

使用流模式 updates 和 values 在图执行时流式传输其状态。
  • updates 在图的每一步之后流式传输状态的 更新。
  • values 在图的每一步之后流式传输状态的 完整值。
使用此模式仅流式传输节点在每一步后返回的 状态更新。流式输出包含节点名称及其更新内容。

LLM tokens

使用 messages 流模式从图的任何部分(包括节点、工具、子图或任务)逐个 token 流式传输大型语言模型(LLM)的输出。 messages 模式的流式输出是一个元组 [message_chunk, metadata],其中:
  • message_chunk:来自 LLM 的 token 或消息段。
  • metadata:一个包含图节点和 LLM 调用详细信息的字典。
如果您的 LLM 作为 LangChain 集成不可用,您仍然可以使用 custom 模式流式传输其输出。详情请参见与任何 LLM 配合使用。

按 LLM 调用过滤

您可以将 tags 与 LLM 调用关联,以便按 LLM 调用过滤流式传输的 token。

从流中省略消息

使用 nostream 标签可完全排除 LLM 输出。标记为 nostream 的调用仍然会运行并产生输出;只是它们的 token 不会在 messages 模式中发出。 这在以下情况下很有用:
  • 您需要 LLM 输出用于内部处理(例如结构化输出),但不希望将其流式传输到客户端
  • 您通过不同的通道(例如自定义 UI 消息)流式传输相同的内容,并希望避免在 messages 流中出现重复输出

按节点过滤

要仅从特定节点流式传输 token,请使用 stream_mode="messages" 并通过流式元数据中的 langgraph_node 字段过滤输出:

自定义数据

要从 LangGraph 节点或工具内部发送自定义用户定义数据,请遵循以下步骤:
  1. 使用来自 LangGraphRunnableConfig 的 writer 参数发出自定义数据。
  2. 调用 .stream() 时设置 streamMode: "custom",以便在流中获取自定义数据。您可以组合多种模式(例如 ["updates", "custom"]),但其中至少一种必须是 "custom"。

工具进度

使用 tools 流模式接收工具执行的实时生命周期事件。这对于在工具运行时在 UI 中显示进度指示器、部分结果和错误状态非常有用。 tools 流模式发出四种事件类型:

定义流式传输进度的工具

要发出 on_tool_event 事件,请将您的工具函数定义为 异步生成器 (async function*)。每个 yield 会将中间数据发送到流中,而 return 的值则作为工具的最终结果。
现有的返回 Promise 的工具完全兼容。它们发出 on_tool_start 和 on_tool_end 事件,但不会发出 on_tool_event 事件。

在服务器端消费工具事件

将 streamMode: ["tools"](或与其他模式组合)传递给 graph.stream():

在 React 中使用 useStream 显示工具进度

来自 @langchain/langgraph-sdk/react 的 useStream hook 在您的流模式中包含 "tools" 时,会暴露一个 toolProgress 数组。每个条目都是一个 ToolProgress 对象,用于跟踪正在运行的工具的当前状态:
此示例展示了一个完整的代理,其异步生成器工具可将搜索进度流式传输到 React UI。代理定义:
带有进度卡片的 React 组件:

tools 与 custom 流模式

这两种流模式都可以展示工具进度,但它们服务于不同的目的:
  • tools——自动发出结构化的生命周期事件(on_tool_start、on_tool_event、on_tool_end、on_tool_error),除了在您的工具中使用 async function* 外无需更改代码。useStream hook 提供了开箱即用的响应式 toolProgress 数组。
  • custom——让您使用 config.writer() 完全控制发出什么数据以及何时发出。当您需要不映射到工具生命周期的自由格式数据,或者您想从节点(而不仅仅是工具)流式传输时,请使用此模式。

子图输出

要将子图的输出包含在流式输出中,您可以在父图的 .stream() 方法中设置 subgraphs: true。这将同时流式传输来自父图和任何子图的输出。 输出将以元组 [namespace, data] 的形式流式传输,其中 namespace 是一个包含调用子图的节点路径的元组,例如 ["parent_node:<task_id>", "child_node:<task_id>"]。
这适用于每个 streamMode,包括 "messages"。createAgent 返回一个 ReactAgent 包装器;将其作为节点添加时传递 agent.graph,这样父图会将其视为子图。使用 subgraphs: true 时,消息块是 [namespace, [token, metadata]],这样您就可以知道是哪个子图发出的。
::::::python
::::::js
:::注意,我们收到的不仅是节点更新,还有命名空间,它告诉我们正在从哪个图(或子图)进行流式传输。
:::python

检查点

使用 checkpoints 流式模式在图执行时接收检查点事件。每个检查点事件的格式与 get_state() 的输出相同。需要一个 检查点存储器。

任务

使用 tasks 流式模式在图执行时接收任务开始和结束事件。任务事件包含有关哪个节点正在运行、其结果以及任何错误的信息。需要一个 检查点存储器。
:::

调试

使用 debug 流式模式,在图的整个执行过程中流式传输尽可能多的信息。流式输出包括节点名称以及完整状态。 :::python
::: :::js
::: :::python
debug 模式将 checkpoints 和 tasks 事件与额外的元数据结合在一起。如果你只需要调试信息的一个子集,请直接使用 checkpoints 或 tasks。
:::

同时使用多种模式

:::python 你可以将列表作为 stream_mode 参数传递,以同时流式传输多种模式。 使用 version="v2" 时,每个数据块都是一个 StreamPart 字典。使用 chunk["type"] 来区分不同的模式:
::: :::js 你可以将数组作为 streamMode 参数传递,以同时流式传输多种模式。 流式输出将是 [mode, chunk] 的元组,其中 mode 是流模式的名称,chunk 是该模式流式传输的数据。
:::

高级用法

与任意 LLM 一起使用

:::python 你可以使用 stream_mode="custom" 从任何 LLM API 流式传输数据——即使该 API 没有实现 LangChain 聊天模型接口。 这使你可以集成原始的 LLM 客户端或提供自己流式接口的外部服务,使得 LangGraph 对于自定义设置非常灵活。
::: :::js 你可以使用 streamMode: "custom" 从任何 LLM API 流式传输数据——即使该 API 没有实现 LangChain 聊天模型接口。 这使你可以集成原始的 LLM 客户端或提供自己流式接口的外部服务,使得 LangGraph 对于自定义设置非常灵活。
:::
python
让我们使用一个包含工具调用的 @[AIMessage] 来调用该图:
:::
让我们使用一个包含工具调用的 @[AIMessage] 来调用该图:

禁用特定聊天模型的流式传输

如果你的应用程序混合使用了支持流式传输和不支持流式传输的模型,你可能需要明确地为不支持流式传输的模型禁用它。 在初始化模型时设置 streaming: false。
并非所有聊天模型集成都支持 streaming 参数。如果你的模型不支持它,请改用 disableStreaming: true。这个参数在所有聊天模型上通过基类都可用。