File size: 3,742 Bytes
b4856f1
2473009
b4856f1
752f5cc
b4856f1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
752f5cc
b4856f1
2473009
752f5cc
b4856f1
 
 
 
 
 
752f5cc
b4856f1
 
752f5cc
b4856f1
 
 
 
752f5cc
b4856f1
 
 
 
 
b4c4175
 
 
 
752f5cc
b4856f1
752f5cc
b4856f1
 
 
 
 
 
752f5cc
b4856f1
752f5cc
b4856f1
 
752f5cc
b4856f1
 
752f5cc
b4856f1
 
752f5cc
b4856f1
 
 
 
 
 
 
752f5cc
b4856f1
 
 
752f5cc
b4856f1
752f5cc
b4856f1
2473009
b4856f1
 
 
 
 
 
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
"""
RogerGraph.py - Main Roger Graph with Fan-Out/Fan-In Architecture
"""

from __future__ import annotations
import logging
from langgraph.graph import StateGraph, START, END

from src.states.combinedAgentState import CombinedAgentState
from src.nodes.combinedAgentNode import CombinedAgentNode
from src.graphs.dataRetrievalAgentGraph import DataRetrievalAgentGraph
from src.graphs.meteorologicalAgentGraph import MeteorologicalGraphBuilder
from src.graphs.politicalAgentGraph import PoliticalGraphBuilder
from src.graphs.economicalAgentGraph import EconomicalGraphBuilder
from src.graphs.intelligenceAgentGraph import IntelligenceGraphBuilder
from src.graphs.socialAgentGraph import SocialGraphBuilder
from src.llms.groqllm import GroqLLM

logger = logging.getLogger("Roger_graph")
logger.setLevel(logging.INFO)
if not logger.handlers:
    ch = logging.StreamHandler()
    ch.setFormatter(logging.Formatter("[%(levelname)s] %(message)s"))
    logger.addHandler(ch)


class CombinedAgentGraphBuilder:
    def __init__(self, llm):
        self.llm = llm

    def build_graph(self):
        logger.info("Building Roger Combined Agent Graph")

        social_builder = SocialGraphBuilder(self.llm)
        intelligence_builder = IntelligenceGraphBuilder(self.llm)
        economical_builder = EconomicalGraphBuilder(self.llm)
        political_builder = PoliticalGraphBuilder(self.llm)
        meteorological_builder = MeteorologicalGraphBuilder(self.llm)
        data_retrieval_builder = DataRetrievalAgentGraph(self.llm)

        orchestrator = CombinedAgentNode(self.llm)
        workflow = StateGraph(CombinedAgentState)

        workflow.add_node("GraphInitiator", orchestrator.graph_initiator)
        workflow.add_node("FeedAggregatorAgent", orchestrator.feed_aggregator_agent)
        workflow.add_node("DataRefresherAgent", orchestrator.data_refresher_agent)
        workflow.add_node("DataRefreshRouter", orchestrator.data_refresh_router)

        workflow.add_node("SocialAgent", social_builder.build_graph())
        workflow.add_node("IntelligenceAgent", intelligence_builder.build_graph())
        workflow.add_node("EconomicalAgent", economical_builder.build_graph())
        workflow.add_node("PoliticalAgent", political_builder.build_graph())
        workflow.add_node("MeteorologicalAgent", meteorological_builder.build_graph())
        workflow.add_node(
            "DataRetrievalAgent",
            data_retrieval_builder.build_data_retrieval_agent_graph(),
        )

        workflow.add_edge(START, "GraphInitiator")

        domain_agents = [
            "SocialAgent",
            "IntelligenceAgent",
            "EconomicalAgent",
            "PoliticalAgent",
            "MeteorologicalAgent",
            "DataRetrievalAgent",
        ]

        for agent in domain_agents:
            workflow.add_edge("GraphInitiator", agent)

        for agent in domain_agents:
            workflow.add_edge(agent, "FeedAggregatorAgent")

        workflow.add_edge("FeedAggregatorAgent", "DataRefresherAgent")
        workflow.add_edge("DataRefresherAgent", "DataRefreshRouter")

        def route_decision(state):
            route = getattr(state, "route", [])
            if route is None or route == "":
                return END
            if route == "GraphInitiator":
                return "GraphInitiator"
            return END

        workflow.add_conditional_edges(
            "DataRefreshRouter",
            route_decision,
            {"GraphInitiator": "GraphInitiator", END: END},
        )

        graph = workflow.compile()
        logger.info("Roger Graph compiled successfully")
        return graph


llm = GroqLLM().get_llm()
builder = CombinedAgentGraphBuilder(llm)
graph = builder.build_graph()