Skip to main content
对于新应用,我们推荐 事件流——在 LangGraph v1.2 中引入的 typed-projection API。事件流为每个投影(消息、值、子图、输出)提供单独的迭代器,因此您可以独立消费它们,而不是在 stream_mode 块上分支。
本页面涵盖了 LangGraph 的流式 API。它通过流式模式(如 updates、values、messages、custom、checkpoints、tasks 和 debug)公开图执行。当您需要直接访问图运行时事件或特定流式模式输出时,请使用它。

入门

基本用法

:::python LangGraph 图表公开了 @[stream][Pregel.stream](同步)和 @[astream][Pregel.astream](异步)方法来生成流式输出作为迭代器。将一个或多个 流式模式 传递给它们,以控制您接收的数据。
Output
Output
::: :::js LangGraph 图表公开了 @[stream][Pregel.stream] 方法来生成流式输出作为迭代器。
:::
使用 LangSmith 调试流式事件、检查 Token-by-Token LLM 输出并监控延迟。按照 跟踪快速入门 设置。
:::python

流式输出格式 (v2)

需要 LangGraph 1.1 或更高版本。本页面上的所有示例都使用 version="v2"。
将 version="v2" 传递给 stream() 或 astream() 以获取统一输出格式。每个块都是一个 StreamPart 字典,具有一致的形状——无论流式模式、模式数量或子图设置如何:
每个流式模式都有一个对应的 TypedDict,包含 @[ValuesStreamPart]、@[UpdatesStreamPart]、@[MessagesStreamPart]、@[CustomStreamPart]、@[CheckpointStreamPart]、@[TasksStreamPart]、@[DebugStreamPart]。您可以从 langgraph.types 导入这些类型。联合类型 @[StreamPart] 在 part["type"] 上是分离的联合,能够在编辑器和类型检查器中实现完整的类型缩小。 在 v1(默认)中,输出格式根据您的流式选项变化(单模式返回原始数据,多模式返回 (mode, data) 元组,子图返回 (namespace, data) 元组)。在 v2 中,格式始终相同:
v2 格式还启用了类型缩小,这意味着您可以按 chunk["type"] 过滤块并获取正确的有效负载类型。每个分支将 part["data"] 缩小为该模式的特定类型:
:::

流式模式

:::python 将以下一个或多个流式模式作为列表传递给 @[stream][CompiledStateGraph.stream] 或 @[astream][CompiledStateGraph.astream] 方法: :::js 将以下一个或多个流式模式作为列表传递给 @[stream][CompiledStateGraph.stream] 方法:

图状态

使用流式模式 updates 和 values 来流式传输图在执行过程中的状态。
  • updates 流式传输图每一步的 状态更新。
  • values 流式传输图每一步的 完整状态值。
:::python
::: :::js
:::
使用此方法来流式传输节点在每一步后返回的 状态更新。流式输出的内容包括节点名称以及更新。:::python
Output
::::::js
:::

LLM token

使用 messages 流式模式从您的图谱的任何部分(包括节点、工具、子图谱或任务)逐个 Token 地流式传输大型语言模型(LLM)输出。 :::python 从 messages 模式 流式传输的输出是一个元组 (message_chunk, metadata),其中:
  • message_chunk:来自 LLM 的 Token 或消息片段。
  • metadata:包含有关图谱节点和 LLM 调用详情的字典。
如果您的 LLM 不可用为 LangChain 集成,您可以使用 custom 模式来流式传输其输出。有关详细信息,请参阅 与任何 LLM 一起使用。
对于 Python < 3.11 的异步代码需要手动配置 当使用 Python < 3.11 与异步代码时,您必须显式地将 @[RunnableConfig] 传递给 ainvoke() 以启用正确的流式传输。有关详细信息,请参阅 使用 Python < 3.11 的异步 或升级到 Python 3.11+。
::: :::js 从 messages 模式 流式传输的输出是一个元组 [message_chunk, metadata],其中:
  • message_chunk:来自 LLM 的 Token 或消息片段。
  • metadata:包含有关图谱节点和 LLM 调用详情的字典。
如果您的 LLM 不可用为 LangChain 集成,您可以使用 custom 模式来流式传输其输出。有关详细信息,请参阅 与任何 LLM 一起使用。
:::

根据 LLM 调用进行过滤

您可以将 tags 与 LLM 调用关联起来,以根据 LLM 调用过滤流式传输的 Token。 :::python
::: :::js
:::
:::python
::::::js
:::

忽略流中的消息

使用 nostream 标签完全排除 LLM 输出。带有 nostream 标签的调用仍然会运行并产生输出;它们的 Token 仅在 messages 模式下不会被发出。 这很有用,当:
  • 你需要 LLM 输出用于内部处理(例如结构化输出),但不想将其流式传输给客户端
  • 你通过不同的通道(例如自定义 UI 消息)流式传输相同的内容,并希望避免在 messages 流中产生重复输出
:::python

View example trace

为此示例打开一个公开的 LangSmith 运行。
::: :::js

View example trace

为此示例打开一个公开的 LangSmith 运行。
:::

按节点筛选

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

自定义数据

:::python 要在 LangGraph 节点或工具内部发送 自定义用户定义数据,请按照以下步骤操作:
  1. 使用 @[get_stream_writer] 访问流式写入器并发出自定义数据。
  2. 在调用 .stream() 或 .astream() 时设置 stream_mode="custom" 以获取流中的自定义数据。您可以组合多种模式(例如,["updates", "custom"]),但至少必须有一个是 "custom"。
