Закрывшееся соединение ещё не означает, что модель успешно закончила ответ. При потоковой выдаче, когда текст приходит частями, в 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 года. Описан план проверки, а не проведённый тест.
Последнее редактирование: