# Стриминг

> Потоковая выдача через SSE — события по форматам, usage, keep-alive и ошибки посреди потока.

Текстовые эндпоинты отдают ответ потоком, если в запросе `"stream": true`.
Поток — Server-Sent Events (`text/event-stream`) в том же формате, что у
оригинального API. Изображения и видео потоком не отдаются.

## Пример

```bash [curl]
curl -N https://ai-seller.vibe-codes.ru/v1/chat/completions \
  -H "Authorization: Bearer $AISELLER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-5.6-sol",
    "stream": true,
    "stream_options": {"include_usage": true},
    "messages": [{"role": "user", "content": "Расскажи короткую историю"}]
  }'
```

```python [Python]
from openai import OpenAI

client = OpenAI(base_url="https://ai-seller.vibe-codes.ru/v1", api_key="$AISELLER_API_KEY")
stream = client.chat.completions.create(
    model="gpt-5.6-sol",
    stream=True,
    stream_options={"include_usage": True},
    messages=[{"role": "user", "content": "Расскажи короткую историю"}],
)
for chunk in stream:
    if chunk.choices and chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="")
```

## События и usage по форматам

| Эндпоинт | События | Где usage |
| --- | --- | --- |
| `/v1/chat/completions` | `chat.completion.chunk`, в конце `data: [DONE]` | Последний чанк — только при `"stream_options": {"include_usage": true}` |
| `/v1/responses` | `response.created`, `response.output_text.delta`, …, `response.completed` | `response.completed` |
| `/v1/messages` | `message_start`, `content_block_*`, `message_delta`, `message_stop` | `message_start` и `message_delta` |

## Keep-alive и долгое молчание

- Рассуждающие модели могут молчать десятки секунд перед первым токеном. Шлюз
  ждёт начала ответа провайдера около минуты; клиентский таймаут ставьте с
  запасом.
- В потоке бывают строки-комментарии, начинающиеся с `:` (keep-alive). SDK их
  пропускают; если разбираете SSE сами — игнорируйте такие строки.

## Ошибки посреди потока

- Если провайдер отказал до начала ответа, шлюз успевает переключиться на
  другого провайдера модели или вернуть обычную JSON-ошибку с HTTP-статусом —
  см. [Ошибки](https://ai-seller.vibe-codes.ru/docs/errors).
- Если ответ уже начал приходить (HTTP 200 отправлен), переключения нет:
  ошибка приходит событием ошибки в формате эндпоинта, либо поток просто
  закрывается без завершающего события (`[DONE]`, `response.completed`,
  `message_stop`). Считайте такой ответ оборванным и повторите запрос.
- Если провайдер оборвал поток до первого фрагмента ответа, списания нет. Если
  посреди ответа или вы прервали запрос сами — списывается вход и
  сгенерированный выход (см. [Баланс и стоимость](https://ai-seller.vibe-codes.ru/docs/pricing)).
