JSON mode non è Structured Outputs
Data Pubblicazione: | | Intelligenza Artificiale

JSON mode non è Structured Outputs

Il 22 ottobre 2026 la guida OpenAI dice che JSON mode e Structured Outputs producono JSON valido, ma solo il secondo aderisce allo schema. json_object non è json_schema.

Il 22 ottobre 2026, sulla guida OpenAI Structured model outputs, JSON mode non è Structured Outputs. La pagina lo scrive in una sezione titolata proprio così: Structured Outputs è l’evoluzione di JSON mode. Tutti e due possono produrre JSON valido. Solo Structured Outputs, in quella tabella, aderisce allo schema. Non ho chiamato l’API. Non è la stessa cosa di Google-Extended contro GPTBot, e non è il calendario dell’AI Act.

In breve: JSON mode, nella Chat Completions, è response_format: { "type": "json_object" }. Nella Responses API è text.format con type: "json_object". Structured Outputs, in tabella, è json_schema con strict: true, oppure l’equivalente in text.format. Lo schema non è garantito dal json_object. La parola «JSON» deve comparire nel contesto, altrimenti l’API risponde con un errore.

Cosa trovi in questo articolo

  1. Valido non vuol dire aderente allo schema

  2. La tabella della guida, non un riassunto mio

  3. Due elenchi di modelli, sulla stessa pagina

  4. Errori da evitare

  5. In sintesi

Valido non vuol dire aderente allo schema

La guida, letta il 22 ottobre, definisce Structured Outputs come la funzione che fa aderire la risposta a uno JSON Schema fornito da chi chiama: niente chiave obbligatoria omessa, niente enum inventato. I benefici scritti in cima sono tre: type-safety senza validare o ritentare il formato, rifiuti di sicurezza rilevabili dal programma, prompt più semplici perché non serve insistere sul formato. Le librerie Python e JavaScript possono descrivere lo schema con pydantic o con l’equivalente mostrato negli esempi. Non ho installato quelle librerie.

Più sotto, la frase che separa le due modalità: «While both ensure valid JSON is produced, only Structured Outputs ensure schema adherence.» JSON mode è «a more basic version». Garantisce JSON valido, «except for in some edge cases that you should detect and handle appropriately». Non garantisce lo schema. Se Structured Outputs non è disponibile per il caso d’uso, la guida dice di validare con una libreria e, se serve, di ritentare.

Come si accende JSON mode. Chat Completions: response_format a { "type": "json_object" }. Se si usa function calling, la pagina dice che JSON mode è sempre acceso. Responses API: text.format a { "type": "json_object" }, e anche lì function calling lo accende sempre. Structured Outputs, nella stessa tabella, si accende con response_format: { type: "json_schema", json_schema: {"strict": true, "schema": ...} } oppure, sulla Responses API, con text: { format: { type: "json_schema", "strict": true, "schema": ... } }.

Nota della guida, non un consiglio mio: in JSON mode bisogna dire al modello di produrre JSON, per esempio nel messaggio di sistema. Se l’istruzione manca, il modello può generare uno stream infinito di spazi finché non esaurisce i token. Per ricordarlo, l’API lancia un errore se la stringa «JSON» non compare da qualche parte nel contesto. Non ho provocato quell’errore. Lo riporto come frase della pagina.

La tabella della guida, non un riassunto mio

Riga della tabella «Structured Outputs vs JSON mode»Structured OutputsJSON mode
Outputs valid JSONYesYes
Adheres to schemaYes, con rinvio agli schemi supportatiNo
Compatible models, come stampatigpt-4o-mini, gpt-4o-2024-08-06, and latergpt-3.5-turbo, gpt-4-*, gpt-4o-*, and compatible GPT-5 models
Enabling, Chat Completionsresponse_format type json_schema, strict trueresponse_format type json_object
Enabling, Responses APItext.format type json_schema, strict truetext.format type json_object

La stessa pagina dice che entrambe le modalità sono supportate in Responses API, Chat Completions API, Assistants API, Fine-tuning API e Batch API, e che conviene usare Structured Outputs al posto di JSON mode quando è possibile. L’eccezione scritta subito dopo: response_format con type: "json_schema" è supportato dagli snapshot gpt-4o-mini, gpt-4o-mini-2024-07-18 e gpt-4o-2024-08-06 in poi. Non ho verificato un listino prezzi né un modello in console.

