Переключение между ботами
Продвинутая возможность
В одном аккаунте вы можете создать произвольное число проектов с чат-ботами.
В данной статье мы рассмотрим:
- Что такое стек ботов;
- Как реализовать переключение и возврат контекста;
- Особенности и ограничения данной возможности.
Стек ботов
Для каждого бота в JAICP выделены ресурсы для переключения контекста на других ботов. Боты, на которых производится переключение, организованы в стек.
Если сценарий бота не предполагает переключения контекста, его стек не меняется. Для изменения контекста возможны две операции:
- Переключение контекста (context switch): контекст диалога передается нужному боту, а этот бот добавляется в стек.
- Возврат контекста (context return): последний добавленный бот удаляется из стека, а контекст переходит к боту, из которого он был добавлен.
При изменении контекста бот начинает работу по сценарию другого бота, но при этом канал общения остается прежним. Это дает гибкие возможности для сложного взаимодействия с клиентами.
Переключение контекста
Для переключения контекста из сценария необходимо добавить в массив $response.replies
объект со следующими полями.
Поле | Тип | Обязательное | Описание |
---|---|---|---|
type | Строка | Да | Тип ответа в массиве $response.replies . Должен иметь значение "context-switch" . |
targetBotId | Строка | Да | Идентификатор бота, на которого переключается контекст. Его можно узнать в свойствах канала, где опубликован бот. |
targetState | Строка | Нет | Абсолютный путь к стейту, в который произойдет переход после переключения контекста. Если preMatch |
parameters | Объект | Да | Произвольные данные, которые необходимо передать в другого бота. После переключения контекста объект будет доступен в поле $request.data . |
state: SwitchToEnglish
q!: * говори* [на/по] ~английский *
script:
$response.replies = $response.replies || []; // Инициализация массива `$response.replies`
$response.replies.push({
type: "context-switch",
targetBotId: "13721-enBot-13721-BkN-41730",
targetState: "/Start",
parameters: {}
});
Возврат контекста
После переключения контекста общение по сценарию предыдущего бота больше не доступно. Используйте возврат контекста из сценария нового бота, чтобы вернуться обратно в сценарий, из которого произошло переключение.
Для возврата контекста из сценария необходимо добавить в массив $response.replies
объект со следующими полями.
Поле | Тип | Обязательное | Описание |
---|---|---|---|
type | Строка | Да | Тип ответа в массиве $response.replies . Должен иметь значение "context-return" . |
state | Строка | Нет | Абсолютный путь к стейту, в который произойдет переход после возврата контекста. Если state не указан, то при возврате контекста запрос будет обработан в корневой теме / . Подходящий стейт будет определен динамически. |
data | Объект | Да | Произвольные данные, которые необходимо передать в другого бота. После возврата контекста объект будет доступен в поле $request.data . |
state: SwitchToRussian
q!: * говори* [на/по] ~русский *
script:
$response.replies = $response.replies || []; // Инициализация массива `$response.replies`
$response.replies.push({
type: "context-return",
state: "/Start",
data: {}
});
Особенности и ограничения
Переполнение стека
Для возврата контекста на предыдущего бота также возможно использовать context-switch
. Однако такое использование некорректно, поскольку один и тот же бот будет помещен в стек несколько раз.
context-return
.Обработка событий
После переключения контекста на второго бота все запросы от клиента обрабатываются в контексте этого второго бота.
Однако если в канале происходит таймаут или пользовательское событие, стейт-обработчик для которого предусмотрен в первом боте, то событие будет успешно обработано, причем контекст будет автоматически возвращен первому боту.
$pushgate
,
и не работает для системных событий.noContext
.Вы можете ознакомиться с примером использования смены контекста на практике, пройдя пошаговый сценарий создания многоязычного бота.
Выполнение обработчиков при переключении контекста
Если вы перешли в стейт второго бота с помощью переключения контекста, то по умолчанию выполнятся все подходящие обработчики из сценария второго бота, кроме preMatch
.
Вы можете изменить это поведение для каждого обработчика с помощью аргумента allowedInContextSwitch
функции bind
.
Аргумент allowedInContextSwitch
применяется только при первом вызове обработчиков после перехода во второго бота.