„Structured outputs" (strukturierte Ausgaben) beschränken Claudes Antworten darauf, einem bestimmten Schema zu folgen, und gewährleisten so eine gültige, parsbare Ausgabe für die nachgelagerte Verarbeitung. Strukturierte Ausgaben bieten zwei sich ergänzende Funktionen:
output_config.format): Erhalte Claudes Antwort in einem bestimmten JSON-Formatstrict: true): Garantiere Schema-Validierung für Tool-Namen und -EingabenDu kannst diese Funktionen unabhängig voneinander oder zusammen in derselben Anfrage verwenden.
Ohne strukturierte Ausgaben kann Claude fehlerhafte JSON-Antworten oder ungültige Tool-Eingaben generieren, die deine Anwendungen zum Absturz bringen. Selbst bei sorgfältigem Prompting kannst du auf Folgendes stoßen:
Strukturierte Ausgaben garantieren schemakonforme Antworten durch „constrained decoding" (eingeschränktes Decoding):
JSON.parse()-Fehler mehrJSON-Ausgaben steuern das Antwortformat von Claude und stellen sicher, dass Claude gültiges JSON zurückgibt, das deinem Schema entspricht. Verwende JSON-Ausgaben, wenn du:
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"))Antwortformat: Gültiges JSON, das deinem Schema entspricht, im Text-Content-Block der Antwort
{
"name": "John Smith",
"email": "[email protected]",
"plan_interest": "Enterprise",
"demo_requested": true
}Definiere dein JSON-Schema
Erstelle ein JSON-Schema, das die Struktur beschreibt, der Claude folgen soll. Das Schema verwendet das Standard-JSON-Schema-Format mit einigen Einschränkungen (siehe JSON-Schema-Einschränkungen).
Füge den Parameter output_config.format hinzu
Füge den Parameter output_config.format mit type: "json_schema" und deiner Schema-Definition in deine API-Anfrage ein.
Parse die Antwort
Claudes Antwort ist gültiges JSON, das deinem Schema entspricht und im Text-Content-Block der Antwort zurückgegeben wird.
Die SDKs bieten Hilfsfunktionen, die die Arbeit mit JSON-Ausgaben erleichtern, einschließlich Schema-Transformation, automatischer Validierung und Integration mit beliebten Schema-Bibliotheken.
Anstatt rohe JSON-Schemas zu schreiben, kannst du vertraute Schema-Definitions-Tools in deiner Sprache verwenden:
client.messages.parse()zodOutputFormat() oder typisierte JSON-Schema-Literale mit jsonSchemaOutputFormat()outputConfig(Class<T>)Anthropic::BaseModel-Klassen mit output_config: {format: Model}StructuredOutputModel implementieren, mit outputConfig: ['format' => MyClass::class]Create<T>()-Überladung, die das Schema automatisch ableitetoutput_configoutput_config übergeben werdenfrom 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)Jedes SDK bietet Hilfsfunktionen, die die Arbeit mit strukturierten Ausgaben erleichtern. Vollständige Details findest du auf den einzelnen SDK-Seiten.
client.messages.parse() (Empfohlen)
Die Methode parse() transformiert automatisch dein Pydantic-Modell, validiert die Antwort und gibt ein parsed_output-Attribut zurück.
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,
)
# Greife direkt auf die geparste Ausgabe zu
contact = response.parsed_output
print(contact.name, contact.email)transform_schema()-Helper
Für den Fall, dass du Schemas vor dem Senden manuell transformieren musst oder ein von Pydantic generiertes Schema modifizieren möchtest. Im Gegensatz zu client.messages.parse(), das bereitgestellte Schemas automatisch transformiert, erhältst du hier das transformierte Schema, sodass du es weiter anpassen kannst.
from anthropic import transform_schema
from pydantic import TypeAdapter
# Konvertiere zuerst das Pydantic-Modell in ein JSON-Schema, dann transformiere es
schema = TypeAdapter(ContactInfo).json_schema()
schema = transform_schema(schema)
# Passe das Schema bei Bedarf an
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},
},
)Die Python-, TypeScript-, Ruby- und PHP-SDKs transformieren Schemas mit nicht unterstützten Funktionen automatisch. Die C#- und Go-SDKs wenden dieselben Transformationen an, wenn das Schema aus einem nativen Typ abgeleitet wird (Create<T>() in C#; Struct-Reflection oder BetaJSONSchemaOutputFormat() auf der Go-Beta-API). Die Transformationsschritte:
minimum, maximum, minLength, maxLength)additionalProperties: false hinzufügen zu allen ObjektenDas bedeutet, Claude erhält ein vereinfachtes Schema, aber dein Code erzwingt weiterhin alle Constraints durch Validierung.
Beispiel: Ein Pydantic-Feld mit minimum: 100 wird im gesendeten Schema zu einem einfachen Integer, aber das SDK aktualisiert die Beschreibung auf „Muss mindestens 100 sein" und validiert die Antwort gegen den ursprünglichen Constraint.
Zum Erzwingen der JSON-Schema-Konformität bei Tool-Eingaben mit grammatikbeschränktem Sampling siehe Strikte Tool-Nutzung.
JSON-Ausgaben und strikte Tool-Nutzung lösen unterschiedliche Probleme und arbeiten zusammen:
In Kombination kann Claude Tools mit garantiert gültigen Parametern aufrufen UND strukturierte JSON-Antworten zurückgeben. Dies ist nützlich für agentische Workflows, bei denen du sowohl zuverlässige Tool-Aufrufe als auch strukturierte Endausgaben benötigst.
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",
}
],
# JSON-Ausgaben: strukturiertes Antwortformat
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,
},
}
},
# Strikte Tool-Nutzung: garantierte Tool-Parameter
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)Strukturierte Ausgaben verwenden eingeschränktes Sampling mit kompilierten Grammatik-Artefakten. Dies bringt einige Performance-Eigenschaften mit sich, die du beachten solltest:
name oder description invalidiert den Cache nichtBei der Verwendung strukturierter Ausgaben erhält Claude automatisch einen zusätzlichen System-Prompt, der das erwartete Ausgabeformat erklärt. Das bedeutet:
output_config.format invalidiert jeden Prompt-Cache für diesen Konversations-ThreadStrukturierte Ausgaben unterstützen Standard-JSON-Schema mit einigen Einschränkungen. Sowohl JSON-Ausgaben als auch strikte Tool-Nutzung teilen diese Einschränkungen.
Bei der Verwendung strukturierter Ausgaben behalten Properties in Objekten ihre definierte Reihenfolge aus deinem Schema bei, mit einer wichtigen Einschränkung: Erforderliche Properties erscheinen zuerst, gefolgt von optionalen Properties.
Zum Beispiel, bei diesem Schema:
{
"type": "object",
"properties": {
"notes": { "type": "string" },
"name": { "type": "string" },
"email": { "type": "string" },
"age": { "type": "integer" }
},
"required": ["name", "email"],
"additionalProperties": false
}Die Ausgabe ordnet Properties wie folgt:
name (erforderlich, in Schema-Reihenfolge)email (erforderlich, in Schema-Reihenfolge)notes (optional, in Schema-Reihenfolge)age (optional, in Schema-Reihenfolge)Das bedeutet, die Ausgabe könnte so aussehen:
{
"name": "John Smith",
"email": "[email protected]",
"notes": "Interested in enterprise plan",
"age": 35
}Wenn die Property-Reihenfolge in der Ausgabe für deine Anwendung wichtig ist, markiere alle Properties als erforderlich oder berücksichtige diese Neuordnung in deiner Parsing-Logik.
Während strukturierte Ausgaben in den meisten Fällen Schema-Konformität garantieren, gibt es Szenarien, in denen die Ausgabe möglicherweise nicht deinem Schema entspricht:
Ablehnungen (stop_reason: "refusal")
Claude behält seine Sicherheits- und Hilfsbereitschaftseigenschaften auch bei der Verwendung strukturierter Ausgaben bei. Wenn Claude eine Anfrage aus Sicherheitsgründen ablehnt:
stop_reason: "refusal"Token-Limit erreicht (stop_reason: "max_tokens")
Wenn die Antwort aufgrund des Erreichens des max_tokens-Limits abgeschnitten wird:
stop_reason: "max_tokens"max_tokens-Wert, um die vollständige strukturierte Ausgabe zu erhaltenGroß-/Kleinschreibung von Enum-Werten
Strukturierte Ausgaben garantieren nicht die Groß-/Kleinschreibung von String-enum- und const-Werten: Claude kann einen Wert zurückgeben, der sich von deinem Schema nur in der Groß-/Kleinschreibung unterscheidet, typischerweise beim ersten Buchstaben eines Wortes nach einem Leerzeichen. Zum Beispiel, bei diesem Schema:
{
"type": "string",
"enum": ["Conversation Topic 1", "Conversation Topic 2", "Conversation topic 3"]
}Die Ausgabe kann "Conversation Topic 3" (großes „T") enthalten, obwohl dieser exakte Wert nicht im Enum ist. Die Antwort wird normal abgeschlossen, ohne Fehler und ohne speziellen stop_reason. Dies gilt sowohl für JSON-Ausgaben als auch für strikte Tool-Nutzung. Vergleiche Enum-Werte ohne Berücksichtigung der Groß-/Kleinschreibung und vermeide Enum-Werte, die sich nur in der Groß-/Kleinschreibung unterscheiden.
Strukturierte Ausgaben funktionieren, indem deine JSON-Schemas in eine Grammatik kompiliert werden, die Claudes Ausgabe einschränkt. Komplexere Schemas erzeugen größere Grammatiken, deren Kompilierung länger dauert. Zum Schutz vor übermäßigen Kompilierungszeiten erzwingt die API mehrere Komplexitätslimits.
Die folgenden Limits gelten für alle Anfragen mit output_config.format oder strict: true:
| Limit | Wert | Beschreibung |
|---|---|---|
| Strikte Tools pro Anfrage | 20 | Maximale Anzahl von Tools mit strict: true. Nicht-strikte Tools zählen nicht zu diesem Limit. |
| Optionale Parameter | 24 | Gesamtzahl optionaler Parameter über alle strikten Tool-Schemas und JSON-Ausgabe-Schemas hinweg. Jeder Parameter, der nicht in required aufgeführt ist, zählt zu diesem Limit. |
| Parameter mit Union-Typen | 16 | Gesamtzahl der Parameter, die anyOf oder Typ-Arrays verwenden (zum Beispiel "type": ["string", "null"]), über alle strikten Schemas hinweg. Diese sind besonders teuer, da sie exponentielle Kompilierungskosten verursachen. |
Über die expliziten Limits in der vorstehenden Tabelle hinaus gibt es zusätzliche interne Limits für die Größe der kompilierten Grammatik. Diese Limits existieren, weil sich Schema-Komplexität nicht auf eine einzige Dimension reduzieren lässt: Funktionen wie optionale Parameter, Union-Typen, verschachtelte Objekte und Anzahl der Tools interagieren miteinander auf Weisen, die die kompilierte Grammatik unverhältnismäßig groß machen können.
Wenn diese Limits überschritten werden, erhältst du einen 400-Fehler mit der Meldung „Schema is too complex for compilation." Diese Fehler bedeuten, dass die kombinierte Komplexität deiner Schemas das übersteigt, was effizient kompiliert werden kann, selbst wenn jedes einzelne Limit in der vorstehenden Tabelle erfüllt ist. Als letzte Absicherung erzwingt die API außerdem ein Kompilierungs-Timeout von 180 Sekunden. Schemas, die alle expliziten Prüfungen bestehen, aber sehr große kompilierte Grammatiken erzeugen, können dieses Timeout erreichen.
Wenn du auf Komplexitätslimits stößt, probiere diese Strategien der Reihe nach aus:
Markiere nur kritische Tools als strikt. Wenn du viele Tools hast, reserviere es für Tools, bei denen Schema-Verletzungen echte Probleme verursachen, und verlasse dich bei einfacheren Tools auf Claudes natürliche Einhaltung.
Reduziere optionale Parameter. Mache Parameter wo möglich required. Jeder optionale Parameter verdoppelt ungefähr einen Teil des Zustandsraums der Grammatik. Wenn ein Parameter immer einen sinnvollen Standardwert hat, erwäge, ihn erforderlich zu machen und Claude diesen Standardwert explizit angeben zu lassen.
Vereinfache verschachtelte Strukturen. Tief verschachtelte Objekte mit optionalen Feldern verstärken die Komplexität. Flache Strukturen ab, wo möglich.
Teile in mehrere Anfragen auf. Wenn du viele strikte Tools hast, erwäge, sie auf separate Anfragen oder Sub-Agenten aufzuteilen.
Bei anhaltenden Problemen mit gültigen Schemas kontaktiere den Support mit deiner Schema-Definition.
Prompts und Antworten werden bei der Verwendung strukturierter Ausgaben mit ZDR verarbeitet. Das JSON-Schema selbst wird jedoch zu Optimierungszwecken bis zu 24 Stunden seit der letzten Verwendung temporär gecacht. Keine Prompt- oder Antwortdaten werden über die API-Antwort hinaus gespeichert.
Strukturierte Ausgaben sind HIPAA-fähig, aber PHI dürfen nicht in JSON-Schema-Definitionen enthalten sein. Die API kompiliert JSON-Schemas in Grammatiken, die separat vom Nachrichteninhalt gecacht werden, und diese gecachten Schemas erhalten nicht denselben PHI-Schutz wie Prompts und Antworten. Füge keine PHI in Schema-Property-Namen, enum-Werte, const-Werte oder pattern-Reguläre-Ausdrücke ein. PHI sollten nur im Nachrichteninhalt (Prompts und Antworten) erscheinen, wo sie unter HIPAA-Schutzmaßnahmen geschützt sind.
Für ZDR- und HIPAA-Fähigkeit über alle Funktionen hinweg siehe API und Datenspeicherung.
Funktioniert mit:
output_config.format) und strikte Tool-Nutzung (strict: true) zusammen in derselben AnfrageInkompatibel mit:
output_config.format aktiviert sind.Lass Claude seine Quellen zitieren, wenn es Fragen zu bereitgestellten Dokumenten beantwortet.
Erzwinge JSON-Schema-Konformität bei Claudes Tool-Eingaben mit grammatikbeschränktem Sampling.
Verbinde Claude mit externen Tools und APIs. Erfahre, wo Tools ausgeführt werden und wie die agentische Schleife funktioniert.
Erfahre mehr über Anthropics Preisstruktur für Modelle und Funktionen.
| Supported models |
|
|---|---|
| Supported platforms |
Was this page helpful?