from pydantic import BaseModel, Field from typing import List, Optional, Dict, Any from datetime import datetime class PredictionRequest(BaseModel): image_base64: Optional[str] = Field(None, description="Base64-encoded image") class SinglePrediction(BaseModel): filename: str = Field(..., description="Input filename") prediction: str = Field(..., description="real or ai_generated") confidence: float = Field(..., ge=0.0, le=1.0) real_probability: float = Field(0.0, ge=0.0, le=1.0) ai_probability: float = Field(0.0, ge=0.0, le=1.0) processing_time_ms: float = 0.0 anomaly_heatmap: Optional[str] = None error: Optional[str] = None frequency_band_contributions: Optional[Dict[str, float]] = None class PredictionResponse(BaseModel): prediction: str = Field(..., description="real or ai_generated") confidence: float = Field(..., ge=0.0, le=1.0) real_probability: float = Field(..., ge=0.0, le=1.0) ai_probability: float = Field(..., ge=0.0, le=1.0) processing_time_ms: float anomaly_heatmap: Optional[str] = None frequency_band_contributions: Optional[Dict[str, float]] = None tier: Optional[Dict[str, Any]] = None class BatchPredictionResponse(BaseModel): results: List[SinglePrediction] summary: Dict[str, Any] tier: Optional[Dict[str, Any]] = None class HealthResponse(BaseModel): status: str model_loaded: bool version: str timestamp: str class UsageStats(BaseModel): tier: str requests_this_minute: int rate_limit: int class ErrorResponse(BaseModel): detail: str status_code: int