"""
routing.py
Routing helpers for the WalkXR LangGraph workflow.
These functions keep conditional graph logic separate from graph construction,
so branching decisions are easy to read and extend later.
"""
from __future__ import annotations
from walkxr_ai.core.state import WalkState
MEMORY_UPDATE_INTERVAL = 10
def route_after_call_llm(state: WalkState) -> str:
"""
Routes the graph after the call_llm node.
Returns:
- "error" if the LLM step failed
- "call_supervisor" if the response was generated successfully
"""
if state.get("error"):
return "error"
return "call_supervisor"
def route_after_supervisor_score(state: WalkState) -> str:
"""
Routes the graph after the reflection node.
Returns:
- "exit" if the supervisor scored the llm response as "good"
or maximum response generation attempts have been reached
- "loop" if the supervisor scored the llm response as "bad"
"""
if state["supervisor_score"] == "good":
return "exit"
elif state["supervisor_retries"] >= state["max_retries_allowed"]:
return "fail-safe"
return "loop"
def route_after_update_conversation_history(state: WalkState) -> str:
"""
Routes the graph after the conversation history has been updated.
Returns:
- "update_memory" when the current completed turn hits the memory interval
- "end" otherwise
"""
completed_turn = state.get("turn_index", 0) + 1
# Update memory every MEMORY_UPDATE_INTERVAL turns
if completed_turn % MEMORY_UPDATE_INTERVAL == 0:
return "update_memory"
return "end"