[{"data":1,"prerenderedAt":848},["ShallowReactive",2],{"blog-structured-outputs-json-schema-llm-de":3},{"slug":4,"published":5,"minutes":6,"category":7,"tags":8,"keywords":14,"about":26,"sources":35,"cover":54,"og":55,"expertise":56,"locales":57,"lang":59,"title":61,"description":62,"coverAlt":63,"metaTitle":64,"takeaways":65,"faq":71,"toc":87,"blocks":121,"others":586},"structured-outputs-json-schema-llm","2026-10-16",9,"llmops",[9,10,11,12,13],"Structured outputs","JSON Schema","Constrained decoding","LLM APIs","Validation",[15,16,17,18,19,20,21,22,23,24,25],"structured outputs LLM","JSON schema LLM output","OpenAI structured outputs strict mode","Claude structured outputs","Gemini structured output","constrained decoding","JSON mode vs structured outputs","validate LLM JSON output","Zod structured output","Pydantic LLM output","vLLM structured outputs",[27,30,32],{"name":28,"url":29},"JSON","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FJSON",{"name":10,"url":31},"https:\u002F\u002Fjson-schema.org\u002F",{"name":33,"url":34},"Large language model","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FLarge_language_model",[36,39,42,45,48,51],{"title":37,"url":38},"OpenAI API docs: Structured model outputs","https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fguides\u002Fstructured-outputs",{"title":40,"url":41},"Claude API docs: Structured outputs","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fbuild-with-claude\u002Fstructured-outputs",{"title":43,"url":44},"Gemini API docs: Structured outputs","https:\u002F\u002Fai.google.dev\u002Fgemini-api\u002Fdocs\u002Fstructured-output",{"title":46,"url":47},"vLLM docs: Structured Outputs","https:\u002F\u002Fdocs.vllm.ai\u002Fen\u002Flatest\u002Ffeatures\u002Fstructured_outputs.html",{"title":49,"url":50},"Tam et al.: Let Me Speak Freely? A Study on the Impact of Format Restrictions on Performance of LLMs (2024)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2408.02442",{"title":52,"url":53},"Geng et al.: JSONSchemaBench: A Rigorous Benchmark of Structured Outputs for Language Models (2025)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2501.10868","\u002Fimages\u002Fblog\u002Fstructured-outputs-json-schema-llm\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fstructured-outputs-json-schema-llm\u002Fog.jpg","ai-engineer",[58,59,60],"en","de","hu","Structured Outputs mit JSON Schema: was die Garantie abdeckt und was nicht","Wie Structured Outputs und Constrained Decoding bei OpenAI, Claude, Gemini und vLLM funktionieren, welche Schemaregeln zählen und was du validierst.","Ein JSON Schema wird zu einer Grammatik kompiliert, die Tokens maskiert und schemagültiges JSON erzeugt, das danach eine fachliche Validierung durchläuft.","Structured Outputs und JSON Schema für LLMs · Balázs Csorba",[66,67,68,69,70],"Structured Outputs kompilieren dein JSON Schema zu einer Grammatik und maskieren ungültige Tokens, sodass Antworten konstruktionsbedingt parsebar und schemakonform sind.","Der JSON-Modus garantiert nur gültiges JSON; Structured Outputs garantieren die Form, und strikte Tools übertragen dieselbe Garantie auf Tool-Argumente.","OpenAI, Claude und Gemini unterstützen jeweils eine andere Teilmenge von JSON Schema; entwirf für die Schnittmenge mit Pflichtfeldern, null und additionalProperties false.","Verweigerungen, Abbruch bei max_tokens, Enum-Schreibweise und abgelehnte Schemas sind dokumentierte Ausnahmen mit eigenem Codepfad.","Ein schemagültiges Objekt kann trotzdem falsch sein: Referenzen und Plausibilität im Code prüfen und Qualität mit und ohne Schema messen.",[72,75,78,81,84],{"q":73,"a":74},"Was ist der Unterschied zwischen JSON-Modus und Structured Outputs?","Der JSON-Modus garantiert syntaktisch gültiges JSON, aber nicht, dass es die Felder und Typen hat, die du brauchst. Structured Outputs beschränken die Generierung auf dein JSON Schema, sodass die Antwort dem Schema entspricht, außer in dokumentierten Fällen wie Verweigerung oder Abbruch. Nutze Structured Outputs, wann immer Anbieter und Modell sie unterstützen.",{"q":76,"a":77},"Machen Structured Outputs LLM-Antworten schlechter?","Die Beleglage ist gemischt. Eine Studie von 2024 berichtete schwächeres Reasoning unter strengen Formatvorgaben, während JSONSchemaBench 2025 mit korrigiertem Prompt Constrained Decoding auf oder über der Baseline ohne Constraints fand. Lass das Modell nachdenken, bevor es sich auf ein Antwortfeld festlegt, entweder in Thinking-Blöcken oder in einem vorangestellten Begründungsfeld, und miss es an deiner eigenen Aufgabe.",{"q":79,"a":80},"Muss ich die Ausgabe im strikten Modus noch validieren?","Ja. Das Schema garantiert die Form, nicht die Wahrheit. Prüfe den Stoppgrund, schlage IDs und Artikelnummern in deinen Daten nach, wende Plausibilitätsregeln an und schick fehlerhafte Fälle in einen Reparaturversuch und dann zu einem Menschen.",{"q":82,"a":83},"Warum liefert mein JSON Schema einen 400-Fehler?","Meist, weil es Schlüsselwörter nutzt, die der Anbieter nicht unterstützt, etwa allOf bei OpenAI oder minLength bei Claude, oder weil die kombinierte Komplexität zu hoch ist. Claude zählt seine Grenzen von 20 strikten Tools, 24 optionalen Parametern und 16 Parametern mit Union-Typ über alle Schemas einer Anfrage.",{"q":85,"a":86},"Wie mache ich ein Feld im strikten Modus von OpenAI optional?","Der strikte Modus verlangt, dass jedes Feld als required gelistet ist. Bilde ein optionales Feld mit einer Union nach, die null enthält, etwa dem Typ string oder null, und behandle null in deinem Code als unbekannt.",[88,91,94,97,100,103,106,109,112,115,118],{"id":89,"title":90},"json-mode-vs-structured-outputs","JSON-Modus, Structured Outputs und strikte Tools",{"id":92,"title":93},"how-constrained-decoding-works","Wie Constrained Decoding funktioniert",{"id":95,"title":96},"provider-comparison","OpenAI, Claude, Gemini und vLLM im Vergleich",{"id":98,"title":99},"schema-design-rules","Schemaregeln, die bei jedem Anbieter gelten",{"id":101,"title":102},"code-example","Eine typisierte Extraktion in TypeScript",{"id":104,"title":105},"when-the-guarantee-breaks","Wann die Garantie nicht greift",{"id":107,"title":108},"does-it-hurt-quality","Schadet die Formatvorgabe der Antwortqualität?",{"id":110,"title":111},"validation-layer","Die Validierungsschicht hinter dem Schema",{"id":113,"title":114},"self-hosted-models","Structured Outputs bei selbst gehosteten Modellen",{"id":116,"title":117},"checklist","Checkliste",{"id":119,"title":120},"sources","Quellen",[122,131,134,137,148,162,163,166,177,186,187,190,277,280,281,284,329,330,355,357,368,369,372,419,426,427,439,456,457,460,493,510,511,531,534,535,553,565,566],{"type":123,"content":124},"paragraph",[125,126,130],"Ein Modell zu bitten, \"in JSON zu antworten\", funktioniert so lange, bis es das nicht mehr tut: ein Kommentar am Ende, ein fehlendes Feld, ein String, wo dein Code eine Zahl erwartet. ",{"tag":127,"children":128},"strong",[129],"Structured Outputs"," lösen die syntaktische Hälfte dieses Problems. Der Anbieter kompiliert dein JSON Schema zu einer Grammatik und lässt das Modell nur Tokens ausgeben, die die Ausgabe gültig halten. Die Antwort ist damit parsebar und schemakonform, und zwar konstruktionsbedingt. OpenAI, Anthropic, Google und die Open-Source-Inferenzserver bieten inzwischen alle eine Variante davon an.",{"type":123,"content":132},[133],"Die andere Hälfte bleibt deine Aufgabe. Ein schemagültiges Objekt kann den falschen Kunden, ein erfundenes Datum oder eine Verweigerung enthalten. Dieser Leitfaden erklärt, wie Constrained Decoding funktioniert, wie sich die drei großen APIs unterscheiden, welche Schemaregeln Leute stolpern lassen, welche Fehlerfälle die Garantie nicht abdeckt und welche Validierungsschicht dahinter gehört.",{"type":135,"level":136,"id":89,"text":90},"heading",2,{"type":123,"content":138},[139,140,143,144,147],"Es gibt drei Stufen, und man verwechselt sie leicht. ",{"tag":127,"children":141},[142],"JSON nur per Prompt"," ist eine Anweisung, sonst nichts. Der ",{"tag":127,"children":145},[146],"JSON-Modus"," garantiert syntaktisch gültiges JSON, aber nicht deine Struktur: Laut OpenAI-Leitfaden erzeugen beide Modi gültiges JSON, aber \"nur Structured Outputs stellen die Einhaltung des Schemas sicher\". Der JSON-Modus hat sogar eine eigene Falle: Erwähnt der Prompt JSON nicht, kann das Modell einen endlosen Strom aus Leerzeichen ausgeben. Deshalb lehnt die OpenAI-API eine Anfrage im JSON-Modus ab, wenn der String \"JSON\" nirgends im Kontext vorkommt.",{"type":123,"content":149},[150,152,153,156,157,161],{"tag":127,"children":151},[129]," beschränken die finale Antwort auf ein Schema. ",{"tag":127,"children":154},[155],"Strikte Tool-Nutzung"," überträgt dieselbe Garantie auf Tool-Argumente: Setze ",{"tag":158,"children":159},"code",[160],"strict: true"," in der Tool-Definition, und die Argumente, die das Modell schickt, validieren gegen das Input-Schema des Tools. Nimm das Erste, wenn das Modell deinem Code antwortet, das Zweite, wenn das Modell deinen Code aufruft. Die Anthropic-API erlaubt beides in einer Anfrage.",{"type":135,"level":136,"id":92,"text":93},{"type":123,"content":164},[165],"Bei jedem Generierungsschritt berechnet ein Modell eine Wahrscheinlichkeit für jedes Token seines Vokabulars. Constrained Decoding führt einen aus deinem Schema abgeleiteten Zustandsautomaten mit und maskiert jedes Token, das die Ausgabe an dieser Stelle ungültig machen würde. Nach einer öffnenden Klammer und einem Pflichtschlüssel steht eine schließende Klammer schlicht nicht zur Wahl. Den Inhalt wählt weiterhin das Modell; die Grammatik entfernt nur Optionen, die nicht zu gültiger Ausgabe führen können.",{"type":123,"content":167},[168,169,172,173,176],"Das Kompilieren dieser Grammatik kostet Zeit. Laut Anthropic-Doku hat die erste Anfrage mit einem neuen Schema zusätzliche Latenz, weil die Grammatik kompiliert wird; kompilierte Grammatiken werden 24 Stunden ab letzter Nutzung zwischengespeichert. Eine Änderung der Schemastruktur oder der Tool-Menge invalidiert den Cache; eine Änderung nur an ",{"tag":158,"children":170},[171],"name"," oder ",{"tag":158,"children":174},[175],"description"," nicht. OpenAI nennt eine ähnliche Verzögerung bei der ersten Anfrage nur für feinabgestimmte Modelle. Praktisch heißt das: Schemas stabil und versioniert halten und nach einem Deploy vorwärmen, wenn nicht der erste Nutzer die Kompilierung bezahlen soll.",{"type":178,"attrs":179,"inner":183,"caption":184},"diagram",{"viewBox":180,"role":181,"aria-labelledby":182},"0 0 720 300","img","so-flow-t so-flow-d","\u003Ctitle id=\"so-flow-t\">Vom Schema zum akzeptierten Objekt\u003C\u002Ftitle>\u003Cdesc id=\"so-flow-d\">Dein Schema wird zu einer Grammatik kompiliert und zwischengespeichert. Während der Generierung maskiert die Grammatik ungültige Tokens, sodass das Modell schemagültiges JSON liefert. Dein Code prüft den Stoppgrund, parst das Objekt und führt die fachliche Validierung aus. Gültige Objekte werden akzeptiert; Verweigerungen, Abbrüche oder Regelverstöße gehen in einen Retry- oder Ablehnungspfad.\u003C\u002Fdesc>\u003Cdefs>\u003Cmarker id=\"ah-so\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"7\" markerHeight=\"7\" orient=\"auto-start-reverse\">\u003Cpath d=\"M0 0L10 5L0 10z\" class=\"d-head\" \u002F>\u003C\u002Fmarker>\u003C\u002Fdefs>\u003Crect x=\"20\" y=\"40\" width=\"140\" height=\"64\" rx=\"10\" class=\"d-box\" \u002F>\u003Ctext x=\"90\" y=\"68\" text-anchor=\"middle\" class=\"d-text\">JSON Schema\u003C\u002Ftext>\u003Ctext x=\"90\" y=\"90\" text-anchor=\"middle\" class=\"d-small\">Zod, Pydantic\u003C\u002Ftext>\u003Crect x=\"200\" y=\"40\" width=\"140\" height=\"64\" rx=\"10\" class=\"d-gold\" \u002F>\u003Ctext x=\"270\" y=\"68\" text-anchor=\"middle\" class=\"d-text\">Grammatik\u003C\u002Ftext>\u003Ctext x=\"270\" y=\"90\" text-anchor=\"middle\" class=\"d-small\">kompiliert, gecacht\u003C\u002Ftext>\u003Crect x=\"380\" y=\"40\" width=\"140\" height=\"64\" rx=\"10\" class=\"d-accent\" \u002F>\u003Ctext x=\"450\" y=\"68\" text-anchor=\"middle\" class=\"d-text\">Token-Maske\u003C\u002Ftext>\u003Ctext x=\"450\" y=\"90\" text-anchor=\"middle\" class=\"d-small\">jeder Schritt\u003C\u002Ftext>\u003Crect x=\"560\" y=\"40\" width=\"140\" height=\"64\" rx=\"10\" class=\"d-mint\" \u002F>\u003Ctext x=\"630\" y=\"68\" text-anchor=\"middle\" class=\"d-text\">JSON\u003C\u002Ftext>\u003Ctext x=\"630\" y=\"90\" text-anchor=\"middle\" class=\"d-small\">schemagültig\u003C\u002Ftext>\u003Crect x=\"560\" y=\"200\" width=\"140\" height=\"64\" rx=\"10\" class=\"d-gold\" \u002F>\u003Ctext x=\"630\" y=\"228\" text-anchor=\"middle\" class=\"d-text\">Stoppgrund\u003C\u002Ftext>\u003Ctext x=\"630\" y=\"250\" text-anchor=\"middle\" class=\"d-small\">refusal, max_tokens\u003C\u002Ftext>\u003Crect x=\"380\" y=\"200\" width=\"140\" height=\"64\" rx=\"10\" class=\"d-box\" \u002F>\u003Ctext x=\"450\" y=\"228\" text-anchor=\"middle\" class=\"d-text\">Validator\u003C\u002Ftext>\u003Ctext x=\"450\" y=\"250\" text-anchor=\"middle\" class=\"d-small\">Fachregeln\u003C\u002Ftext>\u003Crect x=\"200\" y=\"200\" width=\"140\" height=\"64\" rx=\"10\" class=\"d-mint\" \u002F>\u003Ctext x=\"270\" y=\"228\" text-anchor=\"middle\" class=\"d-text\">akzeptieren\u003C\u002Ftext>\u003Ctext x=\"270\" y=\"250\" text-anchor=\"middle\" class=\"d-small\">Objekt nutzen\u003C\u002Ftext>\u003Crect x=\"20\" y=\"200\" width=\"140\" height=\"64\" rx=\"10\" class=\"d-sky\" \u002F>\u003Ctext x=\"90\" y=\"228\" text-anchor=\"middle\" class=\"d-text\">Retry \u002F Ablehnung\u003C\u002Ftext>\u003Ctext x=\"90\" y=\"250\" text-anchor=\"middle\" class=\"d-small\">Fall loggen\u003C\u002Ftext>\u003Cpath d=\"M160 72H198\" class=\"d-line\" marker-end=\"url(#ah-so)\" \u002F>\u003Cpath d=\"M340 72H378\" class=\"d-line\" marker-end=\"url(#ah-so)\" \u002F>\u003Cpath d=\"M520 72H558\" class=\"d-line\" marker-end=\"url(#ah-so)\" \u002F>\u003Cpath d=\"M630 104V198\" class=\"d-line\" marker-end=\"url(#ah-so)\" \u002F>\u003Cpath d=\"M560 232H522\" class=\"d-line\" marker-end=\"url(#ah-so)\" \u002F>\u003Cpath d=\"M380 232H342\" class=\"d-line-accent\" marker-end=\"url(#ah-so)\" \u002F>\u003Ctext x=\"361\" y=\"222\" text-anchor=\"middle\" class=\"d-label\">gültig\u003C\u002Ftext>\u003Cpath d=\"M450 264V290H90V266\" class=\"d-line d-dash\" marker-end=\"url(#ah-so)\" \u002F>\u003Ctext x=\"270\" y=\"284\" text-anchor=\"middle\" class=\"d-label\">ungültig\u003C\u002Ftext>",[185],"Structured Outputs garantieren die obere Reihe. Die untere Reihe, Stoppgrund prüfen und Inhalt validieren, bleibt dein Code.",{"type":135,"level":136,"id":95,"text":96},{"type":123,"content":188},[189],"Alle vier akzeptieren JSON Schema, alle vier unterstützen nur eine Teilmenge davon, und die Teilmengen unterscheiden sich. Das sagen die aktuellen Dokus:",{"type":191,"head":192,"rows":201},"table",[193,195,197,199],[194],"",[196],"Aktivierung",[198],"Wichtige Schemaregeln",[200],"Dokumentierte Grenzen",[202,222,236,252],[203,206,218,220],[204,205],"tag","children",[207,210,211,214,215,217],{"tag":158,"children":208},[209],"text.format"," mit ",{"tag":158,"children":212},[213],"type: \"json_schema\""," und ",{"tag":158,"children":216},[160]," (Responses API)",[219],"Alle Felder required (optional per null-Union nachbilden); additionalProperties false; kein allOf, not, if\u002Fthen\u002Felse; Schlüssel kommen in Schemareihenfolge",[221],"Bis zu 5.000 Objekteigenschaften, 10 Verschachtelungsebenen, 1.000 Enum-Werte",[223,224,232,234],[204,205],[225,228,229,231],{"tag":158,"children":226},[227],"output_config.format","; ",{"tag":158,"children":230},[160]," bei Tools",[233],"additionalProperties muss false sein; keine Zahlen- oder Längen-Constraints; minItems nur 0 oder 1; Pflichtfelder werden vor optionalen ausgegeben",[235],"20 strikte Tools, 24 optionale Parameter, 16 Parameter mit Union-Typ pro Anfrage",[237,238,248,250],[204,205],[239,210,242,214,245],{"tag":158,"children":240},[241],"response_format",{"tag":158,"children":243},[244],"mime_type: application\u002Fjson",{"tag":158,"children":246},[247],"schema",[249],"Unterstützt enum, format, minimum\u002Fmaximum, minItems\u002FmaxItems, prefixItems; null über Typ-Arrays",[251],"\"Sehr große oder tief verschachtelte Schemas können abgelehnt werden\"",[253,254,273,275],[204,205],[255,258,259,262,263,262,266,262,269,272],{"tag":158,"children":256},[257],"structured_outputs"," (",{"tag":158,"children":260},[261],"json",", ",{"tag":158,"children":264},[265],"regex",{"tag":158,"children":267},[268],"choice",{"tag":158,"children":270},[271],"grammar",")",[274],"Backends: xgrammar oder guidance; die alten guided_json-Felder wurden in v0.12.0 entfernt",[276],"Abhängig von Backend und Modell",{"type":123,"content":278},[279],"Zwei Details aus dieser Tabelle verursachen die meisten Überraschungen. Erstens unterscheiden sich die Reihenfolgeregeln: OpenAI gibt Schlüssel in Schemareihenfolge aus, Claude stellt Pflichtfelder zuerst und optionale danach. Wenn du dich auf die Reihenfolge verlässt (etwa um Teilobjekte in eine UI zu streamen), mach alle Eigenschaften zu Pflichtfeldern. Zweitens zählen Claudes Grenzen über alle strikten Schemas einer Anfrage hinweg: Vier strikte Tools mit je sechs optionalen Parametern erreichen bereits die Grenze von 24. Wird die kombinierte Grammatik zu groß, kommt ein 400 mit \"Schema is too complex for compilation\".",{"type":135,"level":136,"id":98,"text":99},{"type":123,"content":282},[283],"Wenn ein Schema bei mehr als einem Anbieter laufen muss, entwirf es für die Schnittmenge. Das sind meine Regeln:",{"type":285,"ordered":286,"items":287},"list",false,[288,297,302,307,312,317],[289,292,293,296],{"tag":127,"children":290},[291],"Mach jedes Feld zum Pflichtfeld und modelliere \"unbekannt\" als null."," Ein Typ ",{"tag":158,"children":294},[295],"[\"string\", \"null\"]"," ist eindeutig und funktioniert überall; ein fehlender Schlüssel ist mehrdeutig. Bei Claude zählen Union-Typen zur Grenze von 16 Parametern, also nur dort einsetzen, wo null eine echte Antwort ist.",[298,301],{"tag":127,"children":299},[300],"Setze additionalProperties bei jedem Objekt auf false."," Claude und OpenAIs strikter Modus verlangen es, und es verhindert, dass das Modell Felder erfindet, die dein Code stillschweigend ignoriert.",[303,306],{"tag":127,"children":304},[305],"Nimm Enums statt Freitext für alles, worauf du verzweigst."," Status, Kategorie, Intent. Vergleiche Enum-Werte trotzdem ohne Groß-\u002FKleinschreibung: Claudes Doku warnt, dass die Schreibweise von enum- und const-Werten nicht garantiert ist.",[308,311],{"tag":127,"children":309},[310],"Regeln gehören in die Beschreibung, nicht in Constraints."," Claude unterstützt minLength, maximum und Ähnliches nicht; schreib \"ISO-4217-Code, drei Buchstaben\" in die Beschreibung und prüfe es im Code.",[313,316],{"tag":127,"children":314},[315],"Flach und klein halten."," Verschachtelung, Unions und optionale Parameter vervielfachen die Grammatikgröße. Zwei einfache Aufrufe schlagen oft ein Schema, das alles erfassen will.",[318,321,322,172,325,328],{"tag":127,"children":319},[320],"Baue einen expliziten Ausweg ein."," Ein Feld wie ",{"tag":158,"children":323},[324],"\"confidence\": \"low\" | \"high\"",{"tag":158,"children":326},[327],"\"not_found\": true"," gibt dem Modell eine gültige Möglichkeit zu sagen, dass es etwas nicht weiß. Ohne so ein Feld erzwingt das Schema eine Antwort.",{"type":135,"level":136,"id":101,"text":102},{"type":123,"content":331},[332,333,336,337,340,341,343,344,347,348,210,351,354],"Die SDKs verstecken die Schema-Mechanik. Mit dem Anthropic-TypeScript-SDK packst du ein Zod-Schema in ",{"tag":158,"children":334},[335],"zodOutputFormat()"," und rufst ",{"tag":158,"children":338},[339],"client.messages.parse()"," auf; das schickt es als ",{"tag":158,"children":342},[227]," und liefert ein typisiertes ",{"tag":158,"children":345},[346],"parsed_output",". Das OpenAI-Pendant ist ",{"tag":158,"children":349},[350],"responses.parse()",{"tag":158,"children":352},[353],"zodTextFormat()",". Was das SDK dir nicht abnimmt, sind die Prüfung des Stoppgrunds und die Fachregel danach:",{"type":158,"code":356},"import Anthropic from \"@anthropic-ai\u002Fsdk\";\nimport { zodOutputFormat } from \"@anthropic-ai\u002Fsdk\u002Fhelpers\u002Fzod\";\nimport { z } from \"zod\";\n\nconst OrderLine = z.object({\n  sku: z.string().describe(\"Article number exactly as written in the email\"),\n  quantity: z.number().int().describe(\"Ordered quantity, a positive integer\"),\n  unit: z.enum([\"piece\", \"box\", \"pallet\"]),\n  delivery_date: z.string().nullable().describe(\"ISO date, or null if none given\"),\n});\nconst Order = z.object({ lines: z.array(OrderLine), not_an_order: z.boolean() });\n\nconst client = new Anthropic();\nconst res = await client.messages.parse({\n  model: \"claude-opus-5-5\",\n  max_tokens: 4096,\n  messages: [{ role: \"user\", content: `Extract the order lines:\\n\\n${email}` }],\n  output_config: { format: zodOutputFormat(Order) },\n});\n\nif (res.stop_reason === \"refusal\" || res.stop_reason === \"max_tokens\") {\n  throw new Error(`no usable output: ${res.stop_reason}`);   \u002F\u002F schema not guaranteed here\n}\nconst order = res.parsed_output!;\nfor (const line of order.lines) {\n  if (line.quantity \u003C= 0 || !(await skuExists(line.sku))) {   \u002F\u002F business rules: your job\n    await queueForHumanReview(email, order);\n    break;\n  }\n}",{"type":123,"content":358},[359,360,363,364,367],"Die Zod-Angaben (",{"tag":158,"children":361},[362],".int()",", die Beschreibungen) helfen trotzdem: Die Beschreibung erreicht das Modell als Hinweis, und du kannst ",{"tag":158,"children":365},[366],"Order.parse()"," selbst noch einmal ausführen, wenn du eine zweite, lokale Prüfung der Constraints willst, die der Anbieter nicht durchsetzt.",{"type":135,"level":136,"id":104,"text":105},{"type":123,"content":370},[371],"\"Garantierte Schemakonformität\" hat dokumentierte Ausnahmen, und jede braucht einen Codepfad:",{"type":285,"ordered":286,"items":373},[374,387,404,409,414],[375,378,379,382,383,386],{"tag":127,"children":376},[377],"Verweigerungen."," Claude liefert ",{"tag":158,"children":380},[381],"stop_reason: \"refusal\""," mit HTTP 200, und die Ausgabe passt womöglich nicht zum Schema. OpenAI setzt ein eigenes Feld ",{"tag":158,"children":384},[385],"refusal"," in die Antwort. Anthropic warnt außerdem, dass eine Eigenschaft, die das schrittweise Denken des Modells abfragt, eine Verweigerung wegen Reasoning-Extraktion auslösen kann; frag stattdessen nach einer kurzen Begründung.",[388,391,392,395,396,399,400,403],{"tag":127,"children":389},[390],"Abbruch."," Erreicht die Antwort ",{"tag":158,"children":393},[394],"max_tokens"," (Claude) oder ",{"tag":158,"children":397},[398],"max_output_tokens"," (OpenAI, Status ",{"tag":158,"children":401},[402],"incomplete","), ist das JSON abgeschnitten. Erhöhe das Limit oder verkleinere die Ausgabe; nie optimistisch parsen.",[405,408],{"tag":127,"children":406},[407],"Enum-Schreibweise."," Siehe oben: ohne Groß-\u002FKleinschreibung vergleichen.",[410,413],{"tag":127,"children":411},[412],"Abgelehntes Schema."," Nicht unterstützte Schlüsselwörter oder zu viel Komplexität liefern ein 400, bevor überhaupt generiert wird. Teste jedes Schema in der CI, nicht erst in Produktion.",[415,418],{"tag":127,"children":416},[417],"Feature-Konflikte."," Bei Claude sind Citations und Structured Outputs inkompatibel (400), ebenso Prefills. Wenn du belegte Antworten und JSON brauchst, mach es in zwei Schritten.",{"type":420,"variant":421,"title":422,"body":423},"callout","warn","Gültiges JSON ist keine richtige Antwort",[424],[425],"Geminis eigene Doku sagt es deutlich: Die Ausgabe ist syntaktisch korrektes JSON, also validiere die Werte immer in deiner Anwendung und behandle schemakonforme, aber inhaltlich falsche Ausgaben. Das Schema garantiert die Form. Ob die Artikelnummer existiert, sagt es nicht.",{"type":135,"level":136,"id":107,"text":108},{"type":123,"content":428},[429,430,434,435,438],"Das ist die umstrittenste Frage, und die Belege zeigen in beide Richtungen. ",{"tag":431,"href":50,"children":432},"a",[433],"\"Let Me Speak Freely?\""," (Tam et al., 2024) berichtete von einem \"deutlichen Rückgang der Reasoning-Fähigkeiten unter Formatvorgaben\", wobei strengere Vorgaben stärker schadeten. ",{"tag":431,"href":53,"children":436},[437],"JSONSchemaBench"," (Geng et al., 2025) wiederholte drei Aufgaben mit korrigiertem Prompt und fand das Gegenteil: Jedes Constrained-Decoding-Framework lag auf oder über der Baseline ohne Constraints; Guidance erreichte bei GSM8K 83,8 % gegenüber 80,1 % für das Modell allein.",{"type":123,"content":440},[441,442,445,446,449,450,455],"Meine Lesart: Prompt- und Schemadesign zählen mehr als der Mechanismus. Schädlich ist, das Modell auf ein Antwortfeld festzulegen, bevor es nachgedacht hat. Zwei Lösungen funktionieren. Bei Reasoning-Modellen findet das Denken in den Thinking-Blöcken statt: Claudes Grammatik gilt dort nicht, das Modell denkt frei, und nur die finale Antwort ist eingeschränkt. Bei anderen Modellen setzt du ein kurzes Feld ",{"tag":158,"children":443},[444],"explanation"," vor das Feld ",{"tag":158,"children":447},[448],"answer"," (OpenAI gibt Schlüssel in Schemareihenfolge aus). Und miss es an deiner eigenen Aufgabe, mit ",{"tag":451,"to":452,"children":453},"link","\u002Fblog\u002Fllm-evals-for-product-features",[454],"einem kleinen Eval-Set",", einmal mit und einmal ohne Schema.",{"type":135,"level":136,"id":110,"text":111},{"type":123,"content":458},[459],"Behandle die Modellausgabe wie Eingaben eines nicht vertrauenswürdigen Clients: parsen, validieren, dann handeln. Das Schema beseitigt eine Fehlerklasse (Syntax und Form), die übrigen Prüfungen werden dadurch einfacher, aber nicht optional. Das setze ich hinter jeden strukturierten Aufruf:",{"type":285,"ordered":461,"items":462},true,[463,468,478,483,488],[464,467],{"tag":127,"children":465},[466],"Stoppgrund-Gate."," Alles außer einem normalen Ende geht in einen Fehlerpfad.",[469,472,473,477],{"tag":127,"children":470},[471],"Referenzprüfungen."," IDs, Artikelnummern, Kundennummern und Daten werden gegen deine Daten nachgeschlagen. Hier zeigen sich die meisten echten Fehler, und hier zählt ",{"tag":451,"to":474,"children":475},"\u002Fblog\u002Fllm-hallucination-grounding-citations",[476],"Grounding"," mehr als das Format.",[479,482],{"tag":127,"children":480},[481],"Plausibilitätsregeln."," Mengen über einem Schwellenwert, Daten in der Vergangenheit, Summen, die nicht aufgehen.",[484,487],{"tag":127,"children":485},[486],"Ein Reparaturversuch, dann ein Mensch."," Gib den Validierungsfehler einmal zurück; scheitert es weiter, kommt der Fall in eine Prüfwarteschlange statt in eine Schleife.",[489,492],{"tag":127,"children":490},[491],"Schemaversion loggen."," Wenn du ein Schema änderst, müssen alte Traces interpretierbar bleiben, und deine Evals sollten gegen die Version in Produktion laufen.",{"type":123,"content":494},[495,496,214,500,504,505,509],"Bibliotheken wie ",{"tag":451,"to":497,"children":498},"\u002Ftools\u002Fpydantic-ai",[499],"Pydantic AI",{"tag":451,"to":501,"children":502},"\u002Ftools\u002Fguardrails-ai",[503],"Guardrails AI"," bündeln Teile dieser Schleife. Für Routing- und Triage-Entscheidungen, bei denen du zusätzlich wissen musst, wie sicher sich das Modell ist, siehe ",{"tag":451,"to":506,"children":507},"\u002Fblog\u002Fjev-typed-decisions-llm-routing",[508],"typisierte Entscheidungen mit kalibrierter Konfidenz",".",{"type":135,"level":136,"id":113,"text":114},{"type":123,"content":512},[513,517,518,520,521,523,524,262,527,530],{"tag":451,"to":514,"children":515},"\u002Ftools\u002Fvllm",[516],"vLLM"," unterstützt Structured Outputs mit xgrammar oder guidance als Backend, über seinen OpenAI-kompatiblen Server (",{"tag":158,"children":519},[241]," mit JSON Schema) oder den Parameter ",{"tag":158,"children":522},[257],", der auch eine Regex, eine feste Auswahlliste oder eine kontextfreie Grammatik akzeptiert. Wenn du von einem älteren vLLM aktualisierst: Die Felder ",{"tag":158,"children":525},[526],"guided_json",{"tag":158,"children":528},[529],"guided_regex"," und verwandte wurden in v0.12.0 entfernt. vLLM kombiniert Structured Outputs außerdem mit Reasoning-Parsern, sodass ein Reasoning-Modell frei denken und trotzdem eingeschränktes JSON liefern kann.",{"type":123,"content":532},[533],"JSONSchemaBench ist hier die nützliche Referenz: Es testete Guidance, Outlines, llama.cpp, XGrammar, OpenAI und Gemini an 10.000 realen Schemas auf Effizienz, Abdeckung und Qualität und fand, dass keine einzelne Engine bei jeder Instanz die beste war. Wenn du selbst hostest, schick deine eigenen Schemas durch das gewählte Backend, bevor du dich festlegst.",{"type":135,"level":136,"id":116,"text":117},{"type":285,"ordered":461,"items":536},[537,539,541,543,545,547,549,551],[538],"Structured Outputs (nicht JSON-Modus) für Antworten, strikte Tools für Tool-Argumente.",[540],"Schemas für die Schnittmenge entwerfen: alle Felder required, null für unbekannt, additionalProperties false, Enums für alles, worauf du verzweigst.",[542],"Jedes Schema in der CI gegen die Grenzen jedes Anbieters prüfen.",[544],"Verweigerung und Abbruch behandeln, bevor du parst.",[546],"Enums ohne Groß-\u002FKleinschreibung vergleichen.",[548],"Referenzen und Plausibilität im Code prüfen; ein Reparaturversuch, dann ein Mensch.",[550],"Schemas versionieren, die Version mit jedem Trace loggen und neue Schemas nach einem Deploy vorwärmen.",[552],"Qualität mit und ohne Schema am eigenen Eval-Set messen.",{"type":123,"content":554},[555,556,560,561,509],"Wenn du das in ein Nuxt-Frontend einbaust, zeigt ",{"tag":451,"to":557,"children":558},"\u002Fblog\u002Fnuxt-llm-features-ai-sdk-streaming",[559],"der Leitfaden zu LLM-Features in Nuxt"," die Streaming-Seite. Für Unterstützung beim Entwurf von Extraktionspipelines siehe ",{"tag":451,"to":562,"children":563},"\u002Fexpertise\u002Fai-engineer",[564],"AI Engineering",{"type":135,"level":136,"id":119,"text":120},{"type":285,"ordered":461,"items":567},[568,571,574,577,580,583],[569],{"tag":431,"href":38,"children":570},[37],[572],{"tag":431,"href":41,"children":573},[40],[575],{"tag":431,"href":44,"children":576},[43],[578],{"tag":431,"href":47,"children":579},[46],[581],{"tag":431,"href":50,"children":582},[49],[584],{"tag":431,"href":53,"children":585},[52],[587,644,698,745],{"slug":588,"published":5,"minutes":6,"category":7,"tags":589,"keywords":595,"about":608,"sources":616,"cover":638,"og":639,"expertise":56,"locales":640,"lang":59,"title":641,"description":642,"coverAlt":643},"evaluating-ai-agents-trajectories",[590,591,592,593,594],"Agent evals","Trajectories","Tool calling","pass^k","LLM-as-judge",[596,597,598,599,600,601,602,603,604,605,606,607],"evaluating AI agents","agent trajectory evaluation","agent evals","tool call accuracy","trajectory match evaluator","pass^k metric","tau-bench","LLM as a judge for agents","agent regression testing","outcome vs trajectory evaluation","agentevals","tool correctness metric",[609,612,615],{"name":610,"url":611},"Intelligent agent","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FIntelligent_agent",{"name":613,"url":614},"Software testing","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSoftware_testing",{"name":33,"url":34},[617,620,623,626,629,632,635],{"title":618,"url":619},"Anthropic: Demystifying evals for AI agents (Jan 2026)","https:\u002F\u002Fwww.anthropic.com\u002Fengineering\u002Fdemystifying-evals-for-ai-agents",{"title":621,"url":622},"Yao et al.: τ-bench: A Benchmark for Tool-Agent-User Interaction in Real-World Domains (2024)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2406.12045",{"title":624,"url":625},"Barres et al.: τ²-Bench: Evaluating Conversational Agents in a Dual-Control Environment (2025)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2506.07982",{"title":627,"url":628},"LangChain: agentevals (GitHub)","https:\u002F\u002Fgithub.com\u002Flangchain-ai\u002Fagentevals",{"title":630,"url":631},"DeepEval docs: Tool Correctness","https:\u002F\u002Fdeepeval.com\u002Fdocs\u002Fmetrics-tool-correctness",{"title":633,"url":634},"Ragas docs: Agentic or tool use metrics","https:\u002F\u002Fdocs.ragas.io\u002Fen\u002Fstable\u002Fconcepts\u002Fmetrics\u002Favailable_metrics\u002Fagents\u002F",{"title":636,"url":637},"OpenAI API docs: Trace grading","https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fguides\u002Ftrace-grading","\u002Fimages\u002Fblog\u002Fevaluating-ai-agents-trajectories\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fevaluating-ai-agents-trajectories\u002Fog.jpg",[58,59,60],"KI-Agenten evaluieren: Trajektorien, Ergebnisse und Zuverlässigkeit bewerten","KI-Agenten evaluieren: Ergebnis- und Trajektorie-Grader, Match-Modi, pass^k, isolierte Umgebungen und LLM-Judges, die belastbar sind.","Eine Agenten-Trajektorie aus Tool-Aufrufen wird zweimal bewertet: ein Trajektorie-Grader prüft Reihenfolge und Argumente, ein Ergebnis-Grader vergleicht die Datenbank mit dem Zielzustand.",{"slug":645,"published":5,"minutes":646,"category":7,"tags":647,"keywords":653,"about":665,"sources":672,"cover":692,"og":693,"expertise":56,"locales":694,"lang":59,"title":695,"description":696,"coverAlt":697},"llm-model-migration-regression-testing",10,[648,649,650,651,652],"Model migration","Regression testing","Deprecations","LLM evals","Canary releases",[654,655,656,657,658,659,660,661,662,663,664],"LLM model migration","LLM regression testing","model deprecation OpenAI","Claude model deprecation","switch LLM model without breaking","LLM model upgrade checklist","prompt regression testing","shadow testing LLM","model retirement date","golden dataset LLM","LLM drift monitoring",[666,668,669],{"name":649,"url":667},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FRegression_testing",{"name":33,"url":34},{"name":670,"url":671},"Feature toggle","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FFeature_toggle",[673,676,679,682,685,688,691],{"title":674,"url":675},"Claude API docs: Model deprecations","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fabout-claude\u002Fmodel-deprecations",{"title":677,"url":678},"OpenAI API docs: Deprecations","https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fdeprecations",{"title":680,"url":681},"Gemini API docs: Models and version name patterns","https:\u002F\u002Fai.google.dev\u002Fgemini-api\u002Fdocs\u002Fmodels",{"title":683,"url":684},"Claude API docs: Claude Opus 5.5 migration guide","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fmodels\u002Fopus-5-5\u002Fmigration-guide",{"title":686,"url":687},"Chen, Zaharia, Zou: How is ChatGPT's behavior changing over time? (2023)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2307.09009",{"title":689,"url":690},"Sclar et al.: Quantifying Language Models' Sensitivity to Spurious Features in Prompt Design (2023)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2310.11324",{"title":618,"url":619},"\u002Fimages\u002Fblog\u002Fllm-model-migration-regression-testing\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fllm-model-migration-regression-testing\u002Fog.jpg",[58,59,60],"LLM-Modellmigration ohne Regressionen: Deprecations, Evals, Shadow-Traffic","Ein Playbook für den Wechsel von LLM-Modellen: Deprecation-Fristen, Vertragsfixes, Regression-Suite, Prompt-Tuning, Shadow-Traffic und Canary.","Fünf Migrationsstufen von Inventar und Vertragsanpassungen über Offline-Evals und Shadow-Traffic bis zu einem Canary-Rollout mit Rückweg.",{"slug":699,"published":5,"minutes":700,"category":7,"tags":701,"keywords":707,"about":718,"sources":726,"cover":739,"og":740,"expertise":56,"locales":741,"lang":59,"title":742,"description":743,"coverAlt":744},"semantic-caching-llm-responses",6,[702,703,704,705,706],"Semantic cache","LLM cost","Latency","Embeddings","Redis",[708,709,710,711,712,713,714,715,716,717],"semantic caching llm","semantic cache","llm response cache","gptcache","semantic cache similarity threshold","prompt caching vs semantic caching","reduce llm api cost","cache llm answers redis","semantic cache false positive","llm cache invalidation",[719,722,725],{"name":720,"url":721},"Cache (computing)","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCache_(computing)",{"name":723,"url":724},"Sentence embedding","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSentence_embedding",{"name":33,"url":34},[727,730,733,736],{"title":728,"url":729},"Regmi and Pun: GPT Semantic Cache: Reducing LLM Costs and Latency via Semantic Embedding Caching (2024)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2411.05276",{"title":731,"url":732},"Zilliz: GPTCache README (modules, similarity evaluation, eviction)","https:\u002F\u002Fgithub.com\u002Fzilliztech\u002FGPTCache",{"title":734,"url":735},"Claude Platform Docs: Prompt caching","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fbuild-with-claude\u002Fprompt-caching",{"title":737,"url":738},"pgvector README: vector types and indexes","https:\u002F\u002Fgithub.com\u002Fpgvector\u002Fpgvector","\u002Fimages\u002Fblog\u002Fsemantic-caching-llm-responses\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fsemantic-caching-llm-responses\u002Fog.jpg",[58,59,60],"Semantisches Caching für LLM-Apps: wann Antworten wiederverwenden sicher ist und wann nicht","Wie semantische Caches LLM-Antworten für ähnliche Fragen wiederverwenden, was sie vom Prompt-Caching trennt, wie man falsche Treffer und Lecks vermeidet.","Eine neue Frage wird eingebettet und mit gecachten Fragen verglichen; über einer Ähnlichkeitsschwelle kommt die gespeicherte Antwort, darunter wird das Modell aufgerufen.",{"slug":746,"published":747,"minutes":646,"category":7,"tags":748,"keywords":753,"about":762,"sources":772,"cover":842,"og":843,"expertise":56,"locales":844,"lang":59,"title":845,"description":846,"coverAlt":847},"self-hosted-llm-gdpr-cost","2026-10-09",[749,750,516,751,752],"Self-hosting","GDPR","GPU cost","Open-weight models",[754,755,756,757,758,759,760,761],"self-hosted LLM GDPR","self-host LLM data protection","LLM GPU memory requirements","vLLM throughput benchmark","EU GPU cloud for LLMs","LLM API vs self-hosting break-even","open-weight LLM hardware cost","data processing agreement LLM",[763,766,767,770],{"name":764,"url":765},"General Data Protection Regulation","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FGeneral_Data_Protection_Regulation",{"name":33,"url":34},{"name":768,"url":769},"Graphics processing unit","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FGraphics_processing_unit",{"name":516,"url":771},"https:\u002F\u002Fgithub.com\u002Fvllm-project\u002Fvllm",[773,776,779,782,785,788,791,794,797,800,803,806,809,812,815,818,821,824,827,830,833,836,839],{"title":774,"url":775},"openai\u002Fgpt-oss-120b model card (Hugging Face)","https:\u002F\u002Fhuggingface.co\u002Fopenai\u002Fgpt-oss-120b",{"title":777,"url":778},"mistralai\u002FMistral-Small-3.2-24B-Instruct-2506 model card (Hugging Face)","https:\u002F\u002Fhuggingface.co\u002Fmistralai\u002FMistral-Small-3.2-24B-Instruct-2506",{"title":780,"url":781},"meta-llama\u002FLlama-3.3-70B-Instruct model card (Hugging Face)","https:\u002F\u002Fhuggingface.co\u002Fmeta-llama\u002FLlama-3.3-70B-Instruct",{"title":783,"url":784},"mistralai\u002FMistral-Large-3-675B-Instruct-2512 model card (Hugging Face)","https:\u002F\u002Fhuggingface.co\u002Fmistralai\u002FMistral-Large-3-675B-Instruct-2512",{"title":786,"url":787},"vLLM blog: v0.6.0 performance update (September 2024)","https:\u002F\u002Fblog.vllm.ai\u002F2024\u002F09\u002F05\u002Fperf-update.html",{"title":789,"url":790},"vLLM documentation: engine arguments","https:\u002F\u002Fdocs.vllm.ai\u002Fen\u002Flatest\u002Fconfiguration\u002Fengine_args.html",{"title":792,"url":793},"vLLM documentation: vllm bench serve","https:\u002F\u002Fdocs.vllm.ai\u002Fen\u002Flatest\u002Fcli\u002Fbench\u002Fserve.html",{"title":795,"url":796},"SemiAnalysis InferenceX: Llama 3.3 70B on H100 vs H200","https:\u002F\u002Finferencex.semianalysis.com\u002Fcompare\u002Fllama-3-3-70b-h100-vs-h200",{"title":798,"url":799},"Scaleway GPU instances pricing","https:\u002F\u002Fwww.scaleway.com\u002Fen\u002Fpricing\u002Fgpu\u002F",{"title":801,"url":802},"Scaleway blog: a transparent update on Scaleway pricing (27 April 2026)","https:\u002F\u002Fwww.scaleway.com\u002Fen\u002Fblog\u002Fa-transparent-update-on-scaleway-pricing\u002F",{"title":804,"url":805},"Scaleway Generative APIs pricing","https:\u002F\u002Fwww.scaleway.com\u002Fen\u002Fpricing\u002Fmodel-as-a-service\u002F",{"title":807,"url":808},"OVHcloud public cloud price list","https:\u002F\u002Fwww.ovhcloud.com\u002Fen\u002Fpublic-cloud\u002Fprices\u002F",{"title":810,"url":811},"OVHcloud AI Endpoints","https:\u002F\u002Fwww.ovhcloud.com\u002Fen\u002Fpublic-cloud\u002Fai-endpoints\u002F",{"title":813,"url":814},"OVHcloud AI Endpoints model catalogue","https:\u002F\u002Fwww.ovhcloud.com\u002Fen\u002Fpublic-cloud\u002Fai-endpoints\u002Fcatalog\u002F",{"title":816,"url":817},"Hetzner dedicated GPU servers","https:\u002F\u002Fwww.hetzner.com\u002Fdedicated-rootserver\u002Fmatrix-gpu\u002F",{"title":819,"url":820},"NVIDIA newsroom: GeForce RTX 50 Series launch","https:\u002F\u002Fnvidianews.nvidia.com\u002Fnews\u002Fnvidia-blackwell-geforce-rtx-50-series-opens-new-world-of-ai-computer-graphics",{"title":822,"url":823},"NVIDIA GeForce RTX 5090","https:\u002F\u002Fwww.nvidia.com\u002Fen-us\u002Fgeforce\u002Fgraphics-cards\u002F50-series\u002Frtx-5090\u002F",{"title":825,"url":826},"NVIDIA GeForce software licence","https:\u002F\u002Fwww.nvidia.com\u002Fen-us\u002Fdrivers\u002Fgeforce-license\u002F",{"title":828,"url":829},"GDPR Article 28: processor","https:\u002F\u002Fgdpr-info.eu\u002Fart-28-gdpr\u002F",{"title":831,"url":832},"GDPR Article 44: general principle for transfers","https:\u002F\u002Fgdpr-info.eu\u002Fart-44-gdpr\u002F",{"title":834,"url":835},"European Commission: EU-US data transfers (Data Privacy Framework)","https:\u002F\u002Fcommission.europa.eu\u002Flaw\u002Flaw-topic\u002Fdata-protection\u002Finternational-dimension-data-protection\u002Feu-us-data-transfers_en",{"title":837,"url":838},"EDPB Opinion 28\u002F2024 on AI models (adopted 17 December 2024)","https:\u002F\u002Fwww.edpb.europa.eu\u002Fsystem\u002Ffiles\u002F2024-12\u002Fedpb_opinion_202428_ai-models_en.pdf",{"title":840,"url":841},"Mistral AI pricing","https:\u002F\u002Fmistral.ai\u002Fpricing","\u002Fimages\u002Fblog\u002Fself-hosted-llm-gdpr-cost\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fself-hosted-llm-gdpr-cost\u002Fog.jpg",[58,59,60],"LLMs selbst hosten für die DSGVO: wann es nötig ist und was es kostet","LLMs selbst hosten für die DSGVO: wann es nötig ist, GPU-Speicher für offene Modelle, EU-Preise Stand Oktober 2026 und Break-even pro Million Token.","Coverbild zu selbst gehosteten LLMs unter der DSGVO: die Wahl zwischen eigenen GPUs und einer EU-API, mit einer Break-even-Linie.",1792177149273]