Les extracteurs de documents extraient le contenu d'un objet File vers un objet Document qui peut être traité ultérieurement. Les différents types de fichiers nécessitent des logiques d'extraction différentes : les fichiers PDF peuvent être extraits par OCR, tandis que les fichiers Excel nécessitent une extraction tabulaire.

Tous les extracteurs intégrés définissent l'ID du document à file.id.

Extracteurs de documents disponibles

Extracteurs de documents disponibles

ExtracteurTypes de fichiers
Extracteur OCR MistralPDF, DOCX, PPTX, ODT
Extracteur de transcription audio MistralMP3, WAV, M4A, FLAC, OGG
Extracteur de texte brutTXT, MD, CSV, JS, PY (et autres fichiers texte/code)
Extracteur HTMLHTML, HTM
Extracteur de feuilles de calculXLS, XLSX, XLSM, XLSB, ODS, ODF
Extracteur d’e-mailsEML, MSG
Extracteur NumbersNUMBERS
Extracteur Office héritéDOC, PPT, HWP, HWPX
Extracteurs personnalisésToute source
Extracteur OCR Mistral

Extracteur OCR Mistral

MistralOCRExtractor utilise l'API OCR de Mistral pour extraire du texte structuré et des images depuis des fichiers PDF, DOCX, PPTX et ODT. C'est l'extracteur recommandé pour les documents scannés et riches en images.

Exigences :

  • Une clé API Mistral

Installation : Bibliothèque de base (aucune dépendance supplémentaire requise)

Exemple :

import os

from mistralai.client import Mistral
from mistralai.search.toolkit.ingestion.extractors import MistralOCRExtractor

mistral_client = Mistral(
    api_key=os.environ.get("MISTRAL_API_KEY", "your-api-key"),
    server_url=os.environ.get("MISTRAL_SERVER_URL"),  # Optional
)
extractor = MistralOCRExtractor(
    client=mistral_client,
    include_image_base64=True,      # Include image data
    include_image_annotation=True,  # Add image annotations
)
document = await extractor.extract(file)

Paramètres :

ParamètreTypePar défautDescription
clientMistral(obligatoire)Instance client Mistral
model_namestr"mistral-ocr-latest"Nom du modèle OCR
timeout_secondsint900Délai d'exécution de la requête en secondes
strip_page_markdownboolTrueSupprimer les espaces en début/fin de ligne dans le markdown de page
populate_contentboolTrueRemplir le champ content du document
include_image_base64boolFalseInclure les données des images en base64 dans le document
include_image_annotationboolFalseAjouter des annotations d'images au markdown de page
max_file_size_bytesint | NoneNoneTaille maximale de fichier avant division en parties
pages_split_sizeint | NoneNoneNombre de pages par division lorsque le fichier dépasse max_file_size_bytes
pages_group_sizeint | NoneNoneNombre de pages par requête API
http_headersMapping[str, str] | NoneNoneEn-têtes HTTP personnalisés transmise à l'API OCR
image_limitint | NoneNoneNombre maximal d'images à inclure par page
pagesSequence[int] | NoneNoneNuméros de pages spécifiques à extraire (basé sur 1)
table_format"markdown" | "html" | NoneNoneFormat de sortie des tableaux

Fonctionnalités :

  • OCR pour les documents scannés et les images
  • Sortie en markdown avec préservation de la structure
  • Suivi des références d'images avec encodage base64 optionnel
  • Extraction configurable des pages (pages spécifiques ou plages de pages)
  • Personnalisation du format de tableau (markdown ou HTML)
  • Gestion des gros fichiers avec division automatique
Extracteur de transcription audio Mistral

Extracteur de transcription audio Mistral

MistralAudioTranscriptionExtractor utilise l'API de transcription audio de Mistral pour convertir les fichiers audio en texte. Prise en charge de la diarisation des locuteurs et des granularités d'horodatage.

Exigences :

  • Une clé API Mistral

Installation : Bibliothèque de base (aucune dépendance supplémentaire requise)

Exemple :

import os

