LangGraph条件分支配置报错:TypeError类型不匹配问题求助
问题原因及解决方法
错误根源
- 节点返回值不符合要求:LangGraph的节点函数必须返回与定义的状态类型(
PersonDetails)一致的对象,你的check_age直接返回字符串,会导致状态被覆盖为字符串类型,后续流程无法处理。 - 条件边用法错误:
add_conditional_edges的第二个参数需要是可调用对象/ Runnable,用于根据当前状态判断跳转目标,不能直接传入字典映射。
修正后的代码
from langgraph.graph import StateGraph, START, END from langchain_core.runnables import RunnableLambda from typing import TypedDict class PersonDetails(TypedDict): name: str age: int route: str # 新增路由字段,用于存储分支判断结果 # Nodes def greet(state: PersonDetails): print(f"Hello, {state['name']}!") return state def check_age(state: PersonDetails): age = state['age'] if age >= 21: return {**state, "route": "can_drink"} # 返回更新后的状态 elif age >= 16: return {**state, "route": "can_drive"} else: return {**state, "route": "minor"} def can_drink(state: PersonDetails): print("You can legally drink 🍺") return state def can_drive(state: PersonDetails): print("You can drive 🚗") return state def minor(state: PersonDetails): print("You're a minor 🚫") return state # Build graph graph = StateGraph(PersonDetails) graph.add_node("greet", greet) graph.add_node("check_age", check_age) # 无需用RunnableLambda包装,直接传函数 graph.add_node("can_drink", can_drink) graph.add_node("can_drive", can_drive) graph.add_node("minor", minor) # Edges graph.add_edge(START, "greet") graph.add_edge("greet", "check_age") # Conditional branching graph.add_conditional_edges( "check_age", lambda state: state["route"], # 从状态中读取路由值,返回目标节点名 ) graph.add_edge("can_drink", END) graph.add_edge("can_drive", END) graph.add_edge("minor", END) # Compile graph app = graph.compile() # 测试运行 if __name__ == "__main__": app.invoke({"name": "Alice", "age": 22}) app.invoke({"name": "Bob", "age": 17}) app.invoke({"name": "Charlie", "age": 12})
关键修改说明
- 给
PersonDetails新增route字段,用于存储check_age的分支判断结果,保证节点返回值始终符合状态类型要求。 - 修改
check_age函数,返回包含route字段的完整状态对象,而不是单独字符串。 add_conditional_edges中使用lambda函数从状态中提取route值,作为跳转的目标节点名称,符合方法对参数类型的要求。- 移除
check_age节点的RunnableLambda包装,普通函数只要符合「接收状态、返回状态」的要求,可直接作为节点添加。
内容的提问来源于stack exchange,提问作者Lijin Durairaj
相关产品推荐
相关产品推荐

