"""LangGraph graph definition and compilation.""" from dotenv import load_dotenv from langgraph.graph import END, StateGraph from src.nodes.call_llm import call_llm from src.nodes.construct_prompt import construct_prompt from src.nodes.reflection import reflection from src.nodes.retrieve_context import retrieve_context from src.nodes.update_memory import update_memory from src.routing import route_after_memory_update from src.schemas.state import WalkState load_dotenv() def build_graph() -> StateGraph: """Build and compile the WalkXR role-play graph.""" graph = StateGraph(WalkState) # Register nodes graph.add_node("retrieve_context", retrieve_context) graph.add_node("construct_prompt", construct_prompt) graph.add_node("call_llm", call_llm) graph.add_node("update_memory", update_memory) graph.add_node("reflection", reflection) # Connect edges graph.set_entry_point("retrieve_context") graph.add_edge("retrieve_context", "construct_prompt") graph.add_edge("construct_prompt", "call_llm") graph.add_edge("call_llm", "update_memory") # Conditional branching after update_memory graph.add_conditional_edges( "update_memory", route_after_memory_update, { "reflection": "reflection", "end": END, }, ) # reflection -> END graph.add_edge("reflection", END) return graph.compile() # Singleton instance app = build_graph()