""" Anomaly detection API endpoints. Responsabilidad: Manejar requests de detección de anomalías. """ from fastapi import APIRouter, Depends, HTTPException, status from app.api.dependencies import get_detect_anomalies_use_case from app.application.use_cases.anomaly_use_case import DetectAnomaliesUseCase from app.application.dtos.anomaly_dtos import ( DetectAnomaliesRequestDTO, DetectAnomaliesResponseDTO ) from app.utils.logger import setup_logger logger = setup_logger(__name__) router = APIRouter(prefix="/anomaly", tags=["Anomaly Detection"]) @router.post( "/detect", response_model=DetectAnomaliesResponseDTO, status_code=status.HTTP_200_OK, summary="Detectar anomalías", description="Detecta anomalías comparando valores observados con pronóstico" ) async def detect_anomalies( request: DetectAnomaliesRequestDTO, use_case: DetectAnomaliesUseCase = Depends(get_detect_anomalies_use_case) ): """ Detecta anomalías en serie temporal. Compara valores observados recientes con pronóstico basado en contexto histórico. Marca como anomalías los valores que caen fuera de intervalos de confianza. Args: request: Contexto histórico y valores recientes a evaluar use_case: Caso de uso inyectado Returns: Lista de puntos con indicador de anomalía Example: ```json { "context_values": [100, 102, 105, 103, 108], "recent_observed": [112, 150, 115], "quantile_low": 0.05, "quantile_high": 0.95, "freq": "D" } ``` """ try: logger.info( f"Anomaly detection request: {len(request.context_values)} context, " f"{len(request.recent_observed)} to evaluate" ) # Ejecutar use case response = use_case.execute(request) num_anomalies = sum(1 for p in response.anomaly_points if p.is_anomaly) logger.info( f"Anomaly detection completed: {num_anomalies} anomalies found" ) return response except ValueError as e: logger.error(f"Validation error: {e}") raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail=str(e) ) except Exception as e: logger.error(f"Unexpected error in anomaly detection: {e}", exc_info=True) raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="Error interno en detección de anomalías" )