Strömning
Hur en strömmad completion anländer över nätet, vad den sista ramen innehåller, och vad som händer när en klient kopplar från.
Transporten
Sätt stream: true och svaret är text/event-stream: ett JSON-objekt per data:-rad, var och en följd av en tom rad. Buffring är inaktiverad så att en proxy inte håller tillbaka ramar.
HTTP/1.1 200 OK
content-type: text/event-stream; charset=utf-8
cache-control: no-cache, no-transform
connection: keep-alive
Ramarna
Den första ramen innehåller assistentrollen, sedan en ram per delta, sedan en ram med finish_reason och routingblocket, sedan exakt en terminator. En klient som följer formatet läser terminatorn och stannar; den får inte behandla en saknad terminator som ett komplett svar.
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]
Routingblocket färdas med den sista ramen
Den sista ramen innehåller samma llmeu-objekt som det icke-strömmande svaret returnerar: trace_id, model_used, model_version, provider, endpoint_id, inference_region, sovereignty_class, policy_id, retention och kostnadsuppskattningen. I strömmande läge är användningen endast känd i slutet, vilket är varför blocket färdas med den sista ramen i stället för den första.
Klienten kopplar från
Att stänga anslutningen stoppar arbetet och skriver spårningen med det som faktiskt producerades. En avbruten begäran är fortfarande ett anrop som hände, så den visas i användningen; den registreras inte som en slutförd completion.
Vad som inte kan strömmas
Embeddings och plattforms-API:et är enskilda JSON-svar. stream: true på en icke-strömmande rutt är ett valideringsfel, inte en tyst återgång till en ram.