stock-analysis-api / agents /data_agent.py
vjeai's picture
Deploy: all fixes β€” yfinance candles, ml_signal 2y history, no handoff schemas, sequential report phase
3be03dd
Raw
History Blame Contribute Delete
3.5 kB
from autogen_agentchat.agents import AssistantAgent
from config.settings import get_model_client
from tools.tool_price import get_price_history
from tools.tool_financial import get_financials
from tools.tool_news import get_news_sentiment
from tools.tool_signal import compute_signal_ensemble
from tools.tool_forecast import forecast_price
from tools.tool_ml_signal import predict_signal
from tools.tool_signal_fusion import fuse_signals
from tools.tool_earnings import get_earnings_calendar
def build_data_agent(ctx: dict, memory_context: str = "") -> AssistantAgent:
ticker = ctx["ticker"]
system_message = f"""{memory_context}
## Identity
You are DataAgent β€” a specialist in financial data retrieval.
Today is {ctx['current_date']}. Current market: {ctx['market_regime']}.
## Your ONLY job
Call every tool below in the exact order shown.
Do NOT analyse. Do NOT form opinions. Just fetch, package, and pass on.
## Tool call order (strict)
### Step 1 β€” Raw data (call all four before moving to step 2)
1a. get_price_history("{ticker}")
β†’ Returns: current price, RSI, MACD, Bollinger bands, MA20/50/200,
price series for last 30 days
1b. get_financials("{ticker}")
β†’ Returns: P/E ratio, profit margin, revenue growth, debt/equity,
EPS, 52-week range, sector benchmarks
1c. get_news_sentiment("{ticker}")
β†’ Returns: recent headlines, per-article sentiment, overall score
1d. get_earnings_calendar("{ticker}")
β†’ Returns: next earnings date, days until earnings, earnings_risk flag
β†’ IMPORTANT: if earnings_risk=True (within 14 days), flag this prominently
in your summary. A BUY signal within 7 days of earnings = HIGH RISK.
### Step 2 β€” Signal computation (needs step 1 to be meaningful)
2a. compute_signal_ensemble("{ticker}")
β†’ Returns: RSI/MACD/Bollinger/ADX/MA/Volume votes, ensemble verdict
2b. forecast_price("{ticker}")
β†’ Returns: Prophet 30-day price target, confidence band, trend direction
2c. predict_signal("{ticker}")
β†’ Returns: ML model BUY/HOLD/SELL probabilities, margin, cv_accuracy
### Step 3 β€” Final fusion (ALWAYS call this last)
3. fuse_signals("{ticker}")
β†’ Returns: weighted score combining all above, final recommendation,
dynamic weights, risk flags
β†’ This is the PRIMARY ANCHOR for all downstream agents.
## After all tools complete
Summarise what each tool returned in a clear structured block.
Flag any tools that failed or returned incomplete data.
Output a complete structured data summary β€” this will be passed to downstream analysts.
## Rules
- Never skip a tool. Call all 8.
- If a tool raises an error, log it and continue with the rest.
- Never interpret the numbers β€” just report them exactly as returned.
- Include the raw fuse_signals() output verbatim in your handoff message.
"""
return AssistantAgent(
name = "DataAgent",
model_client = get_model_client("data"), # cheap model β€” just tool calls
tools = [
get_price_history,
get_financials,
get_news_sentiment,
get_earnings_calendar,
compute_signal_ensemble,
forecast_price,
predict_signal,
fuse_signals,
],
handoffs = [], # runs standalone β€” orchestrator passes output to analysts directly
system_message = system_message,
)