之前我们使用最多的可能是TypedDict,但是Pydantic model也是一个很好的选择,下面看一下这个类型如何作为graph state吧。from langgraph.graph import StateGraph, START, END
from typing_extensions import TypedDict
from pydantic import BaseModel
# 图的整体状态(这是节点之间共享的公共状态)
class OverallState(BaseModel):
a: str
def node(state: OverallState):
return {"a": "再见"}
# 构建状态图
builder = StateGraph(OverallState)
builder.add_node(node) # node_1 是第一个节点
builder.add_edge(START, "node") # 以 node_1 开始图
builder.add_edge("node", END) # 在 node_1 之后结束图
graph = builder.compile()
# 使用有效输入测试图
graph.invoke({"a": "你好"})
我们在OverallState的时候继承了BaseModel,并且a的属性定义为str类型,如果我们输入是正确的,它会输出:try:
graph.invoke({"a": 123}) # Should be a string
except Exception as e:
print("An exception was raised because `a` is an integer rather than a string.")
print(e)
An exception was raised because `a` is an integer rather than a string.
1 validation error for OverallState
a
Input should be a valid string [type=string_type, input_value=123, input_type=int]
For further information visit https:
运行时验证也适用于多节点图。在下面的示例中,bad_node 将 a 更新为integer。因为运行时验证发生在输入上,所以在调用 ok_node 时会发生验证错误(而不是在 bad_node 返回与模式不一致的状态更新时)。from langgraph.graph import StateGraph, START, END
from typing_extensions import TypedDict
from pydantic import BaseModel
# 图的整体状态(这是节点之间共享的公共状态)
class OverallState(BaseModel):
a: str
def bad_node(state: OverallState):
return {
"a": 123 # 无效
}
def ok_node(state: OverallState):
return {"a": "goodbye"}
# 构建状态图
builder = StateGraph(OverallState)
builder.add_node(bad_node)
builder.add_node(ok_node)
builder.add_edge(START, "bad_node")
builder.add_edge("bad_node", "ok_node")
builder.add_edge("ok_node", END)
graph = builder.compile()
# 使用有效输入测试图
try:
graph.invoke({"a": "hello"})
except Exception as e:
print("由于 bad_node 将 `a` 设置为整数,引发了异常。")
print(e)
注意,他会在转换的时候就会报错,而不是去update的时候发现类型不对才去报错。