Streaming
Configura stream: true y la respuesta llega como server-sent events mientras el modelo la escribe, en lugar de llegar completa al final. Todos los endpoints de texto transmiten en streaming, en el formato de eventos que espera su SDK. Las solicitudes con streaming se contabilizan, se facturan y se registran como cualquier otra.
Chat Completions
const stream = await client.chat.completions.create({
model: "gpt-5.5",
messages: [{ role: "user", content: "Write a haiku about latency." }],
stream: true,
stream_options: { include_usage: true },
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}
stream = client.chat.completions.create(
model="gpt-5.5",
messages=[{"role": "user", "content": "Write a haiku about latency."}],
stream=True,
stream_options={"include_usage": True},
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="")
En la conexión, cada evento es una línea data: que contiene un chat.completion.chunk, y el stream termina con data: [DONE]:
curl -N https://api.inferray.com/v1/chat/completions \
-H "Authorization: Bearer $INFERRAY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "gpt-5.5", "stream": true, "messages": [{"role": "user", "content": "Count to five."}]}'
data: {"id":"chatcmpl-...","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":"One"}}]}
data: {"id":"chatcmpl-...","object":"chat.completion.chunk","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}
data: [DONE]
El último fragmento antes de [DONE] contiene usage (incluido el cost cobrado) y un array choices vacío. Las llamadas a herramientas llegan en streaming como fragmentos delta.tool_calls; une las cadenas arguments según su índice antes de analizarlas.
Responses
Responses API transmite eventos tipados. El texto llega en response.output_text.delta, y response.completed cierra el stream con la respuesta completa y su uso, incluido cost:
const stream = await client.responses.create({
model: "gpt-5.5",
input: "Write a haiku about latency.",
stream: true,
});
for await (const event of stream) {
if (event.type === "response.output_text.delta") process.stdout.write(event.delta);
}
Messages
El endpoint Messages transmite los eventos de Anthropic: message_start, luego content_block_start, content_block_delta y content_block_stop para cada bloque, message_delta con el motivo de detención y el uso de salida, y message_stop.
const stream = client.messages.stream({
model: "claude-opus-4-8",
max_tokens: 1024,
messages: [{ role: "user", content: "Write a haiku about latency." }],
});
stream.on("text", (text) => process.stdout.write(text));
await stream.finalMessage();
Errores durante un stream
Un error antes del primer token devuelve un error HTTP normal con un cuerpo JSON. Una vez que el stream ha comenzado, el estado ya es 200, así que el error llega como un evento dentro del stream: un objeto error en un chunk, o un evento error de Anthropic. Maneja ambos casos y considera incompleto cualquier stream que termine sin su evento final ([DONE], response.completed, message_stop).
Qué no admite streaming
Los embeddings, las imágenes, la voz, la transcripción y los demás endpoints que no son de texto devuelven una sola respuesta. Video es, en cambio, un job asíncrono que consultas periódicamente.