Потоковая передача
Получайте ответ модели по частям через Server-Sent Events (SSE).
Кому подходит
- Разработчикам — чат-интерфейсы, агенты и любые сценарии с постепенным выводом текста.
Маршруты с SSE
Передайте stream: true в теле запроса:
| Маршрут | Формат SSE |
|---|---|
POST /chat/completions, /completions | OpenAI — с завершающим [DONE] |
POST /responses | OpenAI Responses — события response.output_text.delta |
POST /messages | Anthropic — без [DONE] |
POST /images/generations | OpenAI |
POST /audio/transcriptions, /audio/translations | OpenAI |
Ответ — 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 — это фоновая задача с опросом статуса. См. Гайд по видео.