WalkXR-AI / src / walkxr_ai / core / graph.py
graph.py
Raw

"""
graph.py

Builds the core WalkXR LangGraph workflow for a single turn.
"""

from __future__ import annotations
from langgraph.graph import END, START, StateGraph
from walkxr_ai.core.state import WalkState
from walkxr_ai.core.routing import (
    route_after_call_llm,
    route_after_supervisor_score,
    route_after_update_conversation_history,
)
from walkxr_ai.core.nodes import (
    build_call_llm_node,
    build_retrieve_context_node,
    construct_prompt,
    update_conversation_history,
    build_call_supervisor_node,
    build_update_memory_node,
    fail_safe_response,
)


def build_graph(retrieval_engine, user_memory_store, responder, memory_extractor):
    """
    Build and compile WalkXR LangGraph for one conversation turn.
    """
    graph = StateGraph(WalkState)

    retrieve_context = build_retrieve_context_node(retrieval_engine, user_memory_store)
    call_llm = build_call_llm_node(responder)
    call_supervisor = build_call_supervisor_node(responder)
    update_memory = build_update_memory_node(memory_extractor)

    graph.add_node("retrieve_context", retrieve_context)
    graph.add_node("construct_prompt", construct_prompt)
    graph.add_node("call_llm", call_llm)
    graph.add_node("call_supervisor", call_supervisor)
    graph.add_node("fail_safe_response", fail_safe_response)
    graph.add_node("update_conversation_history", update_conversation_history)
    graph.add_node("update_memory", update_memory)

    graph.add_edge(START, "retrieve_context")
    graph.add_edge("retrieve_context", "construct_prompt")
    graph.add_edge("construct_prompt", "call_llm")
    graph.add_conditional_edges("call_llm", route_after_call_llm,
        {
            "call_supervisor": "call_supervisor",
            "error": END,
        },
    )
    graph.add_conditional_edges("call_supervisor", route_after_supervisor_score,
        {
            "loop": "call_llm",
            "fail-safe": "fail_safe_response",
            "exit": "update_conversation_history"
        }
    )
    graph.add_edge("fail_safe_response", "update_conversation_history")
    graph.add_conditional_edges("update_conversation_history", route_after_update_conversation_history,
        {
            "update_memory": "update_memory",
            "end": END,
        },
    )
    graph.add_edge("update_memory", END)

    return graph.compile()