Гайды

Потоковая передача

Получайте ответ модели по частям через Server-Sent Events (SSE).

Кому подходит

  • Разработчикам — чат-интерфейсы, агенты и любые сценарии с постепенным выводом текста.

Маршруты с SSE

Передайте stream: true в теле запроса:

МаршрутФормат SSE
POST /chat/completions, /completionsOpenAI — с завершающим [DONE]
POST /responsesOpenAI Responses — события response.output_text.delta
POST /messagesAnthropic — без [DONE]
POST /images/generationsOpenAI
POST /audio/transcriptions, /audio/translationsOpenAI

Ответ — Content-Type: text/event-stream. Игнорируйте служебные комментарии в потоке, если SDK их не обрабатывает. Пока поставщик молчит, шлюз примерно раз в 15 секунд пишет комментарий : processing.

Ожидание первого события на POST /chat/completions: до 10 минут. После первого события потока 60 секунд без новых данных закрывают соединение, и в поток уходит событие с ошибкой. На остальных потоковых маршрутах 60 секунд тишины закрывают соединение сразу.

OpenAI SSE и [DONE]

На маршрутах OpenAI (/chat/completions, /completions, /responses) поток завершается событием data: [DONE]. Официальный OpenAI SDK ожидает эту метку — не удаляйте её при ручной обработке SSE.

Anthropic SSE без [DONE]

На POST /messages поток идёт в формате Anthropic и не содержит [DONE]. Если прокси или самописный клиент ждёт [DONE] как у OpenAI, Anthropic SDK сломается. Используйте Anthropic SDK или парсите события message_start, content_block_delta, message_stop.

Chat Completions (OpenAI)

from openai import OpenAI

client = OpenAI(api_key="sk-…", base_url="https://www.llmmart.ru/api/v1")
stream = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[{"role": "user", "content": "Привет!"}],
    stream=True,
)
for chunk in stream:
    if chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="")
import OpenAI from "openai";

const client = new OpenAI({
  apiKey: "sk-…",
  baseURL: "https://www.llmmart.ru/api/v1",
});
const stream = await client.chat.completions.create({
  model: "gpt-4o-mini",
  messages: [{ role: "user", content: "Привет!" }],
  stream: true,
});
for await (const chunk of stream) {
  process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}

Messages (Anthropic)

from anthropic import Anthropic

client = Anthropic(api_key="sk-…", base_url="https://www.llmmart.ru/api")
with client.messages.stream(
    model="anthropic/claude-sonnet-5",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Привет!"}],
) as stream:
    for text in stream.text_stream:
        print(text, end="")

Поток завершается событием message_stop, не [DONE].

Responses API

POST /responses при stream: true отдаёт SSE с событиями Responses API. Каждый вызов независим — контекст передаётся в input.

stream = client.responses.create(
    model="gpt-4o-mini",
    input="Напиши короткий абзац про HTTP/2.",
    stream=True,
)
for event in stream:
    if event.type == "response.output_text.delta":
        print(event.delta, end="")

Подробности — Responses API.

Usage в потоках

Для синхронных JSON-ответов поле usage приходит в теле. Для SSE — в финальном chunk или событии завершения. Для картинок, аудио, видео и realtime набор полей другой, у синтеза речи JSON нет вовсе. Структура — Поле usage. Списание в рублях появляется в кабинете в течение нескольких секунд — см. Расходы.

Асинхронное видео

Генерация видео не стримится в SSE — это фоновая задача с опросом статуса. См. Гайд по видео.

Что дальше