Was this page helpful?
Les sorties structurées contraignent les réponses de Claude à suivre un schéma spécifique, garantissant une sortie valide et analysable pour le traitement en aval. Les sorties structurées fournissent deux fonctionnalités complémentaires :
output_config.format) : Obtenir la réponse de Claude dans un format JSON spécifiquestrict: true) : Garantir la validation du schéma sur les noms et les entrées des outilsVous pouvez utiliser ces fonctionnalités indépendamment ou ensemble dans la même requête.
Les sorties structurées sont généralement disponibles sur l'API Claude pour Claude Mythos Preview, Claude Opus 4.7, Claude Opus 4.6, Claude Sonnet 4.6, Claude Sonnet 4.5, Claude Opus 4.5, et Claude Haiku 4.5. Sur Amazon Bedrock, les sorties structurées sont généralement disponibles pour Claude Mythos Preview, Claude Opus 4.6, Claude Sonnet 4.6, Claude Sonnet 4.5, Claude Opus 4.5, et Claude Haiku 4.5 ; Claude Opus 4.7 est disponible via la préversion de recherche Amazon Bedrock. Les sorties structurées sont en bêta sur Microsoft Foundry. Les sorties structurées ne sont pas prises en charge sur Vertex AI de Google Cloud pour Claude Mythos Preview.
This feature qualifies for Zero Data Retention (ZDR) with limited technical retention. See the Data retention section for details on what is retained and why.
Migration depuis la bêta ? Le paramètre output_format a été déplacé vers output_config.format, et les en-têtes bêta ne sont plus nécessaires. L'ancien en-tête bêta (structured-outputs-2025-11-13) et le paramètre output_format continueront à fonctionner pendant une période de transition. Consultez les exemples de code ci-dessous pour la forme API mise à jour.
Sans sorties structurées, Claude peut générer des réponses JSON mal formées ou des entrées d'outils invalides qui cassent vos applications. Même avec un invite soigné, vous pouvez rencontrer :
Les sorties structurées garantissent des réponses conformes au schéma grâce au décodage contraint :
JSON.parse()Les sorties JSON contrôlent le format de réponse de Claude, garantissant que Claude retourne un JSON valide correspondant à votre schéma. Utilisez les sorties JSON lorsque vous avez besoin de :
Format de réponse : JSON valide correspondant à votre schéma dans response.content[0].text
{
"name": "John Smith",
"email": "[email protected]",
"plan_interest": "Enterprise",
"demo_requested": true
}Définir votre schéma JSON
Créez un schéma JSON qui décrit la structure que vous souhaitez que Claude suive. Le schéma utilise le format JSON Schema standard avec certaines limitations (voir Limitations du schéma JSON).
Ajouter le paramètre output_config.format
Incluez le paramètre output_config.format dans votre requête API avec type: "json_schema" et votre définition de schéma.
Analyser la réponse
La réponse de Claude est un JSON valide correspondant à votre schéma, retourné dans response.content[0].text.
Les SDKs fournissent des assistants qui facilitent le travail avec les sorties JSON, notamment la transformation de schéma, la validation automatique et l'intégration avec les bibliothèques de schéma populaires.
Le SDK Python client.messages.parse() accepte toujours output_format comme paramètre de commodité et le traduit en output_config.format en interne. Les autres SDKs nécessitent output_config directement. Les exemples ci-dessous montrent la syntaxe d'assistance du SDK.
Au lieu d'écrire des schémas JSON bruts, vous pouvez utiliser des outils de définition de schéma familiers dans votre langage :
client.messages.parse()zodOutputFormat() ou littéraux JSON Schema typés avec jsonSchemaOutputFormat()outputConfig(Class<T>)Anthropic::BaseModel avec output_config: {format: Model}StructuredOutputModel avec outputConfig: ['format' => MyClass::class]Chaque SDK fournit des assistants qui facilitent le travail avec les sorties structurées. Consultez les pages individuelles du SDK pour plus de détails.
Les SDKs Python, TypeScript, Ruby et PHP transforment automatiquement les schémas avec des fonctionnalités non supportées :
minimum, maximum, minLength, maxLength)additionalProperties: false à tous les objetsCela signifie que Claude reçoit un schéma simplifié, mais votre code applique toujours toutes les contraintes par la validation.
Exemple : un champ Pydantic avec minimum: 100 devient un entier simple dans le schéma envoyé, mais le SDK met à jour la description à « Doit être au moins 100 » et valide la réponse par rapport à la contrainte originale.
Pour appliquer la conformité du schéma JSON sur les entrées d'outils avec l'échantillonnage contraint par grammaire, consultez Utilisation stricte des outils.
Les sorties JSON et l'utilisation stricte des outils résolvent des problèmes différents et fonctionnent ensemble :
Lorsqu'elles sont combinées, Claude peut appeler des outils avec des paramètres garantis valides ET retourner des réponses JSON structurées. Ceci est utile pour les flux de travail d'agents où vous avez besoin à la fois d'appels d'outils fiables et de sorties finales structurées.
Les sorties structurées utilisent l'échantillonnage contraint avec des artefacts de grammaire compilés. Cela introduit certaines caractéristiques de performance à connaître :
name ou description n'invalide pas le cacheLors de l'utilisation de sorties structurées, Claude reçoit automatiquement une invite système supplémentaire expliquant le format de sortie attendu. Cela signifie :
output_config.format invalidera tout cache d'invite pour ce fil de conversationLes sorties structurées supportent le schéma JSON standard avec certaines limitations. Les sorties JSON et l'utilisation stricte des outils partagent ces limitations.
Les SDK Python, TypeScript, Ruby et PHP peuvent transformer automatiquement les schémas avec des fonctionnalités non supportées en les supprimant et en ajoutant des contraintes aux descriptions de champs. Voir méthodes spécifiques au SDK pour plus de détails.
Lors de l'utilisation de sorties structurées, les propriétés dans les objets maintiennent leur ordre défini à partir de votre schéma, avec une mise en garde importante : les propriétés requises apparaissent en premier, suivies par les propriétés optionnelles.
Par exemple, étant donné ce schéma :
{
"type": "object",
"properties": {
"notes": { "type": "string" },
"name": { "type": "string" },
"email": { "type": "string" },
"age": { "type": "integer" }
},
"required": ["name", "email"],
"additionalProperties": false
}La sortie ordonnera les propriétés comme :
name (requis, dans l'ordre du schéma)email (requis, dans l'ordre du schéma)notes (optionnel, dans l'ordre du schéma)age (optionnel, dans l'ordre du schéma)Cela signifie que la sortie pourrait ressembler à :
{
"name": "John Smith",
"email": "[email protected]",
"notes": "Interested in enterprise plan",
"age": 35
}Si l'ordre des propriétés dans la sortie est important pour votre application, marquez toutes les propriétés comme requises, ou tenez compte de ce réordonnancement dans votre logique d'analyse.
Bien que les sorties structurées garantissent la conformité au schéma dans la plupart des cas, il existe des scénarios où la sortie peut ne pas correspondre à votre schéma :
Refus (stop_reason: "refusal")
Claude maintient ses propriétés de sécurité et d'utilité même lors de l'utilisation de sorties structurées. Si Claude refuse une requête pour des raisons de sécurité :
stop_reason: "refusal"Limite de jetons atteinte (stop_reason: "max_tokens")
Si la réponse est coupée en raison de l'atteinte de la limite max_tokens :
stop_reason: "max_tokens"max_tokens plus élevée pour obtenir la sortie structurée complèteLes sorties structurées fonctionnent en compilant vos schémas JSON en une grammaire qui contraint la sortie de Claude. Les schémas plus complexes produisent des grammaires plus grandes qui prennent plus de temps à compiler. Pour se protéger contre les temps de compilation excessifs, l'API applique plusieurs limites de complexité.
Les limites suivantes s'appliquent à toutes les requêtes avec output_config.format ou strict: true :
| Limite | Valeur | Description |
|---|---|---|
| Outils stricts par requête | 20 | Nombre maximum d'outils avec strict: true. Les outils non stricts ne comptent pas vers cette limite. |
| Paramètres optionnels | 24 | Total des paramètres optionnels dans tous les schémas d'outils stricts et les schémas de sortie JSON. Chaque paramètre non listé dans required compte vers cette limite. |
| Paramètres avec types union | 16 | Total des paramètres qui utilisent anyOf ou des tableaux de types (par exemple, "type": ["string", "null"]) dans tous les schémas stricts. Ceux-ci sont particulièrement coûteux car ils créent un coût de compilation exponentiel. |
Ces limites s'appliquent au total combiné dans tous les schémas stricts d'une seule requête. Par exemple, si vous avez 4 outils stricts avec 6 paramètres optionnels chacun, vous atteindrez la limite de 24 paramètres même si aucun outil ne semble complexe.
Au-delà des limites explicites ci-dessus, il existe des limites internes supplémentaires sur la taille de la grammaire compilée. Ces limites existent car la complexité du schéma ne se réduit pas à une seule dimension : des fonctionnalités comme les paramètres optionnels, les types union, les objets imbriqués et le nombre d'outils interagissent les uns avec les autres de manière à pouvoir rendre la grammaire compilée disproportionnément grande.
Lorsque ces limites sont dépassées, vous recevrez une erreur 400 avec le message « Schema is too complex for compilation ». Ces erreurs signifient que la complexité combinée de vos schémas dépasse ce qui peut être compilé efficacement, même si chaque limite individuelle ci-dessus est satisfaite. En dernier recours, l'API applique également un délai d'expiration de compilation de 180 secondes. Les schémas qui passent tous les contrôles explicites mais produisent des grammaires compilées très grandes peuvent atteindre ce délai d'expiration.
Si vous atteignez les limites de complexité, essayez ces stratégies dans l'ordre :
Marquez uniquement les outils critiques comme stricts. Si vous avez de nombreux outils, réservez-le aux outils où les violations de schéma causent de vrais problèmes, et fiez-vous à l'adhérence naturelle de Claude pour les outils plus simples.
Réduisez les paramètres optionnels. Rendez les paramètres required si possible. Chaque paramètre optionnel double approximativement une partie de l'espace d'état de la grammaire. Si un paramètre a toujours une valeur par défaut raisonnable, envisagez de le rendre requis et d'avoir Claude fournir cette valeur par défaut explicitement.
Simplifiez les structures imbriquées. Les objets profondément imbriqués avec des champs optionnels composent la complexité. Aplatissez les structures si possible.
Divisez en plusieurs requêtes. Si vous avez de nombreux outils stricts, envisagez de les diviser entre plusieurs requêtes ou sous-agents.
Pour les problèmes persistants avec des schémas valides, contactez le support avec votre définition de schéma.
Les invites et les réponses sont traitées avec ZDR lors de l'utilisation de sorties structurées. Cependant, le schéma JSON lui-même est temporairement mis en cache pendant jusqu'à 24 heures depuis la dernière utilisation à des fins d'optimisation. Aucune donnée d'invite ou de réponse n'est conservée au-delà de la réponse de l'API.
Les sorties structurées sont éligibles à HIPAA, mais les PHI ne doivent pas être inclus dans les définitions de schéma JSON. L'API compile les schémas JSON en grammaires qui sont mises en cache séparément du contenu des messages, et ces schémas mis en cache ne reçoivent pas les mêmes protections PHI que les invites et les réponses. N'incluez pas de PHI dans les noms de propriétés de schéma, les valeurs enum, les valeurs const ou les expressions régulières pattern. Les PHI ne doivent apparaître que dans le contenu des messages (invites et réponses), où ils sont protégés par les garanties de sécurité HIPAA.
Pour l'éligibilité ZDR et HIPAA dans toutes les fonctionnalités, voir API et conservation des données.
Fonctionne avec :
output_config.format) et l'utilisation stricte des outils (strict: true) ensemble dans la même requêteIncompatible avec :
output_config.format.Portée de la grammaire : Les grammaires s'appliquent uniquement à la sortie directe de Claude, pas aux appels d'utilisation d'outils, aux résultats d'outils ou aux balises de réflexion (lors de l'utilisation de Extended Thinking). L'état de la grammaire se réinitialise entre les sections, permettant à Claude de réfléchir librement tout en produisant une sortie structurée dans la réponse finale.
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-4-7",
max_tokens=1024,
messages=[
{
"role": "user",
"content": "Extract the key information from this email: John Smith ([email protected]) is interested in our Enterprise plan and wants to schedule a demo for next Tuesday at 2pm.",
}
],
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,
},
}
},
)
print(response.content[0].text)output_configfrom pydantic import BaseModel
from anthropic import Anthropic
class ContactInfo(BaseModel):
name: str
email: str
plan_interest: str
demo_requested: bool
client = Anthropic()
response = client.messages.parse(
model="claude-opus-4-7",
max_tokens=1024,
messages=[
{
"role": "user",
"content": "Extract the key information from this email: John Smith ([email protected]) is interested in our Enterprise plan and wants to schedule a demo for next Tuesday at 2pm.",
}
],
output_format=ContactInfo,
)
print(response.parsed_output)response = client.messages.create(
model="claude-opus-4-7",
max_tokens=1024,
messages=[
{
"role": "user",
"content": "Help me plan a trip to Paris departing May 15, 2026",
}
],
# JSON outputs: structured response format
output_config={
"format": {
"type": "json_schema",
"schema": {
"type": "object",
"properties": {
"summary": {"type": "string"},
"next_steps": {"type": "array", "items": {"type": "string"}},
},
"required": ["summary", "next_steps"],
"additionalProperties": False,
},
}
},
# Strict tool use: guaranteed tool parameters
tools=[
{
"name": "search_flights",
"strict": True,
"input_schema": {
"type": "object",
"properties": {
"destination": {"type": "string"},
"date": {"type": "string", "format": "date"},
},
"required": ["destination", "date"],
"additionalProperties": False,
},
}
],
)
print(response)