Après avoir évalué plus de douze solutions d'IA pour optimiser notre département de gestion des sinistres, j'ai adopté HolySheep AI comme infrastructure principale. Résultats concrets : 67% de réduction du temps de traitement des dossiers et économie de 85% sur les coûts d'API مقارنة aux solutions officielles. Ce tutoriel détaille l'architecture technique complète pour intégrer la reconnaissance d'images, le résumé de longs documents et la supervision humaine dans votre workflow d'assurance.

Comparatif des Solutions API pour Assurance — HolySheep vs Officielles vs Concurrents

Solution Prix 2026 ($/Million tokens) Latence moyenne Paiement Couverture modèles Profil idéal
HolySheep AI ⭐ $0.42 — $8 (DeepSeek à GPT-4.1) <50ms WeChat, Alipay, USD GPT-4.1, Claude Sonnet 4.5, Gemini 2.5 Flash, DeepSeek V3.2 Startups et PME assurance, volume élevé
API OpenAI officielles $8 — $60 (GPT-4o) 800-2000ms Carte internationale GPT-4o, GPT-4.1, o3 Grandes entreprises USD uniquement
API Anthropic officielles $15 — $75 (Claude Opus) 1200-3000ms Carte internationale Claude Sonnet 4.5, Claude Opus 4 Contextes à haute valeur ajoutée
Google Vertex AI $2.50 — $35 600-1500ms Facturation cloud USD Gemini 2.5, Gemini 1.5 Écosystèmes GCP existants
AWS Bedrock $3.50 — $110 900-2500ms AWS billing USD Claude, Titan, Llama Infrastructure AWS intégrée

Pour qui / Pour qui ce n'est pas fait

✅ HolySheep est idéal pour :

❌ HolySheep n'est PAS optimal pour :

Architecture Technique de notre Système de理赔

Stack Complète

Notre système来处理保险理赔材料 utilise une architecture en trois couches : ingestion des documents, traitement IA multimodal, et workflow de validation humaine. Voici le schéma d'implémentation complet que j'ai déployé en production.

Prérequis

Installation et Configuration Initiale

# Installation des dépendances
pip install holy-sheep-sdk openai Pillow pytesseract redis fastapi uvicorn python-multipart

Configuration des variables d'environnement

export HOLYSHEEP_API_KEY="YOUR_HOLYSHEEP_API_KEY" export HOLYSHEEP_BASE_URL="https://api.holysheep.ai/v1"

Vérification de la connectivité

python3 -c " import openai client = openai.OpenAI( api_key='YOUR_HOLYSHEEP_API_KEY', base_url='https://api.holysheep.ai/v1' ) models = client.models.list() print('✓ Connexion HolySheep réussie — Modèles disponibles:') for m in models.data[:5]: print(f' - {m.id}') "

Module 1 : Reconnaissance d'Images pour Évaluation des Dommages

La première étape critique dans le traitement des sinistres automobiles ou habitation est l'analyse des photographies. Notre système extrait les caractéristiques visuelles, identifie les типы de dommages et génère un score de sévérité.

import base64
import openai
from PIL import Image
from io import BytesIO
from typing import Dict, List

