from typing import Dict, Any from langgraph.graph import END, StateGraph, START from langgraph.prebuilt import ToolNode from tradingagents.agents import * from tradingagents.agents.utils.agent_states import AgentState from .conditional_logic import ConditionalLogic class GraphSetup: """Handles the setup and configuration of the agent graph.""" def __init__( self, role_llms: Dict[str, Any], tool_nodes: Dict[str, ToolNode], bull_memory, bear_memory, trader_memory, invest_judge_memory, risk_manager_memory, conditional_logic: ConditionalLogic, ): """Initialize with required components.""" self.role_llms = role_llms self.tool_nodes = tool_nodes self.bull_memory = bull_memory self.bear_memory = bear_memory self.trader_memory = trader_memory self.invest_judge_memory = invest_judge_memory self.risk_manager_memory = risk_manager_memory self.conditional_logic = conditional_logic def _get_llm(self, role: str): if role not in self.role_llms: raise ValueError(f"Missing LLM assignment for role: {role}") return self.role_llms[role] def setup_graph( self, selected_analysts=["market", "social", "news", "fundamentals"] ): """Set up and compile the agent workflow graph.""" if len(selected_analysts) == 0: raise ValueError("Trading Agents Graph Setup Error: no analysts selected!") analyst_nodes = {} delete_nodes = {} tool_nodes = {} if "market" in selected_analysts: analyst_nodes["market"] = create_market_analyst( self._get_llm("market") ) delete_nodes["market"] = create_msg_delete() tool_nodes["market"] = self.tool_nodes["market"] if "social" in selected_analysts: analyst_nodes["social"] = create_social_media_analyst( self._get_llm("social") ) delete_nodes["social"] = create_msg_delete() tool_nodes["social"] = self.tool_nodes["social"] if "news" in selected_analysts: analyst_nodes["news"] = create_news_analyst( self._get_llm("news") ) delete_nodes["news"] = create_msg_delete() tool_nodes["news"] = self.tool_nodes["news"] if "fundamentals" in selected_analysts: analyst_nodes["fundamentals"] = create_fundamentals_analyst( self._get_llm("fundamentals") ) delete_nodes["fundamentals"] = create_msg_delete() tool_nodes["fundamentals"] = self.tool_nodes["fundamentals"] bull_researcher_node = create_bull_researcher( self._get_llm("bull_researcher"), self.bull_memory ) bear_researcher_node = create_bear_researcher( self._get_llm("bear_researcher"), self.bear_memory ) research_manager_node = create_research_manager( self._get_llm("research_manager"), self.invest_judge_memory ) trader_node = create_trader( self._get_llm("trader"), self.trader_memory ) aggressive_analyst = create_aggressive_debator( self._get_llm("aggressive_analyst") ) neutral_analyst = create_neutral_debator( self._get_llm("neutral_analyst") ) conservative_analyst = create_conservative_debator( self._get_llm("conservative_analyst") ) risk_manager_node = create_risk_manager( self._get_llm("portfolio_manager"), self.risk_manager_memory ) workflow = StateGraph(AgentState) for analyst_type, node in analyst_nodes.items(): workflow.add_node(f"{analyst_type.capitalize()} Analyst", node) workflow.add_node( f"Msg Clear {analyst_type.capitalize()}", delete_nodes[analyst_type] ) workflow.add_node(f"tools_{analyst_type}", tool_nodes[analyst_type]) workflow.add_node("Bull Researcher", bull_researcher_node) workflow.add_node("Bear Researcher", bear_researcher_node) workflow.add_node("Research Manager", research_manager_node) workflow.add_node("Trader", trader_node) workflow.add_node("Aggressive Analyst", aggressive_analyst) workflow.add_node("Neutral Analyst", neutral_analyst) workflow.add_node("Conservative Analyst", conservative_analyst) workflow.add_node("Risk Judge", risk_manager_node) first_analyst = selected_analysts[0] workflow.add_edge(START, f"{first_analyst.capitalize()} Analyst") for i, analyst_type in enumerate(selected_analysts): current_analyst = f"{analyst_type.capitalize()} Analyst" current_tools = f"tools_{analyst_type}" current_clear = f"Msg Clear {analyst_type.capitalize()}" workflow.add_conditional_edges( current_analyst, getattr(self.conditional_logic, f"should_continue_{analyst_type}"), [current_tools, current_clear], ) workflow.add_edge(current_tools, current_analyst) if i < len(selected_analysts) - 1: next_analyst = f"{selected_analysts[i+1].capitalize()} Analyst" workflow.add_edge(current_clear, next_analyst) else: workflow.add_edge(current_clear, "Bull Researcher") workflow.add_conditional_edges( "Bull Researcher", self.conditional_logic.should_continue_debate, { "Bear Researcher": "Bear Researcher", "Research Manager": "Research Manager", }, ) workflow.add_conditional_edges( "Bear Researcher", self.conditional_logic.should_continue_debate, { "Bull Researcher": "Bull Researcher", "Research Manager": "Research Manager", }, ) workflow.add_edge("Research Manager", "Trader") workflow.add_edge("Trader", "Aggressive Analyst") workflow.add_conditional_edges( "Aggressive Analyst", self.conditional_logic.should_continue_risk_analysis, { "Conservative Analyst": "Conservative Analyst", "Risk Judge": "Risk Judge", }, ) workflow.add_conditional_edges( "Conservative Analyst", self.conditional_logic.should_continue_risk_analysis, { "Neutral Analyst": "Neutral Analyst", "Risk Judge": "Risk Judge", }, ) workflow.add_conditional_edges( "Neutral Analyst", self.conditional_logic.should_continue_risk_analysis, { "Aggressive Analyst": "Aggressive Analyst", "Risk Judge": "Risk Judge", }, ) workflow.add_edge("Risk Judge", END) return workflow.compile()