Gli "structured outputs" (output strutturati) vincolano le risposte di Claude a seguire uno schema specifico, garantendo output validi e analizzabili per l'elaborazione a valle. Gli output strutturati forniscono due funzionalità complementari:
output_config.format): Ottieni la risposta di Claude in un formato JSON specificostrict: true): Garantisci la validazione dello schema sui nomi e sugli input degli strumentiPuoi utilizzare queste funzionalità in modo indipendente o insieme nella stessa richiesta.
Senza output strutturati, Claude può generare risposte JSON malformate o input degli strumenti non validi che interrompono le tue applicazioni. Anche con un prompting accurato, potresti riscontrare:
Gli output strutturati garantiscono risposte conformi allo schema attraverso la decodifica vincolata:
JSON.parse()Gli output JSON controllano il formato della risposta di Claude, garantendo che Claude restituisca JSON valido corrispondente al tuo schema. Usa gli output JSON quando devi:
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-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_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(next(block.text for block in response.content if block.type == "text"))Formato della risposta: JSON valido corrispondente al tuo schema nel blocco di contenuto testuale della risposta
{
"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 vuoi che Claude segua. Lo schema utilizza il formato JSON Schema standard con alcune limitazioni (vedi Limitazioni di JSON Schema).
Aggiungi il parametro output_config.format
Includi il parametro output_config.format nella tua richiesta API con type: "json_schema" e la definizione del tuo schema.
Analizza la risposta
La risposta di Claude è JSON valido corrispondente al tuo schema, restituito nel blocco di contenuto testuale della risposta.
Gli SDK forniscono helper che semplificano il lavoro con gli output JSON, inclusa la trasformazione dello schema, la validazione automatica e l'integrazione con le librerie di schema più diffuse.
Invece di scrivere schemi JSON grezzi, puoi utilizzare strumenti di definizione dello schema familiari nel tuo linguaggio:
client.messages.parse()zodOutputFormat() o literal JSON Schema tipizzati con jsonSchemaOutputFormat()outputConfig(Class<T>)Anthropic::BaseModel con output_config: {format: Model}StructuredOutputModel con outputConfig: ['format' => MyClass::class]Create<T>(), che deriva automaticamente lo schemaoutput_configoutput_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-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=ContactInfo,
)
print(response.parsed_output)Ogni SDK fornisce helper che semplificano il lavoro con gli output strutturati. Consulta le pagine dei singoli SDK per i dettagli completi.
client.messages.parse() (Consigliato)
Il metodo parse() trasforma automaticamente il tuo modello Pydantic, valida la risposta e restituisce un attributo parsed_output.
from pydantic import BaseModel
class ContactInfo(BaseModel):
name: str
email: str
plan_interest: str
response = client.messages.parse(
model="claude-opus-5",
max_tokens=1024,
messages=[
{
"role": "user",
"content": "Extract contact info: John Smith, [email protected], interested in the Pro plan",
}
],
output_format=ContactInfo,
)
# Accedi direttamente all'output analizzato
contact = response.parsed_output
print(contact.name, contact.email)Helper transform_schema()
Per quando devi trasformare manualmente gli schemi prima dell'invio, o quando vuoi modificare uno schema generato da Pydantic. A differenza di client.messages.parse(), che trasforma automaticamente gli schemi forniti, questo ti fornisce lo schema trasformato in modo da poterlo personalizzare ulteriormente.
from anthropic import transform_schema
from pydantic import TypeAdapter
# Prima converti il modello Pydantic in JSON schema, poi trasformalo
schema = TypeAdapter(ContactInfo).json_schema()
schema = transform_schema(schema)
# Modifica lo schema se necessario
schema["properties"]["custom_field"] = {"type": "string"}
response = client.messages.create(
model="claude-opus-5",
max_tokens=1024,
messages=[{"role": "user", "content": "..."}],
output_config={
"format": {"type": "json_schema", "schema": schema},
},
)Gli SDK Python, TypeScript, Ruby e PHP trasformano automaticamente gli schemi con funzionalità non supportate. Gli SDK C# e Go applicano le stesse trasformazioni quando lo schema è derivato da un tipo nativo (Create<T>() in C#; riflessione di struct o BetaJSONSchemaOutputFormat() sull'API beta di Go). I passaggi di trasformazione:
minimum, maximum, minLength, maxLength)additionalProperties: false a tutti gli oggettiQuesto significa che Claude riceve uno schema semplificato, ma il tuo codice applica comunque tutti i vincoli attraverso la validazione.
Esempio: Un campo Pydantic con minimum: 100 diventa un intero semplice nello schema inviato, ma l'SDK aggiorna la descrizione a "Must be at least 100" e valida la risposta rispetto al vincolo originale.
Per applicare la conformità a JSON Schema sugli input degli strumenti con campionamento vincolato da grammatica, vedi Uso degli strumenti strict.
Gli output JSON e l'uso degli strumenti strict risolvono problemi diversi e funzionano insieme:
Quando combinati, Claude può chiamare strumenti con parametri garantiti validi E restituire risposte JSON strutturate. Questo è utile per flussi di lavoro agentici in cui hai bisogno sia di chiamate agli strumenti affidabili sia di output finali strutturati.
response = client.messages.create(
model="claude-opus-5",
max_tokens=1024,
messages=[
{
"role": "user",
"content": "Help me plan a trip to Paris departing May 15, 2026",
}
],
# Output JSON: formato di risposta strutturato
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,
},
}
},
# Uso degli strumenti rigoroso: parametri degli strumenti garantiti
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)Gli output strutturati utilizzano il campionamento vincolato con artefatti di grammatica compilati. Questo introduce alcune caratteristiche di prestazioni da tenere presenti:
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. Questo significa che:
output_config.format invaliderà qualsiasi cache dei prompt per quel thread di conversazioneGli output strutturati supportano JSON Schema standard con alcune limitazioni. Sia gli output JSON che l'uso degli strumenti strict condividono queste limitazioni.
Quando utilizzi gli output strutturati, le proprietà negli oggetti mantengono l'ordinamento definito dal tuo schema, con un'importante avvertenza: le proprietà obbligatorie appaiono per prime, seguite dalle proprietà opzionali.
Ad esempio, dato questo schema:
{
"type": "object",
"properties": {
"notes": { "type": "string" },
"name": { "type": "string" },
"email": { "type": "string" },
"age": { "type": "integer" }
},
"required": ["name", "email"],
"additionalProperties": false
}L'output ordinerà le proprietà come segue:
name (obbligatoria, nell'ordine dello schema)email (obbligatoria, nell'ordine dello schema)notes (opzionale, nell'ordine dello schema)age (opzionale, nell'ordine dello schema)Questo significa che l'output potrebbe apparire così:
{
"name": "John Smith",
"email": "[email protected]",
"notes": "Interested in enterprise plan",
"age": 35
}Se l'ordine delle proprietà nell'output è importante per la tua applicazione, contrassegna tutte le proprietà come obbligatorie, oppure tieni conto di questo riordinamento nella tua logica di parsing.
Sebbene gli output strutturati garantiscano la conformità allo 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 troncata a causa del raggiungimento del limite max_tokens:
stop_reason: "max_tokens"max_tokens più alto per ottenere l'output strutturato completoCapitalizzazione dei valori enum
Gli output strutturati non garantiscono la capitalizzazione dei valori stringa enum e const: Claude potrebbe restituire un valore che differisce dal tuo schema solo nella capitalizzazione, tipicamente nella prima lettera di una parola che segue uno spazio. Ad esempio, dato questo schema:
{
"type": "string",
"enum": ["Conversation Topic 1", "Conversation Topic 2", "Conversation topic 3"]
}L'output potrebbe contenere "Conversation Topic 3" ("T" maiuscola) anche se quel valore esatto non è nell'enum. La risposta viene completata normalmente, senza errori e senza uno stop_reason speciale. Questo si applica sia agli output JSON che all'uso degli strumenti strict. Confronta i valori enum senza distinzione tra maiuscole e minuscole, ed evita valori enum che differiscono solo nella capitalizzazione.
Gli output strutturati funzionano compilando i tuoi schemi JSON in una grammatica che vincola l'output di Claude. Schemi più complessi producono grammatiche più grandi che richiedono più tempo per la compilazione. Per proteggere da tempi di compilazione eccessivi, l'API applica diversi limiti di complessità.
I seguenti limiti si applicano a tutte le richieste con output_config.format o strict: true:
| Limite | Valore | Descrizione |
|---|---|---|
| Strumenti strict per richiesta | 20 | Numero massimo di strumenti con strict: true. Gli strumenti non strict non contano ai fini di questo limite. |
| Parametri opzionali | 24 | Totale dei parametri opzionali in tutti gli schemi di strumenti strict e schemi di output JSON. Ogni parametro non elencato in required conta ai fini di questo limite. |
| Parametri con tipi union | 16 | Totale dei parametri che utilizzano anyOf o array di tipi (ad esempio, "type": ["string", "null"]) in tutti gli schemi strict. Questi sono particolarmente costosi perché creano un costo di compilazione esponenziale. |
Oltre ai limiti espliciti nella tabella precedente, ci sono limiti interni aggiuntivi sulla dimensione della grammatica compilata. Questi limiti esistono perché la complessità dello schema non si riduce a una singola dimensione: funzionalità come parametri opzionali, tipi union, oggetti annidati e numero di strumenti interagiscono tra loro in modi che possono rendere la grammatica compilata sproporzionatamente grande.
Quando questi limiti vengono superati, riceverai un errore 400 con il messaggio "Schema is too complex for compilation." Questi errori significano che la complessità combinata dei tuoi schemi supera ciò che può essere compilato in modo efficiente, anche se ogni singolo limite nella tabella precedente è soddisfatto. Come ultima misura di sicurezza, l'API applica anche un timeout di compilazione di 180 secondi. Gli schemi che superano tutti i controlli espliciti ma producono grammatiche compilate molto grandi possono raggiungere questo timeout.
Se stai raggiungendo i limiti di complessità, prova queste strategie nell'ordine:
Contrassegna come strict solo gli strumenti critici. Se hai molti strumenti, riservalo agli strumenti in cui le violazioni dello schema causano problemi reali, e affidati all'aderenza naturale di Claude per gli strumenti più semplici.
Riduci i parametri opzionali. Rendi i parametri required dove possibile. Ogni parametro opzionale raddoppia approssimativamente una porzione dello spazio degli stati della grammatica. Se un parametro ha sempre un valore predefinito ragionevole, considera di renderlo obbligatorio e far sì che Claude fornisca esplicitamente quel valore predefinito.
Semplifica le strutture annidate. Gli oggetti profondamente annidati con campi opzionali moltiplicano la complessità. Appiattisci le strutture dove possibile.
Suddividi in più richieste. Se hai molti strumenti strict, considera di suddividerli in richieste separate o sub-agenti.
Per problemi persistenti con schemi validi, contatta il supporto con la definizione del tuo schema.
I prompt e le risposte vengono elaborati con ZDR quando si utilizzano gli output strutturati. Tuttavia, lo schema JSON stesso viene temporaneamente memorizzato nella cache per un massimo di 24 ore dall'ultimo utilizzo a scopo di ottimizzazione. Nessun dato di prompt o risposta viene conservato oltre la risposta API.
Gli output strutturati sono idonei per HIPAA, ma le PHI non devono essere incluse nelle definizioni dello schema JSON. L'API compila gli schemi JSON in grammatiche che vengono memorizzate nella cache separatamente dal contenuto dei messaggi, e questi schemi memorizzati nella cache non ricevono le stesse protezioni PHI dei prompt e delle risposte. Non includere PHI nei nomi delle proprietà dello schema, nei valori enum, nei valori const o nelle espressioni regolari pattern. Le PHI dovrebbero apparire solo nel contenuto dei messaggi (prompt e risposte), dove sono protette dalle salvaguardie HIPAA.
Per l'idoneità ZDR e HIPAA di tutte le funzionalità, vedi API e conservazione dei dati.
Funziona con:
output_config.format) e uso degli strumenti strict (strict: true) insieme nella stessa richiestaIncompatibile con:
output_config.format.Fai in modo che Claude citi le sue fonti quando risponde a domande sui documenti forniti.
Applica la conformità a JSON Schema sugli input degli strumenti di Claude con campionamento vincolato da grammatica.
Connetti Claude a strumenti e API esterni. Scopri dove vengono eseguiti gli strumenti e come funziona il ciclo agentico.
Scopri la struttura dei prezzi di Anthropic per modelli e funzionalità.
| Supported models |
|
|---|---|
| Supported platforms |
Was this page helpful?