diff --git a/backend/app/main_graph/nodes/__init__.py b/backend/app/main_graph/nodes/__init__.py index 9401c40..ed5cc91 100644 --- a/backend/app/main_graph/nodes/__init__.py +++ b/backend/app/main_graph/nodes/__init__.py @@ -2,18 +2,42 @@ 主图节点模块导出 """ -from .router import should_continue +# 新的 React 模式节点 +from .react_nodes import ( + init_state_node, + react_reason_node, + web_search_node, + error_handling_node, + route_by_reasoning +) from .llm_call import create_llm_call_node -from .tool_call import create_tool_call_node +from .rag_nodes import rag_retrieve_node + +# 记忆节点(已更新到 MainGraphState) from .retrieve_memory import create_retrieve_memory_node +from .memory_trigger import memory_trigger_node, set_mem0_client from .summarize import create_summarize_node from .finalize import finalize_node +# 路由(已更新到 MainGraphState) +from .router import should_continue + __all__ = [ - "should_continue", + # React 模式节点 + "init_state_node", + "react_reason_node", + "web_search_node", + "error_handling_node", + "route_by_reasoning", + # 通用节点 "create_llm_call_node", - "create_tool_call_node", + "rag_retrieve_node", + # 记忆节点 "create_retrieve_memory_node", + "memory_trigger_node", + "set_mem0_client", "create_summarize_node", "finalize_node", + # 路由 + "should_continue", ] diff --git a/backend/app/main_graph/nodes/router.py b/backend/app/main_graph/nodes/router.py index 552dce9..b5fd203 100644 --- a/backend/app/main_graph/nodes/router.py +++ b/backend/app/main_graph/nodes/router.py @@ -8,11 +8,11 @@ from langchain_core.messages import AIMessage # 本地模块 from app.config import ENABLE_GRAPH_TRACE, MEMORY_SUMMARIZE_INTERVAL -from app.main_graph.state import MessagesState +from app.main_graph.state import MainGraphState from app.logger import info -def should_continue(state: MessagesState) -> Literal['tool_node', 'summarize', 'finalize']: +def should_continue(state: MainGraphState) -> Literal['tool_node', 'summarize', 'finalize']: """ 决定下一步:工具调用、生成摘要还是结束 @@ -22,7 +22,7 @@ def should_continue(state: MessagesState) -> Literal['tool_node', 'summarize', ' Returns: 下一个节点名称 """ - last_message = state["messages"][-1] + last_message = state.messages[-1] # 1. 如果需要调用工具,优先进入工具节点 if isinstance(last_message, AIMessage) and last_message.tool_calls: @@ -32,7 +32,7 @@ def should_continue(state: MessagesState) -> Literal['tool_node', 'summarize', ' # 2. 如果是 AI 的最终回复,判断是否达到摘要生成阈值 if isinstance(last_message, AIMessage): - turns = state.get("turns_since_last_summary", 0) + turns = state.turns_since_last_summary if turns >= MEMORY_SUMMARIZE_INTERVAL: if ENABLE_GRAPH_TRACE: info(f"🔀 [路由决策] 收到 AI 最终回复,已达摘要阈值({turns}/{MEMORY_SUMMARIZE_INTERVAL}) → 转向 'summarize'")