Kernleitfäden

Streaming

Echtzeit-Streaming-Antworten implementieren

Überblick

Streaming liefert Ausgaben schrittweise. Verwenden Sie Responses, wenn das Modell openai_responses in accepted_request_formats angibt. Bestehende Chat-Completions-Clients können ihr Format beibehalten.

Empfohlen: Responses Streaming

curl https://api.tokenlab.sh/v1/responses \
  -H "Authorization: Bearer sk-your-api-key" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-5.6-terra",
    "input": "Write a short poem.",
    "stream": true
  }'

Streaming-Grenzen für Responses und Gemini

Responses SSE erhält die öffentlichen Ereignisnamen, ihre Reihenfolge und Felder. Ein Abbruch nach Beginn der Ausgabe ergibt eine unvollständige Antwort, die nicht automatisch neu gestartet wird.

Responses WebSocket verwendet response.create und streamt immer; background und response.cancel werden nicht unterstützt. Pro Verbindung läuft eine Antwort gleichzeitig, bis zu 60 Minuten. generate: false erzeugt eine ID zur Fortsetzung ohne Modellausgabe oder Modellkosten.

Gemini SSE liefert native Chunks. Zwischenereignisse dürfen finishReason auslassen; der Stream kann ohne Chat-Marker [DONE] natürlich enden.

Chat Completions-Streaming

Falls Ihr Framework weiterhin SSE-Chunks von /v1/chat/completions erwartet, funktioniert auch das:

import os
from openai import OpenAI

with OpenAI(
    api_key=os.environ["TOKENLAB_API_KEY"],
    base_url="https://api.tokenlab.sh/v1",
    timeout=30.0,
    max_retries=0,
) as client:
    finish_reason = None
    with client.chat.completions.create(
        model="gpt-5.6-terra",
        messages=[{"role": "user", "content": "Write a short poem."}],
        stream=True,
        stream_options={"include_usage": True},
    ) as stream:
        for chunk in stream:
            if not chunk.choices:
                continue
            choice = chunk.choices[0]
            if choice.delta.content:
                print(choice.delta.content, end="", flush=True)
            if choice.finish_reason:
                finish_reason = choice.finish_reason
    if finish_reason != "stop":
        raise RuntimeError(f"Stream ended without a complete text answer: {finish_reason}")

Bedingungen für das Stream-Ende

Typische Abschlussbedingungen:

  • response.completed für Responses API-Streams
  • finish_reason: "stop" für Chat Completions-Streams
  • finish_reason: "length" wenn ein token-Limit erreicht wird
  • Tool-/Function-Call-Ereignisse, wenn das Modell Tools verwenden möchte

Web-App-Muster

Verarbeiten Sie den SDK-Stream auf Ihrem Server. Der Browser ruft Ihr eigenes authentifiziertes Backend auf; der TokenLab-Schlüssel bleibt in der Serverumgebung. Leiten Sie Textänderungen weiter und brechen Sie den vorgelagerten Stream bei Abbruch oder Verbindungsende ab. Lassen Sie das SDK SSE-Ereignisse parsen: Ein Netzwerkblock ist nicht zwingend ein vollständiges Ereignis.

Bewährte Praktiken

Auf dieser Seite