Ajout de 2 fonctionnalitées principales : import PDF que ce soit pour les règles ou les campagnes directement.
All checks were successful
Build & Push Images / build (brain) (push) Successful in 1m28s
Build & Push Images / build (core) (push) Successful in 1m40s
Build & Push Images / build-switcher (push) Successful in 19s
Build & Push Images / build (web) (push) Successful in 1m46s

Fonctionnalité de comparaison PDF / campagne pour faire un mix et demander des conseils à l'IA
This commit is contained in:
2026-06-04 13:55:27 +02:00
parent 79a68bc27b
commit 439f43875b
78 changed files with 5250 additions and 183 deletions

View File

@@ -7,7 +7,10 @@ En Python moderne on privilégie Protocol (PEP 544) sur ABC pour bénéficier
du duck typing structurel : toute classe qui possède les bonnes méthodes
satisfait le contrat, sans héritage explicite.
"""
from typing import AsyncIterator, Protocol
from typing import TYPE_CHECKING, AsyncIterator, Protocol
if TYPE_CHECKING:
from app.domain.models import ExtractedDocument
class LLMProvider(Protocol):
@@ -78,6 +81,32 @@ class LLMChatProvider(Protocol):
...
class PdfTextExtractor(Protocol):
"""Port sortant — extrait le texte d'un PDF (born-digital ou scan).
L'implémentation décide de sa stratégie (couche texte directe, repli OCR
page par page…). Le domaine ne connaît ni PyMuPDF ni Tesseract.
"""
def extract(self, pdf_bytes: bytes) -> "ExtractedDocument":
"""Extrait le texte du PDF fourni sous forme d'octets.
Args:
pdf_bytes: contenu binaire du fichier PDF.
Returns:
ExtractedDocument : une entrée par page (texte + flag OCR).
Raises:
PdfExtractionError: si le PDF est illisible/corrompu.
"""
...
class PdfExtractionError(Exception):
"""Erreur du domaine : un PDF n'a pas pu être lu/extrait."""
class LLMProviderError(Exception):
"""Erreur du domaine signalant qu'un LLMProvider n'a pas pu générer.