Structured Outputs, ancora in guida, sta in due forme: function calling, quando il modello deve chiamare una funzione dell’applicazione, e json_schema come formato di risposta, quando serve il testo aderente allo schema e non una chiamata. Il resto della guida che ho seguito riguarda il secondo caso, sulla Responses API. La function calling ha una pagina sua. Non l’ho riscritta qui.

Due elenchi di modelli, sulla stessa pagina

La tabella non è l’unico elenco. Nella sezione Supported models la guida scrive che Structured Outputs è disponibile nei modelli grandi più recenti, a partire da GPT-4o, e che per i progetti nuovi si parte da gpt-6-astra. I modelli più vecchi, «like gpt-4-turbo and earlier», possono usare JSON mode al posto suo. Questa frase e la riga «Compatible models» della tabella non usano gli stessi nomi. Non le ho unite in un elenco solo. Chi sceglie un modello deve leggere la riga che corrisponde alla chiamata che sta facendo, non un sunto.

Un altro confine, nella sezione JSON mode: l’output è JSON valido salvo edge case in cui l’oggetto non è completo. L’applicazione deve riconoscerli. Non ho copiato gli esempi di codice Python che stanno sotto quella frase: non li ho eseguiti, e non aggiungono un fatto che la prosa non dica già.

Questo pezzo non parla di un CMS, di un chatbot da incorporare in un sito, né di un obbligo dell’AI Act. Quei temi stanno negli altri articoli linkati in apertura. Qui il punto è solo la differenza, nella documentazione OpenAI letta oggi, tra json_object e json_schema strict.

Errori da evitare

  • Credere che json_object rispetti lo schema. In tabella, Adheres to schema è No.

  • Omettere la parola JSON dal contesto quando si accende JSON mode. La guida dice che l’API risponde con un errore.

  • Spegnere la validazione perché «è JSON valido». Valido e aderente, in pagina, sono due righe diverse. Gli edge case restano.

  • Trattare function calling e json_schema come la stessa chiamata. La guida li separa.

  • Fondere gpt-6-astra, gpt-4o-2024-08-06 e «gpt-4-*» in un’unica compatibilità. Sono frasi diverse della stessa pagina.

  • Confondere questa pagina con robots.txt, con Google-Extended o con una scadenza dell’AI Act. Non ne parlano.

In sintesi

Il 22 ottobre 2026 la guida OpenAI Structured Outputs dice che JSON mode è la versione più semplice: JSON valido, schema non garantito, type: "json_object". Structured Outputs è l’evoluzione: adesione allo schema, json_schema con strict: true, consigliata quando il modello la supporta. La tabella e la sezione Supported models elencano i modelli in due modi. Non ho chiamato l’API e non ho sciolto io quella differenza. Senza la parola JSON nel contesto, la pagina prevede un errore, non uno schema.

Foto di copertina: Marcin Wichary, «IBM 1402 punch card reader», Computer History Museum, 7 marzo 2009, Wikimedia Commons, CC BY 2.0. Il file è quel lettore; l’inquadratura è il meccanismo, non una scheda forata e non uno JSON Schema.

Domande frequenti

No, secondo la tabella della guida OpenAI letta il 22 ottobre 2026. Entrambe le modalità possono dare JSON valido. Adheres to schema è Yes solo per Structured Outputs.
Chat Completions: response_format type json_object. Responses API: text.format type json_object. Con function calling la guida dice che JSON mode è sempre acceso.
Nella stessa tabella: json_schema con strict true, dentro response_format oppure dentro text.format. Non è la stessa chiave di json_object.
Per JSON mode sì. Se la stringa JSON non compare nel contesto, la guida dice che l’API risponde con un errore. Senza istruzione, il modello può riempire di spazi fino al limite di token.
No. Stanno in due punti diversi della stessa pagina. Non li ho fusi, e non ho chiamato l’API per verificarli.

Potrebbe interessarti anche...