1.确认依赖pip install langgraph-sdk

pip install langgraph-sdk

SDK(Software Development Kit,软件开发工具包)
给开发者用的一组现成工具 + 接口不用关心底层细节就能调用某个系统。

一句话理解:

SDK = “已经帮封装好的调用方式”

现在的场景里:

  • langgraph_sdk = 帮我们用 Python / JS 调 LangGraph 服务

  • 我们不用自己写:

    • HTTP 请求
    • 认证
    • 流式处理
    • 事件解析

类比:

  • SDK :client.runs.stream(...)
  • 不用 SDK:手写 fetch / requests

一句话总结:

SDK 让我们“少写代码,也不容易写错”。

2.my_test.py异步调用Stream测试agent的api

新建测试文件my_test.py

在这里插入图片描述

# 从 LangGraph SDK 获取客户端,用于连接已启动的 LangGraph 服务
from langgraph_sdk import get_client
import asyncio

# 创建客户端,指向本地 langgraph dev 启动的服务地址
# 默认端口就是 2024
client = get_client(url="http://localhost:2024")


# 主异步函数
async def main():
    # 以「流式(stream)」方式运行一个 Agent
    async for chunk in client.runs.stream(
            None,  # Thread ID = None,表示无状态(threadless)运行
            "agent",  # Assistant 名称,对应 langgraph.json 里的 graph 名
            input={
                # 输入给 Agent 的内容
                # 本质等价于 Chat 中的一次对话输入
                "messages": [{
                    "role": "human",
                    "content": "今天,广州的天气怎么样?",
                }],
            },
    ):
        # 每收到一个事件(event),就打印一次
        print(f"Receiving new event of type: {chunk.event}...")
        print(chunk.data)
        print("\n\n")


if __name__ == '__main__':
    # 启动异步主函数
    asyncio.run(main())

3.agent流式调用解析

一、一句话先给结论

流式调用 = 不等整个任务跑完,一有“进展”就立刻返回

和传统“等结果一次性返回”是两种完全不同的调用模型


二、不用 LLM,先用最普通的程序打比方

1 非流式

result = do_something()
print(result)

特点:

  • do_something() 全部执行完
  • 才拿到结果
  • 中间发生了什么,完全不知道

👉 像:
HTTP 请求 / 数据库查询 / REST API


2 流式(其实早就见过)

for chunk in do_something_stream():
    print(chunk)

特点:

  • 函数边执行
  • 边把“进度 / 中间结果”往外吐
  • 你可以实时处理

像:

  • 读大文件 for line in file
  • 日志 tail
  • WebSocket / SSE
  • 视频直播(推流)

三、放到 LLM / Agent 里,就变成什么?

非流式调用(一次性)

response = agent.invoke("今天广州天气")
print(response)

发生了什么?

  1. LLM 思考
  2. 判断是否用 Tool
  3. 调 Tool
  4. 再思考
  5. 最终生成答案

只能等
中间完全是黑箱


流式调用(LangGraph 的方式)

async for chunk in client.runs.stream(...):
    print(chunk.event, chunk.data)

发生了什么?

时间点 收到的事件
第 1 秒 Agent 开始
第 2 秒 LLM 被调用
第 3 秒 决定用 Tool
第 4 秒 Tool 执行
第 5 秒 最终回答

每一步都实时可见


四、这行代码到底在干什么?

async for chunk in client.runs.stream(...)

拆开讲:

1️⃣ client.runs.stream(...)

  • 启动一次 Agent 运行
  • 返回的不是结果
  • 而是一个 “事件流”

2️⃣ async for

表示:

“这是一个 异步生成器,会不断产出 chunk”

每个 chunk 是:

“Agent 执行过程中的一个事件”

3️⃣ chunk 里有什么?

通常包含:

chunk.event   # 事件类型
chunk.data    # 事件数据

例如:

event 含义
on_chain_start Agent 开始
on_chat_model_start LLM 被调用
on_tool_start Tool 开始
on_tool_end Tool 结束
on_chain_end Agent 结束

👉 这就是在 Trace 里看到的东西


五、为什么 LLM / Agent 特别需要“流式”?

因为 Agent ≠ 一个函数调用

它是:

LLM → 判断 → Tool → 判断 → LLM → 判断 → 结束

这是一个:

  • 不确定步数
  • 不确定路径
  • 可能很慢
  • 可能失败