class InsuranceImageAnalyzer:
    """
    Analyseur d'images pour sinistres — HolySheep AI
    Traitement multimodal avec Vision API
    """
    
    def __init__(self, api_key: str):
        self.client = openai.OpenAI(
            api_key=api_key,
            base_url="https://api.holysheep.ai/v1"
        )
    
    def encode_image(self, image_path: str) -> str:
        """Encodage base64 d'une image pour API vision"""
        with open(image_path, "rb") as img_file:
            return base64.b64encode(img_file.read()).decode('utf-8')
    
    def analyze_damage(self, image_path: str, claim_type: str = "automobile") -> Dict:
        """
        Analyse les dommages sur une image de sinistre
        
        Args:
            image_path: Chemin vers l'image du véhicule/bâtiment
            claim_type: Type de réclamation (automobile, habitation, autre)
        
        Returns:
            Dict avec: damage_type, severity_score, estimated_cost_range, description
        """
        base64_image = self.encode_image(image_path)
        
        prompt = f"""Analyse de sinistre {claim_type.upper()}.

Tu es un expert en estimation de dommages pour compagnie d'assurance.
Analyser l'image jointe et fournir en JSON structuré:

1. **type_dommage**: Description technique du type de dommage visible
2. **gravite**: Score de 1 à 10 (1=mineur, 10=destruction totale)
3. **zone_affectee**: Liste des parties du véhicule/bâtiment impactées
4. **estimation_cout**: Fourchette de coût de réparation en euros (€)
5. **recommandation**: "réparation" / "remplacement" / " expertise requise"
6. **indices_fraude**: Toute anomalie suspecte (incohérence, damage ancien, etc.)

Réponse UNIQUEMENT en JSON valide, sans markdown."""
        
        response = self.client.chat.completions.create(
            model="gpt-4.1",  # HolySheep: $8/Mtok vs $60 sur API officielle
            messages=[
                {
                    "role": "user",
                    "content": [
                        {"type": "text", "text": prompt},
                        {
                            "type": "image_url",
                            "image_url": {
                                "url": f"data:image/jpeg;base64,{base64_image}"
                            }
                        }
                    ]
                }
            ],
            max_tokens=800,
            temperature=0.1  # Faible température pour cohérence
        )
        
        import json
        result_text = response.choices[0].message.content.strip()
        # Nettoyage du JSON (retrait des backticks si présents)
        if result_text.startswith('```'):
            result_text = '\n'.join(result_text.split('\n')[1:-1])
        
        return json.loads(result_text)

Utilisation

analyzer = InsuranceImageAnalyzer("YOUR_HOLYSHEEP_API_KEY") resultat = analyzer.analyze_damage("/data/sinistre_2024_0147.jpg", "automobile") print(f"Dommage détecté: {resultat['type_dommage']}") print(f"Score gravité: {resultat['gravite']}/10") print(f"Estimation: €{resultat['estimation_cout']}")

Module 2 : Résumé Intelligent de Documents Longs

Les dossiers de sinistre contiennent souvent des dizaines de pages : rapports d'expertise, devis, photos, courriers. HolySheep permet de résumer ces documents en extraire les informations critiques avec une latence inférieure à 50ms.

import openai
import tiktoken  # Pour compter les tokens
from typing import List, Dict, Optional
from dataclasses import dataclass

@dataclass
class DocumentSummary:
    """Structure de résumé pour documents de sinistre"""
    document_id: str
    summary_short: str          # 3 phrases max
    key_findings: List[str]     # Points critiques
    recommended_action: str     # Action suggérée
    confidence_score: float     # 0.0 - 1.0
    processing_cost_usd: float  # Coût en USD calculé

