Zum Inhalt springen
DeutschlandGPT

Streaming, Tools und strukturierte Ausgabe

Die drei Dinge, die der Chat-Endpunkt über das Zurückgeben eines Textblocks hinaus kann — mit Anfrage- und Antwortform für jedes

Die Referenz zu Chat-Vervollständigungen führt stream, tools und response_format als unterstützte Felder auf. Diese Seite zeigt, wie jedes davon tatsächlich über die Leitung geht.

Alles Folgende ist OpenAI-kompatibel: Ein vorhandenes SDK funktioniert unverändert, sobald es auf die Base URL zeigt.

Streaming

Mit stream: true kommt die Antwort als Server-Sent Events statt als ein JSON-Body. Jede data:-Zeile enthält ein JSON-Delta; der Stream endet mit einem wörtlichen data: [DONE].

PYTHON
import os, requests, json

response = requests.post(
    "https://api.deutschlandgpt.de/v2/chat/completions",
    headers={"Authorization": f"Bearer {os.environ['DGPT_API_KEY']}"},
    json={
        "model": "gpt-4o",
        "messages": [{"role": "user", "content": "Zähle bis fünf."}],
        "stream": True,
        "stream_options": {"include_usage": True},
    },
    stream=True,
)

for line in response.iter_lines():
    if not line or not line.startswith(b"data: "):
        continue
    payload = line[len(b"data: "):]
    if payload == b"[DONE]":
        break
    delta = json.loads(payload)["choices"][0]["delta"]
    print(delta.get("content", ""), end="", flush=True)

stream_options.include_usage hängt vor [DONE] einen letzten Chunk mit den Token-Zahlen an. Ohne dieses Feld meldet eine gestreamte Antwort ihren eigenen Verbrauch nie — der übliche Grund, weshalb eine Streaming-Integration ihre Kosten nicht zuordnen kann.

Streaming und json_schema schließen sich gegenseitig aus. Eine Anfrage, die beides verlangt, wird abgelehnt — entweder strukturierte Ausgabe oder inkrementelle Tokens.

Tools (Function Calling)

Beschreiben Sie in tools die Funktionen, die das Modell aufrufen darf. Jede ist ein JSON-Schema; das Modell führt nichts aus, es bittet Sie nur darum.

JSON
{
  "model": "gpt-4o",
  "messages": [{ "role": "user", "content": "Wie ist das Wetter in Berlin?" }],
  "tools": [
    {
      "type": "function",
      "function": {
        "name": "get_weather",
        "description": "Aktuelles Wetter einer Stadt — daran entscheidet das Modell, wann es aufruft",
        "parameters": {
          "type": "object",
          "properties": { "city": { "type": "string" } },
          "required": ["city"]
        }
      }
    }
  ]
}

Ein Funktions-name ist höchstens 64 Zeichen lang und besteht aus a-z, A-Z, 0-9, Unterstrichen und Bindestrichen.

Will das Modell einen Aufruf, enthält die Antwort tool_calls statt content. Sie führen die Funktion selbst aus und senden das Ergebnis als tool-Nachricht zurück, dann rufen Sie den Endpunkt mit der erweiterten Historie erneut auf:

JSON
{
  "model": "gpt-4o",
  "messages": [
    { "role": "user", "content": "Wie ist das Wetter in Berlin?" },
    {
      "role": "assistant",
      "tool_calls": [
        {
          "id": "call_abc123",
          "type": "function",
          "function": { "name": "get_weather", "arguments": "{\"city\":\"Berlin\"}" }
        }
      ]
    },
    { "role": "tool", "tool_call_id": "call_abc123", "content": "18 °C, leichter Regen" }
  ]
}

arguments ist ein JSON-String, kein Objekt — parsen Sie ihn vor der Verwendung. Die tool_call_id Ihrer Antwort muss der id des beantworteten Aufrufs entsprechen.

Standardmäßig darf das Modell mehrere Aufrufe pro Zug anfordern. Mit parallel_tool_calls: false erzwingen Sie einen nach dem anderen.

tool_choice — das Erzwingen einer bestimmten Funktion — wird auf diesem Endpunkt zwar akzeptiert, aber ignoriert. Wenn Sie es brauchen, nutzen Sie /v2/responses.

Strukturierte Ausgabe

Für JSON nach einem Schema statt Fließtext übergeben Sie ein response_format vom Typ json_schema:

JSON
{
  "model": "gpt-4o",
  "messages": [{ "role": "user", "content": "Extrahiere Rechnungssumme und Währung." }],
  "response_format": {
    "type": "json_schema",
    "json_schema": {
      "name": "invoice",
      "strict": true,
      "schema": {
        "type": "object",
        "properties": {
          "total": { "type": "number" },
          "currency": { "type": "string" }
        },
        "required": ["total", "currency"],
        "additionalProperties": false
      }
    }
  }
}

Die Antwort steht weiterhin in choices[0].message.content, als JSON-String, den Sie selbst parsen.

strict: true sorgt dafür, dass sich das Modell an das Schema hält, statt es als Vorschlag zu behandeln. Es setzt additionalProperties: false voraus und dass jede Eigenschaft in required steht.

Reasoning-Modelle

reasoning_effort legt fest, wie viel ein Reasoning-Modell vor der Antwort nachdenkt: none (Standard, erweitertes Denken aus), minimal, low, medium, high oder xhigh. Niedriger ist schneller und günstiger. Auf Modelle ohne Reasoning hat es keine Wirkung.

Was Ihren Durchsatz begrenzt

Es gibt kein Limit für Anfragen pro Minute und keinen 429. Was eine Anfrage tatsächlich stoppt, sind Guthaben und Berechtigungen:

GrenzeWas passiert
Workspace-Guthaben402, sobald Guthaben oder monatliches Ausgabenlimit erreicht sind
Ausgabenlimit pro Schlüssel402 für diesen Schlüssel, während andere Schlüssel weiterarbeiten
Modellbeschränkungen pro Schlüssel403 für ein Modell, das der Schlüssel nicht nutzen darf

Siehe API-Schlüssel für Limits pro Schlüssel und Abrechnung für Guthaben.

War diese Seite hilfreich?