from mistralai.client import Mistral
from mistralai.search.toolkit.ingestion.extractors import MistralAudioTranscriptionExtractor

extractor = MistralAudioTranscriptionExtractor(
    client=Mistral(api_key=os.environ.get("MISTRAL_API_KEY", "your-api-key")),
    model_name="voxtral-mini-latest",  # Default model
    language="en",          # Optional language hint
    diarize=True,           # Enable speaker diarization
    timeout_seconds=900,    # Transcription timeout (default)
)
document = await extractor.extract(file)

Paramètres :

ParamètreTypePar défautDescription
clientMistral(obligatoire)Instance client Mistral
model_namestr"voxtral-mini-latest"Nom du modèle de transcription
languagestr | NoneNoneIndice de langue cible pour la transcription
diarizeboolFalseActiver la diarisation des locuteurs
timestamp_granularitieslist[str] | NoneNoneGranularités des horodatages (par ex. ["word", "segment"])
timeout_secondsint900Délai d'exécution de la requête en secondes
populate_contentboolTrueRemplir le champ content du document
http_headersMapping[str, str] | NoneNoneEn-têtes HTTP personnalisés transmis à l'API de transcription

Fonctionnalités :

  • Transcription audio avec prise en charge de la diarisation des locuteurs
  • Granularités des horodatages pour une précision au niveau des mots et des segments
  • Indice de langue pour une meilleure précision
  • Prise en charge des téléchargements de fichiers bruts et des sources URL distantes
  • Délai d'exécution personnalisable pour les fichiers audio longs
Extracteur de texte brut

Extracteur de texte brut

Extracteur pour les documents de type texte brut (txt, md, code, csv, etc.).

Installation : Bibliothèque de base (aucune dépendance supplémentaire requise)

Exemple :

from mistralai.search.toolkit.ingestion.extractors import PlainTextExtractor

extractor = PlainTextExtractor(
    page_size=2000,    # Characters per page (default)
    encoding="utf-8",  # Default encoding
)
document = await extractor.extract(file)

Options de configuration :

OptionTypePar défautObjectif
page_sizeint2000Caractères par page (divise les gros fichiers en pages logiques)
encodingstr"utf-8"Encodage des caractères pour la lecture des fichiers
skip_encoding_detectionboolFalseIgnorer la détection automatique de l'encodage (utiliser uniquement l'encodage spécifié)

Comportement :

  • Les fichiers plus grands que page_size sont divisés en plusieurs pages
  • Chaque page devient une page de document avec des métadonnées page_number
  • L'intégralité du contenu du fichier est préservée dans document.content
  • La détection de l'encodage essaie UTF-8 en premier, puis bascule sur d'autres encodages si activé
Extracteur HTML

Extracteur HTML

HTMLExtractor analyse les fichiers HTML et HTM et les convertit en markdown propre pour un découpage et une récupération en aval. Par défaut, il supprime les éléments de structure (navigation, pieds de page, scripts).

Installation :

Pour une conversion markdown par défaut :

uv add "mistralai-search-toolkit[html-converter-markdownify]"

Ou utilisez uniquement la bibliothèque de base si vous fournissez un convertisseur personnalisé.

Exemple :

from mistralai.search.toolkit.ingestion.extractors import HTMLExtractor

extractor = HTMLExtractor()
document = await extractor.extract(file)

Le convertisseur par défaut est MarkdownifyConverter, basé sur la bibliothèque markdownify (MIT). Il est configuré pour produire un markdown propre avec des titres ATX, des styles de puces cohérents, une détection des langages dans les blocs de code et une suppression complète des sous-arborescences pour les balises de structure.

Configuration du convertisseur par défaut :

MarkdownifyConverter accepte plusieurs options pour personnaliser son comportement :

from mistralai.search.toolkit.ingestion.extractors import HTMLExtractor, MarkdownifyConverter

# Use default settings
converter = MarkdownifyConverter()

# Or customize: only strip <script> and <style>, disable id/class filtering
converter = MarkdownifyConverter(
    ignore_tags=["script", "style"],
    ignore_ids=[],
    ignore_classes=[],
)

