Стриминг ответов моделей через AI Gateway (SSE, stream: true)
Как получать ответ модели по мере генерации: параметр stream:true, Server-Sent Events, примеры на Python и JavaScript, подводные камни с таймаутами и буферизацией.
Стриминг отдаёт ответ модели частями, по мере генерации, а не одним блоком после завершения. Для интерфейсов чата это ключевой приём: пользователь видит первые слова через доли секунды, а не ждёт весь ответ целиком. В AI Gateway стриминг включается стандартным параметром stream: true и работает через Server-Sent Events — точно так же, как в оригинальном API OpenAI.
Как это работает
С stream: true сервер держит соединение открытым и присылает поток событий data:, каждое из которых несёт очередной фрагмент ответа в поле delta. Клиент склеивает фрагменты по мере поступления; поток закрывается служебным data: [DONE]. SDK OpenAI разбирает эти события за вас — достаточно итерироваться по объекту потока.
from openai import OpenAIclient = OpenAI(base_url="https://ai-gatewey.ru/v1",api_key="sk-aigate-ваш_ключ",)stream = client.chat.completions.create(model="deepseek/deepseek-v4-flash",messages=[{"role": "user", "content": "Расскажи о токенах"}],stream=True,)for chunk in stream:delta = chunk.choices[0].delta.contentif delta:print(delta, end="", flush=True)import OpenAI from "openai";const client = new OpenAI({baseURL: "https://ai-gatewey.ru/v1",apiKey: "sk-aigate-ваш_ключ",});const stream = await client.chat.completions.create({model: "deepseek/deepseek-v4-flash",messages: [{ role: "user", content: "Расскажи о токенах" }],stream: true,});for await (const chunk of stream) {const delta = chunk.choices[0]?.delta?.content;if (delta) process.stdout.write(delta);}Сценарии
- Чат-интерфейсы — вывод ответа «печатной машинкой» снижает воспринимаемую задержку и удерживает внимание пользователя.
- Длинные генерации — статьи, отчёты, код: пользователь начинает читать первый абзац, пока модель дописывает остальное.
- Ранняя остановка — можно прервать поток, как только получен нужный фрагмент, и не платить за лишние токены.
- Голосовые ассистенты — фрагменты текста сразу уходят в синтез речи, без ожидания полного ответа.
usage с числом токенов приходит в самом конце потока (или требует stream_options: {include_usage: true}) — не рассчитывайте увидеть расход в первом же чанке.Подводные камни
- Таймауты прокси и балансировщиков. nginx, CDN и облачные шлюзы часто рвут «тихие» соединения. Увеличьте
proxy_read_timeoutи отключите буферизацию ответа для стриминг-маршрута. - Буферизация на стороне сервера. Если ваш backend копит ответ в буфер и отдаёт целиком, эффект стриминга теряется — отдавайте чанки сразу (
flushпосле каждого фрагмента). - Обрыв соединения. Сеть может оборваться посреди потока: оберните чтение в обработку ошибок и предусмотрите повтор запроса.
- Сборка ответа. Итоговый текст — это конкатенация всех
delta.content; не забудьте, чтоtool_callsпри стриминге тоже приходят по частям и требуют склейки по индексу.
Частые вопросы
Все ли модели каталога поддерживают стриминг?
Стриминг поддерживает большинство чат-моделей — точный список для этой возможности собирается живьём ниже по каталогу. Смотрите бейдж «стриминг» на карточке модели в каталоге.
Отличается ли цена при стриминге?
Нет. Оплачиваются те же входные и выходные токены — способ доставки ответа на стоимость не влияет.
Как посчитать токены, если ответ пришёл потоком?
Передайте stream_options: {include_usage: true} — тогда в финальном событии потока придёт блок usage с числом токенов. Фактический расход всегда виден в кабинете в реальном времени.