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.completedfür Responses API-Streamsfinish_reason: "stop"für Chat Completions-Streamsfinish_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.