Streaming

Cum ajunge o completare transmisă prin streaming pe fir, ce conține ultimul cadru și ce se întâmplă când un client se deconectează.

Transportul

Setează stream: true și răspunsul este text/event-stream: un obiect JSON per linie data:, fiecare urmat de o linie goală. Tamponarea este dezactivată astfel încât un proxy să nu rețină cadrele.

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

Cadrele

Primul cadru conține rolul de assistant, apoi un cadru per delta, apoi un cadru cu finish_reason și blocul de rutare, apoi exact un terminator. Un client care respectă formatul citește terminatorul și se oprește; nu trebuie să trateze un terminator lipsă ca pe un răspuns complet.

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]

Blocul de rutare călătorește cu ultimul cadru

Cadrul final conține același obiect llmeu pe care îl returnează răspunsul non-streaming: trace_id, model_used, model_version, provider, endpoint_id, inference_region, sovereignty_class, policy_id, retention și estimarea costului. În modul streaming, utilizarea este cunoscută doar la final, motiv pentru care blocul călătorește cu ultimul cadru, nu cu primul.

Deconectări ale clientului

Închiderea conexiunii oprește lucrul și scrie trace-ul cu ceea ce a fost produs efectiv. O cerere anulată este totuși un apel care a avut loc, așa că apare în utilizare; nu este înregistrată ca o completare finalizată.

Ce nu poate fi transmis prin streaming

Embeddings și API-ul de platformă sunt răspunsuri JSON unice. stream: true pe o rută non-streaming este o eroare de validare, nu o revenire silențioasă la un singur cadru.