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

开始使用

基本用法

LangGraph 图暴露了 stream(同步)和 astream(异步)方法,以迭代器的形式生成流式输出。传递一个或多个流模式来控制您接收的数据。
Output
Output
使用 LangSmith 调试流事件、检查逐个 token 的 LLM 输出并监控延迟。按照追踪快速入门进行设置。

流输出格式 (v2)

要求 LangGraph >= 1.1。本页面的所有示例均使用 version="v2"。
向 stream() 或 astream() 传递 version="v2" 可获得统一的输出格式。每个块都是一个具有固定结构的 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"] 收窄为该模式的特定类型:

流模式

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

图状态

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

LLM tokens

使用 messages 流模式从图的任何部分(包括节点、工具、子图或任务)逐个 token 流式传输大型语言模型(LLM)的输出。 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+。

按 LLM 调用过滤

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

从流中省略消息

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

按节点过滤

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

自定义数据

要从 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 的异步支持。

子图输出

要将子图的输出包含在流式输出中,您可以在父图的 .stream() 方法中设置 subgraphs=True。这将同时流式传输来自父图和任何子图的输出。 输出将以元组 (namespace, data) 的形式流式传输,其中 namespace 是一个包含调用子图的节点路径的元组,例如 ("parent_node:<task_id>", "child_node:<task_id>")。
使用 version="v2" 时,子图事件使用相同的 StreamPart 格式。ns 字段标识来源:
这适用于每个 stream_mode,包括 "messages"。像 create_agent 这样的代理构建器返回一个编译后的图,因此将其添加为节点会将其变为子图。如果未设置 subgraphs=True,父图上的 stream_mode="messages" 将不会发出内部代理 LLM 调用的 token 块。直接调用 agent.stream(...) 则会发出,这就是为什么通常只在包装后才出现此问题。
python
让我们使用一个包含工具调用的 @[AIMessage] 来调用该图:
:::

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

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

迁移到 v2

v2 流式格式(在整个页面中使用)提供了一个统一的输出格式。以下是关键差异以及如何迁移的总结:

v2 调用格式

当你向 invoke() 或 ainvoke() 传递 version="v2" 时,它会返回一个具有 .value 和 .interrupts 属性的 @[GraphOutput] 对象:
对于除默认 "values" 以外的任何流模式,invoke(..., stream_mode="updates", version="v2") 返回 list[StreamPart] 而不是 list[tuple]。
在 GraphOutput 上使用字典风格访问 (result["key"], "key" in result, result["__interrupt__"]) 为了向后兼容仍然有效,但已被弃用,将在未来版本中移除。请迁移到使用 result.value 和 result.interrupts。
这将状态与中断元数据分离。在 v1 中,中断嵌入在返回的字典中,位于 __interrupt__ 下:

Pydantic 和 dataclass 状态强制转换

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

Python < 3.11 版本的异步支持

在 Python 版本 < 3.11 中,异步任务 不支持 context 参数。 这限制了 LangGraph 自动传播上下文的能力,并以两种关键方式影响 LangGraph 的流式机制:
  1. 你必须在异步 LLM 调用(例如 ainvoke())中显式传递 RunnableConfig,因为回调不会自动传播。
  2. 你不能在异步节点或工具中使用 @[get_stream_writer]——你必须直接传递一个 writer 参数。