Зачем стримить
Когда 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] вслепую.