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.