流程型系统

👉 如果不用流式:

  • UI 卡死
  • 没进度
  • 无法调试
  • 用户以为挂了

六、我们已经“用过”流式了,只是没意识到

场景 是否流式
ChatGPT 打字逐字出现
LangGraph Trace 实时刷新
tail -f 日志
视频直播

七、什么时候该用流式?什么时候不用?

✅ 用流式

  • 前端聊天
  • Agent 调 Tool
  • 想看过程 / Trace
  • 长时间任务

❌ 不用流式

  • 批处理
  • 定时任务
  • 不关心中间过程

八、给一个“后端工程师”的类比

非流式 = 返回值
流式 = callback / event / message queue


4.测试结果

C:\Users\HP\miniconda3\envs\new_langgrapg_env\python.exe C:\Users\HP\PycharmProjects\langgraph_demo\tests\my_test.py 
Receiving new event of type: metadata...
{'run_id': '019b6abb-0159-7561-b9f4-7426089c7a4f', 'attempt': 1}



Receiving new event of type: values...
{'messages': [{'content': '今天,广州的天气怎么样?', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'human', 'name': None, 'id': '191f669e-ca90-44bb-b3cb-c642d7533a9f'}]}



Receiving new event of type: values...
{'messages': [{'content': '今天,广州的天气怎么样?', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'human', 'name': None, 'id': '191f669e-ca90-44bb-b3cb-c642d7533a9f'}, {'content': '', 'additional_kwargs': {'function_call': {'name': 'get_weather', 'arguments': '{"city": "\\u5e7f\\u5dde"}'}}, 'response_metadata': {'finish_reason': 'STOP', 'model_name': 'gemini-2.5-flash', 'safety_ratings': [], 'model_provider': 'google_genai'}, 'type': 'ai', 'name': None, 'id': 'lc_run--019b6abb-057e-7a13-a2cf-b707108166a2-0', 'tool_calls': [{'name': 'get_weather', 'args': {'city': '广州'}, 'id': '80b73cbc-bcb2-4e30-9092-8baa86d29da2', 'type': 'tool_call'}], 'invalid_tool_calls': [], 'usage_metadata': {'input_tokens': 52, 'output_tokens': 15, 'total_tokens': 67, 'input_token_details': {'cache_read': 0}}}]}



Receiving new event of type: values...
{'messages': [{'content': '今天,广州的天气怎么样?', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'human', 'name': None, 'id': '191f669e-ca90-44bb-b3cb-c642d7533a9f'}, {'content': '', 'additional_kwargs': {'function_call': {'name': 'get_weather', 'arguments': '{"city": "\\u5e7f\\u5dde"}'}}, 'response_metadata': {'finish_reason': 'STOP', 'model_name': 'gemini-2.5-flash', 'safety_ratings': [], 'model_provider': 'google_genai'}, 'type': 'ai', 'name': None, 'id': 'lc_run--019b6abb-057e-7a13-a2cf-b707108166a2-0', 'tool_calls': [{'name': 'get_weather', 'args': {'city': '广州'}, 'id': '80b73cbc-bcb2-4e30-9092-8baa86d29da2', 'type': 'tool_call'}], 'invalid_tool_calls': [], 'usage_metadata': {'input_tokens': 52, 'output_tokens': 15, 'total_tokens': 67, 'input_token_details': {'cache_read': 0}}}, {'content': '城市 in 广州,今天天气晴朗!', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'tool', 'name': 'get_weather', 'id': '37e6a8b7-e136-4915-8ef3-01518b902795', 'tool_call_id': '80b73cbc-bcb2-4e30-9092-8baa86d29da2', 'artifact': None, 'status': 'success'}]}



