TokenLab

Guides essentiels

Streaming

Implémenter des réponses en streaming en temps réel

Vue d’ensemble

Le streaming renvoie la sortie progressivement. Utilisez Responses si le modèle déclare openai_responses dans accepted_request_formats ; les clients Chat Completions existants peuvent conserver leur format.

Recommandé : streaming Responses

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
  }'

Limites de streaming Responses et Gemini

Responses SSE conserve les noms, l’ordre et les champs publics des événements. Une coupure après réception de contenu laisse une réponse incomplète, sans redémarrage automatique.

Responses WebSocket utilise response.create et diffuse toujours en streaming ; background et response.cancel ne sont pas pris en charge. Une connexion traite une réponse à la fois et dure jusqu’à 60 minutes. generate: false crée un ID de continuation sans sortie ni coût de modèle.

Gemini SSE renvoie des chunks natifs. Les événements intermédiaires peuvent omettre finishReason et le flux peut se terminer sans le marqueur Chat [DONE].

Streaming Chat Completions

Si votre framework attend encore des chunks SSE provenant de /v1/chat/completions, cela fonctionne également :

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}")

Conditions de fin du stream

Conditions de fin typiques :

  • response.completed pour les streams de l’API Responses
  • finish_reason: "stop" pour les streams Chat Completions
  • finish_reason: "length" lorsqu’une limite de token est atteinte
  • événements d’appel d’outil/de fonction lorsque le modèle souhaite utiliser des outils

Modèle pour application web

Traitez le flux du SDK sur votre serveur. Le navigateur appelle votre propre backend authentifié ; la clé TokenLab reste dans son environnement. Transmettez les fragments de texte et annulez le flux amont si l’utilisateur arrête ou se déconnecte. Confiez le décodage SSE au SDK : un bloc réseau ne correspond pas forcément à un événement complet.

Bonnes pratiques

Sur cette page