Guide
Sortie JSON structurée : forcer un schéma par l'API
Obtenir un JSON conforme à votre schéma avec Claude, Gemini et Mistral : paramètres, exemple, mots-clés de schéma non pris en charge, contrôles à garder.
Mis à jour le
Pour obtenir de l'API d'un modèle un JSON qui respecte exactement votre schéma, n'écrivez plus « réponds en JSON » dans le prompt : utilisez la sortie structurée. Vous joignez à la requête un schéma JSON Schema (la norme qui décrit la forme attendue d'un objet JSON) et l'API contraint la génération pour que la réponse le suive. Chez Claude, cela passe par output_config.format ; chez Gemini, par response_format ; chez Mistral, par response_format avec un schéma. Détails d'après les documentations lues le 15/11/2026.
Claude : output_config.format
La documentation d'Anthropic décrit deux fonctions complémentaires : les sorties JSON, qui contraignent la réponse, et l'usage strict des outils (strict: true), qui garantit que les paramètres passés à vos fonctions respectent leur schéma. L'appel d'outils lui-même est expliqué sur Cercle IA Tech · Agents.
L'exemple officiel extrait des informations d'un courriel :
curl https://api.anthropic.com/v1/messages \
-H "content-type: application/json" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2026-10-21" \
-d '{
"model": "claude-opus-5-5",
"max_tokens": 1024,
"messages": [{"role": "user", "content": "Extract the key information from this email: ..."}],
"output_config": {
"format": {
"type": "json_schema",
"schema": {
"type": "object",
"properties": {
"name": {"type": "string"},
"email": {"type": "string"},
"plan_interest": {"type": "string"},
"demo_requested": {"type": "boolean"}
},
"required": ["name", "email", "plan_interest", "demo_requested"],
"additionalProperties": false
}
}
}
}'
Ce que promet la documentation : une génération contrainte (« constrained decoding »), donc une réponse toujours analysable, des types et des champs obligatoires respectés, sans nouvel essai pour non-conformité. La fonction est marquée stable.
Ce qui n'est pas pris en charge dans le schéma (une erreur 400 le signale) :
- les schémas récursifs ;
- les types complexes dans une énumération ;
- les références externes (
$refvers une adresse web) ; - les contraintes numériques (
minimum,maximum,multipleOf) ; - les contraintes de longueur de chaîne (
minLength,maxLength) ; - les contraintes de tableau au-delà d'un
minItemsde 0 ou 1 ; additionalPropertiesautre quefalse.
Chaque objet doit déclarer required et additionalProperties: false. Et l'ancienne astuce qui consistait à pré-remplir le début de la réponse de l'assistant (par une accolade, par exemple) ne fonctionne plus : à partir de Claude 4.6, un message d'assistant pré-rempli renvoie une erreur 400, et la documentation oriente vers les sorties structurées. Changer de format en cours de conversation invalide le cache du prompt de cette conversation.
Gemini : response_format
Dans l'API Interactions de Google, la sortie structurée se règle avec un objet response_format dont le mime_type vaut application/json et dont le champ schema contient le schéma :
{
"model": "gemini-4-hydrogen",
"input": "Extract the name and age from: Ana is 30.",
"response_format": {
"type": "text",
"mime_type": "application/json",
"schema": {
"type": "object",
"properties": {
"name": {"type": "string"},
"age": {"type": "integer"}
},
"required": ["name", "age"]
}
}
}
Google garantit un JSON syntaxiquement correct, et prévient : certains mots-clés ne sont pas appliqués par le moteur de génération contrainte (minLength, maxLength, minProperties, maxProperties, uniqueItems, contains, minContains, maxContains). Ils sont retirés sans erreur. Les schémas très grands ou très imbriqués peuvent être refusés.
Mistral : schéma personnalisé ou mode JSON
La documentation de Mistral propose deux options : un schéma personnalisé, « plus fiable et recommandé chaque fois que possible », et un mode JSON simple. Pour ce dernier, elle précise qu'il faut demander explicitement du JSON dans le prompt. En Python, l'exemple officiel passe un modèle Pydantic (une bibliothèque Python de description de données) à client.chat.parse.
Le tableau de décision
| Besoin | Réglage |
|---|---|
| Extraire des champs d'un texte (courriel, devis, fiche) | Sortie JSON avec schéma |
| Faire appeler vos fonctions avec des paramètres valides | Usage strict des outils |
| Un JSON quelconque, sans forme imposée | Mode JSON (Mistral) ou schéma très ouvert |
| Des contraintes fines (longueur, bornes numériques) | Schéma + validation dans votre code |
Les contrôles à garder
La sortie structurée garantit la forme, pas le fond. Google le dit en toutes lettres : validez toujours les valeurs dans votre application, et prévoyez des réponses conformes au schéma mais fausses sur le sens. En pratique :
- validez le JSON reçu avec le même schéma, côté serveur ;
- vérifiez les règles métier (une date de livraison dans le passé, un montant négatif) ;
- prévoyez un champ « non trouvé » plutôt que de forcer le modèle à inventer une valeur obligatoire.
Un mot sur la compatibilité OpenAI : chez Anthropic, cette couche n'accepte response_format qu'avec json_schema et strict: true ; json_object ou text renvoient une erreur 400.
Questions fréquentes
La sortie structurée garantit-elle des valeurs justes ?
Non. Elle garantit la forme (un JSON valide qui suit le schéma), pas l'exactitude du contenu. Google le rappelle : validez toujours les valeurs dans votre application.
Peut-on encore pré-remplir la réponse de Claude avec une accolade ?
Plus sur les modèles récents : à partir de Claude 4.6, le pré-remplissage du message de l'assistant renvoie une erreur 400. La documentation oriente vers les sorties structurées.
Sources
Pages consultées pour écrire cet article :
- https://platform.claude.com/docs/en/build-with-claude/structured-outputs
- https://platform.claude.com/docs/en/api/errors
- https://aistudio.google.com/docs/structured-output
- https://docs.mistral.ai/capabilities/structured-output/custom_structured_output/
- https://platform.claude.com/docs/en/cli-sdks-libraries/libraries/openai-sdk