Spaces:
Build error
Build error
| """ | |
| 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"]) | |
| 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" | |
| ) | |