stream=True.
Как это выглядит в коде
Вместо одного объектаresponse вы получаете итератор. На каждой итерации приходит chunk, а полезный текст лежит в chunk.choices[0].delta.content. Его нужно дописывать к выводу по мере поступления.
data: {...}, каждая со своим фрагментом. Признак конца — строка data: [DONE].
Смена модели
Как и в обычных запросах, для переключения модели меняется только полеmodel — код стриминга остаётся тем же. Например, gpt-5, gemini-3.5-flash или deepseek-v3:
Стриминг по протоколу Anthropic
Если вы работаете через нативный протокол Anthropic (Claude Code, Anthropic SDK), стриминг тоже поддерживается — черезclient.messages.stream(...). Адрес здесь без /v1:
Подводные камни
В последнем chunk delta.content равен None
В последнем chunk delta.content равен None
Финальный фрагмент потока обычно несёт служебную информацию (например,
finish_reason), а не текст — поэтому delta.content там None (в Node.js — undefined). Всегда проверяйте значение перед тем, как его выводить или склеивать, иначе получите TypeError при попытке конкатенации.Как узнать расход токенов при стриминге
Как узнать расход токенов при стриминге
По умолчанию итоговая статистика (Тогда в самом конце потока придёт отдельный chunk с полем
usage) в потоке не приходит. Чтобы её получить, добавьте в запрос параметр stream_options:usage. У такого chunk список choices пустой — учитывайте это при разборе.Ответ приходит не по частям, а целиком
Ответ приходит не по частям, а целиком
Если текст появляется одним куском, а не печатается постепенно — скорее всего, между вами и API стоит прокси или балансировщик, который буферизует SSE. Проверьте, что отключено буферирование ответа (например,
proxy_buffering off; в nginx) и что ваш HTTP-клиент не накапливает поток сам. В curl для надёжности добавьте флаг -N (--no-buffer).Что дальше
- Быстрый старт — регистрация, ключ и первый запрос
- Модели Claude — какую линейку взять для стриминга
- Телеграм-бот на нейросети — стриминг ответов в живом боте
- Ошибки и их разбор — что делать, если запрос упал