Skip to main content
预览版: 尝试对消息、状态、子图、输出和自定义扩展的事件流类型化投影。从事件流概述开始,或在流式输出 cookbook 中探索可运行的示例。
LangGraph 实现了一个流式输出系统来呈现实时更新。流式输出对于增强基于 LLM 构建的应用的响应能力至关重要。通过在完整响应准备好之前逐步显示输出,流式输出显著改善了用户体验(UX),特别是在处理 LLM 延迟时。
使用 LangSmith 调试流式事件、检查逐 Token 的 LLM 输出和监控延迟。按照追踪快速入门进行设置。

快速开始

基本用法

LangGraph 图暴露了 stream(同步)和 astream(异步)方法来以迭代器的形式产出流式输出。传入一个或多个流模式来控制你接收的数据。
输出
输出

流输出格式 (v2)

需要 LangGraph >= 1.1。本页所有示例使用 version="v2"
version="v2" 传递给 stream()astream() 以获得统一的输出格式。每个 chunk 都是一个具有一致结构的 StreamPart 字典——无论流模式、模式数量或子图设置如何:
每种流模式都有对应的 TypedDict,包含 ValuesStreamPartUpdatesStreamPartMessagesStreamPartCustomStreamPartCheckpointStreamPartTasksStreamPartDebugStreamPart。你可以从 langgraph.types 中导入这些类型。联合类型 StreamPart 是基于 part["type"] 的不相交联合,可在编辑器和类型检查器中实现完整的类型缩窄。 使用 v1(默认值),输出格式会根据你的流选项变化(单模式返回原始数据,多模式返回 (mode, data) 元组,子图返回 (namespace, data) 元组)。使用 v2,格式始终相同:
v2 格式还支持类型缩窄,这意味着你可以通过 chunk["type"] 过滤 chunk 并获得正确的负载类型。每个分支会将 part["data"] 缩窄为该模式的特定类型:

流模式

将以下一个或多个流模式作为列表传递给 streamastream 方法:

图状态

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

LLM Token

使用 messages 流模式从图的任何部分(包括节点、工具、子图或任务)逐 Token 流式输出大语言模型(LLM)的输出。 messages 模式的流式输出是一个元组 (message_chunk, metadata),其中:
  • message_chunk:来自 LLM 的 Token 或消息片段。
  • metadata:包含图节点和 LLM 调用详情的字典。
如果你的 LLM 没有提供 LangChain 集成,你可以使用 custom 模式来流式输出其输出。详见与任意 LLM 配合使用
Python < 3.11 的异步代码需要手动传递 config 在 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 字段标识来源:
注意我们不仅接收到了节点更新,还接收到了命名空间,它告诉我们正在从哪个图(或子图)进行流式输出。

检查点

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

任务

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

调试

使用 debug 流模式在图执行过程中流式输出尽可能多的信息。流式输出包含节点名称和完整状态。
debug 模式合并了 checkpointstasks 事件及额外的元数据。如果你只需要调试信息的子集,请直接使用 checkpointstasks

同时使用多个模式

你可以将列表作为 stream_mode 参数传递,同时流式输出多个模式。 使用 version="v2" 时,每个 chunk 都是一个 StreamPart 字典。使用 chunk["type"] 来区分模式:

高级

与任意 LLM 配合使用

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

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

如果你的应用混合使用支持流式输出和不支持流式输出的模型,你可能需要显式禁用不支持流式输出的模型的流式功能。 初始化模型时设置 streaming=False
并非所有聊天模型集成都支持 streaming 参数。如果你的模型不支持,请改用 disable_streaming=True。此参数通过基类在所有聊天模型上可用。

迁移到 v2

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

v2 invoke 格式

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

Pydantic 和 dataclass 状态强制转换

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

Python < 3.11 的异步

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