File size: 1,999 Bytes
16ab8a2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
from __future__ import annotations

from functools import partial

from langgraph.checkpoint.memory import InMemorySaver
from langgraph.graph import END, START, StateGraph

from api.client import GaiaApiClient
from config import Settings
from graph.routes import route_after_execute, route_after_verify
from graph.state import AgentState
from models.openrouter_model import OpenRouterModels
from nodes.answer_generator import generate_answer
from nodes.formatter import format_answer
from nodes.inspector import inspect_task
from nodes.planner import create_plan, revise_plan
from nodes.tool_executor import execute_next_tool
from nodes.verifier import verify_answer


def build_graph(settings: Settings, api_client: GaiaApiClient):
    models = OpenRouterModels(settings)
    builder = StateGraph(AgentState)

    builder.add_node("inspect", partial(inspect_task, settings=settings, api_client=api_client))
    builder.add_node("plan", partial(create_plan, model=models.reasoning))
    builder.add_node("execute", partial(execute_next_tool, settings=settings, models=models))
    builder.add_node("generate", partial(generate_answer, model=models.reasoning))
    builder.add_node("verify", partial(verify_answer, model=models.reasoning))
    builder.add_node("replan", partial(revise_plan, model=models.reasoning))
    builder.add_node("format", format_answer)

    builder.add_edge(START, "inspect")
    builder.add_edge("inspect", "plan")
    builder.add_edge("plan", "execute")
    builder.add_conditional_edges(
        "execute",
        partial(route_after_execute, settings=settings),
        {"execute": "execute", "generate": "generate"},
    )
    builder.add_edge("generate", "verify")
    builder.add_conditional_edges(
        "verify",
        partial(route_after_verify, settings=settings),
        {"format": "format", "replan": "replan"},
    )
    builder.add_edge("replan", "execute")
    builder.add_edge("format", END)

    return builder.compile(checkpointer=InMemorySaver())