""" API Routes - RESTful endpoints for AegisAI """ from fastapi import APIRouter, HTTPException, Query from typing import Optional, List from pydantic import BaseModel import base64 from services.database_service import db_service from agents.vision_agent import VisionAgent from agents.planner_agent import PlannerAgent router = APIRouter(prefix="/api", tags=["api"]) # Initialize agents (singleton pattern) vision_agent = VisionAgent() planner_agent = PlannerAgent() # ============================================================================ # Request/Response Models # ============================================================================ class AnalyzeRequest(BaseModel): image: str # Base64 encoded image class AnalyzeResponse(BaseModel): incident: bool type: str severity: str confidence: float reasoning: str subjects: List[str] recommended_actions: List[str] class IncidentResponse(BaseModel): id: int timestamp: str type: str severity: str confidence: float reasoning: str subjects: List[str] evidence_path: str status: str created_at: str class StatsResponse(BaseModel): total_incidents: int active_incidents: int severity_breakdown: dict recent_24h: int system_status: str class HealthResponse(BaseModel): status: str components: dict timestamp: str # ============================================================================ # Endpoints # ============================================================================ @router.get("/") async def root(): """API root endpoint""" return { "name": "AegisAI API", "version": "2.5.0", "status": "operational" } @router.get("/health", response_model=HealthResponse) async def health_check(): """ System health check Returns status of all components """ from datetime import datetime # Check components components = { "database": "ok", "vision_agent": "ok", "planner_agent": "ok" } # Test database connection try: db_service.get_statistics() except Exception as e: components["database"] = f"error: {str(e)}" # Determine overall status status = "healthy" if all( v == "ok" for v in components.values() ) else "degraded" return { "status": status, "components": components, "timestamp": datetime.now().isoformat() } @router.post("/analyze", response_model=AnalyzeResponse) async def analyze_frame(request: AnalyzeRequest): """ Analyze a video frame for security threats """ try: # Analyze frame using VisionAgent result = await vision_agent.process( base64_image=request.image, frame_number=0 ) if not result: raise HTTPException( status_code=500, detail="Analysis failed" ) return result except Exception as e: raise HTTPException( status_code=500, detail=f"Analysis error: {str(e)}" ) @router.get("/incidents", response_model=List[IncidentResponse]) async def get_incidents( limit: int = Query(50, ge=1, le=500), severity: Optional[str] = Query(None, pattern="^(low|medium|high|critical)$") ): """ Get recent incidents with optional filtering """ try: incidents = db_service.get_recent_incidents( limit=limit, severity=severity ) return incidents except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @router.get("/incidents/{incident_id}", response_model=IncidentResponse) async def get_incident(incident_id: int): """Get single incident by ID""" incident = db_service.get_incident_by_id(incident_id) if not incident: raise HTTPException( status_code=404, detail=f"Incident {incident_id} not found" ) return incident @router.get("/stats", response_model=StatsResponse) async def get_statistics(): """Get system statistics""" try: stats = db_service.get_statistics() return { **stats, "system_status": "operational" } except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @router.post("/incidents/{incident_id}/status") async def update_incident_status( incident_id: int, status: str = Query(..., pattern="^(active|resolved|escalated|dismissed)$") ): """Update incident status""" success = db_service.update_incident_status(incident_id, status) if not success: raise HTTPException( status_code=404, detail=f"Incident {incident_id} not found" ) return {"success": True, "incident_id": incident_id, "status": status} @router.delete("/incidents/cleanup") async def cleanup_old_incidents(days: int = Query(30, ge=7, le=365)): """ Cleanup incidents older than specified days """ try: deleted_count = db_service.cleanup_old_incidents(days) return { "success": True, "deleted_count": deleted_count, "days": days } except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @router.get("/agents/stats") async def get_agent_stats(): """Get performance statistics for all agents""" vision_agent = VisionAgent() planner_agent = PlannerAgent() return { "vision_agent": vision_agent.get_stats(), "planner_agent": planner_agent.get_stats() }