Zum Hauptinhalt springen
Das JSON, das ein Modell im Szenario Strukturierte Ausgabe zurückgibt, lässt sich mitunter nicht parsen: Die Ausgabe wird durch max_tokens abgeschnitten, enthält ein nachgestelltes Komma oder ist in einen Markdown-Codeblock eingebettet. Auf Anwendungsseite müssen dafür in der Regel Wiederholungs- oder manuelle Reparaturlogiken geschrieben werden. Die Reparatur strukturierter Ausgaben (Structured Output Repair) ist eine Fähigkeit auf Key-Ebene und standardmäßig deaktiviert. Ist sie aktiviert, repariert das AIHubMix-Gateway bei nicht-streamenden Anfragen, die eine strukturierte JSON-Ausgabe deklarieren, ein vom Modell zurückgegebenes JSON mit Formatfehlern vor der Rückgabe automatisch zu parsbarem, gültigem JSON; der Client-Code muss dafür nicht geändert werden.
Dieser Schalter ist standardmäßig deaktiviert; solange er nicht aktiviert ist, werden alle Antworten unverändert zurückgegeben. Der Schalter wird pro Key einzeln konfiguriert und wird nach dem Aktivieren sofort wirksam.

Zur Key-Verwaltungsseite wechseln und konfigurieren

Erstellen oder bearbeiten Sie einen Key und aktivieren Sie den Schalter „Reparatur strukturierter Ausgaben” (Structured Output Repair).
Aktivieren des Schalters für die Reparatur strukturierter Ausgaben im AIHubMix-Panel zum Bearbeiten eines Keys

1. Voraussetzungen für die Wirksamkeit

Die Reparatur erfolgt nur, wenn alle folgenden Bedingungen erfüllt sind:
  1. Für den in der Anfrage verwendeten Key ist „Reparatur strukturierter Ausgaben” aktiviert.
  2. Die Anfrage ist nicht-streamend (stream: true ist nicht gesetzt).
  3. Die Anfrage deklariert eine strukturierte JSON-Ausgabe (die Deklarationsfelder der einzelnen Protokolle siehe folgende Tabelle).
  4. Der vom Modell zurückgegebene Textinhalt lässt sich nicht als JSON parsen.
ProtokollEndpunktDeklarationsfeld für strukturierte Ausgabe
Chat Completions/v1/chat/completionsresponse_format.type ist json_object oder json_schema
Responses/v1/responsestext.format.type ist json_schema oder json_object
Claude Messages/v1/messagesoutput_config.format.type ist json_schema
Gemini/gemini/v1beta/models/{model}:generateContentgenerationConfig.responseMimeType ist application/json, oder responseSchema ist gesetzt
Ist der Inhalt selbst bereits gültiges JSON, wird keinerlei Änderung vorgenommen und er wird unverändert zurückgegeben.

2. Reparierbare Formatfehler

Nicht geschlossene Klammern / Anführungszeichen durch abgeschnittene Ausgabe (z. B. finish_reason ist length):
Vorher
{"items": [{"name": "Widget", "price": 9.99}, {"name": "Gad
Nachher
{"items": [{"name": "Widget", "price": 9.99}, {"name": "Gad"}]}
Umschließung durch Markdown-Codeblock:
Vorher
```json
{"status": "ok", "count": 3}
```
Nachher
{"status": "ok", "count": 3}
Nachgestelltes Komma:
Vorher
{"a": 1, "b": 2,}
Nachher
{"a": 1, "b": 2}
Einfache Anführungszeichen:
Vorher
{'name': 'Widget'}
Nachher
{"name": "Widget"}
Schlüsselnamen ohne Anführungszeichen:
Vorher
{name: "Widget", price: 9.99}
Nachher
{"name": "Widget", "price": 9.99}
Vermischung von Text und JSON (erläuternder Text vor oder nach dem JSON):
Vorher
Here is the JSON you requested: {"name": "Widget", "price": 9.99}
Nachher
{"name": "Widget", "price": 9.99}
Die Reparatur folgt einer konservativen Strategie:
  • Die Reparatur vervollständigt oder normalisiert ausschließlich die JSON-Syntax; Zahlenwerte und Zeichenketteninhalte bleiben im Originaltext erhalten, es kommt zu keinem Präzisionsverlust und keiner Umschreibung.
  • Das Reparaturergebnis muss ein gültiges JSON-Objekt oder -Array sein und darf sich nur in einem angemessenen Rahmen vom Original unterscheiden; ist eine dieser Bedingungen nicht erfüllt, wird die Reparatur verworfen und der Originalinhalt unverändert zurückgegeben.

3. Wie erkennen Sie, dass eine Antwort repariert wurde

Bei einer Reparatur gibt es zwei programmatisch abrufbare bzw. einsehbare Signale:
  1. Response-Header X-JSON-Repaired: true (dieser Response-Header fehlt, wenn keine Reparatur stattgefunden hat).
  2. Notiz im Aufrufprotokoll: Auf der Seite mit den Aufrufprotokollen zeigt die Notizspalte der entsprechenden Anfrage This request gateway automatically corrected the JSON format issue in the model output. an.
Token-Verbrauch und Abrechnung werden nach der ursprünglichen Modellausgabe berechnet; die Reparatur verändert das Abrechnungsergebnis nicht.

4. Vollständiges Beispiel

Am Beispiel der Generierung von Produktinformationen: Die Anfrage deklariert die strukturierte Ausgabe über json_schema; ist der Schalter aktiviert, lässt sich der erhaltene content auch dann direkt parsen, wenn die Modellausgabe die oben genannten Formatfehler aufweist:
import json
import os
import requests

response = requests.post(
    "https://aihubmix.com/v1/chat/completions",
    headers={
        "Authorization": f"Bearer {os.environ['AIHUBMIX_API_KEY']}",
        "Content-Type": "application/json",
    },
    json={
        "model": "gpt-5.2",
        "messages": [
            {"role": "user", "content": "Generate a product listing for a wireless keyboard."}
        ],
        "response_format": {
            "type": "json_schema",
            "json_schema": {
                "name": "product",
                "schema": {
                    "type": "object",
                    "properties": {
                        "name": {"type": "string"},
                        "price": {"type": "number"},
                        "description": {"type": "string"},
                    },
                    "required": ["name", "price"],
                    "additionalProperties": False,
                },
            },
        },
    },
)

repaired = response.headers.get("X-JSON-Repaired") == "true"
product = json.loads(response.json()["choices"][0]["message"]["content"])
print(product, "repaired:", repaired)
const response = await fetch("https://aihubmix.com/v1/chat/completions", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.AIHUBMIX_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    model: "gpt-5.2",
    messages: [
      { role: "user", content: "Generate a product listing for a wireless keyboard." },
    ],
    response_format: {
      type: "json_schema",
      json_schema: {
        name: "product",
        schema: {
          type: "object",
          properties: {
            name: { type: "string" },
            price: { type: "number" },
            description: { type: "string" },
          },
          required: ["name", "price"],
          additionalProperties: false,
        },
      },
    },
  }),
});

