Перейти к основному содержимому

Переключение между ботами

Продвинутая возможность

В одном аккаунте вы можете создать произвольное число проектов с чат-ботами.

подсказка
JAICP позволяет в любой момент переключить контекст диалога из бота, размещенного в одном проекте, в другого бота.

В данной статье мы рассмотрим:

  1. Что такое стек ботов;
  2. Как реализовать переключение и возврат контекста;
  3. Особенности и ограничения данной возможности.

Стек ботов

Для каждого бота в JAICP выделены ресурсы для переключения контекста на других ботов. Боты, на которых производится переключение, организованы в стек.

Если сценарий бота не предполагает переключения контекста, его стек не меняется. Для изменения контекста возможны две операции:

  • Переключение контекста (context switch): контекст диалога передается нужному боту, а этот бот добавляется в стек.
  • Возврат контекста (context return): последний добавленный бот удаляется из стека, а контекст переходит к боту, из которого он был добавлен.

Переключение и возврат контекста

При изменении контекста бот начинает работу по сценарию другого бота, но при этом канал общения остается прежним. Это дает гибкие возможности для сложного взаимодействия с клиентами.

предупреждение
Боты, участвующие в смене контекста, должны быть размещены в одном аккаунте. Переключение контекста на бота в другом аккаунте приведет к ошибке.

Переключение контекста

Для переключения контекста из сценария необходимо добавить в массив $response.replies объект со следующими полями.

ПолеТипОбязательноеОписание
typeСтрокаДаТип ответа в массиве $response.replies. Должен иметь значение "context-switch".
targetBotIdСтрокаДаИдентификатор бота, на которого переключается контекст. Его можно узнать в свойствах канала, где опубликован бот.
targetStateСтрокаНет

Абсолютный путь к стейту, в который произойдет переход после переключения контекста.

Если 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: {}
});
предупреждение
Данные, переданные в $request.data, доступны в другом боте только во время обработки текущего запроса. Если эти данные потребуются и в дальнейшем, сохраните их в $session или $client.

Возврат контекста

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

Для возврата контекста из сценария необходимо добавить в массив $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 применяется только при первом вызове обработчиков после перехода во второго бота.