Vorab: Structured Output ist nicht der Prompt „bitte gib JSON zurück“. Es ist die API, die zur Decode-Zeit mit einem JSON Schema illegale Token blockiert, damit die finale Antwort von einem Programm geparst werden kann. GPT, Gemini und Claude haben es zur First-Class-Funktion gemacht — nicht weil der Begriff auf Folien gut aussieht, sondern weil Agenten, Extraktion und Formularfüllung das Modell in eine Pipeline verdrahten müssen. Prosa scheitert an JSON.parse. Am Downstream-Schema scheitert sie noch härter.
Dieser Artikel ist vom 8. September 2026. Alle drei können jetzt das finale JSON für den Nutzer oder den nächsten Dienst einschränken: OpenAI über response_format.json_schema (strict), Gemini über responseMimeType + responseJsonSchema, Claude über das GA-Feld output_config.format (das ältere Beta-Feld output_format funktioniert in der Übergangszeit weiter). Wie die Felder auszufüllen sind und worin sich die Teilmengen unterscheiden, haben wir im August bereits aufgeschlüsselt. Dieser Text beantwortet zwei Fragen: was es ist, und warum alle drei es liefern mussten. Für das How-to siehe Vom Prompt zu Structured Output. Für OpenAI vs. Gemini siehe den Structured-Output-API-Vergleich.
Was Structured Output ist
Structured Output heißt: Sie liefern ein JSON Schema, und die finale Antwort des Modells muss JSON sein, das dazu passt. Die Garantie gilt, während jedes Token erzeugt wird — nicht erst danach, wenn das Modell „versucht, wie JSON auszusehen“. Die Namen unterscheiden sich: OpenAI sagt Structured Outputs, Google sagt Structured Output, Anthropic schreibt structured outputs / JSON outputs. Das Extra-s ist Branding. Die Aufgabe ist dieselbe.
Denken Sie an Compiler und Type-Checker. Ein Prompt ist ein Kommentar — das Modell hört vielleicht. Ein Schema ist das Typsystem — ein falscher Feldname, ein fehlendes required, ein String dort, wo eine Zahl hingehört, werden nie emittiert. Was Ihr Programm bekommt, ist ein Objekt, nicht Prosa in einem ```json-Zaun.
| Begriff | Tatsächliche Bedeutung | Häufige Fehldeutung |
|---|---|---|
| Structured Output | Constrained Decoding der finalen Antwort gegen ein JSON Schema | Das Modell wurde klüger, oder „es kann JSON schreiben“ |
| JSON Schema | Der Vertrag für Felder, Typen, Pflichtfelder, Enums | Ein längerer Prompt |
| Constrained Decoding | Illegale Token werden gefiltert, während sie erzeugt werden | Regex-Aufräumen hinterher |
| strict / harte Einschränkung | Die API garantiert die Form auf einer strengeren Schema-Teilmenge | Fakten stimmen und Zahlen sind nicht erfunden |
Ein Schema, das alle drei lesen können, ist meist flach: Wurzel object, explizite properties / required, additionalProperties: false. Unter OpenAI strict ist „optional“ oft nullable, statt aus required zu fehlen. Die Teilmengen sind nicht identisch; nehmen Sie zuerst die Schnittmenge.
{
"type": "object",
"additionalProperties": false,
"properties": {
"task": { "type": "string", "enum": ["extract", "classify", "summarize"] },
"ok": { "type": "boolean" },
"fields": {
"type": "object",
"additionalProperties": false,
"properties": {
"orderId": { "type": "string" },
"total": { "type": "number" },
"note": { "type": ["string", "null"] }
},
"required": ["orderId", "total", "note"]
}
},
"required": ["task", "ok", "fields"]
}
Es ist nicht JSON Mode und nicht Tool Calling
Drei Namen werden oft zu einem zusammengezogen. Sie liegen nicht auf derselben Schicht:
| Fähigkeit | Was sie garantiert | Was sie nicht garantiert |
|---|---|---|
| Prompt: „return JSON“ | Eine höhere Wahrscheinlichkeit | Syntax, Feldnamen, Pflichtlisten |
| JSON Mode | Der Text ist parsebares JSON | Form, Typen, Enums |
| Structured Output | Die finale Antwort entspricht dem Schema | Semantische Wahrheit, oder dass ein Tool gelaufen ist |
| Tool Calling | Tool-Argumente passen zum Schema, und der Host führt sie aus | Die Form der nutzerseitigen Antwort |
JSON Mode garantiert nur passende Klammern und ein erfolgreiches JSON.parse. Das Modell kann trotzdem order_id erfinden, wenn Sie orderId verlangt haben, oder den Betrag als String ausgeben. In Produktion ist „es parst“ nicht „es lässt sich einfügen“.
Tool Calling / Function Calling beschränkt die Hand, die nach einem Tool greift — nicht den letzten Satz an den Nutzer. Bestandsabfragen, Dateischreiben, MCP tools/call gehören auf das Tool-Schema. E-Mails extrahieren, ein Ticket klassifizieren, JSON für eine Downstream-API ausgeben gehören auf Structured Output. Ein voller Agent schaltet oft beides ein — Argumente auf Tools, die finale Antwort auf ein Output-Schema. Zur Schichtung siehe Was MCP ist und den Agent-JSON-Datenfluss.
Warum alle drei es unterstützen
2023 konnten Sie noch auf einen Prompt wetten. 2026 bettet ein Agent das Modell in eine Schleife: die Ausgabe trifft eine Datenbank, das nächste Tool oder das Modell eines anderen Anbieters. Die drei Labs haben keinen Pressezyklus abgesprochen. Sie sind auf denselben Produktdruck und denselben Vertrag gestoßen — JSON Schema.
- Der Downstream-Konsument ist ein Programm, kein Leser. Chat darf Prosa sein. Eine Pipeline braucht Objekte. Ein fehlendes Komma, ein umbenanntes Feld — und die nächtliche Retry-Warteschlange läuft voll. Anbieter schneiden lieber illegale Pfade im Decoder ab, als zuzusehen, wie jeder Kunde einen Reparierer schreibt.
- Agenten haben stabile Form zur Pflicht gemacht. In einer mehrstufigen Schleife ist das JSON der letzten Runde der Input dieser Runde. Einmal driftet die Form — und alles danach ist falsch. Tool Calling beantwortet „wie man hinausgreift“. Structured Output beantwortet „wie man die Schlussfolgerung zurückgibt“. Beide brauchen ein Schema — siehe ob JSON Schema der Agent-Contract wird.
- Prompts haben bewiesen, dass sie nicht reichen. „Nur JSON, kein Markdown“ sieht auf der Bench gut aus, lässt dann Felder weg, setzt Zäune hinzu und umschreibt Enums, sobald der Kontext lang ist, Tools zurückfließen oder Sprachen sich mischen. Constrained Decoding macht aus „manchmal“ einen API-400 oder einen wiederholbaren Schema-Fehler.
- JSON Schema war bereits der kleinste gemeinsame Nenner. OpenAPI, MCP
inputSchema, Pydantic- / Zod-Exporte — alles dasselbe. Eine private IDL auf der Modellseite zwänge den Host, zweimal zu übersetzen. Die finale Antwort an dasselbe Schema zu hängen macht den Anbieterwechsel billig. - Das Rennen heißt „kommt das in Produktion“, nicht „kann es chatten“. Sobald ein Anbieter eine harte Einschränkung auslieferte, schrieben Gateways, Agent-Frameworks und Beschaffungslisten sie als Pflicht fest. Die anderen beiden folgen — oder sie stecken nicht in denselben Graphen. Im September 2026 ist eine Flaggschiff-API ohne Structured Output schwer an Kunden zu verkaufen, die Zeilen einfügen.
Deshalb liegen die Daten so dicht beieinander: OpenAI hat Structured Outputs im August 2024 GA gemacht; Gemini hat MIME + Schema in die Generierungskonfiguration gezogen; Claude hing Ende 2025 noch an einem Beta-Header und liefert jetzt output_config.format als stabiles Feld. Die Namen haben nie gepasst. Der Druck schon.
Wie GPT, Gemini und Claude es einschalten
Richten Sie das Konzept aus. Felder nicht über Anbieter hinweg kopieren. Die Tabelle ist das, was Sie am 8. September 2026 in ein Dokument schreiben können — kein vollständiges SDK-Tutorial.
| Anbieter | Einstieg | Wo das Schema hängt | Worauf 2026 zu achten ist |
|---|---|---|---|
| OpenAI (GPT-5.5 und Verwandte) | response_format bei Chat Completions; text.format bei der Responses API | type: json_schema + strict: true | Unter strict will jedes Objekt additionalProperties: false, und Properties sitzen meist alle in required; optional wird nullable |
| Google (Gemini 3.7 Flash und Verwandte) | MIME + Schema in der Generierungskonfiguration | responseMimeType: application/json + responseJsonSchema (SDK oft response_schema) | Kein Schalter namens strict; älteres responseSchema nutzte OpenAPI-Großschreibung; der neuere Kanal nutzt kleingeschriebenes JSON Schema |
| Anthropic (Claude 4.6 / 4.8 und Verwandte) | output_config.format bei der Messages API | type: json_schema + schema | GA — kein Header structured-outputs-2025-11-13 nötig; altes output_format funktioniert in der Übergangszeit weiter. Tool-seitiges strict: true ist Tool Calling, nicht die finale Antwort |
Die Hüllen unterscheiden sich. Der Schema-Körper sollte dieselbe Datei sein. Beim Modellwechsel ändert sich der Umschlag, nicht orderId und required. Eine Claude-Skizze (Spezifikationsfelder; tauschen Sie Ihr Business-Schema ein):
{
"model": "claude-sonnet-4-6",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "Extract orderId and total from the order text"}
],
"output_config": {
"format": {
"type": "json_schema",
"schema": {
"type": "object",
"additionalProperties": false,
"properties": {
"orderId": { "type": "string" },
"total": { "type": "number" }
},
"required": ["orderId", "total"]
}
}
}
}
OpenAI legt dasselbe schema in response_format.json_schema und schaltet strict ein. Gemini legt es in responseJsonSchema und deklariert den JSON-MIME-Typ. Der vollständige Python-Vergleich steht weiter in OpenAI vs Gemini. Produktoberflächen (ChatGPT / claude.ai / die Gemini-Web-App) legen nicht immer dieselbe harte Einschränkung offen. Schreiben Sie das SLA gegen die API, die Sie tatsächlich aufrufen.
Was Constrained Decoding tatsächlich blockiert
Ohne Structured Output sampelt das Modell das volle Vokabular und hofft, dass der Prompt es wie JSON aussehen lässt. Mit Structured Output hält der Decoder aus dem Schema ein legales Präfix: das nächste Token darf nur noch etwas Gültiges sein — ein ", orderId, true oder }. Illegale Pfade bekommen Wahrscheinlichkeit null.
Es blockiert die Form: nachgestellte Kommas, Markdown-Zäune, fehlende Pflichtfelder, Typdrift, Extra-Keys wenn additionalProperties false ist. Es blockiert nicht das Erfinden: total ist eine Zahl, und die Zahl kann erfunden sein; ein legaler enum-Wert kann trotzdem der falsche sein. Produktion jagt dasselbe Schema weiter durch einen Validator; bei Fehler wiederholen, degradieren oder an einen Menschen. Constrained Decoding senkt Parse-Unfälle, nicht Halluzinationen.
Ein größeres Fenster ändert das nicht. 1M Token verbreitern nur, was sichtbar ist; sie beschränken nicht die Ausgabeform. Wenn Sie einen Dump stopfen, brauchen Sie trotzdem ein Schema — siehe 1M-Token-Kontextfenster.
Was Sie jetzt tun sollten
- Schreiben Sie das Schema, bevor Sie ein Modell wählen. Feldnamen, Pflichtlisten und Enums sind der Produktvertrag. GPT / Gemini / Claude sind austauschbare Backends. Halten Sie den Vertrag im Repo, nicht im Prompt.
- Extraktion, Klassifikation, Formularfüllung → Structured Output. Seiteneffekte → Tool Calling. Tun Sie nicht so, als hätte Structured Output schon die Bestands-API getroffen. Prozessübergreifende Wiederverwendung ist der Moment für MCP.
- Nehmen Sie die Schema-Schnittmenge über Anbieter hinweg: flache Objekte,
additionalProperties: false, flache$ref, kein Wurzel-anyOf. OpenAI strict macht aus „optional“ nullable. Pflegen Sie nicht drei driftende Feldtabellen. - Dass die API durchgeht, ist nicht die letzte Prüfung. Legen Sie das Schema und zwei oder drei gute / schlechte Fixtures als JSON ab; validieren und Diffen Sie auf dieser Seite. Nichts wird hochgeladen. Das ist das zweite Tor nach Constrained Decoding.
- Führen Sie Fehler als Struktur zurück: scheitert Parse oder der zweite Validator, geben Sie ein Objekt zurück (welches Feld, erwarteter Typ). Gießen Sie keinen rohen Stack in die nächste Runde.
FAQ
Ist Structured Output nur „das Modell soll JSON zurückgeben“?
Nein. Ein Prompt oder JSON Mode kann JSON-Text ausgeben. Structured Output filtert Token zur Decode-Zeit gegen ein JSON Schema. Feldnamen, Typen und Pflichtlisten erzwingt die API — nicht das Wohlverhalten des Modells.
Warum haben GPT, Gemini und Claude das alle ausgeliefert — reicht nicht ein Anbieter?
Kunden wollen Multi-Modell-Failover und Preisvergleich. Gateways und Agent-Frameworks verdrahten bereits „Schema rein, JSON raus“. Ein Anbieter ohne harte Einschränkung steckt nicht in diese Pipeline. Wettbewerbsdruck und Engineering-Bedarf sind dieselbe Tatsache.
Braucht Claude noch ein Schein-Tool, um Structured Output vorzutäuschen?
Nicht als Hauptweg. 2026 liefert die Messages API JSON-Schema-Ausgabe über output_config.format. Tool-level strict deckt weiter nur Tool-Argumente ab. Der alte Beta-Header und output_format bleiben in einem Übergangsfenster; neuer Code sollte output_config nutzen.
Wenn Structured Output an ist, muss ich trotzdem validieren?
Ja. Es garantiert Form und Typen, nicht wahre Werte oder Geschäftsregeln. Führen Sie dasselbe Schema in der App noch einmal aus; bei Fehler wiederholen oder eskalieren. Im Browser prüfen Sie Fixtures zuerst mit der JSON-Toolbox.
Wie wähle ich zwischen Structured Output, MCP und Tool Calling?
Finale Antwort für ein Programm: Structured Output. Externe Aktion: Tool Calling. Tools in einem anderen Prozess, wiederverwendet über Hosts: MCP. Sie können die drei stapeln. Lassen Sie keine Schicht eine andere imitieren.
Kann ein JSON Schema unverändert an alle drei?
Der Körper kann geteilt werden; der Request-Wrapper nicht. Ein flaches Objekt, keine Extra-Properties, Optionals als Nullables — das gewinnt am häufigsten. Die strict-Teilmenge von OpenAI ist die engste — bestehen Sie die zuerst, dann dieselbe Datei an Gemini / Claude, statt drei driftender Schemas.
Fazit
Structured Output ist die Flaggschiff-API-Buchse 2026: die finale Antwort wird gegen ein JSON Schema decodiert, damit Programme nicht mehr auf Klammern in einem Prompt wetten. GPT, Gemini und Claude haben es alle ausgeliefert, weil Agenten und Extraktion „stabile Form“ in die Abnahmetests geschrieben haben und JSON Schema der Vertrag war, den alle drei schon sprachen. Es ist nicht JSON Mode. Es ersetzt weder Tool Calling noch MCP.
Tauschen Sie das Modell, tauschen Sie nur die Hüllenfelder. Halten Sie Feldnamen und required im Repo und validieren Sie Samples lokal gegen dasselbe Schema, bevor Sie live gehen. Wie jede API zu konfigurieren ist und wie sich das von der Tool-Schicht trennt, hat diese Seite bereits behandelt. Dieser Artikel macht nur „was“ und „warum“ unmissverständlich.