Aller au contenu principal

JSON Mode vs Custom Structured Outputs

Deux approches, deux philosophies

L’API Mistral propose deux mécanismes distincts pour obtenir des sorties structurées. Chacun répond à des besoins différents, et le choix entre les deux dépend de votre cas d’usage, de votre stack technique et de votre exigence de fiabilité.

JSON Mode : la flexibilité

Le JSON Mode est l’approche la plus simple. Vous activez un paramètre dans votre requête, et Mistral garantit que la sortie sera un JSON valide. C’est tout.

Le modèle est libre de choisir la structure du JSON — les clés, les types, la profondeur. Vous guidez le format souhaité via votre prompt, mais il n’y a aucune contrainte technique sur le schéma.

# JSON Mode — le modèle choisit la structure
response = client.chat.complete(
    model="mistral-large-latest",
    messages=[{"role": "user", "content": "Analyse ce texte et retourne le résultat en JSON."}],
    response_format={"type": "json_object"}
)

Avantages :

  • Simple à mettre en place (un seul paramètre)
  • Flexible — pas besoin de définir un schéma à l’avance
  • Adapté au prototypage rapide et à l’exploration

Inconvénients :

  • Aucune garantie sur la structure exacte du JSON
  • Le modèle peut omettre des champs ou changer les noms de clés
  • Nécessite une validation côté client

Custom Structured Outputs : la rigueur

Les Custom Structured Outputs vont plus loin. Vous définissez un schéma précis — avec Pydantic en Python ou Zod en TypeScript — et Mistral contraint le modèle à respecter exactement ce schéma.

from pydantic import BaseModel

class Analyse(BaseModel):
    sentiment: str
    score: float
    keywords: list[str]

# Custom — le schéma est imposé
response = client.chat.parse(
    model="mistral-large-latest",
    messages=[{"role": "user", "content": "Analyse ce texte."}],
    response_format=Analyse
)

Avantages :

  • Schéma garanti — chaque champ est présent avec le bon type
  • Objet parsé directement exploitable (instance Pydantic/Zod)
  • Idéal pour la production et les pipelines critiques

Inconvénients :

  • Nécessite de définir un modèle de données à l’avance
  • Moins flexible pour l’exploration
  • Légère surcharge de développement initial

Comparaison détaillée

Critère JSON Mode Custom Structured Outputs
Activation response_format: {"type": "json_object"} response_format: MonModèle (Pydantic/Zod)
Méthode API client.chat.complete() client.chat.parse()
Garantie de schéma Non — JSON valide uniquement Oui — schéma exact respecté
Parsing automatique Non — json.loads() manuel Oui — .parsed retourne l'objet typé
Flexibilité Haute — structure libre Faible — structure fixée
Cas d'usage idéal Prototypage, exploration, schémas variables Production, pipelines critiques, APIs
Validation nécessaire Oui — côté client obligatoire Minimale — le schéma fait le travail

Quand choisir quoi ?

Choisissez JSON Mode si :

  • Vous prototypez rapidement et le schéma n’est pas encore stabilisé
  • La structure de la sortie varie selon l’input (par exemple, des analyses exploratoires)
  • Vous travaillez dans un langage sans support Pydantic/Zod

Choisissez Custom Structured Outputs si :

  • Vous êtes en production et la fiabilité est critique
  • Le schéma de sortie est connu à l’avance et stable
  • Vous travaillez en Python ou TypeScript avec Pydantic ou Zod
  • Vous avez besoin d’objets typés directement exploitables

Recommandation Mistral

La documentation officielle de Mistral recommande d’utiliser les Custom Structured Outputs quand c’est possible. Le JSON Mode reste un bon point d’entrée, mais les Custom Outputs offrent une fiabilité supérieure et réduisent considérablement le code de validation côté client.

Points clés à retenir

  • JSON Mode = JSON valide garanti, structure libre, simple à activer
  • Custom Structured Outputs = schéma exact garanti, parsing automatique, idéal en production
  • Commencez par JSON Mode pour prototyper, migrez vers Custom pour la production
  • Les deux approches sont complémentaires, pas mutuellement exclusives