Receiving new event of type: values...
{'messages': [{'content': '今天,广州的天气怎么样?', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'human', 'name': None, 'id': '191f669e-ca90-44bb-b3cb-c642d7533a9f'}, {'content': '', 'additional_kwargs': {'function_call': {'name': 'get_weather', 'arguments': '{"city": "\\u5e7f\\u5dde"}'}}, 'response_metadata': {'finish_reason': 'STOP', 'model_name': 'gemini-2.5-flash', 'safety_ratings': [], 'model_provider': 'google_genai'}, 'type': 'ai', 'name': None, 'id': 'lc_run--019b6abb-057e-7a13-a2cf-b707108166a2-0', 'tool_calls': [{'name': 'get_weather', 'args': {'city': '广州'}, 'id': '80b73cbc-bcb2-4e30-9092-8baa86d29da2', 'type': 'tool_call'}], 'invalid_tool_calls': [], 'usage_metadata': {'input_tokens': 52, 'output_tokens': 15, 'total_tokens': 67, 'input_token_details': {'cache_read': 0}}}, {'content': '城市 in 广州,今天天气晴朗!', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'tool', 'name': 'get_weather', 'id': '37e6a8b7-e136-4915-8ef3-01518b902795', 'tool_call_id': '80b73cbc-bcb2-4e30-9092-8baa86d29da2', 'artifact': None, 'status': 'success'}, {'content': '广州今天天气晴朗!', 'additional_kwargs': {}, 'response_metadata': {'finish_reason': 'STOP', 'model_name': 'gemini-2.5-flash', 'safety_ratings': [], 'model_provider': 'google_genai'}, 'type': 'ai', 'name': None, 'id': 'lc_run--019b6abb-099b-7ba2-9e96-7f309513f776-0', 'tool_calls': [], 'invalid_tool_calls': [], 'usage_metadata': {'input_tokens': 91, 'output_tokens': 6, 'total_tokens': 97, 'input_token_details': {'cache_read': 0}}}]}




进程已结束,退出代码为 0


from langgraph_sdk import get_sync_client

# 创建同步客户端,连接本地通过 `langgraph dev` 启动的 LangGraph 服务
client = get_sync_client(url="http://localhost:2024")

# 使用同步方式 + 流式接口运行 agent
for chunk in client.runs.stream(
    None,        # Thread ID = None,表示无状态的一次性调用
    "agent",     # agent 名称,对应 langgraph.json 中的 graph 名
    input={
        # 传递给 agent 的输入消息
        "messages": [{
            "role": "human",                 # 消息角色:用户输入
            "content": "今天,广州的天气怎么样?", # 输入内容
        }],
    },
    stream_mode="messages-tuple",  # 以 message 维度进行流式返回
):
    # 打印当前接收到的事件类型
    print(f"Receiving new event of type: {chunk.event}...")
    # 打印事件对应的数据(LLM 输出、Tool 调用结果等)
    print(chunk.data)
    print("\n")


4.my_test.py同步调用Stream测试agent的api

修改测试文件my_test.py

from langgraph_sdk import get_sync_client

# 创建同步客户端,连接本地通过 `langgraph dev` 启动的 LangGraph 服务
client = get_sync_client(url="http://localhost:2024")

# 使用同步方式 + 流式接口运行 agent
for chunk in client.runs.stream(
    None,        # Thread ID = None,表示无状态的一次性调用
    "agent",     # agent 名称,对应 langgraph.json 中的 graph 名
    input={
        # 传递给 agent 的输入消息
        "messages": [{
            "role": "human",                 # 消息角色:用户输入
            "content": "今天,广州的天气怎么样?", # 输入内容
        }],
    },
    stream_mode="messages-tuple",  # 以 message 维度进行流式返回
):
    # 打印当前接收到的事件类型
    print(f"Receiving new event of type: {chunk.event}...")
    # 打印事件对应的数据(LLM 输出、Tool 调用结果等)
    print(chunk.data)
    print("\n")


执行结果

C:\Users\HP\miniconda3\envs\new_langgrapg_env\python.exe C:\Users\HP\PycharmProjects\langgraph_demo\tests\my_test.py 
Receiving new event of type: metadata...
{'run_id': '019b6ad6-a6b5-7a22-b77f-321fea1bc3ac', 'attempt': 1}


