Guías principales

Streaming

Implementa respuestas de streaming en tiempo real

Descripción general

El streaming entrega la salida de forma incremental. Usa Responses si el modelo incluye openai_responses en accepted_request_formats; los clientes existentes de Chat Completions pueden mantener su formato.

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

Límites de streaming de Responses y Gemini

Responses SSE conserva nombres, orden y campos públicos de los eventos. Una interrupción tras recibir salida deja una respuesta incompleta y no la reinicia automáticamente.

Responses WebSocket usa response.create y siempre transmite en streaming; no admite background ni response.cancel. Cada conexión procesa una respuesta a la vez y dura hasta 60 minutos. generate: false crea un ID para continuar sin generar salida ni cargo del modelo.

Gemini SSE devuelve chunks nativos. Los eventos intermedios pueden omitir finishReason y el flujo puede terminar sin el marcador Chat [DONE].

Streaming de Chat Completions

Si tu framework aún espera fragmentos SSE de /v1/chat/completions, eso también funciona:

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

Condiciones de finalización del stream

Condiciones típicas de finalización:

  • response.completed para streams de Responses API
  • finish_reason: "stop" para streams de Chat Completions
  • finish_reason: "length" cuando se alcanza un límite de token
  • eventos de llamada a tool/function cuando el modelo quiere usar herramientas

Patrón para aplicaciones web

Procesa el flujo del SDK en tu servidor. El navegador debe llamar a tu propio backend autenticado; guarda la clave TokenLab en el entorno del servidor. Reenvía los fragmentos de texto y cancela el flujo cuando el usuario lo detenga o se desconecte. Deja que el SDK interprete SSE: un bloque de red no siempre contiene un evento completo.

Mejores prácticas

En esta página