ttzzs's picture
Deploy Chronos2 Forecasting API v3.0.0 with new SOLID architecture
c40c447 verified
"""
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"
)