extractor = HTMLExtractor(converter=converter)
document = await extractor.extract(file)

Options MarkdownifyConverter :

OptionTypePar défautDescription
ignore_tagslist[str] | NoneDEFAULT_IGNORE_TAGSBalises HTML à supprimer entièrement, y compris tous leurs enfants. Si None, utilise la liste par défaut.
ignore_idslist[str] | NoneDEFAULT_IGNORE_IDSValeurs d'attribut id d'élément à supprimer (correspondance littérale). L'intégralité du sous-arbre est supprimée. Si None, utilise la liste par défaut.
ignore_classeslist[str] | NoneDEFAULT_IGNORE_CLASSESExpressions régulières comparées à chaque classe CSS d'un élément. Lorsque qu'une classe correspond, l'intégralité du sous-arbre est supprimée. Si None, utilise la liste par défaut.
escape_miscboolTrueÉchapper les caractères markdown divers (par ex. | dans les cellules de tableau).

Balises ignorées par défaut : head, header, script, style, title, footer, form, button, nav, iframe.

IDs ignorés par défaut : footer, sidebar, cookie, metadata.

Motifs de classes ignorées par défaut : footer, ^ad-, ^ad_, ^menu$, ^newsletter$, ^metadata$, ^muted$, vot(e|ing).

Convertisseur personnalisé :

Vous pouvez injecter n'importe quel objet qui implémente le protocole HtmlToMarkdownConverter :

from mistralai.search.toolkit.ingestion.extractors import HTMLExtractor, HtmlToMarkdownConverter

class MyConverter(HtmlToMarkdownConverter):
    def convert(self, html: str) -> str:
        return html  # your conversion logic

extractor = HTMLExtractor(converter=MyConverter())
document = await extractor.extract(file)

Paramètres :

ParamètreTypePar défautDescription
encodingstr"utf-8"Encodage du fichier HTML
decode_errorsstr"strict"Gestion des erreurs de décodage ("strict", "ignore", "replace")
converterHtmlToMarkdownConverter | NoneNoneInstance de convertisseur personnalisée. Si None, le MarkdownifyConverter par défaut est utilisé

Fonctionnalités :

  • Convertit le HTML en markdown propre avec suppression personnalisable
  • Préserve la structure (titres, listes, tableaux)
  • Suppression des éléments de structure (navigation, pieds de page, publicités, etc.)
  • Prise en charge des convertisseurs personnalisés pour des implémentations alternatives HTML vers markdown
Extracteur de feuilles de calcul

Extracteur de feuilles de calcul

Extracteur pour les documents de type tableur (XLSX/XLS/ODS), produisant un CSV par feuille.

Installation :

uv add "mistralai-search-toolkit[extractor-spreadsheet]"

Exemple :

from mistralai.search.toolkit.ingestion.extractors import SpreadsheetExtractor

extractor = SpreadsheetExtractor(
    include_sheet_name=True,  # Include sheet name in output
    row_limit=None,           # Optional row limit per sheet
    col_limit=None,           # Optional column limit per sheet
)
document = await extractor.extract(file)

Options de configuration :

OptionTypePar défautObjectif
include_sheet_nameboolTrueAjouter le nom de la feuille au début de chaque bloc CSV
row_limitint | NoneNoneNombre maximal de lignes par feuille (None = aucune limite)
col_limitint | NoneAucuneNombre maximum de colonnes par feuille (Aucune = aucune limite)
skip_empty_sheetsboolTrueIgnorer les feuilles sans données
preserve_formula_valuesboolTrueUtiliser les résultats des formules, pas leur texte

Comportement :

  • Chaque feuille devient un bloc CSV distinct dans le document
  • Les cellules fusionnées sont étendues avec les valeurs répétées
  • Les formules sont évaluées (sauf si preserve_formula_values=False)
  • Les en-têtes sont déduits de la première ligne
Extracteur d’e-mails

Extracteur d’e-mails

Extrait les fichiers d’e-mails (.eml et .msg) dans un unique document en Markdown avec l’objet, l’expéditeur, les destinataires, la date et le corps. Les corps au format HTML sont convertis en Markdown lorsqu’ils sont disponibles.

