> ## Documentation Index
> Fetch the complete documentation index at: https://docs.aihubmix.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Reparatur strukturierter Ausgaben

> Reparatur strukturierter Ausgaben pro API Key: Gateway repariert fehlerhaftes JSON automatisch zu gültigem JSON. Chat Completions, Responses, Claude, Gemini.

Das JSON, das ein Modell im Szenario [Strukturierte Ausgabe](/de/api/Structured-Output) 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.

<Note>
  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.
</Note>

<Card title="Zur Key-Verwaltungsseite wechseln und konfigurieren" icon="key" href="https://console.aihubmix.com/token" horizontal>
  Erstellen oder bearbeiten Sie einen Key und aktivieren Sie den Schalter „Reparatur strukturierter Ausgaben" (Structured Output Repair).
</Card>

<Frame>
  <img src="https://mintcdn.com/aihubmix/qSKYuy2NVPUOModZ/images/api/structured-output-repair/create-key-json-repair.png?fit=max&auto=format&n=qSKYuy2NVPUOModZ&q=85&s=119802fb4114c18581c6e47c1543620a" alt="Aktivieren des Schalters für die Reparatur strukturierter Ausgaben im AIHubMix-Panel zum Bearbeiten eines Keys" width="2886" height="1974" data-path="images/api/structured-output-repair/create-key-json-repair.png" />
</Frame>

***

## 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.

| Protokoll        | Endpunkt                                        | Deklarationsfeld für strukturierte Ausgabe                                                    |
| ---------------- | ----------------------------------------------- | --------------------------------------------------------------------------------------------- |
| Chat Completions | `/v1/chat/completions`                          | `response_format.type` ist `json_object` oder `json_schema`                                   |
| Responses        | `/v1/responses`                                 | `text.format.type` ist `json_schema` oder `json_object`                                       |
| Claude Messages  | `/v1/messages`                                  | `output_config.format.type` ist `json_schema`                                                 |
| Gemini           | `/gemini/v1beta/models/{model}:generateContent` | `generationConfig.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`):

```text Vorher theme={null}
{"items": [{"name": "Widget", "price": 9.99}, {"name": "Gad
```

```json Nachher theme={null}
{"items": [{"name": "Widget", "price": 9.99}, {"name": "Gad"}]}
```

**Umschließung durch Markdown-Codeblock**:

````text Vorher theme={null}
```json
{"status": "ok", "count": 3}
```
````

```json Nachher theme={null}
{"status": "ok", "count": 3}
```

**Nachgestelltes Komma**:

```text Vorher theme={null}
{"a": 1, "b": 2,}
```

```json Nachher theme={null}
{"a": 1, "b": 2}
```

**Einfache Anführungszeichen**:

```text Vorher theme={null}
{'name': 'Widget'}
```

```json Nachher theme={null}
{"name": "Widget"}
```

**Schlüsselnamen ohne Anführungszeichen**:

```text Vorher theme={null}
{name: "Widget", price: 9.99}
```

```json Nachher theme={null}
{"name": "Widget", "price": 9.99}
```

**Vermischung von Text und JSON** (erläuternder Text vor oder nach dem JSON):

```text Vorher theme={null}
Here is the JSON you requested: {"name": "Widget", "price": 9.99}
```

```json Nachher theme={null}
{"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](https://console.aihubmix.com/logs) 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:

<CodeGroup>
  ```python Python theme={null}
  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)
  ```

  ```typescript TypeScript theme={null}
  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);
  ```

  ```shell curl theme={null}
  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
          }
        }
      }
    }'
  ```
</CodeGroup>

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

<Warning>
  Streamende Anfragen (`stream: true`) werden nicht repariert, sondern unverändert weitergeleitet. Verwenden Sie eine nicht-streamende Anfrage, wenn Sie die Reparaturfähigkeit benötigen.
</Warning>

<Warning>
  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.
</Warning>

* **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.
