Le problème
La solution : Mistral OCR + Claude Sonnet 4.6
Étape 1 — OCR avec Mistral
Typescript
const ocrResult = await mistral.ocr.process({
model: "mistral-ocr-latest",
document: {
type: "document_url",
documentUrl: pdfUrl,
},
});
const extractedText = ocrResult.pages
.map((page) => page.markdown)
.join("\n\n");
Étape 2 — Extraction intelligente avec Claude Sonnet 4.6
Typescript
const message = await anthropic.messages.create({
model: "claude-sonnet-4-6",
max_tokens: 1024,
messages: [
{
role: "user",
content: `Voici le contenu d'une offre de prêt immobilier.
Extrais les informations suivantes au format JSON strict :
- montant_pret (number, en euros)
- duree_pret (number, en mois)
- taux_nominal (number, en %)
- type_pret (string: "immobilier" | "consommation" | "professionnel")
- quotite (number, en %)
- date_effet (string, format YYYY-MM-DD)
- garanties (array of strings)
Contenu du document :
${extractedText}`,
},
],
});
const loanData = JSON.parse(extractedContent);
Étape 3 — Pré-remplissage automatique du formulaire
Typescript
const formData = {
montant: loanData.montant_pret,
duree: loanData.duree_pret,
taux: loanData.taux_nominal,
typePret: loanData.type_pret,
quotite: loanData.quotite,
dateEffet: loanData.date_effet,
garanties: loanData.garanties,
};
await fillTarificationForm(formData);
Résultats
Ce que j'ai appris
- La qualité du prompt est déterminante : spécifier le format JSON attendu et les types de données évite les réponses ambiguës.
- Prévoir un fallback : sur les documents très dégradés ou atypiques, un mode de saisie manuelle assistée reste nécessaire.
- Valider côté serveur : le JSON retourné par le LLM doit toujours être validé (Zod ou équivalent) avant injection dans le formulaire.