Funktionen
Strukturierte Ausgaben
Antworten als gültiges JSON, optional nach einem festen Schema.
Mit response_format erzwingst du, dass die Antwort gültiges JSON ist. Das ist die Grundlage für Extraktion, Klassifikation und alles, was dein Code weiterverarbeitet. Alle aktuellen Chat-Modelle unterstützen beide Varianten.
JSON nach Schema (empfohlen)
Mit json_schema hält sich die Antwort an dein JSON Schema – Feldnamen, Typen und Pflichtfelder stimmen garantiert.
import json
schema = {
"type": "object",
"properties": {
"kategorie": {"type": "string", "enum": ["Rechnung", "Technik", "Vertrag", "Sonstiges"]},
"dringend": {"type": "boolean"},
"zusammenfassung": {"type": "string"},
},
"required": ["kategorie", "dringend", "zusammenfassung"],
"additionalProperties": False,
}
response = client.chat.completions.create(
model="mistral-small-24b",
messages=[
{"role": "system", "content": "Ordne Support-Anfragen ein."},
{"role": "user", "content": "Seit heute früh ist unser Shop offline, bitte sofort melden!"},
],
response_format={"type": "json_schema", "json_schema": {"name": "ticket", "schema": schema, "strict": True}},
)
ticket = json.loads(response.choices[0].message.content)
print(ticket["kategorie"], ticket["dringend"])Das Schema kannst du auch aus einer Pydantic-Klasse erzeugen: Ticket.model_json_schema().
Beliebiges JSON
{"type": "json_object"} erzwingt gültiges JSON ohne festes Schema. Beschreibe die gewünschten Felder dann im Prompt – ohne Schema wählt das Modell Feldnamen teils selbst (z. B. einwohnerzahl statt einwohner).
response = client.chat.completions.create(
model="gemma-4-31b",
messages=[{"role": "user", "content": "Nenne die größte Stadt Bayerns als JSON mit den Feldern stadt und einwohner."}],
response_format={"type": "json_object"},
)Tipps
- Erwähne im Prompt, dass JSON erwartet wird, und beschreibe die Bedeutung der Felder – das Schema legt nur die Form fest, nicht den Inhalt.
- Setze
max_tokensgroßzügig genug. Wird die Ausgabe abgeschnitten (finish_reason: "length"), ist das JSON unvollständig. - Bei eingeschaltetem Reasoning gilt das Schema für
content, der Gedankengang steht wie immer inreasoning_content.