РУКОВОДСТВО · ОБНОВЛЕНО 2026-10-26
Кнопка «Остановить»: как отменять запрос к LLM
Разбор разных уровней отмены: браузер, приложение, запрос поставщику и выполненные инструменты.
Кнопка остановки должна менять состояние конкретного запроса, а не только скрывать анимацию. В браузере AbortController позволяет прервать fetch и чтение ответа, но это само по себе не подтверждает остановку вычисления на удалённом сервере. Передавайте отмену по всей поддерживаемой цепочке и показывайте честный статус: остановлено чтение, запрос отменяется или результат неизвестен. Уже выполненное действие инструмента отмена текста не откатывает. Условия учёта расхода проверяются отдельно для выбранного сервиса.
1. Привяжите остановку к запросу
Создавайте отдельный контроллер для каждой отправки и храните связь с текущим идентификатором диалога. При переключении между чатами не используйте старый контроллер для нового запроса. Состояния ожидает, получает ответ, отменяется и завершён помогают избежать гонок интерфейса. Если пользователь успел отправить новый вопрос, позднее событие старого запроса не должно перезаписать его результат. Проверьте повторное нажатие остановки и закрытие панели во время ожидания.
2. Передайте сигнал через сервер
Серверный обработчик должен учитывать отключение клиента и поддерживаемую отмену исходящего обращения. Не оставляйте фоновую работу бесконечно только потому, что браузер перестал читать. Однако возможность прекратить запрос зависит от используемого клиента и API. Для длительной задачи с отдельным job ID может понадобиться специальная операция отмены, а не разрыв соединения. Возвращайте статус из фактического контракта сервиса и не объявляйте отмену принятой до получения подтверждения.
3. Сохраните частичный результат понятно
Если часть текста уже получена, отметьте её как незавершённую. Не выдавайте частичный JSON или неполную таблицу за успешно обработанный документ. Для потока отдельно обработайте ожидаемое исключение отмены и настоящую сетевую ошибку. Сохраняйте технический идентификатор, достаточный для последующей проверки, без лишних закрытых данных в журнале. При новом запросе объясните, используется ли частичный текст как контекст или пользователь начинает отдельную попытку.
4. Проверьте инструменты и учёт расхода
Предположим, агент уже создал черновик во внешнем сервисе, а пользователь остановил итоговое объяснение. Сначала проверьте наличие черновика, а не выполняйте весь сценарий заново. Для изменений задайте отдельные правила компенсации и подтверждения. В интерфейсе не обещайте нулевую оплату после кнопки остановки: удалённая обработка могла продолжиться или расход уже возник. Контрольные сценарии должны включать отмену до первого байта, посередине ответа и после завершённого действия инструмента.
Частые вопросы
Достаточно ли вызвать abort в браузере?
Для прекращения локального чтения это основной механизм fetch. Для подтверждённой остановки всей цепочки необходимо проверить сервер и контракт удалённого API.
Нужно ли удалять уже показанный текст?
Это решение интерфейса. Обычно полезно сохранить его как частичный результат, ясно отметив незавершённость и не используя как подтверждённые структурированные данные.
Можно ли повторить запрос сразу после отмены?
Сначала определите, не выполнялась ли внешняя операция. Повтор текстового вопроса и повтор действия имеют разный риск дублирования.
Отмена гарантирует прекращение списания?
Нет универсальной гарантии. Условия расчёта и остановки удалённого выполнения зависят от сервиса; локальный abort их не определяет.