Streaming

Cómo llega una completion transmitida por el cable, qué lleva el último frame, y qué sucede cuando un cliente se desconecta.

El transporte

Establezca stream: true y la respuesta es text/event-stream: un objeto JSON por línea data:, cada uno seguido de una línea vacía. El búfer está deshabilitado para que un proxy no retenga frames.

HTTP/1.1 200 OK
content-type: text/event-stream; charset=utf-8
cache-control: no-cache, no-transform
connection: keep-alive

Los frames

El primer frame lleva el rol de assistant, luego un frame por delta, luego un frame con finish_reason y el bloque de enrutamiento, luego exactamente un terminador. Un cliente que sigue el formato lee el terminador y se detiene; no debe tratar un terminador ausente como una respuesta completa.

data: {"id":"chatcmpl-…","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"role":"assistant"},"finish_reason":null}]}

data: {"id":"chatcmpl-…","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":"Hallo"},"finish_reason":null}]}

data: {"id":"chatcmpl-…","object":"chat.completion.chunk","choices":[{"index":0,"delta":{},"finish_reason":"stop"}],"llmeu":{…}}

data: [DONE]

El bloque de enrutamiento viaja con el último frame

El frame final lleva el mismo objeto llmeu que devuelve la respuesta no transmitida: trace_id, model_used, model_version, provider, endpoint_id, inference_region, sovereignty_class, policy_id, retention y la estimación de coste. En modo streaming el uso solo se conoce al final, por lo que el bloque viaja con el último frame en lugar del primero.

Desconexiones del cliente

Cerrar la conexión detiene el trabajo y escribe la traza con lo que se produjo realmente. Una solicitud cancelada sigue siendo una llamada que ocurrió, por lo que aparece en el uso; no se registra como un completion completo.

Lo que no se puede transmitir

Los embeddings y la API de plataforma son respuestas JSON únicas. stream: true en una ruta no transmitida es un error de validación, no un fallback silencioso a un frame.