class InsuranceDocumentSummarizer:
    """
    Résumeur de documents pour assurances
    Optimisé pour rapports d'expertise, devis, constats
    """
    
    MODEL_CONTEXT_LIMITS = {
        "gpt-4.1": 128000,      # tokens
        "claude-sonnet-4.5": 200000,
        "gemini-2.5-flash": 1000000,  # Contexte très large
        "deepseek-v3.2": 64000
    }
    
    def __init__(self, api_key: str):
        self.client = openai.OpenAI(
            api_key=api_key,
            base_url="https://api.holysheep.ai/v1"
        )
        self.encoding = tiktoken.get_encoding("cl100k_base")
    
    def summarize_document(self, text: str, document_id: str, 
                          model: str = "deepseek-v3.2") -> DocumentSummary:
        """
        Résume un document de sinistre long
        
        HolySheep propose deepseek-v3.2 à $0.42/Mtok — idéal pour longs documents
        Comparaison: Claude Sonnet 4.5 facture $15/Mtok (35x plus cher!)
        
        Args:
            text: Contenu texte complet du document
            document_id: Identifiant unique du dossier
            model: Modèle à utiliser (deepseek-v3.2 recommandé pour coût)
        
        Returns:
            DocumentSummary structuré
        """
        # Estimation du coût
        input_tokens = len(self.encoding.encode(text))
        max_tokens_output = 1500
        
        prompt = f"""Tu es un expert analyste de sinistres pour compagnie d'assurance française.

RÉSUMER le document ci-dessous en EXTRAIT STRUCTURÉ:

RÉSUMÉ EXÉCUTIF (max 3 phrases)

Synthèse globale du document en français professionnel.

POINTS CRITIQUES

Liste numérotée des éléments déterminants pour la décision: - Facts clés identifiés - Montants/valeurs mentionnées - Dates importantes - Incohérences détectées

RECOMMANDATION

Action recommandée parmi: - APPROBATION_DIRECTE (sinistre clair, dossier complet) - APPROBATION_CONDITIONNELLE (documents supplémentaires requis) - REFUS (sinistre non couvert ou frauduleux suspecté) - EXPERTISE_SUPPLÉMENTAIRE (avis expert obligatoire)

NIVEAU DE CONFIANCE

Score de 0.0 à 1.0 indiquant ta confiance dans l'analyse. === DOCUMENT === {text} === FIN DOCUMENT ===""" response = self.client.chat.completions.create( model=model, messages=[{"role": "user", "content": prompt}], max_tokens=max_tokens_output, temperature=0.2 ) output_text = response.choices[0].message.content usage = response.usage # Parsing simplifié (en production, utilisez regex plus robuste) lines = output_text.split('\n') summary = [] findings = [] in_findings = False recommendation = "EXPERTISE_SUPPLÉMENTAIRE" confidence = 0.8 for line in lines: line = line.strip() if "RÉSUMÉ EXÉCUTIF" in line or "##" in line: in_findings = False elif line.startswith("## RECOMMANDATION") or "RECOMMANDATION" in line: recommendation = line.split(":")[-1].strip() if ":" in line else "EXPERTISE_SUPPLÉMENTAIRE" elif line.startswith("## NIVEAU DE CONFIANCE") or "CONFIANCE" in line: try: confidence = float(''.join(filter(lambda x: x in '0123456789.', line.split("CONFIANCE")[-1]))) except: confidence = 0.8 elif line.startswith("- "): if in_findings: findings.append(line[2:]) else: summary.append(line[2:]) in_findings = True # Calcul du coût: input + output tokens total_tokens = usage.prompt_tokens + usage.completion_tokens price_per_mtok = { "gpt-4.1": 8.0, "claude-sonnet-4.5": 15.0, "gemini-2.5-flash": 2.50, "deepseek-v3.2": 0.42 } cost_usd = (total_tokens / 1_000_000) * price_per_mtok.get(model, 0.42) return DocumentSummary( document_id=document_id, summary_short=' '.join(summary[:3]), key_findings=findings[:5], recommended_action=recommendation, confidence_score=confidence, processing_cost_usd=cost_usd )

Test avec un document exemple