const repaired = response.headers.get("X-JSON-Repaired") === "true";
const data = await response.json();
const product = JSON.parse(data.choices[0].message.content);
console.log(product, "repaired:", repaired);
curl -sD - https://aihubmix.com/v1/chat/completions \
  -H "Authorization: Bearer $AIHUBMIX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-5.2",
    "messages": [
      {"role": "user", "content": "Generate a product listing for a wireless keyboard."}
    ],
    "response_format": {
      "type": "json_schema",
      "json_schema": {
        "name": "product",
        "schema": {
          "type": "object",
          "properties": {
            "name": {"type": "string"},
            "price": {"type": "number"},
            "description": {"type": "string"}
          },
          "required": ["name", "price"],
          "additionalProperties": false
        }
      }
    }
  }'
Wollen Sie eine Reparatur gezielt beobachten, können Sie max_tokens auf einen kleinen Wert (z. B. 80) setzen, sodass die Ausgabe abgeschnitten wird: Das finish_reason der Antwort ist dann length, der content ist das reparierte, gültige JSON, und der Response-Header enthält X-JSON-Repaired: true.

5. Grenzen und Hinweise

Streamende Anfragen (stream: true) werden nicht repariert, sondern unverändert weitergeleitet. Verwenden Sie eine nicht-streamende Anfrage, wenn Sie die Reparaturfähigkeit benötigen.
Die Reparatur garantiert, dass sich der Inhalt als JSON parsen lässt; durch Abschneiden fehlende Daten können nicht wiederhergestellt werden. Es wird empfohlen, zugleich finish_reason / stop_reason zu prüfen und bei abgeschnittener Ausgabe max_tokens nach Bedarf zu erhöhen und die Anfrage erneut zu stellen.
  • Syntaxreparatur: Ob Feldnamen und Feldtypen Ihrem Schema entsprechen, muss weiterhin auf Anwendungsseite validiert werden.
  • Parameter von Tool-Calls fallen nicht in den Reparaturbereich: Das Parameter-JSON von tool_calls / function_call wird nicht repariert; Tool-Parameter sollten vor der Ausführung stets auf Anwendungsseite validiert werden.
  • Ausgaben mit mehreren Textblöcken werden nicht repariert: Enthält die Modellausgabe mehrere Textblöcke (z. B. wenn Gemini mehrere parts zurückgibt), wird sie unverändert zurückgegeben.
  • Reasoning-Inhalte bleiben unberührt: Reasoning-Texte wie reasoning_content oder der Thought-Teil von Gemini nehmen nicht an der Reparatur teil.

FAQ

Verändert die Reparatur die Zahlenwerte oder Texte im zurückgegebenen Inhalt? Nein. Die Reparatur vervollständigt oder normalisiert ausschließlich die JSON-Syntax (Ergänzen schließender Klammern, Entfernen nachgestellter Kommas, Normalisieren von Anführungszeichen, Entfernen von Codeblock-Markierungen); Zahlenwerte und Zeichenketteninhalte bleiben im Originaltext der Modellausgabe erhalten. Wirkt sich das Aktivieren des Schalters auf normale Anfragen aus, die keine strukturierte Ausgabe deklarieren? Nein. Anfragen, die keine Felder für strukturierte Ausgabe wie response_format deklarieren, sowie alle streamenden Anfragen werden unverändert zurückgegeben. Verursacht die Reparatur zusätzliche Kosten oder verändert sie den Token-Verbrauch? Nein. Token-Verbrauch und Abrechnung werden nach der ursprünglichen Modellausgabe berechnet; der Reparaturvorgang verursacht keine zusätzlichen Kosten. Entspricht das reparierte JSON garantiert dem von mir definierten Schema? Die Reparatur garantiert, dass sich der Inhalt als JSON parsen lässt; ob Feldnamen und Feldtypen dem Schema entsprechen, hängt von der Modellausgabe selbst ab. Es wird empfohlen, die Schema-Validierung auf Anwendungsseite weiterhin beizubehalten.