Installation :

uv add "mistralai-search-toolkit[extractor-email]"

Ajoute les dépendances eml-parser et extract-msg.

Exemple :

from mistralai.search.toolkit.ingestion.extractors import EmailExtractor

extractor = EmailExtractor()
document = await extractor.extract(file)

Fonctionnalités :

  • Analyse les formats EML (RFC 822) et MSG d’Outlook
  • Génère un Markdown structuré (objet, expéditeur, destinataire, CC, date, corps)
  • Préfère le corps en texte brut ; utilise le HTML converti en Markdown en solution de repli

Pièces jointes : utilisez extract_email_attachments (ou extract_eml_attachments / extract_msg_attachments) pour traiter les pièces jointes du même fichier d’e-mail. Elles renvoyent une liste de EmailAttachment (nom de fichier, type de contenu, données, extension) que vous pouvez transmettre à d’autres extracteurs :

from mistralai.search.toolkit.ingestion.extractors import (
    EmailExtractor,
    EmailAttachment,
    extract_email_attachments,
)

document = await EmailExtractor().extract(file)
attachments = extract_email_attachments(file.raw, extension="eml")
for att in attachments:
    # Build a File from att.data and run through the right extractor
    ...
Extracteur Numbers

Extracteur Numbers

Extracteur pour les documents Apple Numbers (.numbers), générant un CSV par tableau/feuille.

Installation :

uv add "mistralai-search-toolkit[extractor-spreadsheet]"

Exemple :

from mistralai.search.toolkit.ingestion.extractors import NumbersExtractor, NumbersOptions

extractor = NumbersExtractor(
    row_limit=1000,           # Cap rows per table
    col_limit=50,             # Cap columns per table
    include_sheet_name=True,  # Prefix each block with sheet/table name
)
document = await extractor.extract(file)

Utilisez iter_csv_pages(blob, options=...) pour itérer sur des chaînes CSV sans construire un Document complet.

Extracteur Legacy Office

Extracteur Legacy Office

Extrait les anciens formats Office (.doc, .ppt, .hwp, .hwpx) en les convertissant en PDF avec PyMuPDF Pro, puis en lançant Mistral OCR. Ne gère pas les fichiers .xls — utilisez SpreadsheetExtractor pour cela.

Installation :

uv add "mistralai-search-toolkit[extractor-pymupdf]"

Nécessite une licence PyMuPDF Pro pour la prise en charge complète des formats.

Exemple :

from mistralai.client import Mistral
from mistralai.search.toolkit.ingestion.extractors import LegacyOfficeExtractor, MistralOCRExtractor

ocr_extractor = MistralOCRExtractor(
    client=Mistral(api_key="your-api-key")
)
extractor = LegacyOfficeExtractor(
    ocr_extractor,
    pymupdf_license_key="your-license-key",  # Optional
)
document = await extractor.extract(
    file,
    include_image_base64=True,
    include_image_annotation=True,
)

Fonctionnalités :

  • Convertit le document au format hérité en PDF en mémoire, puis délègue à MistralOCRExtractor
  • Prend en charge les mêmes options OCR que Mistral OCR (par exemple, http_headers, image_limit)
Créer des extracteurs personnalisés

Créer des extracteurs personnalisés

Implémentez le protocole DocumentExtractor :

import base64
from mistralai.search.toolkit.ingestion.extractors import DocumentExtractor
from mistralai.search.toolkit.document import Document, Page
from mistralai.search.toolkit.ingestion import File

class Base64FileExtractor(DocumentExtractor):
    """Extract content from base64-encoded text files."""

    async def extract(self, file: File, **kwargs) -> Document:
        decoded_content = base64.b64decode(file.raw).decode("utf-8")

        return Document(
            id=file.id,
            extractor_type="text",
            content=decoded_content,
            pages=[Page(page_number=1, markdown=decoded_content, ref_to_images={})],
            metadata={"encoding": "base64"},
            filename=file.name,
            filepath=file.path,
        )

extractor = Base64FileExtractor()
document = await extractor.extract(b64_file)