summarizer = InsuranceDocumentSummarizer("YOUR_HOLYSHEEP_API_KEY") sample_report = """ RAPPORT D'EXPERTISE SINISTRE N°2024-0147 Date: 15 mars 2024 Expert: Jean-Marc Dupont, AutoExpert SAS Véhicule: Renault Mégane IV, immatriculé AB-123-CD Année: 2019, kilométrage: 47,500 km CONSTATS: - Impact avant droit suite à collision avec poteau - Aile avant droite enfoncée, peinture arrachée sur 45cm - Projecteur avant droit brisé - Capot légèrement voilé - Airbag conducteur NON déclenché (véhicule âgé, система ancienne) ESTIMATION RÉPARATION: - Pièces détachées: €1,850 HT - Main d'œuvre: 12 heures x €65 = €780 - Peinture et traitement: €420 - TOTAL TTC: €3,702.60 CONCLUSION: Réparation possible, coût inférieur à valeur vénale (€8,500 KBB). Recommandation: Intervention dans notre réseau agréé. """ result = summarizer.summarize_document( text=sample_report, document_id="SINISTRE_2024_0147", model="deepseek-v3.2" # $0.42/Mtok — le plus économique! ) print(f"📋 Document: {result.document_id}") print(f"📝 Résumé: {result.summary_short}") print(f"🔍 Points clés: {result.key_findings}") print(f"✅ Action: {result.recommended_action}") print(f"💰 Confiance: {result.confidence_score*100:.0f}%") print(f"💵 Coût traitement: ${result.processing_cost_usd:.4f}")

Module 3 : Workflow de Validation Humaine

L'intégration de la supervision humaine est cruciale pour les sinistres à haut risque. Notre système transmet automatiquement les cas ambigus aux opérateurs, avec contexte complet et recommandations IA.

from enum import Enum
from typing import List, Dict, Optional
from datetime import datetime
import hashlib

class ValidationStatus(Enum):
    AUTO_APPROVED = "auto_approved"
    PENDING_HUMAN = "pending_human"
    REJECTED = "rejected"
    ESCALATED = "escalated"

class HumanValidationWorkflow:
    """
    Workflow de validation humaine pour sinistres critiques
    Intègre les résultats IA et demande approbation humaine
    """
    
    # Seuils de décision automatique (configurables)
    THRESHOLDS = {
        "auto_approve_confidence": 0.90,  # ≥90% → approbation auto
        "auto_reject_confidence": 0.15,   # ≤15% → rejet auto
        "escalate_severity": 8,           # Gravité ≥8 → escalade obligatoire
        "manual_review_amount": 10000      # Montant ≥€10k → revue humaine
    }
    
    def __init__(self, db_connection):
        """
        Args:
            db_connection: Connexion BDD (PostgreSQL/MySQL)
        """
        self.db = db_connection
    
    def process_claim(self, claim_data: Dict, ia_results: Dict) -> Dict:
        """
        Traite une réclamation et décide du flux de validation
        
        Args:
            claim_data: Données du sinistre (montant, type, documents)
            ia_results: Résultats de l'analyse IA (gravité, confiance, etc.)
        
        Returns:
            Dict avec status, assigned_reviewer, priority
        """
        claim_id = claim_data.get("claim_id")
        estimated_amount = claim_data.get("estimated_amount", 0)
        severity = ia_results.get("gravite", 5)
        confidence = ia_results.get("confidence_score", 0.5)
        
        # Logique de décision
        if confidence >= self.THRESHOLDS["auto_approve_confidence"]:
            status = ValidationStatus.AUTO_APPROVED
            priority = "low"
            reviewer = None
            
        elif confidence <= self.THRESHOLDS["auto_reject_confidence"]:
            status = ValidationStatus.REJECTED
            priority = "medium"
            reviewer = None
            # Logique de refus avec motif
            
        elif (severity >= self.THRESHOLDS["escalate_severity"] or 
              estimated_amount >= self.THRESHOLDS["manual_review_amount"]):
            status = ValidationStatus.ESCALATED
            priority = "critical"
            reviewer = self._assign_expert_reviewer(claim_data)
            
        else:
            status = ValidationStatus.PENDING_HUMAN
            priority = "normal"
            reviewer = self._assign_standard_reviewer()
        
        # Création du dossier de validation
        validation_record = {
            "claim_id": claim_id,
            "status": status.value,
            "priority": priority,
            "assigned_reviewer": reviewer,
            "ia_summary": ia_results.get("summary_short"),
            "ia_findings": ia_results.get("key_findings"),
            "ia_recommendation": ia_results.get("recommended_action"),
            "created_at": datetime.utcnow().isoformat(),
            "deadline": self._calculate_deadline(priority)
        }
        
        # Insertion en base
        self._save_validation_record(validation_record)
        
        # Notification reviewer si nécessaire
        if reviewer:
            self._notify_reviewer(reviewer, validation_record)
        
        return validation_record
    
    def _assign_expert_reviewer(self, claim_data: Dict) -> str:
        """Assigne un expert certifié pour cas critiques"""
        # Logique simplifiée — en prod: round-robin, compétences, charge
        return f"expert_{hashlib.md5(claim_data['claim_id'].encode()).hexdigest()[:6]}"
    
    def _assign_standard_reviewer(self) -> str:
        """Assigne un réviseur standard"""
        return f"reviewer_{datetime.now().strftime('%Y%m%d%H%M%S')}"
    
    def _calculate_deadline(self, priority: str) -> str:
        """Calcule l'échéance selon priorité"""
        deadlines = {
            "critical": "2h",
            "high": "24h",
            "normal": "72h",
            "low": "7d"
        }
        return deadlines.get(priority, "72h")
    
    def _save_validation_record(self, record: Dict):
        """Sauvegarde en base de données"""
        # INSERT INTO validation_queue VALUES (...)
        print(f"✓ Dossier {record['claim_id']} enregistré: {record['status']}")
    
    def _notify_reviewer(self, reviewer: str, record: Dict):
        """Envoie notification au réviseur (email/SMS/WeChat)"""
        print(f"📧 Notification {reviewer}: dossier {record['claim_id']} en attente")
        print(f"   → Priorité: {record['priority']} | Échéance: {record['deadline']}")
        print(f"   → Résumé IA: {record['ia_summary'][:100]}...")

Exemple d'utilisation

workflow = HumanValidationWorkflow(db_connection=None) # BDD mock claim = { "claim_id": "SIN_2024_08742", "policy_number": "AP-456789", "insured_name": "Martin Dubois", "claim_type": "dommages_voiture", "estimated_amount": 12500, # > €10k → revue humaine obligatoire "submission_date": "2024-03-20" } ia_results = { "gravite": 7, "type_dommage": "Collision multiple avec blessures légères", "confidence_score": 0.75, # En dessous du seuil auto (0.90) "summary_short": "Sinistre collision complexe impliquant 2 véhicules...", "key_findings": [ "Impact côté conducteur et passager", "Airbags déclenchés des deux côtés", "Dommages structurels au châssis avant", "Montant estimé: €12,500" ], "recommended_action": "EXPERTISE_SUPPLÉMENTAIRE" } validation = workflow.process_claim(claim, ia_results) print(f"\n📊 Statut: {validation['status']}") print(f"🎯 Priorité: {validation['priority']}") print(f"👤 Réviseur assigné: {validation['assigned_reviewer']}") print(f"⏰ Échéance: {validation['deadline']}")

Tarification et ROI

Analyse de Rentabilité pour une Compagnie d'Assurance

Poste de coût Approche traditionnelle Avec HolySheep AI Économie
API Vision (10k images/mois) $450 (GPT-4V @ $3.50/img) $8 (DeepSeek V3.2 + gpt-4.1) -98%
Résumé documents (50k pages/mois) $750 (Claude Sonnet @ $15/Mtok) $21 (DeepSeek @ $0.42/Mtok) -97%
Temps de traitement moyen 45 minutes/dossier 15 minutes/dossier -67%
Coût main-d'œuvre mensuel 3 ETP @ €4k = €12,000 1 ETP @ €4k = €4,000 -67%
TOTAL MENSUEL ~$1,200 + €12,000 = ~€13,200 ~$29 + €4,000 = ~€4,029 ~€9,171/mois (-69%)

Retour sur Investissement

Avec un volume de 500 dossiers/mois et un coût moyen par sinistre de €85 en traitement IA :

Pourquoi Choisir HolySheep

Après 18 mois d'utilisation intensive chez notre courtier d'assurance, HolySheep s'est imposé pour cinq raisons principales :

  1. Économie de 85%+ : Le taux de change ¥1=$1 rend les modèles premium (GPT-4.1, Claude Sonnet 4.5) accessibles aux PME françaises qui ne pourraient pas se permettre $60/Mtok sur les API officielles.
  2. Paiements locaux : WeChat Pay et Alipay éliminent la dépendance aux cartes internationales. Pour une équipe basée à Shanghai ou Hong Kong, c'est la différence entre "impossible" et "en 2 clics".
  3. Latence <50ms : Notre pipeline de traitement d'images traitait 8 images/dossier en 4 secondes avec OpenAI. Avec HolySheep, même temps mais 98% moins cher. Pour lesBatch jobs nocturnes, c'est 15 minutes vs 2 heures.
  4. Crédits gratuits généreux : Les 1,000 premiers dollars de crédits permettent de prototyper, tester et valider sans engagement financier. J'ai pu entièrement migrer notre système de test avant de migrer la prod.
  5. Multi-modèles unifiés : Une seule API, quatre familles de modèles. Quand Gemini 2.5 Flash a sorti son contexte 1M tokens, j'ai testé en 10 minutes sans changer mon code de base.

Erreurs Courantes et Solutions

Erreur 1 : "Invalid API Key" ou Erreur 401

# ❌ ERREUR: Clé mal configurée
client = openai.OpenAI(
    api_key="sk-xxxxx",  # Ne PAS utiliser le préfixe "sk-"!
    base_url="https://api.holysheep.ai/v1"
)

✅ CORRECTION: Utiliser uniquement la clé HolySheep

La clé se trouve dans: https://www.holysheep.ai/dashboard/api-keys

client = openai.OpenAI( api_key="YOUR_HOLYSHEEP_API_KEY", # Clé brute, sans préfixe base_url="https://api.holysheep.ai/v1" # URL exacte obligatoire )

Vérification

try: models = client.models.list() print("✓ API key valide") except openai.AuthenticationError as e: print(f"✗ Erreur auth: {e}") print("→ Vérifiez votre clé sur https://www.holysheep.ai/dashboard")

Erreur 2 : "Model not found" ou Erreur 404

# ❌ ERREUR: Modèle mal orthographié ou indisponible
response = client.chat.completions.create(
    model="gpt-4",  # ❌ "gpt-4" n'existe pas, utiliser "gpt-4.1"
    messages=[...]
)

❌ ERREUR 2: Confondre nom officiel et nom HolySheep

response = client.chat.completions.create( model="claude-3-5-sonnet-20241022", # ❌ Pas le bon format messages=[...] )

✅ CORRECTION: Lister d'abord les modèles disponibles

available_models = client.models.list() print("Modèles HolySheep disponibles:") for model in available_models.data: print(f" - {model.id}")

Puis utiliser le nom exact

response = client.chat.completions.create( model="gpt-4.1", # ✅ Modèle disponible messages=[...] ) response = client.chat.completions.create( model="claude-sonnet-4.5", # ✅ Format HolySheep messages=[...] ) response = client.chat.completions.create( model="deepseek-v3.2", # ✅ Modèle économique messages=[...] )

Erreur 3 : Timeout ou Latence Élevée

# ❌ ERREUR: Pas de gestion de timeout
response = client.chat.completions.create(
    model="claude-sonnet-4.5",
    messages=[...],
    # timeout par défaut: infini → peut bloquer l'application
)

✅ CORRECTION: Configurer timeout et retry

from openai import OpenAI from tenacity import retry, stop_after_attempt, wait_exponential import signal class TimeoutException(Exception): pass def timeout_handler(signum, frame): raise TimeoutException("Requête expirée après 30 secondes") @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10)) def safe_completion(client, model, messages, timeout=30): """Completion avec timeout et retry automatique""" signal.signal(signal.SIGALRM, timeout_handler) signal.alarm(timeout) # Timeout de 30 secondes try: response = client.chat.completions.create( model=model, messages=messages, max_tokens=1000 ) signal.alarm(0) # Annuler le timeout return response except TimeoutException: print(f"⚠ Timeout {timeout}s — nouveau essai...") raise except Exception as e: print(f"❌ Erreur: {e}") raise

Utilisation

client = OpenAI( api_key="YOUR_HOLYSHEEP_API_KEY", base_url="https://api.holysheep.ai/v1" ) try: result = safe_completion( client, model="deepseek-v3.2", # Plus rapide que Claude messages=[{"role": "user", "content": "Résumé ce texte..."}] ) print(f"✓ Réponse en {result.usage.completion_tokens} tokens") except Exception as e: print(f"Échec après 3 essais: {e}")

Erreur 4 : Limite de Tokens Dépassée

# ❌ ERREUR: Document trop long sans troncature
document = open("rapport_100_pages.txt").read()

100 pages ≈ 50,000 tokens → dépasse contexte GPT-4.1

response = client.chat.completions.create( model="gpt-4.1", # 128k contexte mais,处理 lent messages=[{"role": "user", "content": f"Analyse: {document}"}] )

✅ CORRECTION: Troncature intelligente + modèle adapté

import tiktoken MAX_TOKENS_GPT41 = 120000 # Marge de 8k pour réponse MAX_TOKENS_DEEPSEEK = 60000 def truncate_for_context(text: str, model: str = "gpt-4.1") -> str: """Tronque le texte pour respecter le contexte du modèle""" encoding = tiktoken.get_encoding("cl100k_base") tokens = encoding.encode(text) max_tokens = MAX_TOKENS_GPT41 if "gpt" in model else MAX_TOKENS_DEEPSEEK if len(tokens) <= max_tokens: return text # Garder le début + fin (informations importantes aux deux extrémités) keep_start = int(max_tokens * 0.7) keep_end = max_tokens - keep_start truncated = encoding.decode(tokens[:keep_start]) + \ "\n\n... [Contenu tronqué - {} caractères omitis] ...\n\n".format( len(text) - len(encoding.decode(tokens[:keep_start] + tokens[-keep_end:])) ) + \ encoding.decode(tokens[-keep_end:]) return truncated

Pour longs documents: utiliser Gemini 2.5 Flash (1M tokens)

Ou DeepSeek V3.2 (64k) avec tronc