Lecteur de factures
Service d'extraction de factures
Transforme les PDF, les numérisations et les courriels transférés en données de facture propres, prêtes pour votre logiciel comptable. Si un fournisseur d'IA est lent ou en panne, il passe tout seul à un autre, et chaque total est recalculé au cent près avant toute sortie.
Le problème réglé
Les équipes des comptes fournisseurs reçoivent leurs factures sous forme de sorties OCR brutes, de fils de courriels transférés, de reçus de caisse et de PDF en langue étrangère. Un appel LLM brut renvoie de la prose, des blocs de code délimités ou un objet JSON de la mauvaise forme, et une seule panne chez un fournisseur bloque toute la file d'entrée.
Ce qui a été mesuré
- Mesuré
- Cible
21 / 21
entièrement corrects, modèle principal, banc d'essai daté
mesuré10
classes de défaillance de fournisseur couvertes hors ligne
mesuré0
appel réseau permis dans la suite de tests
mesuré0,00 $
de coût marginal par requête sur la chaîne par défaut
mesuré
Comment ça marchepour les équipes techniques
En termes techniques
Un microservice FastAPI asynchrone qui transforme des documents désordonnés et non structurés en un enregistrement de facture garanti, validé par schéma. La résilience vient du routage entre modèles, pas entre fournisseurs. Un modèle principal gratuit bascule vers un second fournisseur en cas de limite de débit, de délai dépassé ou d'exception de schéma, à coût marginal nul.
Architecture
Les requêtes sont validées par Pydantic v2 avant tout appel de modèle. Le répartiteur parcourt une chaîne ordonnée de modèles avec décodage contraint par json_schema strict, à température 0. Chaque tentative s'exécute sous un délai d'expiration ferme et traduit les exceptions du SDK en une taxonomie d'erreurs unique. La sortie brute est débarrassée de ses délimiteurs de code et de ses préambules de raisonnement, analysée, puis normalisée par des validateurs qui recalculent les totaux de ligne au cent près et convertissent les symboles monétaires en codes ISO-4217. Le service veille aussi sur sa propre chaîne. Quand un modèle gratuit est retiré, il reteste le catalogue gratuit avec sept documents d'exemple et comble le vide selon une règle d'ordonnancement publiée.
Pile technique
- Python 3.12
- FastAPI
- Pydantic v2
- OpenRouter
- httpx
- Pytest
- GitHub Actions
- Render
Éléments de preuve
- Dix classes de défaillance exercées hors ligne dans les tests de cascade, soit 429, 503, 404, délai dépassé, exception inattendue, JSON invalide, schéma non conforme, réponse vide, erreur amont intégrée à la réponse et sortie tronquée.
- La suite de tests ne peut pas atteindre le réseau, par construction. Chaque chemin sortant est fermé dans conftest, et un test qui tente d'en emprunter un échoue immédiatement.
- Instantané du banc d'essai daté du 7 octobre 2026. 3 passes de 7 documents par modèle, chaque appel enregistré en JSONL pour que les chiffres puissent être recalculés sans appeler de modèle.
- Chaque chiffre de la page du projet est vérifié par un test contre les enregistrements. Une phrase qui ne découle pas des données fait échouer le build.
- Côté journalisation, le modèle et la durée sont consignés, jamais le nom du fournisseur ni le numéro de facture au-dessus du niveau DEBUG.
Pipeline de requête
- 01
Ingestion
ExtractRequest, 10 à 50k caractères, plafond de 1 Mo sur le corps, refusé avant lecture
- 02
Durcissement
Neutralisation des injections de prompt, middleware request-id, budget d'appels avec Retry-After
- 03
Modèle principal
json_schema strict, température 0, délai d'expiration ferme
- 04branche
Fallback
Autre fournisseur, déclenché seulement après un appel échoué
- 05
Récupération
Retrait des délimiteurs, suppression du préambule de raisonnement, décodage JSON
- 06
Validation
InvoiceData.model_validate, recalcul des totaux, ISO-4217