Skip to main content
Когда вы запрашиваете ответ обычным способом, клиент ждёт, пока модель допишет последнее слово, и только потом показывает результат. На длинном ответе это секунды тишины. Потоковый режим (streaming) отдаёт текст по кусочкам, прямо во время генерации — пользователь видит, как ответ печатается, и воспринимаемая задержка падает почти до нуля. Технически это не магия: вместо одного JSON-ответа сервер открывает поток Server-Sent Events (SSE) и шлёт по нему мелкие фрагменты (chunks). Включается это одним флагом — stream=True.
Streaming работает на том же OpenAI-совместимом эндпоинте, что и обычные запросы. Меняется только флаг stream и способ чтения ответа. base_url остаётся прежним: https://www.ruapi.ai/v1.

Как это выглядит в коде

Вместо одного объекта response вы получаете итератор. На каждой итерации приходит chunk, а полезный текст лежит в chunk.choices[0].delta.content. Его нужно дописывать к выводу по мере поступления.
В curl ответ приходит как поток строк data: {...}, каждая со своим фрагментом. Признак конца — строка data: [DONE].

Смена модели

Как и в обычных запросах, для переключения модели меняется только поле model — код стриминга остаётся тем же. Например, gpt-5.4, gemini-3.5-flash или deepseek-v4-pro:
Полный список доступных имён — на странице «Цены» на www.ruapi.ai.

Стриминг по протоколу Anthropic

Если вы работаете через нативный протокол Anthropic (Claude Code, Anthropic SDK), стриминг тоже поддерживается — через client.messages.stream(...). Адрес здесь без /v1:
Подробнее про два протокола и базовые адреса — в справочнике API.

Подводные камни

Финальный фрагмент потока обычно несёт служебную информацию (например, finish_reason), а не текст — поэтому delta.content там None (в Node.js — undefined). Всегда проверяйте значение перед тем, как его выводить или склеивать, иначе получите TypeError при попытке конкатенации.
По умолчанию итоговая статистика (usage) в потоке не приходит. Чтобы её получить, добавьте в запрос параметр stream_options:
Тогда в самом конце потока придёт отдельный chunk с полем usage. У такого chunk список choices пустой — учитывайте это при разборе.
Если текст появляется одним куском, а не печатается постепенно — скорее всего, между вами и API стоит прокси или балансировщик, который буферизует SSE. Проверьте, что отключена буферизация ответа (например, proxy_buffering off; в nginx) и что ваш HTTP-клиент не накапливает поток сам. В curl для надёжности добавьте флаг -N (--no-buffer).

Что дальше