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. Deux fonctionnalités complémentaires sont disponibles :
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 d'outils et les entréesLe paramètre output_format a été déplacé vers output_config.format. L'ancien paramètre output_format fonctionne toujours temporairement mais est déprécié et sera supprimé dans une future version de l'API. Mettez à jour votre code pour utiliser output_config: {format: {...}} à la place.
Ces fonctionnalités peuvent être utilisées indépendamment ou ensemble dans la même requête.
Les sorties structurées sont généralement disponibles sur l'API Claude et Amazon Bedrock pour Claude Opus 4.6, Claude Sonnet 4.5, Claude Opus 4.5 et Claude Haiku 4.5. Les sorties structurées restent en bêta public sur Microsoft Foundry.
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 d'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 quand vous avez besoin de :
curl https://api.anthropic.com/v1/messages \
-H "content-type: application/json" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-d '{
"model": "claude-opus-4-6",
"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
}
}
}
}'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 voulez 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 sera un JSON valide correspondant à votre schéma, retourné dans response.content[0].text.
Les SDK Python et TypeScript fournissent des assistants qui facilitent le travail avec les sorties JSON, y compris la transformation de schéma, la validation automatique et l'intégration avec les bibliothèques de schéma populaires.
Les méthodes d'assistance du SDK (comme .parse() et l'intégration Pydantic/Zod) acceptent toujours output_format comme paramètre de commodité. Le SDK gère la traduction vers output_config.format en interne. Les exemples ci-dessous montrent la syntaxe d'assistance du SDK.
Pour les développeurs Python et TypeScript, vous pouvez utiliser des outils de définition de schéma familiers comme Pydantic et Zod au lieu d'écrire des schémas JSON bruts.
from pydantic import BaseModel
from anthropic import Anthropic, transform_schema
class ContactInfo(BaseModel):
name: str
email: str
plan_interest: str
demo_requested: bool
client = Anthropic()
# With .create() - requires transform_schema()
response = client.messages.create(
model="claude-opus-4-6",
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": transform_schema(ContactInfo),
}
}
)
print(response.content[0].text)
# With .parse() - can pass Pydantic model directly
response = client.messages.parse(
model="claude-opus-4-6",
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)Python : client.messages.parse() (Recommandé)
La méthode parse() transforme automatiquement votre modèle Pydantic, valide la réponse et retourne un attribut parsed_output.
Python : Assistant transform_schema()
Pour quand vous avez besoin de transformer manuellement les schémas avant d'envoyer, ou quand vous voulez modifier un schéma généré par Pydantic. Contrairement à client.messages.parse(), qui transforme automatiquement les schémas fournis, cela vous donne le schéma transformé pour que vous puissiez le personnaliser davantage.
Les SDK Python et TypeScript 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 grâce à la validation.
Exemple : Un champ Pydantic avec minimum: 100 devient un entier simple dans le schéma envoyé, mais la description est mise à jour à « Doit être au moins 100 », et le SDK valide la réponse par rapport à la contrainte originale.
L'utilisation stricte d'outils valide les paramètres d'outils, garantissant que Claude appelle vos fonctions avec des arguments correctement typés. Utilisez l'utilisation stricte d'outils quand vous avez besoin de :
La construction de systèmes d'agent fiables nécessite une conformité garantie au schéma. Sans le mode strict, Claude pourrait retourner des types incompatibles ("2" au lieu de 2) ou des champs obligatoires manquants, cassant vos fonctions et causant des erreurs d'exécution.
L'utilisation stricte d'outils garantit des paramètres type-safe :
Par exemple, supposons qu'un système de réservation ait besoin de passengers: int. Sans le mode strict, Claude pourrait fournir passengers: "two" ou passengers: "2". Avec strict: true, la réponse contiendra toujours passengers: 2.
curl https://api.anthropic.com/v1/messages \
-H "content-type: application/json" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-d '{
"model": "claude-opus-4-6",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "What is the weather in San Francisco?"}
],
"tools": [{
"name": "get_weather",
"description": "Get the current weather in a given location",
"strict": true,
"input_schema": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city and state, e.g. San Francisco, CA"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"]
}
},
"required": ["location"],
"additionalProperties": false
}
}]
}'Format de réponse : Blocs d'utilisation d'outils avec entrées validées dans response.content[x].input
{
"type": "tool_use",
"name": "get_weather",
"input": {
"location": "San Francisco, CA"
}
}Garanties :
input de l'outil suit strictement l'input_schemaname de l'outil est toujours valide (à partir des outils fournis ou des outils serveur)Définir votre schéma d'outil
Créez un schéma JSON pour l'input_schema de votre outil. Le schéma utilise le format JSON Schema standard avec certaines limitations (voir Limitations du schéma JSON).
Ajouter strict: true
Définissez "strict": true comme propriété de niveau supérieur dans votre définition d'outil, à côté de name, description et input_schema.
Gérer les appels d'outils
Quand Claude utilise l'outil, le champ input dans le bloc tool_use suivra strictement votre input_schema, et le name sera toujours valide.
Les sorties JSON et l'utilisation stricte d'outils résolvent des problèmes différents et peuvent être utilisées ensemble :
Quand 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'agent où vous avez besoin à la fois d'appels d'outils fiables et de sorties finales structurées.
response = client.messages.create(
model="claude-opus-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": "Help me plan a trip to Paris for next month"}],
# 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
}
}]
)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 d'outils partagent ces limitations.
Les SDK Python et TypeScript peuvent automatiquement transformer 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 les détails.
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 du dépassement de la limite max_tokens :
stop_reason: "max_tokens"max_tokens plus élevée pour obtenir la sortie structurée complèteSi votre schéma utilise des fonctionnalités non supportées ou est trop complexe, vous recevrez une erreur 400 :
« Trop de définitions récursives dans le schéma »
« Le schéma est trop complexe »
strict: truePour les problèmes persistants avec des schémas valides, contactez le support avec votre définition de schéma.
Fonctionne avec :
output_config.format) et l'utilisation stricte d'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'outils, aux résultats d'outils ou aux balises de réflexion (lors de l'utilisation de la Réflexion étendue). 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.
Was this page helpful?