Strumieniowanie

Jak strumieniowane uzupełnienie dociera przez sieć, co niesie ostatnia ramka i co się dzieje, gdy klient się rozłączy.

Transport

Ustaw stream: true, a odpowiedź będzie text/event-stream: jeden obiekt JSON na wiersz data:, każdy po którym następuje pusty wiersz. Buforowanie jest wyłączone, aby proxy nie wstrzymywał ramek.

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

Ramki

Pierwsza ramka niesie rolę assistant, potem jedna ramka na deltę, następnie ramka z finish_reason i blokiem routingu, a na końcu dokładnie jeden terminator. Klient, który przestrzega formatu, odczytuje terminator i zatrzymuje się; nie może traktować brakującego terminatora jako pełnej odpowiedzi.

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]

Blok routingu podróżuje z ostatnią ramką

Ostatnia ramka niesie ten sam obiekt llmeu, który zwraca odpowiedź niestrumieniowa: trace_id, model_used, model_version, provider, endpoint_id, inference_region, sovereignty_class, policy_id, retention oraz szacowany koszt. W trybie strumieniowania użycie jest znane dopiero na końcu, dlatego blok podróżuje z ostatnią ramką, a nie z pierwszą.

Rozłączenie klienta

Zamknięcie połączenia zatrzymuje pracę i zapisuje ślad z tym, co faktycznie zostało wyprodukowane. Anulowane żądanie to nadal wywołanie, które miało miejsce, więc pojawia się w użyciu; nie jest rejestrowane jako ukończone uzupełnienie.

Czego nie można strumieniować

Embeddingi i API platformy to pojedyncze odpowiedzi JSON. stream: true na trasie niestrumieniowej jest błędem walidacji, a nie cichym przejściem do jednej ramki.