from typing import List, Optional, Union from pydantic import BaseModel, Field, HttpUrl from datetime import datetime from enum import Enum class FileType(str, Enum): PDF = "pdf" DOCX = "docx" PPTX = "pptx" XLSX = "xlsx" JPG = "jpg" JPEG = "jpeg" PNG = "png" class UploadedFile(BaseModel): """ Modèle pour les fichiers uploadés """ file_id: str = Field(..., description="ID unique du fichier") file_name: str = Field(..., description="Nom original du fichier") file_type: FileType = Field(..., description="Type du fichier") file_path: str = Field(..., description="Chemin d'accès interne") file_size: int = Field(..., description="Taille en octets") upload_date: datetime = Field(default_factory=datetime.now, description="Date d'upload") extracted_text: Optional[str] = Field(None, description="Texte extrait le cas échéant") class Config: json_schema_extra = { "example": { "file_id": "550e8400-e29b-41d4-a716-446655440000", "file_name": "document.pdf", "file_type": "pdf", "file_path": "/uploads/550e8400-e29b-41d4-a716-446655440000.pdf", "file_size": 1024, "upload_date": "2023-01-01T00:00:00", "extracted_text": "Lorem ipsum..." } } class SummaryRequest(BaseModel): """ Modèle pour les requêtes de résumé """ file_id: str = Field(..., description="ID du fichier à résumer") max_length: int = Field(150, gt=50, lt=500, description="Longueur maximale du résumé (50-500 mots)") class SummaryResponse(BaseModel): """ Modèle pour les réponses de résumé """ original_length: int = Field(..., description="Nombre de mots original") summary_length: int = Field(..., description="Nombre de mots du résumé") summary: str = Field(..., description="Résumé généré") processing_time: float = Field(..., description="Temps de traitement en secondes") class ImageCaptionRequest(BaseModel): """ Modèle pour les requêtes de description d'image """ file_id: str = Field(..., description="ID du fichier image") detail_level: str = Field("normal", regex="^(low|normal|high)$") class ImageCaptionResponse(BaseModel): """ Modèle pour les réponses de description d'image """ caption: str = Field(..., description="Description générée") confidence: float = Field(..., ge=0, le=1, description="Confiance du modèle (0-1)") class QARequest(BaseModel): """ Modèle pour les requêtes de questions/réponses """ file_id: Optional[str] = Field(None, description="ID du fichier de référence (optionnel)") question: str = Field(..., min_length=5, description="Question à poser") context: Optional[str] = Field(None, description="Contexte supplémentaire") class QAResponse(BaseModel): """ Modèle pour les réponses aux questions """ answer: str = Field(..., description="Réponse générée") source: Optional[str] = Field(None, description="Source de la réponse le cas échéant") confidence: Optional[float] = Field(None, ge=0, le=1, description="Niveau de confiance") class ErrorResponse(BaseModel): """ Modèle standard pour les erreurs """ error: str = Field(..., description="Message d'erreur") code: int = Field(..., description="Code HTTP") details: Optional[Union[dict, list]] = Field(None, description="Détails supplémentaires") class HealthCheck(BaseModel): """ Modèle pour le endpoint de santé """ status: str = Field(..., description="Statut du service") version: str = Field(..., description="Version de l'API") models_ready: bool = Field(..., description="Les modèles IA sont-ils chargés ?")