Возможности API

Стриминг ответов моделей через 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 OpenAI

client = OpenAI(
    base_url="https://ai-gatewey.ru/v1",
    api_key="sk-aigate-ваш_ключ",
)

stream = client.chat.completions.create(
    model="deepseek/deepseek-chat",
    messages=[{"role": "user", "content": "Расскажи о токенах"}],
    stream=True,
)
for chunk in stream:
    delta = chunk.choices[0].delta.content
    if 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-chat",
  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 с числом токенов. Фактический расход всегда виден в кабинете в реальном времени.

Подключите стриминг за пять минут

Получить ключ