Receiving new event of type: messages...
[{'content': '', 'additional_kwargs': {'function_call': {'name': 'get_weather', 'arguments': '{"city": "\\u5e7f\\u5dde"}'}}, 'response_metadata': {'finish_reason': 'STOP', 'model_name': 'gemini-2.5-flash', 'safety_ratings': [], 'model_provider': 'google_genai'}, 'type': 'AIMessageChunk', 'name': None, 'id': 'lc_run--019b6ad6-a921-75f1-adb6-1037e1fa5742', 'tool_calls': [{'name': 'get_weather', 'args': {'city': '广州'}, 'id': '00d6fa8c-fc8e-4b58-bfe5-5f80243d7f80', 'type': 'tool_call'}], 'invalid_tool_calls': [], 'usage_metadata': {'input_tokens': 52, 'output_tokens': 15, 'total_tokens': 67, 'input_token_details': {'cache_read': 0}}, 'tool_call_chunks': [{'name': 'get_weather', 'args': '{"city": "\\u5e7f\\u5dde"}', 'id': '00d6fa8c-fc8e-4b58-bfe5-5f80243d7f80', 'index': None, 'type': 'tool_call_chunk'}], 'chunk_position': None}, {'created_by': 'system', 'run_attempt': 1, 'langgraph_version': '1.0.5', 'langgraph_api_version': '0.6.15', 'langgraph_plan': 'developer', 'langgraph_host': 'self-hosted', 'langgraph_api_url': 'http://127.0.0.1:2024', 'langgraph_request_id': '801bbc7d-4632-4547-af68-0423559dbe6e', 'run_id': '019b6ad6-a6b5-7a22-b77f-321fea1bc3ac', 'thread_id': '10f988fd-6a23-4c5b-81de-0fe175d486e5', 'graph_id': 'agent', 'assistant_id': 'fe096781-5601-53d2-b2f6-0d3403f7e9ca', 'user_id': '', 'langgraph_step': 1, 'langgraph_node': 'agent', 'langgraph_triggers': ['branch:to:agent'], 'langgraph_path': ['__pregel_pull', 'agent'], 'langgraph_checkpoint_ns': 'agent:1d0039cc-9c78-06a7-1d48-3f7d43163e84', 'langgraph_auth_user_id': '', 'checkpoint_ns': 'agent:1d0039cc-9c78-06a7-1d48-3f7d43163e84', 'ls_provider': 'google_genai', 'ls_model_name': 'gemini-2.5-flash', 'ls_model_type': 'chat', 'ls_temperature': 0.8}]


Receiving new event of type: messages...
[{'content': '', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'AIMessageChunk', 'name': None, 'id': 'lc_run--019b6ad6-a921-75f1-adb6-1037e1fa5742', 'tool_calls': [], 'invalid_tool_calls': [], 'usage_metadata': None, 'tool_call_chunks': [], 'chunk_position': 'last'}, {'created_by': 'system', 'run_attempt': 1, 'langgraph_version': '1.0.5', 'langgraph_api_version': '0.6.15', 'langgraph_plan': 'developer', 'langgraph_host': 'self-hosted', 'langgraph_api_url': 'http://127.0.0.1:2024', 'langgraph_request_id': '801bbc7d-4632-4547-af68-0423559dbe6e', 'run_id': '019b6ad6-a6b5-7a22-b77f-321fea1bc3ac', 'thread_id': '10f988fd-6a23-4c5b-81de-0fe175d486e5', 'graph_id': 'agent', 'assistant_id': 'fe096781-5601-53d2-b2f6-0d3403f7e9ca', 'user_id': '', 'langgraph_step': 1, 'langgraph_node': 'agent', 'langgraph_triggers': ['branch:to:agent'], 'langgraph_path': ['__pregel_pull', 'agent'], 'langgraph_checkpoint_ns': 'agent:1d0039cc-9c78-06a7-1d48-3f7d43163e84', 'langgraph_auth_user_id': '', 'checkpoint_ns': 'agent:1d0039cc-9c78-06a7-1d48-3f7d43163e84', 'ls_provider': 'google_genai', 'ls_model_name': 'gemini-2.5-flash', 'ls_model_type': 'chat', 'ls_temperature': 0.8, 'LANGSMITH_LANGGRAPH_API_VARIANT': 'local_dev'}]


