Потоковые ответы
Server-Sent Events для поэтапного получения ответа.
Укажите "stream": true в теле запроса. Потоковый режим работает в обоих форматах инференса и не меняет тарифы.
Anthropic отправляет события, например message_start, content_block_delta и message_stop. OpenAI отправляет фрагменты data: {...} и завершает поток строкой data: [DONE].
from openai import OpenAI
client = OpenAI(api_key="mg_live_...", base_url="https://api.model-gate.com/v1")
stream = client.chat.completions.create(model="claude-opus-4.8", messages=[{"role":"user","content":"Hello"}], stream=True)
for chunk in stream:
text = chunk.choices[0].delta.content
if text:
print(text, end="", flush=True)
Держите соединение открытым и отключите буферизацию обратного прокси. Закрытие клиентского соединения отменяет генерацию у поставщика; уже сгенерированный объём остаётся платным. Рекомендации по повторам см. в разделе Ошибки.
Завершение и отсутствующие данные об использовании
HTTP 200 подтверждает начало потока, а не завершение инференса. Ошибка поставщика, прерванный или обрезанный поток отображаются в Usage как неуспешные или незавершённые. Для Chat Completions признаком завершения служит причина завершения для каждого запрошенного варианта либо [DONE]; Responses использует response.completed, Anthropic — message_stop. Сохраняйте идентификатор запроса и считайте уже полученный текст или аргументы инструментов частичными. Шлюз не повторяет этот запрос незаметно.
Приоритет имеют данные об использовании, сообщённые поставщиком, включая нулевые или частичные счётчики. Для подтверждённо успешного текстового потока без usage возможна явно обозначенная оценка по байтам декодированных дельт текста, рассуждений и аргументов инструментов, без обрамления SSE/JSON; явные лимиты вывода ограничивают только оценки. Неуспешные или неподдерживаемые потоки без usage показывают Объём использования неизвестен · требуется проверка и не получают автоматического списания по байтовой оценке. Неизвестное значение не доказывает бесплатность выполнения у поставщика. См. Ошибки.
Периоды тишины и завершение передачи
Во время паузы поставщика могут приходить строки комментариев, начинающиеся с :. Это keepalive SSE: в них нет сгенерированного текста или usage. Разбирайте границы событий, а не считайте каждое сетевое чтение токеном. Поддерживаются окончания строк LF, CRLF и CR.
В Chat Completions продолжайте чтение после finish_reason, чтобы получить завершающие usage и [DONE]. Допустимый [DONE], response.completed или message_stop завершает ответ соответствующего протокола без ожидания закрытия соединения поставщиком. Ошибка простоя или предельной длительности потока означает сбой, а не искусственное успешное завершение. Сохраняйте идентификатор запроса и не повторяйте автоматически частично выполненный платный запрос.
Задержка первоначального HTTP-ответа отличается от паузы внутри уже установленного SSE-потока. Keepalive начинается только после получения потоковых HTTP-заголовков от поставщика; он не гарантирует вывод модели и не обходит HTTP-ошибки поставщика. Если поставщик возвращает одно полное событие содержимого, разделение готового текста клиентом не превращает его в настоящую поэтапную генерацию.