# Стриминг ответа по кускам

Курс: Claude API для разработчиков — https://zero2claude.ru/learn/api
Канонический URL: https://zero2claude.ru/learn/api/2-1-streaming

Стриминг шлёт ответ по кускам через поток SSE — показывай текст по мере генерации, а итог забирай через get_final_message.

## Зачем стримить

Когда `max_tokens` большой, обычный запрос может молчать десятки секунд, а потом отдать весь ответ разом — и упереться в таймаут HTTP. **Стриминг** отдаёт текст по кускам, как только модель его генерирует. Пользователь твоего бота поддержки видит, как ответ печатается вживую, а соединение не висит впустую.

Правило простое: если ставишь большой `max_tokens` (порядка `64000`) — стримь. Иначе рискуешь таймаутом.

## Что приходит в потоке

Сервер шлёт SSE-события. Тебе важны три:

- `message_start` — метаданные ответа, начало;
- `content_block_delta` — кусочек текста лежит в `delta.text`;
- `message_stop` — поток закончился.

## SDK делает это за тебя

В Python-SDK не нужно парсить сырые SSE — есть `client.messages.stream(...)`. Печатаем дельты по мере прихода, а в конце забираем собранный объект через `get_final_message()` — там готовый `usage`, `stop_reason` и полный текст.

```
from anthropic import Anthropic

client = Anthropic()

with client.messages.stream(
    model="claude-opus-4-8",
    max_tokens=64000,
    messages=[{"role": "user", "content": "Ответь покупателю про возврат товара"}],
) as stream:
    for text in stream.text_stream:
        print(text, end="", flush=True)

    final = stream.get_final_message()
    print("\n", final.usage.output_tokens, "токенов на выходе")
```

`get_final_message()` возвращает тот же объект, что и обычный `create` — текст бери из массива `content` по `type == "text"`, не из `content[0]` вслепую.
