Perché gli output strutturati?
Gli agenti restituiscono testo libero per impostazione predefinita, il che funziona per la chat ma non quando è necessario utilizzare l’output a livello di programmazione. Gli output strutturati forniscono dati tipizzati che è possibile passare direttamente alla logica dell’applicazione, al database o ai componenti dell’interfaccia utente. Consideriamo un’app di ricette in cui un agente cerca sul web e recupera ricette. Senza output strutturati, si ottiene testo libero che sarebbe necessario analizzare manualmente. Con output strutturati, si definisce la forma desiderata e si ottengono dati tipizzati che è possibile utilizzare direttamente nell’app.Senza output strutturati
Senza output strutturati
Con output strutturati
Con output strutturati
Avvio rapido
Per utilizzare gli output strutturati, definire uno JSON Schema che descriva la forma dei dati desiderati, quindi passarlo aquery() tramite l’opzione outputFormat (TypeScript) o output_format (Python). Quando l’agente termina, il messaggio di risultato include un campo structured_output con dati convalidati corrispondenti allo schema.
L’esempio seguente chiede all’agente di ricercare Anthropic e restituire il nome dell’azienda, l’anno di fondazione e la sede come output strutturato.
Schema type-safe con Zod e Pydantic
Invece di scrivere JSON Schema manualmente, è possibile utilizzare Zod (TypeScript) o Pydantic (Python) per definire lo schema. Queste librerie generano JSON Schema per voi e consentono di analizzare la risposta in un oggetto completamente tipizzato che è possibile utilizzare in tutto il codebase con autocomplete e type checking. L’esempio seguente definisce uno schema per un piano di implementazione delle funzionalità con un riepilogo, un elenco di passaggi (ciascuno con livello di complessità) e rischi potenziali. L’agente pianifica la funzionalità e restituisce un oggettoFeaturePlan tipizzato. È quindi possibile accedere a proprietà come plan.summary e iterare su plan.steps con sicurezza dei tipi completa.
- Inferenza dei tipi completa (TypeScript) e suggerimenti di tipo (Python)
- Convalida in fase di esecuzione con
safeParse()omodel_validate() - Messaggi di errore migliori
- Schema componibili e riutilizzabili
Configurazione del formato di output
L’opzioneoutputFormat (TypeScript) o output_format (Python) accetta un oggetto con:
type: Impostare su"json_schema"per gli output strutturatischema: Un oggetto JSON Schema che definisce la struttura di output. È possibile generarlo da uno schema Zod conz.toJSONSchema()o da un modello Pydantic con.model_json_schema()
enum, const, required, oggetti annidati e definizioni $ref. Per l’elenco completo delle funzionalità supportate e delle limitazioni, vedere Limitazioni di JSON Schema.
Esempio: agente di tracciamento TODO
Questo esempio dimostra come funzionano gli output strutturati con l’uso di strumenti multi-step. L’agente deve trovare commenti TODO nel codebase, quindi cercare le informazioni di git blame per ciascuno. Decide autonomamente quali strumenti utilizzare (Grep per la ricerca, Bash per eseguire comandi git) e combina i risultati in una singola risposta strutturata. Lo schema include campi facoltativi (author e date) poiché le informazioni di git blame potrebbero non essere disponibili per tutti i file. L’agente compila ciò che riesce a trovare e omette il resto.
Gestione degli errori
La generazione di output strutturati può non riuscire quando l’agente non può produrre JSON valido corrispondente allo schema. Questo accade in genere quando lo schema è troppo complesso per l’attività, l’attività stessa è ambigua o l’agente raggiunge il limite di tentativi cercando di correggere gli errori di convalida. Quando si verifica un errore, il messaggio di risultato ha unsubtype che indica cosa è andato storto:
| Subtype | Significato |
|---|---|
success | L’output è stato generato e convalidato con successo |
error_max_structured_output_retries | L’agente non ha potuto produrre output valido dopo più tentativi |
subtype per determinare se l’output è stato generato con successo o se è necessario gestire un errore:
- Mantenere gli schema focalizzati. Gli schema profondamente annidati con molti campi obbligatori sono più difficili da soddisfare. Iniziare in modo semplice e aggiungere complessità secondo le necessità.
- Abbinare lo schema all’attività. Se l’attività potrebbe non avere tutte le informazioni richieste dallo schema, rendere questi campi facoltativi.
- Utilizzare prompt chiari. I prompt ambigui rendono più difficile per l’agente sapere quale output produrre.
Risorse correlate
- Documentazione di JSON Schema: imparare la sintassi di JSON Schema per definire schema complessi con oggetti annidati, array, enum e vincoli di convalida
- API Structured Outputs: utilizzare gli output strutturati direttamente con l’API Claude per richieste single-turn senza uso di strumenti
- Custom tools: fornire all’agente strumenti personalizzati da chiamare durante l’esecuzione prima di restituire l’output strutturato