Gli output strutturati vincolano le risposte di Claude a seguire uno schema specifico, garantendo output valido e analizzabile per l'elaborazione a valle. Sono disponibili due funzionalità complementari:
output_format): Ottieni la risposta di Claude in un formato JSON specificostrict: true): Garantisci la convalidazione dello schema sui nomi e gli input degli strumentiQueste funzionalità possono essere utilizzate indipendentemente o insieme nella stessa richiesta.
Gli output strutturati sono attualmente disponibili come funzionalità beta pubblica nell'API Claude per Claude Sonnet 4.5, Claude Opus 4.1, Claude Opus 4.5 e Claude Haiku 4.5.
Per utilizzare la funzionalità, imposta l'intestazione beta structured-outputs-2025-11-13.
Condividi il tuo feedback utilizzando questo modulo.
Senza output strutturati, Claude può generare risposte JSON malformate o input di strumenti non validi che interrompono le tue applicazioni. Anche con un prompt attento, potresti incontrare:
Gli output strutturati garantiscono risposte conformi allo schema attraverso la decodifica vincolata:
JSON.parse()Gli output JSON controllano il formato della risposta di Claude, assicurando che Claude restituisca JSON valido corrispondente al tuo schema. Utilizza gli output JSON quando hai bisogno di:
Formato della risposta: JSON valido corrispondente al tuo schema in response.content[0].text
{
"name": "John Smith",
"email": "[email protected]",
"plan_interest": "Enterprise",
"demo_requested": true
}Definisci il tuo schema JSON
Crea uno schema JSON che descriva la struttura che desideri che Claude segua. Lo schema utilizza il formato JSON Schema standard con alcune limitazioni (vedi Limitazioni JSON Schema).
Aggiungi il parametro output_format
Includi il parametro output_format nella tua richiesta API con type: "json_schema" e la definizione del tuo schema.
Includi l'intestazione beta
Aggiungi l'intestazione anthropic-beta: structured-outputs-2025-11-13 alla tua richiesta.
Analizza la risposta
La risposta di Claude sarà JSON valido corrispondente al tuo schema, restituito in response.content[0].text.
Gli SDK Python e TypeScript forniscono helper che rendono più facile lavorare con gli output JSON, inclusa la trasformazione dello schema, la convalidazione automatica e l'integrazione con librerie di schema popolari.
Per gli sviluppatori Python e TypeScript, puoi utilizzare strumenti familiari di definizione dello schema come Pydantic e Zod invece di scrivere schemi JSON grezzi.
Python: client.beta.messages.parse() (Consigliato)
Il metodo parse() trasforma automaticamente il tuo modello Pydantic, convalida la risposta e restituisce un attributo parsed_output.
Il metodo parse() è disponibile su client.beta.messages, non su client.messages.
Python: helper transform_schema()
Per quando hai bisogno di trasformare manualmente gli schemi prima di inviarli, o quando desideri modificare uno schema generato da Pydantic. A differenza di client.beta.messages.parse(), che trasforma automaticamente gli schemi forniti, questo ti fornisce lo schema trasformato in modo da poterlo personalizzare ulteriormente.
Sia gli SDK Python che TypeScript trasformano automaticamente gli schemi con funzionalità non supportate:
minimum, maximum, minLength, maxLength)additionalProperties: false a tutti gli oggettiCiò significa che Claude riceve uno schema semplificato, ma il tuo codice applica comunque tutti i vincoli attraverso la convalidazione.
Esempio: Un campo Pydantic con minimum: 100 diventa un semplice numero intero nello schema inviato, ma la descrizione viene aggiornata a "Deve essere almeno 100", e l'SDK convalida la risposta rispetto al vincolo originale.
L'uso rigoroso degli strumenti convalida i parametri dello strumento, assicurando che Claude chiami le tue funzioni con argomenti correttamente tipizzati. Utilizza l'uso rigoroso degli strumenti quando hai bisogno di:
La costruzione di sistemi agentici affidabili richiede la conformità garantita dello schema. Senza la modalità rigorosa, Claude potrebbe restituire tipi incompatibili ("2" invece di 2) o campi obbligatori mancanti, interrompendo le tue funzioni e causando errori di runtime.
L'uso rigoroso degli strumenti garantisce parametri type-safe:
Ad esempio, supponiamo che un sistema di prenotazione abbia bisogno di passengers: int. Senza la modalità rigorosa, Claude potrebbe fornire passengers: "two" o passengers: "2". Con strict: true, la risposta conterrà sempre passengers: 2.
Formato della risposta: Blocchi di utilizzo dello strumento con input convalidati in response.content[x].input
{
"type": "tool_use",
"name": "get_weather",
"input": {
"location": "San Francisco, CA"
}
}Garanzie:
input dello strumento segue rigorosamente l'input_schemaname dello strumento è sempre valido (dagli strumenti forniti o dagli strumenti del server)Definisci lo schema del tuo strumento
Crea uno schema JSON per l'input_schema del tuo strumento. Lo schema utilizza il formato JSON Schema standard con alcune limitazioni (vedi Limitazioni JSON Schema).
Aggiungi strict: true
Imposta "strict": true come proprietà di primo livello nella definizione del tuo strumento, insieme a name, description e input_schema.
Includi l'intestazione beta
Aggiungi l'intestazione anthropic-beta: structured-outputs-2025-11-13 alla tua richiesta.
Gestisci le chiamate dello strumento
Quando Claude utilizza lo strumento, il campo input nel blocco tool_use seguirà rigorosamente il tuo input_schema, e il name sarà sempre valido.
Gli output JSON e l'uso rigoroso degli strumenti risolvono problemi diversi e possono essere utilizzati insieme:
Quando combinati, Claude può chiamare strumenti con parametri garantiti validi E restituire risposte JSON strutturate. Questo è utile per i flussi di lavoro agentici in cui hai bisogno sia di chiamate di strumenti affidabili che di output finali strutturati.
Gli output strutturati utilizzano il campionamento vincolato con artefatti di grammatica compilati. Questo introduce alcune caratteristiche di prestazione di cui essere consapevoli:
name o description non invalida la cacheQuando utilizzi gli output strutturati, Claude riceve automaticamente un prompt di sistema aggiuntivo che spiega il formato di output previsto. Ciò significa:
output_format invaliderà qualsiasi cache del prompt per quel thread di conversazioneGli output strutturati supportano JSON Schema standard con alcune limitazioni. Sia gli output JSON che l'uso rigoroso degli strumenti condividono queste limitazioni.
Gli SDK Python e TypeScript possono trasformare automaticamente gli schemi con funzionalità non supportate rimuovendole e aggiungendo vincoli alle descrizioni dei campi. Vedi Metodi specifici dell'SDK per i dettagli.
Sebbene gli output strutturati garantiscano la conformità dello schema nella maggior parte dei casi, ci sono scenari in cui l'output potrebbe non corrispondere al tuo schema:
Rifiuti (stop_reason: "refusal")
Claude mantiene le sue proprietà di sicurezza e utilità anche quando utilizza gli output strutturati. Se Claude rifiuta una richiesta per motivi di sicurezza:
stop_reason: "refusal"Limite di token raggiunto (stop_reason: "max_tokens")
Se la risposta viene interrotta a causa del raggiungimento del limite max_tokens:
stop_reason: "max_tokens"max_tokens più alto per ottenere l'output strutturato completoSe il tuo schema utilizza funzionalità non supportate o è troppo complesso, riceverai un errore 400:
"Too many recursive definitions in schema"
"Schema is too complex"
strict: truePer problemi persistenti con schemi validi, contatta il supporto con la definizione del tuo schema.
Funziona con:
output_format) e l'uso rigoroso degli strumenti (strict: true) insieme nella stessa richiestaIncompatibile con:
output_format.Ambito della grammatica: Le grammatiche si applicano solo all'output diretto di Claude, non alle chiamate dello strumento, ai risultati dello strumento o ai tag di pensiero (quando si utilizza Extended Thinking). Lo stato della grammatica si ripristina tra le sezioni, consentendo a Claude di pensare liberamente mentre produce comunque output strutturato nella risposta finale.
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" \
-H "anthropic-beta: structured-outputs-2025-11-13" \
-d '{
"model": "claude-sonnet-4-5",
"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": {
"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
}
}
}'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.beta.messages.create(
model="claude-sonnet-4-5",
max_tokens=1024,
betas=["structured-outputs-2025-11-13"],
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={
"type": "json_schema",
"schema": transform_schema(ContactInfo),
}
)
print(response.content[0].text)
# With .parse() - can pass Pydantic model directly
response = client.beta.messages.parse(
model="claude-sonnet-4-5",
max_tokens=1024,
betas=["structured-outputs-2025-11-13"],
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)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" \
-H "anthropic-beta: structured-outputs-2025-11-13" \
-d '{
"model": "claude-sonnet-4-5",
"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
}
}]
}'response = client.beta.messages.create(
model="claude-sonnet-4-5",
betas=["structured-outputs-2025-11-13"],
max_tokens=1024,
messages=[{"role": "user", "content": "Help me plan a trip to Paris for next month"}],
# JSON outputs: structured response format
output_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
}
}]
)