root 5d8ad901d1 Initial commit: Pipeline notarial complet
- Infrastructure complète de traitement de documents notariaux
- API FastAPI d'ingestion et d'orchestration
- Pipelines Celery pour le traitement asynchrone
- Support des formats PDF, JPEG, PNG, TIFF, HEIC
- OCR avec Tesseract et correction lexicale
- Classification automatique des documents avec Ollama
- Extraction de données structurées
- Indexation dans AnythingLLM et OpenSearch
- Système de vérifications et contrôles métier
- Base de données PostgreSQL pour le métier
- Stockage objet avec MinIO
- Base de données graphe Neo4j
- Recherche plein-texte avec OpenSearch
- Supervision avec Prometheus et Grafana
- Scripts d'installation pour Debian
- Documentation complète
- Tests unitaires et de performance
- Service systemd pour le déploiement
- Scripts de déploiement automatisés
2025-09-08 22:05:22 +02:00

79 lines
2.5 KiB
Python

"""
Modèles de données pour l'API
"""
from pydantic import BaseModel, Field
from typing import Optional, Dict, Any, List
from datetime import datetime
from enum import Enum
class DocumentStatus(str, Enum):
"""Statuts possibles d'un document"""
PENDING = "pending"
PROCESSING = "processing"
COMPLETED = "completed"
FAILED = "failed"
MANUAL_REVIEW = "manual_review"
class DocumentType(str, Enum):
"""Types de documents supportés"""
PDF = "application/pdf"
JPEG = "image/jpeg"
PNG = "image/png"
TIFF = "image/tiff"
HEIC = "image/heic"
class ImportMeta(BaseModel):
"""Métadonnées d'import d'un document"""
id_dossier: str = Field(..., description="Identifiant du dossier")
source: str = Field(default="upload", description="Source du document")
etude_id: str = Field(..., description="Identifiant de l'étude")
utilisateur_id: str = Field(..., description="Identifiant de l'utilisateur")
filename: Optional[str] = Field(None, description="Nom du fichier")
mime: Optional[str] = Field(None, description="Type MIME du fichier")
received_at: Optional[int] = Field(None, description="Timestamp de réception")
class DocumentResponse(BaseModel):
"""Réponse d'import de document"""
status: str = Field(..., description="Statut de la requête")
id_document: str = Field(..., description="Identifiant du document")
message: Optional[str] = Field(None, description="Message informatif")
class DocumentInfo(BaseModel):
"""Informations détaillées d'un document"""
id: str
filename: str
mime_type: str
size: int
status: DocumentStatus
id_dossier: str
etude_id: str
utilisateur_id: str
created_at: datetime
updated_at: datetime
processing_steps: Optional[Dict[str, Any]] = None
extracted_data: Optional[Dict[str, Any]] = None
errors: Optional[List[str]] = None
class ProcessingStep(BaseModel):
"""Étape de traitement"""
name: str
status: str
started_at: Optional[datetime] = None
completed_at: Optional[datetime] = None
duration: Optional[float] = None
error: Optional[str] = None
metadata: Optional[Dict[str, Any]] = None
class HealthResponse(BaseModel):
"""Réponse de santé de l'API"""
status: str
timestamp: datetime
version: str
services: Dict[str, str]
class ErrorResponse(BaseModel):
"""Réponse d'erreur standardisée"""
detail: str
error_code: Optional[str] = None
timestamp: datetime = Field(default_factory=datetime.now)