You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LangGraph条件分支配置报错:TypeError类型不匹配问题求助

问题原因及解决方法

错误根源

  1. 节点返回值不符合要求:LangGraph的节点函数必须返回与定义的状态类型(PersonDetails)一致的对象,你的check_age直接返回字符串,会导致状态被覆盖为字符串类型,后续流程无法处理。
  2. 条件边用法错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 16:12:22