Receiving new event of type: messages...
[{'content': '城市 in 广州,今天天气晴朗!', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'tool', 'name': 'get_weather', 'id': '8fe5ffe9-4cc1-4f71-b4a9-f7ff8148adc5', 'tool_call_id': '00d6fa8c-fc8e-4b58-bfe5-5f80243d7f80', 'artifact': None, 'status': 'success'}, {'created_by': 'system', 'run_attempt': 1, 'langgraph_version': '1.0.5', 'langgraph_api_version': '0.6.15', 'langgraph_plan': 'developer', 'langgraph_host': 'self-hosted', 'langgraph_api_url': 'http://127.0.0.1:2024', 'langgraph_request_id': '801bbc7d-4632-4547-af68-0423559dbe6e', 'run_id': '019b6ad6-a6b5-7a22-b77f-321fea1bc3ac', 'thread_id': '10f988fd-6a23-4c5b-81de-0fe175d486e5', 'graph_id': 'agent', 'assistant_id': 'fe096781-5601-53d2-b2f6-0d3403f7e9ca', 'user_id': '', 'langgraph_step': 2, 'langgraph_node': 'tools', 'langgraph_triggers': ['__pregel_push'], 'langgraph_path': ['__pregel_push', 0, False], 'langgraph_checkpoint_ns': 'tools:0eb0f661-3908-3dfe-0ba0-3ba8e9fc95cb', 'LANGSMITH_LANGGRAPH_API_VARIANT': 'local_dev'}]


Receiving new event of type: messages...
[{'content': '今天广州', 'additional_kwargs': {}, 'response_metadata': {'safety_ratings': [], 'model_provider': 'google_genai'}, 'type': 'AIMessageChunk', 'name': None, 'id': 'lc_run--019b6ad6-ad1b-7b41-b54f-4a036915a66b', 'tool_calls': [], 'invalid_tool_calls': [], 'usage_metadata': {'input_tokens': 91, 'output_tokens': 2, 'total_tokens': 93, 'input_token_details': {'cache_read': 0}}, 'tool_call_chunks': [], 'chunk_position': None}, {'created_by': 'system', 'run_attempt': 1, 'langgraph_version': '1.0.5', 'langgraph_api_version': '0.6.15', 'langgraph_plan': 'developer', 'langgraph_host': 'self-hosted', 'langgraph_api_url': 'http://127.0.0.1:2024', 'langgraph_request_id': '801bbc7d-4632-4547-af68-0423559dbe6e', 'run_id': '019b6ad6-a6b5-7a22-b77f-321fea1bc3ac', 'thread_id': '10f988fd-6a23-4c5b-81de-0fe175d486e5', 'graph_id': 'agent', 'assistant_id': 'fe096781-5601-53d2-b2f6-0d3403f7e9ca', 'user_id': '', 'langgraph_step': 3, 'langgraph_node': 'agent', 'langgraph_triggers': ['branch:to:agent'], 'langgraph_path': ['__pregel_pull', 'agent'], 'langgraph_checkpoint_ns': 'agent:0cb14565-27f6-bd50-2e11-b4bf66695769', 'langgraph_auth_user_id': '', 'checkpoint_ns': 'agent:0cb14565-27f6-bd50-2e11-b4bf66695769', 'ls_provider': 'google_genai', 'ls_model_name': 'gemini-2.5-flash', 'ls_model_type': 'chat', 'ls_temperature': 0.8}]


Receiving new event of type: messages...
[{'content': '天气晴朗。', 'additional_kwargs': {}, 'response_metadata': {'finish_reason': 'STOP', 'model_name': 'gemini-2.5-flash', 'safety_ratings': [], 'model_provider': 'google_genai'}, 'type': 'AIMessageChunk', 'name': None, 'id': 'lc_run--019b6ad6-ad1b-7b41-b54f-4a036915a66b', 'tool_calls': [], 'invalid_tool_calls': [], 'usage_metadata': {'output_tokens': 4, 'input_token_details': {'cache_read': 0}, 'input_tokens': 0, 'total_tokens': 4}, 'tool_call_chunks': [], 'chunk_position': None}, {'created_by': 'system', 'run_attempt': 1, 'langgraph_version': '1.0.5', 'langgraph_api_version': '0.6.15', 'langgraph_plan': 'developer', 'langgraph_host': 'self-hosted', 'langgraph_api_url': 'http://127.0.0.1:2024', 'langgraph_request_id': '801bbc7d-4632-4547-af68-0423559dbe6e', 'run_id': '019b6ad6-a6b5-7a22-b77f-321fea1bc3ac', 'thread_id': '10f988fd-6a23-4c5b-81de-0fe175d486e5', 'graph_id': 'agent', 'assistant_id': 'fe096781-5601-53d2-b2f6-0d3403f7e9ca', 'user_id': '', 'langgraph_step': 3, 'langgraph_node': 'agent', 'langgraph_triggers': ['branch:to:agent'], 'langgraph_path': ['__pregel_pull', 'agent'], 'langgraph_checkpoint_ns': 'agent:0cb14565-27f6-bd50-2e11-b4bf66695769', 'langgraph_auth_user_id': '', 'checkpoint_ns': 'agent:0cb14565-27f6-bd50-2e11-b4bf66695769', 'ls_provider': 'google_genai', 'ls_model_name': 'gemini-2.5-flash', 'ls_model_type': 'chat', 'ls_temperature': 0.8}]


