多种状态,Reducer合并状态

全局,局部(私有),输入状态,输出状态

from typing import TypedDict
from langgraph.graph import StateGraph, START, END

class InputState(TypedDict):
username: str

class OutputState(TypedDict):
graph_output: str

class OverAllState(TypedDict):
nickname: str
username: str
graph_output: str

class PrivateState(TypedDict):
greeting: str

def node_1(state: InputState) -> OverAllState:
# 向全局状态写入数据
return {
"nickname": "Dear " + state["username"]
}

def node_2(state: OverAllState) -> PrivateState:
# 从全局状态读取数据,写入私有状态
return {
"greeting": state["nickname"] + ", 早上好~"
}

def node_3(state: PrivateState) -> OutputState:
# 从私有状态读取数据,写入输出状态
return {
"graph_output": state["greeting"] + " 很高兴认识你!"
}

builder = StateGraph(OverAllState,input_schema=InputState,output_schema=OutputState)
builder.add_node("node_1", node_1)
builder.add_node("node_2", node_2)
builder.add_node("node_3", node_3)
builder.add_edge(START, "node_1")
builder.add_edge("node_1", "node_2")
builder.add_edge("node_2", "node_3")
builder.add_edge("node_3", END)

graph = builder.compile()
print(graph.invoke({"username":"小黄"}))

 

InputState 用于约束图的外部输入。

OverAllState 是图内部主要使用的状态 Schema。

其中:

  • username 来自图的输入;
  • nicknamenode_1 写入;
  • graph_outputnode_3 写入,并最终作为图的输出返回。
  • PrivateState 用于节点之间传递临时数据。

OutputState 用于约束图最终返回给外部调用方的数据。

 

 合并状态的方法:

operater.add:

列表直接拼接

add_massage合并消息:

消息专用 reducer,核心是"智能追加":

  • 新消息追加到末尾;
  • 同 id 的消息会替换而不是重复(工具调用的 ToolMessage 就是靠这个配对);
  • 兼容单条消息或消息列表,类型安全。

 

自定义合并消息的方式继承MessagesState

 

posted @ 2026-08-19 17:14  jokercheems  阅读(5)  评论(0)    收藏  举报