Ir al contenido
Toda la documentación

Guías

Streaming

Pon stream: true y la respuesta llega palabra por palabra, como server-sent events de OpenAI. Pide el usage y el último fragmento dice cuánto costó la llamada.

Revisado el 26 de octubre de 2026

Recibe una respuesta en streaming

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://nokeep.ai/v1",
    api_key=os.environ["NOKEEP_API_KEY"],
)

stream = client.chat.completions.create(
    model="deepseek-v4.1-flash-uncensored",
    messages=[{"role": "user", "content": "Tell me a story in three lines."}],
    stream=True,
    stream_options={"include_usage": True},
)
for chunk in stream:
    if chunk.choices:
        print(chunk.choices[0].delta.content or "", end="", flush=True)
    if chunk.usage:
        print("\ncredits:", chunk.usage.model_extra.get("nokeep_credits"))

Qué llega

The stream
data: {"choices":[{"index":0,"delta":{"role":"assistant","content":""}}]}
data: {"choices":[{"index":0,"delta":{"content":"The"}}]}
data: {"choices":[{"index":0,"delta":{"content":" lighthouse"}}]}
…
data: {"choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}
data: {"choices":[],"usage":{"prompt_tokens":18,"completion_tokens":61,"nokeep_credits":0}}
data: [DONE]
  • Las palabras llegan en delta.content. Con razonamiento activo, el razonamiento llega primero, en delta.reasoning_content.
  • Las llamadas a herramientas llegan en delta.tool_calls, sus argumentos en trozos, como las envía OpenAI.
  • Con stream_options.include_usage, un último fragmento con una lista choices vacía trae usage, incluido nokeep_credits, lo que costó la llamada.
  • El stream termina con data: [DONE].

Detén una respuesta antes

Cierra la conexión y el modelo deja de escribir. Pagas por lo enviado antes de detenerte, y nada después. En los SDK, sal del bucle y cierra el stream; en una app, pulsa su botón de Detener.

Python
for chunk in stream:
    text = chunk.choices[0].delta.content if chunk.choices else ""
    if text and "THE END" in text:
        stream.close()  # the model stops here, and so does the bill
        break

Cuando el modelo se detiene primero

Si el modelo termina un stream antes de acabar, el último evento antes de [DONE] es un error con la forma de OpenAI, con el código stream_cut. Lo que escribió se cobra, nada más. Reintenta o continúa desde lo que llegó.

A cut stream
data: {"error":{"type":"api_error","code":"stream_cut","message":"The model stopped before it finished. What it wrote is billed, nothing more."}}
data: [DONE]

Preguntas

¿El streaming cuesta más?

No. Una respuesta en streaming cuesta los mismos tokens que una completa.

¿Por qué no hay un encabezado x-nokeep-credits en un stream?

Los encabezados se envían antes de la primera palabra, cuando aún no se conoce el costo. Pide el usage y lee nokeep_credits en el último fragmento.