lucifer7210's picture
Upload 16 files
c04ca05 verified
# main.py
from fastapi import FastAPI, HTTPException, Depends
from fastapi.middleware.cors import CORSMiddleware # If Streamlit runs on a different port
from typing import Dict, List
from services.data_fetcher import IndianMarketDataFetcher
from services.analyzer import IndianFinancialAnalyzer
from services.swarm_service import create_indian_market_swarm
from models.market_data import StockDataResponse, IndexData, SectorPerformance, EconomicIndicators
from models.analysis import StockAnalysisResponse, SwarmAnalysisResponse, InvestmentRecommendationResponse
from config import NIFTY50_COMPANIES
app = FastAPI(title="Indian Market Analysis API", version="1.0.0")
# Configure CORS if needed (e.g., if Streamlit runs on localhost:8501)
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # Restrict this in production!
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# Dependency Injection for services
def get_data_fetcher():
return IndianMarketDataFetcher()
def get_analyzer():
return IndianFinancialAnalyzer()
# --- API Endpoints ---
@app.get("/")
async def root():
return {"message": "Indian Market Analysis API"}
# --- Market Data Endpoints ---
@app.get("/api/market/indices", response_model=Dict[str, IndexData])
async def get_market_indices(fetcher: IndianMarketDataFetcher = Depends(get_data_fetcher)):
"""Get live market indices data."""
return fetcher.get_market_indices()
@app.get("/api/market/sectors", response_model=Dict[str, SectorPerformance])
async def get_sector_performance(fetcher: IndianMarketDataFetcher = Depends(get_data_fetcher)):
"""Get sector performance data."""
return fetcher.get_sector_performance()
@app.get("/api/market/economic", response_model=EconomicIndicators)
async def get_economic_indicators(analyzer: IndianFinancialAnalyzer = Depends(get_analyzer)):
"""Get key economic indicators."""
return EconomicIndicators(
repo_rate=analyzer.rbi_repo_rate,
inflation_rate=analyzer.indian_inflation_rate
)
# --- Stock Data Endpoints ---
@app.get("/api/stocks/list", response_model=Dict[str, str])
async def get_nifty50_list(fetcher: IndianMarketDataFetcher = Depends(get_data_fetcher)):
"""Get the list of Nifty 50 companies."""
return fetcher.get_nifty50_companies()
@app.get("/api/stocks/{symbol}", response_model=StockDataResponse)
async def get_stock_data(symbol: str, period: str = "1y", fetcher: IndianMarketDataFetcher = Depends(get_data_fetcher)):
"""Get detailed stock data for a given symbol."""
stock_data = fetcher.get_stock_data(symbol, period)
if not stock_data:
raise HTTPException(status_code=404, detail=f"Data for stock symbol {symbol} could not be fetched.")
return stock_data
# --- Analysis Endpoints ---
@app.post("/api/analysis/stock/{symbol}", response_model=StockAnalysisResponse)
async def analyze_stock(symbol: str, period: str = "1y",
fetcher: IndianMarketDataFetcher = Depends(get_data_fetcher),
analyzer: IndianFinancialAnalyzer = Depends(get_analyzer)):
"""Perform basic financial analysis on a stock."""
stock_data = fetcher.get_stock_data(symbol, period)
if not stock_data:
raise HTTPException(status_code=404, detail=f"Data for stock symbol {symbol} could not be fetched.")
company_name = NIFTY50_COMPANIES.get(symbol, symbol)
return analyzer.analyze_indian_stock(stock_data, company_name)
@app.post("/api/analysis/swarm/{symbol}", response_model=SwarmAnalysisResponse)
async def run_swarm_analysis(symbol: str, period: str = "1y",
fetcher: IndianMarketDataFetcher = Depends(get_data_fetcher),
analyzer: IndianFinancialAnalyzer = Depends(get_analyzer)):
"""Run AI swarm analysis on a stock."""
stock_data = fetcher.get_stock_data(symbol, period)
if not stock_data:
return SwarmAnalysisResponse(status="error", error=f"Data for stock symbol {symbol} could not be fetched.")
company_name = NIFTY50_COMPANIES.get(symbol, symbol)
# Perform basic analysis first
basic_analysis_response = analyzer.analyze_indian_stock(stock_data, company_name)
basic_analysis_text = basic_analysis_response.basic_analysis
# Prepare data for swarm analysis
market_data_summary = f"""
Stock: {company_name} ({symbol})
Current Price: ₹{stock_data.history.get('Close', [0])[-1] if stock_data.history.get('Close') else 'N/A'}
Market Data Analysis: {basic_analysis_text}
"""
# Run swarm analysis
return create_indian_market_swarm(market_data_summary, company_name)
@app.get("/api/analysis/recommendation", response_model=InvestmentRecommendationResponse)
async def get_investment_recommendation(analyzer: IndianFinancialAnalyzer = Depends(get_analyzer)):
"""Get general investment recommendations."""
return analyzer.generate_investment_recommendation()
# --- Utility Endpoints ---
@app.get("/api/health")
async def health_check():
"""Health check endpoint."""
return {"status": "ok"}