stream_events(..., version="v3") 实现的事件流。事件流返回一个带有类型化投影的运行对象,因此每个投影可以独立消费,而无需解析流模式的元组。
可流式传输的内容
stream.messages 生成 ChatModelStream 对象。每个消息流都暴露了 .text、.reasoning、.tool_calls 和 .output。同步投影是可迭代的,用于获取实时增量,也可排空以获取最终值:使用 str(message.text) 获取最终文本,使用 message.tool_calls.get() 获取已确定的工具调用。
智能体消息
当你想要获取每次 LLM 调用的模型输出时,请使用stream.messages。
message.output 为你提供最终确定的 AI 消息,包括特定于提供者的内容块。在 TypeScript 中,当你只需要令牌计数或其他使用元数据时使用 message.usage;在 Python 中,从 message.output.usage_metadata 读取使用情况。
推理内容
推理内容使用与文本内容相同的形状,但仅当所选模型发出推理块时才可用。工具调用
有两个有用的工具调用投影:message.tool_calls在模型生成工具调用时,流式传输工具调用参数块。stream.tool_calls在工具调用开始后,流式传输工具执行的生命周期。
流式传输子智能体
当一个create_agent 调用(通常通过包装工具)调用另一个具名的 create_agent 时,内部智能体的事件会在嵌套的命名空间中流动。你传递给 create_agent 的 name= 会在流中标识该内部智能体,因此你可以按智能体进行过滤和标记。
具名子智能体出现在专用的 stream.subagents 投影上。每个句柄都暴露了内部智能体自己的 .messages、.values、.tool_calls 和 .output,以及 .name(你传递的 name=)和 .cause(调度子智能体的工具调用)。因为只有具名的 create_agent 运行才会出现在这里,你不需要过滤掉普通子图。
StateGraph 子图也会出现在 stream.subgraphs 上——在 .compile(name=...) 上设置 name= 可以在 subagent.graph_name 中获得一个标签。
stream.subagents 是具名 create_agent 子智能体的聚焦视图,而 stream.subgraphs 覆盖了每个嵌套图。使用与你的 UI 匹配的那个。
状态与最终输出
使用stream.values 获取状态快照,使用 stream.output 获取最终智能体状态。
多重投影
对于异步代码中的并发消费,使用带有asyncio.gather 的 astream_events:
stream.interleave(...):
自定义更新
当你的应用需要内置投影之外的投影(如检索进度、制品或特定领域的事件)时,请使用自定义流转换器。在中间件上注册转换器
中间件注册的转换器需要
langchain>=1.3.2。AgentMiddleware 子类的 transformers 属性设置为一个工厂序列。每个工厂的形状是 Callable[[tuple[str, ...]], StreamTransformer],并作为 factory(scope) 被调用,其中 scope 是迷你多路复用器作用域元组(() 用于根复用器,非空用于子图)。每次调用都返回一个新的转换器,可以保持每个子图隔离。
create_agent 将中间件注册的工厂与传递给其自身 transformers= 参数的任何内容合并。编译图上的最终顺序是:
- 内置的
ToolCallTransformer。 - 中间件注册的工厂,按中间件顺序。
- 调用者从
create_agent提供的transformers=。
PIIMiddleware 使用此钩子从流式传输的有线输出中编辑 PII。通过设置 apply_to_output=True,其注册的转换器会在文本增量、工具调用参数、工具输出和状态快照离开运行之前,清除检测到的 PII,关闭了 after_model 状态级编辑可能会让原始 PII 传递到 stream_events(version="v3") 的实时读取者的窗口。
相关内容
Connect these docs to Claude, VSCode, and more via MCP for real-time answers.