Receiving new event of type: messages...
[{'content': '', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'AIMessageChunk', 'name': None, 'id': 'lc_run--019b6ad6-ad1b-7b41-b54f-4a036915a66b', 'tool_calls': [], 'invalid_tool_calls': [], 'usage_metadata': None, 'tool_call_chunks': [], 'chunk_position': 'last'}, {'created_by': 'system', 'run_attempt': 1, 'langgraph_version': '1.0.5', 'langgraph_api_version': '0.6.15', 'langgraph_plan': 'developer', 'langgraph_host': 'self-hosted', 'langgraph_api_url': 'http://127.0.0.1:2024', 'langgraph_request_id': '801bbc7d-4632-4547-af68-0423559dbe6e', 'run_id': '019b6ad6-a6b5-7a22-b77f-321fea1bc3ac', 'thread_id': '10f988fd-6a23-4c5b-81de-0fe175d486e5', 'graph_id': 'agent', 'assistant_id': 'fe096781-5601-53d2-b2f6-0d3403f7e9ca', 'user_id': '', 'langgraph_step': 3, 'langgraph_node': 'agent', 'langgraph_triggers': ['branch:to:agent'], 'langgraph_path': ['__pregel_pull', 'agent'], 'langgraph_checkpoint_ns': 'agent:0cb14565-27f6-bd50-2e11-b4bf66695769', 'langgraph_auth_user_id': '', 'checkpoint_ns': 'agent:0cb14565-27f6-bd50-2e11-b4bf66695769', 'ls_provider': 'google_genai', 'ls_model_name': 'gemini-2.5-flash', 'ls_model_type': 'chat', 'ls_temperature': 0.8, 'LANGSMITH_LANGGRAPH_API_VARIANT': 'local_dev'}]



进程已结束,退出代码为 0

改进:“流式打印 AI 输出”的标准写法

from langgraph_sdk import get_sync_client

# 创建同步客户端,连接本地通过 `langgraph dev` 启动的 LangGraph 服务
client = get_sync_client(url="http://localhost:2024")

# 使用同步方式 + 流式接口运行 agent
for chunk in client.runs.stream(
        None,  # Thread ID = None,表示无状态的一次性调用
        "agent",  # agent 名称,对应 langgraph.json 中的 graph 名
        input={
            # 传递给 agent 的输入消息
            "messages": [{
                "role": "human",  # 消息角色:用户输入
                "content": "今天,广州的天气怎么样?",  # 输入内容
            }],
        },
        stream_mode="messages-tuple",  # 按 message 维度进行流式返回
):
    # 判断当前事件的数据是否是 AI 的流式输出片段
    if (
            isinstance(chunk.data, list)  # data 必须是 list
            and len(chunk.data) > 0  # list 不能为空
            and isinstance(chunk.data[0], dict)  # 第一个元素必须是 dict
            and chunk.data[0].get("type") == "AIMessageChunk"  # 判断是否是 AI 输出片段
    ):
        # 实时打印 AI 返回的内容(类似 ChatGPT 打字效果)
        print(chunk.data[0].get("content", ""), end="|", flush=True)

在这里插入图片描述

5.对Java的同学附带说明:


dict

  • 表示 Python 的字典类型

  • 在这里指的是:

    • chunk.data[0] 是一个 dict

    • 里面通常有字段如:

      {
        "type": "AIMessageChunk",
        "content": "今天天气"
      }
      

stream_mode="messages-tuple"

含义:

让 LangGraph 按“消息(message)粒度”流式返回数据

具体表现为:

  • chunk.datalist
  • list 里的每一项 → dict(一条消息片段)

例如:

chunk.data = [
  {
    "type": "AIMessageChunk",
    "content": "今天"
  }
]

一句话总结

stream_mode="messages-tuple" = 我们能逐条拿到 AI 消息的“碎片”,用于实时输出。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