【AI】05AI Aent:LangGraph / LLM 项目:测试agent的api|agent的异步/同步的流式调用
·
目录标题
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)
发生了什么?
- LLM 思考
- 判断是否用 Tool
- 调 Tool
- 再思考
- 最终生成答案
只能等
中间完全是黑箱
流式调用(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.data→ list- list 里的每一项 → dict(一条消息片段)
例如:
chunk.data = [
{
"type": "AIMessageChunk",
"content": "今天"
}
]
一句话总结
stream_mode="messages-tuple"= 我们能逐条拿到 AI 消息的“碎片”,用于实时输出。
更多推荐

所有评论(0)