Skip to content
LangChain 文档版本 跟随上游 源快照 f2044702 更新于 2026-10-08

事件流式传输

从 Deep Agents 流式输出子智能体、消息、工具调用和最终输出。

本页涵盖 Deep Agents 特有的流式传输相关事项——最重要的是通过 stream.subagents 流式输出被委派的子智能体。有关通用的智能体流式传输(stream.messages、stream.values、工具调用、自定义更新),请参阅 LangChain 事件流式传输。

流式输出子智能体

Deep Agents 在 LangGraph 流式传输之上增加了一个子智能体投影。当你希望每次被委派的 task 调用对应一个流句柄时,请使用 stream.subagents。该投影是轻量级的:它先发现子智能体任务,只有在子智能体句柄上访问消息、工具调用和值流时才会打开它们。

每个句柄的 name 就是子智能体配置的名称:即协调器在调用 task 工具时传入的 subagent_type。Deep Agents 会将该名称绑定到被委派的运行上,因此你在子智能体规格中定义的同一个标签,就是你在流中进行筛选和路由所依据的标签。

python
stream = agent.stream_events(
    {
        "messages": [{"role": "user", "content": "Write me a haiku about the sea"}],
    },
    version="v3",
)

subagent_names: list[str] = []
for subagent in stream.subagents:
    print(subagent.name, subagent.path, subagent.status)

    for message in subagent.messages:
        print(message.text)

    subagent_names.append(subagent.name)

View example trace

打开本示例的一个公开 LangSmith 运行记录。

子智能体流字段

每个子智能体流都暴露与父运行相同种类的投影,例如消息、工具调用、嵌套子智能体和最终输出。有关通用的父运行流式传输模型,请参阅 LangChain 事件流式传输。

Python 使用 snake_case 形式的投影名称,例如 tool_calls。每个子智能体流可以暴露 .messages、.tool_calls、.values、.subagents 和 .output。

字段描述
name子智能体名称,取自协调器在其 task 调用中选择的 subagent_type。
messages子智能体发出的消息。
subagents嵌套的子智能体调用。
output子智能体的最终状态,或被委派任务的完成信号。
path子智能体流的命名空间路径。
status生命周期状态,例如 started、completed、failed 或 interrupted。
tool_calls限定在该子智能体范围内的工具调用。

跟踪子智能体生命周期

当你只需要展示哪些子智能体已启动和已完成时,请使用 stream.subagents。除非你要在单个子智能体上访问消息或值流投影,否则无需订阅它们。

python
stream = agent.stream_events(input, version="v3")

running = 0
completed = 0
failed = 0

for subagent in stream.subagents:
    running += 1
    print(f"{subagent.name}: started")

    try:
        _ = subagent.output
        running -= 1
        completed += 1
        print(f"{subagent.name}: completed")
    except Exception:
        running -= 1
        failed += 1
        print(f"{subagent.name}: failed")

View example trace

打开本示例的一个公开 LangSmith 运行记录。

流式输出消息

Deep Agents 可以发出协调器智能体和被委派子智能体的消息。顶层消息请使用 stream.messages,每个被委派的子智能体请使用 subagent.messages。

python
stream = agent.stream_events(input, version="v3")

coordinator_messages: list[str] = []
for message in stream.messages:
    print("[coordinator]", message.text)
    coordinator_messages.append(message.text)

for subagent in stream.subagents:
    for message in subagent.messages:
        print(f"[{subagent.name}]", message.text)

View example trace

打开本示例的一个公开 LangSmith 运行记录。

流式输出工具调用

Deep Agents 在智能体树的每一层都暴露工具调用。协调器工具请使用顶层的 stream.tool_calls,被委派的工作请使用各个 subagent.tool_calls。

python
stream = agent.stream_events(input, version="v3")

coordinator_tool_names: list[str] = []
for call in stream.tool_calls:
    print("[coordinator tool]", call.tool_name, call.input)
    print(call.completed, call.error)
    coordinator_tool_names.append(call.tool_name)

for subagent in stream.subagents:
    for call in subagent.tool_calls:
        print(f"[{subagent.name} tool]", call.tool_name, call.input)
        for delta in call.output_deltas:
            print(delta, end="", flush=True)

        if call.completed and call.error is None:
            print(call.output)
        elif call.error is not None:
            print(call.error)

View example trace

打开本示例的一个公开 LangSmith 运行记录。

流式输出嵌套工作

你可以递归进入子智能体流,以观察嵌套的子智能体、消息和工具调用。

python
stream = agent.stream_events(input, version="v3")

subagent_names: list[str] = []
for subagent in stream.subagents:
    print(f"subagent {subagent.name}: {subagent.status}")

    for tool_call in subagent.tool_calls:
        print(f"{tool_call.tool_name}({tool_call.input})")
        for delta in tool_call.output_deltas:
            print(delta, end="", flush=True)

    for nested in subagent.subagents:
        print(f"nested subagent {nested.name}: {nested.status}")

    subagent_names.append(subagent.name)

View example trace

打开本示例的一个公开 LangSmith 运行记录。

并发消费

协调器和子智能体的输出常常交错在一起。当你需要实时 UI 更新时,请并发消费这些投影。

在异步代码中并发消费时,请把 astream_events 与 asyncio.gather 配合使用:

py
import asyncio

stream = await agent.astream_events(input, version="v3")

async def consume_coordinator():
    async for message in stream.messages:
        print("[coordinator]", await message.text)

async def consume_subagents():
    async for subagent in stream.subagents:
        async for message in subagent.messages:
            print(f"[{subagent.name}]", await message.text)

await asyncio.gather(consume_coordinator(), consume_subagents())

在同步代码中,请改用 stream.interleave(...):

python
stream = agent.stream_events(input, version="v3")

for name, item in stream.interleave("messages", "subagents"):
    if name == "messages":
        print("[coordinator]", item.text)
    else:
        for message in item.messages:
            print(f"[{item.name}]", message.text)

View example trace

打开本示例的一个公开 LangSmith 运行记录。

当你需要跨协调器和所有子智能体的精确到达顺序时,请遍历原始协议事件,并使用 namespace 来标识来源:

python
stream = agent.stream_events(input, version="v3")

text_deltas: list[str] = []
for event in stream:
    if event.get("method") != "messages":
        continue

    payload = event["params"]["data"][0]
    if not isinstance(payload, dict):
        continue
    if payload.get("event") != "content-block-delta":
        continue

    block = payload.get("delta") or {}
    if block.get("type") == "text-delta":
        source = "subagent" if event["params"]["namespace"] else "coordinator"
        print(f"[{source}] {block['text']}")
        text_deltas.append(block["text"])

View example trace

打开本示例的一个公开 LangSmith 运行记录。

子智能体与子图

stream.subgraphs 展示图的执行结构。stream.subagents 展示产品层面的 Deep Agents 任务委派。面向用户的 UI 请使用 stream.subagents,因为它隐藏了内部图节点,并直接暴露子智能体这一概念。

相关


BytesRouter 是社区翻译站点,所有译文仅供参考,一切以官方英文原文为准。