Оборвался streaming OpenAI: как отличить незавершённый ответ от успеха

cybercobra

Administrator
Команда форума
Регистрация
6 Авг 2025
Сообщения
912
Реакции
1
Баллы
777
Веб-сайт
cybercobra.ru
openai-streaming-obryv-povtory.jpg


Закрывшееся соединение ещё не означает, что модель успешно закончила ответ. При потоковой выдаче, когда текст приходит частями, в Responses API ориентируйтесь на событие response.completed, а не на последнюю полученную букву. Отдельно обрабатывайте response.failed, response.incomplete и error. Эти исходы перечислены в справочнике событий OpenAI.

Как распознать завершение всего ответа​


Приложению нужны как минимум состояния «идёт генерация», «завершено», «не завершено» и «ошибка». Delta-события с очередными фрагментами текста можно показывать сразу, но запись в базу как окончательного результата делайте после подтверждения завершения. Событие окончания отдельного фрагмента не заменяет завершение всего Response. Типизированный разбор потока показан в руководстве по streaming.

Если поток закончился без итогового события, сохраните частичный текст и отметьте исход как неопределённый. Не приписывайте ошибку серверу только по обрыву: расследованию помогут время, модель, ID ответа и последняя стадия обработки.

Как ограничить повторы и избежать дублей​


  • Ограничьте количество попыток и общее время операции. Бесконечный цикл вокруг create создаёт новые запросы, а не восстанавливает прежний.
  • При response.incomplete прочитайте incomplete_details.reason. Для max_output_tokens одинаковый повтор без изменения задачи или лимита не решает исходную проблему.
  • Не склеивайте новый ответ с уже показанным текстом молча. Покажите пользователю перезапуск либо оформите продолжение отдельно.
  • Не запускайте повторно внешние действия только потому, что оборвался текстовый поток. Сначала проверьте, выполнился ли предыдущий вызов инструмента.

Когда поток можно возобновить​


Для длительных задач есть другой вариант: заранее создать ответ с background: true и stream: true. Тогда можно сохранить response.id и sequence_number последнего сохранённого события и возобновить поток через starting_after. Транспортный keepalive, сигнал поддержания соединения, не используйте как такой курсор.

Этот сценарий описан в Background mode; он не означает, что любой обычный поток можно продолжить тем же способом.

Перед запуском приложения проверьте искусственный обрыв соединения. Интерфейс должен показать незавершённость, остановить бесконечные повторы и не удвоить уже выполненную операцию.

Проверено 10 ноября 2026 года. Описан план проверки, а не проведённый тест.
 
Последнее редактирование:
Назад
Сверху Снизу

Экосистема проектов TeleCobra

CyberCobra.ru — форум TeleCobra.com — софт для Telegram TeleCobra.ru — экосистема CyberMindBot — нейрокомментинг Spellbook Academy — AI обучение