Python 版本低于 3.11 的异步代码中不能使用 @[get_stream_writer] 在 Python 版本低于 3.11 的异步代码中,@[get_stream_writer] 将无法工作。 相反,向您的节点或工具添加一个 writer 参数,并手动传递它。 参见 Python 版本低于 3.11 的异步使用示例 获取使用示例。
::: :::js 要在 LangGraph 节点或工具内部发送自定义用户定义数据,请按照以下步骤操作:
  1. 使用 writer 参数从 LangGraphRunnableConfig 发出自定义数据。
  2. 在调用 .stream() 时设置 streamMode: "custom" 以在流中获取自定义数据。您可以组合多个模式(例如,["updates", "custom"]),但至少必须有一个是 "custom"。
::: :::js

工具进度

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

定义流式进度的工具

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

服务器端消费工具事件

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

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

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

tools 与 custom 流模式

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

子图输出

:::python 要包含来自 子图 的输出到流式输出中,您可以在父图的 .stream() 方法中设置 subgraphs=True。这将流式传输父图和任何子图的输出。 输出将作为元组 (namespace, data) 流式传输,其中 namespace 是一个元组,包含子图被调用的节点的路径,例如 ("parent_node:<task_id>", "child_node:<task_id>")。
使用 version="v2",子图事件使用相同的 StreamPart 格式。ns 字段标识源:
::: :::js 要包含来自 子图 的输出到流式输出中,您可以在父图的 .stream() 方法中设置 subgraphs: true。这将流式传输父图和任何子图的输出。 输出将作为元组 [namespace, data] 流式传输,其中 namespace 是一个元组,包含子图被调用的节点的路径,例如 ["parent_node:<task_id>", "child_node:<task_id>"]。
::: :::python
这适用于每个 stream_mode,包括 "messages"。像 @[create_agent] 这样的智能体构建器返回一个 编译后的图,因此将一个作为节点添加,它就变成了子图。没有 subgraphs=True,父图上的 stream_mode="messages" 不会发出来自内部智能体 LLM 调用的 Token 段。直接调用 agent.stream(...) 会,这就是为什么这通常只在包装后出现。
::: :::js
这适用于每一个 streamMode,包括 "messages"。@[createAgent] 返回一个 ReactAgent 包装器;添加它作为节点时传递 agent.graph,以便父节点将其视为子图。使用 subgraphs: true 时,消息块被 [namespace, [token, metadata]],因此你可以知道哪个子图发出了它们。
:::
:::python
::::::js
::::::python
::::::js
:::注意 我们不仅接收节点更新,还接收命名空间,这些命名空间告诉我们正在从哪个图(或子图)流式传输。
:::python

检查点

使用 checkpoints 流式模式接收图执行过程中的检查点事件。每个检查点事件与 get_state() 的输出格式相同。需要 checkpointer。

任务

使用 tasks 流式模式接收图执行过程中的任务开始和结束事件。任务事件包括关于正在运行的节点、其结果以及任何错误的信息。需要 checkpointer。
:::

调试

使用 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] 来调用图,其中包含一个工具调用:
::::::js
让我们使用包含工具调用的 @[AIMessage] 调用图:
:::

禁用特定对话模型的流式输出

如果您的应用程序混合了支持流式输出的模型和不支持的模型,您可能需要显式禁用不支持流式输出的模型的流式输出。 :::python 在初始化模型时设置 streaming=False。
::: :::js 在初始化模型时设置 streaming: false。
::: :::python
并非所有对话模型集成都支持 streaming 参数。如果您的模型不支持它,请使用 disable_streaming=True 代替。此参数通过基类在所有对话模型中可用。
::: :::js
并非所有对话模型集成都支持 streaming 参数。如果您的模型不支持它,请使用 disableStreaming: true 代替。此参数通过基类在所有对话模型中可用。
::: :::python

迁移到 v2

v2 流式输出格式(本页全程使用)提供了一个统一的输出格式。以下是主要差异和迁移方法的总结:

v2 调用格式

当您将 version="v2" 传递给 invoke() 或 ainvoke() 时,它将返回一个 @[GraphOutput] 对象,包含 .value 和 .interrupts 属性:
对于默认 "values" 之外的任何流模式,invoke(..., stream_mode="updates", version="v2") 返回 list[StreamPart] 而不是 list[tuple]。
GraphOutput(result["key"], "key" in result, result["__interrupt__"])的字典式访问仍然适用于向后兼容,但已弃用,将在未来版本中移除。迁移到 result.value 和 result.interrupts。
这将状态与中断元数据分离。在 v1 中,中断嵌套在返回的 dict 下 __interrupt__:

Pydantic 和数据类状态强制转换

当您的图状态是 Pydantic 模型或数据类时,v2 values 模式会自动将输出转换为正确的类型:

Python < 3.11 时的异步

在 Python 版本 < 3.11 中,异步任务 不支持 context 参数。 这限制了 LangGraph 自动传播上下文的能力,并从两个关键方面影响 LangGraph 的流式机制:
  1. 您必须将 RunnableConfig 显式传递给异步 LLM 调用(例如,ainvoke()),因为回调不会自动传播。
  2. 您不能在异步节点或工具中使用 @[get_stream_writer]——您必须直接传递一个 writer 参数。
:::
官方原文:src/oss/langgraph/streaming.mdx · 非官方翻译,译文由 AI 生成,以英文原文为准。
Last modified on November 3, 2026