Guides · Structured outputs
Sorties structurées : un JSON conforme à votre schéma
Les sorties structurées obligent le modèle à répondre par un JSON qui suit le schéma que vous définissez, plutôt que par un texte libre à analyser. Utilisez-les dès qu'un programme lit le résultat : extraction de champs dans des documents, classification de tickets, routage de demandes ou remplissage de formulaires. Le format de requête est le champ `response_format` d'OpenAI, et la sortie est contrainte pendant sa génération.
- 01Format d'API: OpenAI
- 02Centres de données dans l'UE
- 03Couvert par un seul DPA
import json, os
from openai import OpenAI
client = OpenAI(base_url="https://api.inference.eu/v1", api_key=os.environ["INFERENCE_EU_API_KEY"])
schema = {
"type": "object",
"properties": {
"supplier": {"type": "string"},
"invoice_number": {"type": "string"},
"issue_date": {"type": "string", "description": "ISO 8601 date"},
"currency": {"type": "string", "enum": ["EUR", "GBP", "CHF", "PLN", "SEK"]},
"total": {"type": "number"},
"vat_id": {"type": ["string", "null"]},
},
"required": ["supplier", "invoice_number", "issue_date", "currency", "total", "vat_id"],
"additionalProperties": False,
}
reply = client.chat.completions.create(
model="gpt-oss-120b",
messages=[
{"role": "system", "content": "Extract invoice fields. Use null when a field is missing."},
{"role": "user", "content": open("invoice.md").read()},
],
response_format={
"type": "json_schema",
"json_schema": {"name": "invoice", "schema": schema, "strict": True},
},
)
invoice = json.loads(reply.choices[0].message.content)Comment fonctionnent les sorties structurées
Ajoutez response_format avec type: "json_schema" et un objet json_schema contenant un name, votre schema en JSON Schema et strict: true. Pendant la génération, l'API n'autorise que les tokens qui gardent la sortie valide au regard du schéma. Le résultat dans message.content est une chaîne JSON que vous analysez directement.
C'est plus fiable que de réclamer du JSON dans le prompt. Le modèle ne peut ni glisser une phrase avant l'accolade ouvrante, ni omettre un champ obligatoire, ni inventer une propriété non définie. Vous décrivez toujours la tâche dans le prompt : le schéma fixe la forme, le prompt le contenu.
Mode JSON et conception du schéma
response_format: {"type": "json_object"} est l'option plus souple, appelée mode JSON. La sortie est un JSON valide garanti, mais sans structure imposée : citez donc les champs attendus dans le prompt. Préférez json_schema dès que vous connaissez la forme.
Gardez des schémas simples et explicites. Listez chaque propriété dans required et réglez additionalProperties sur false, comme l'attend le mode strict. Représentez les valeurs facultatives par un type qui accepte null, comme vat_id dans l'exemple, pour que le modèle puisse signaler une absence au lieu de deviner. Utilisez enum pour les catégories fixes et ajoutez une description aux champs dont le nom ne suffit pas.
Un pipeline d'extraction éprouvé
Un schéma courant transforme des documents en données. Convertissez chaque PDF en Markdown avec l'outil de conversion de documents, envoyez le texte avec un court prompt système et votre schéma, puis analysez le résultat. Validez l'objet obtenu avec le même schéma dans votre code, puis vérifiez les règles métier que le schéma ne peut exprimer, comme la cohérence des totaux.
Pour des milliers de documents, regroupez les mêmes requêtes dans un traitement par lots. Prévoyez un champ de confiance ou une courte chaîne notes si les relecteurs doivent comprendre un choix. Avec l'API Responses, le même schéma se place dans text.format au lieu de response_format.
Erreurs et cas particuliers
Les schémas très volumineux ou très imbriqués, et certains mots-clés inhabituels comme des expressions pattern complexes ou des oneOf aux branches qui se recoupent, peuvent être refusés avec une erreur 400 qui désigne la partie non prise en charge. Scindez ou simplifiez ces schémas.
Le schéma garantit le format, pas l'exactitude. Un modèle peut écrire une mauvaise date dans un champ de date valide : vérifiez les valeurs importantes. Si la génération s'arrête à max_tokens, le JSON est tronqué et ne s'analyse pas ; contrôlez finish_reason et augmentez la limite. Les modèles de raisonnement réfléchissent avant d'écrire le JSON, prévoyez de la place pour les deux. Les refus sont renvoyés en texte.
Structured outputs : questions fréquentes
Les questions que nous posent le plus les achats, les développeurs et les juristes. Il en manque une ? Posez-la-nous directement.
Pages liées
- Tool callingLaissez des modèles ouverts appeler vos fonctions et vos API grâce à l'appel d'outils compatible OpenAI. Définir les outils, gérer la boucle, dans l'UE.Guides
- Document conversionConvertissez vos fichiers PDF, Word, PowerPoint et Excel en Markdown propre pour le RAG et les prompts. Tableaux, titres et scans, traités dans l'UE.Outils
- Chat completionsEnvoyez vos messages à des modèles open-weight au format chat completions d'OpenAI. Traitement dans des centres de données de l'UE, sans entraînement.Endpoints
- BatchesExécutez des milliers de requêtes de chat ou d'embeddings en un seul traitement asynchrone avec une API batch compatible OpenAI, traitée dans l'UE.Endpoints
Faites passer vos charges IA sur une infrastructure européenne
Dites-nous quels modèles vous utilisez et votre volume approximatif. Nous répondons sous un jour ouvré avec un tarif et la suite.
- Réponse sous un jour ouvré
- Tarif adapté à votre volume
- DPA prêt à signer