|
from langgraph.graph import StateGraph, END |
|
from .state import AgentState, AgentState2 |
|
from .portfolio_analyzer import portfolio_analyzer |
|
from .news_analyzer import news_analyzer |
|
from .technical_analyzer import technical_analyzer |
|
from .recommendation_engine import recommendation_engine |
|
from .rag_analyzer import rag_analyzer |
|
from .zacks_analyzer import zacks_analyzer |
|
from .new_investment_recommender import new_investment_recommender |
|
from .new_stock_analyzer import new_stock_analyzer |
|
from .portfolio_fit_evaluator import portfolio_fit_evaluator |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def setup_graph_with_tracking(progress_callback=None): |
|
"""Set up and compile the LangGraph workflow with progress tracking and direct sequential flow. |
|
|
|
The workflow follows a fixed sequence without a supervisor: |
|
TechnicalAnalyzer -> PortfolioAnalyzer -> NewsAnalyzer -> RAGAnalyzer -> RecommendationEngine -> END |
|
""" |
|
|
|
workflow = StateGraph(AgentState) |
|
|
|
|
|
workflow.add_node("PortfolioAnalyzer", |
|
lambda state: progress_callback(portfolio_analyzer(state)) if progress_callback else portfolio_analyzer(state)) |
|
|
|
workflow.add_node("NewsAnalyzer", |
|
lambda state: progress_callback(news_analyzer(state)) if progress_callback else news_analyzer(state)) |
|
|
|
workflow.add_node("TechnicalAnalyzer", |
|
lambda state: progress_callback(technical_analyzer(state)) if progress_callback else technical_analyzer(state)) |
|
|
|
workflow.add_node("RAGAnalyzer", |
|
lambda state: progress_callback(rag_analyzer(state)) if progress_callback else rag_analyzer(state)) |
|
|
|
workflow.add_node("RecommendationEngine", |
|
lambda state: progress_callback(recommendation_engine(state)) if progress_callback else recommendation_engine(state)) |
|
|
|
|
|
workflow.add_edge("TechnicalAnalyzer", "PortfolioAnalyzer") |
|
workflow.add_edge("PortfolioAnalyzer", "NewsAnalyzer") |
|
workflow.add_edge("NewsAnalyzer", "RAGAnalyzer") |
|
workflow.add_edge("RAGAnalyzer", "RecommendationEngine") |
|
workflow.add_edge("RecommendationEngine", END) |
|
|
|
|
|
workflow.set_entry_point("TechnicalAnalyzer") |
|
|
|
return workflow.compile() |
|
|
|
def setup_new_investments_graph(progress_callback=None): |
|
"""Set up and compile a LangGraph workflow for finding new investment opportunities. |
|
|
|
The workflow follows a fixed sequence: |
|
ZacksAnalyzer -> NewStockAnalyzer -> PortfolioFitEvaluator -> NewInvestmentRecommender -> END |
|
|
|
This workflow: |
|
1. Fetches high-ranked stocks from Zacks |
|
2. Performs technical analysis only on these new stocks |
|
3. Evaluates how these new stocks fit into the existing portfolio |
|
4. Recommends only stocks that have been properly analyzed |
|
""" |
|
|
|
workflow = StateGraph(AgentState2) |
|
|
|
|
|
workflow.add_node("ZacksAnalyzer", |
|
lambda state: progress_callback(zacks_analyzer(state)) if progress_callback else zacks_analyzer(state)) |
|
|
|
|
|
workflow.add_node("NewStockAnalyzer", |
|
lambda state: progress_callback(new_stock_analyzer(state)) if progress_callback else new_stock_analyzer(state)) |
|
|
|
|
|
workflow.add_node("PortfolioFitEvaluator", |
|
lambda state: progress_callback(portfolio_fit_evaluator(state)) if progress_callback else portfolio_fit_evaluator(state)) |
|
|
|
|
|
workflow.add_node("NewInvestmentRecommender", |
|
lambda state: progress_callback(new_investment_recommender(state)) if progress_callback else new_investment_recommender(state)) |
|
|
|
|
|
workflow.add_edge("ZacksAnalyzer", "NewStockAnalyzer") |
|
workflow.add_edge("NewStockAnalyzer", "PortfolioFitEvaluator") |
|
workflow.add_edge("PortfolioFitEvaluator", "NewInvestmentRecommender") |
|
workflow.add_edge("NewInvestmentRecommender", END) |
|
|
|
|
|
workflow.set_entry_point("ZacksAnalyzer") |
|
|
|
return workflow.compile() |