Streaming ответов AI через SSE: практическое руководство
Streaming уменьшает время до первого видимого фрагмента ответа: приложение показывает текст по мере генерации. Для этого сервер возвращает последовательность SSE-событий вместо одного JSON.
Как читать SSE-поток
Клиент читает response.body как поток байтов, декодирует UTF-8 и разделяет события по пустой строке. Каждая строка data содержит фрагмент или служебное событие. Нельзя считать, что один сетевой chunk равен одному SSE-событию: граница может пройти внутри строки.
- накапливать неполный хвост между чтениями
- разбирать только завершённые события
- обрабатывать финальный маркер
- закрывать reader при отмене пользователем
Ошибки до и после начала ответа
До отправки заголовков API может вернуть обычный JSON с HTTP-ошибкой. После начала SSE статус уже не меняется, поэтому ошибка может прийти отдельным событием. Интерфейс должен сохранить полученный текст и явно показать, что генерация прервалась.
Поддержка маршрутов NormaHub
Потоковый режим следует проверять для конкретного endpoint. Responses API поддерживает streaming. Для Chat Completions и Messages API потоковая выдача сейчас может возвращать 503 streaming_not_enabled, поэтому интеграция обязана иметь непотоковый fallback и не обещать streaming для всех моделей.
- проверить маршрут тестовым запросом
- добавить AbortController
- не повторять оборванную генерацию автоматически без контроля дублей