Streaming

Hur en streamad 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 routningsblocket, 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]

Routningsblocket färdas med den sista ramen

Den sista ramen innehåller samma llmeu-objekt som det icke-streamande svaret returnerar: trace_id, model_used, model_version, provider, endpoint_id, inference_region, sovereignty_class, policy_id, retention och kostnadsuppskattningen. I streamande läge är användningen endast känd i slutet, vilket är anledningen till att blocket färdas med den sista ramen snarare än 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 inträffade, så den visas i användning; den registreras inte som en slutförd completion.

Vad som inte kan streamas

Embeddings och plattforms-API:et är enskilda JSON-svar. stream: true på en icke-streamande rutt är ett valideringsfel, inte en tyst återgång till en enda ram.