Тайм-ауты и обработка ошибок
Продуктивный бот должен уметь две вещи, которых нет в счастливом пути: заметить, что клиент ушёл, и не зависнуть, если что-то сломалось.
Клиент замолчал
Два таймера настраивает администратор в главном конфиге (см. Конфигурация):
dialog.timeoutInterval, по умолчанию 25 минут без сообщений. По его истечении платформа выполняет сценарий тайм-аута и возвращает клиента в начало: следующее сообщение попадёт в звено «Начало» главного процесса.dialog.sessionTimeoutInterval, по умолчанию 30 минут. По его истечении очищаютсяtempиsession.
Сценарий тайм-аута платформа ищет в таком порядке:
- звено, указанное в свойстве «тайм-аут» текущего звена;
- звено с именем
timeoutв текущем процессе (для навыков — в процессе, который вызвал навык); - звено, указанное в свойстве процесса «звено тайм-аута»;
- процесс
Таймаут(файлtimeout.flow.json): создайте процесс с таким именем, и его начало сработает для любого звена бота.
Типичный процесс тайм-аута: сообщение «Вы ещё здесь? Если вопрос остался, напишите, и мы продолжим», при необходимости сброс сессии. Для веб-чата и iQChannels тайм-аут запускается на сервере, клиент получит сообщение, даже если окно чата уже закрыто. Перед выполнением вызывается хук before_session_timeout.
Клиент ответил не то
Звено с ожиданием ответа остаётся на месте, пока ни одно условие перехода не подошло. Чтобы клиент не застрял:
- добавляйте запасной переход «Иначе» (условие «всегда») в конец списка, который объясняет, что сказать по-другому, или возвращает в меню;
- в навыках «Выбор» и «Заполнение слота» задано число попыток, после которого срабатывает переход «Ошибка»;
- для свободного текста используйте намерения и порог уверенности, а не точное совпадение строки.
Что-то сломалось
Если действие бросило исключение, навык не смог выполниться или в процессе найдена ошибка (нет звена, на которое ведёт переход), платформа переводит диалог в процесс Ошибка (файл error.flow.json), который есть в каждом новом боте. По умолчанию он извиняется и завершает процесс; настройте его под себя: предложите связаться с оператором (навык «Переадресация»), запишите в журнал, что произошло.
Ошибки действий видны в «Панели отладки» (вкладка «Журнал», уровень «Ошибка») и в журнале бота в админ-панели. Чтобы дежурный узнавал о сериях ошибок, администратор может включить хук on_bot_error (см. «Действия и хуки»).
Внешние системы отвечают долго
Ответ бота на одно сообщение ограничен тайм-аутом диалога (converse.timeout, по умолчанию 5 секунд; ИИ-агент имеет собственный тайм-аут запроса, по умолчанию 60 секунд). Если внешняя система отвечает дольше:
- вызывайте её из действия с собственным тайм-аутом (
timeoutу axios) и обрабатывайте ошибку, выставляяtemp.valid = false; - для медленных операций отвечайте сразу («Проверяю, это займёт до минуты») и отправляйте результат отдельным сообщением из действия (
iqbot.events.replyToEvent), либо передавайте обращение оператору; - в сценариях с ИИ-агентом предусматривайте переход «Ошибка» с понятным ответом, как в процессе «Свободный_вопрос» демонстрационного бота.