Создает новый экземпляр контроллера. Инициализирует все необходимые компоненты.
OptionalappContext: AppContext<IDatabaseInfo, unknown>Контекст приложения.
Стиль обращения к пользователю. Определяет формальность общения, используется для платформ, которые поддерживают данное поведение.
Платформа от которой был получен запрос.
Эмоция для голосового ответа. Используется для платформ, которые поддерживают данное поведение.
Флаг необходимости авторизации. Определяет, требуется ли авторизация пользователя или нет.
Флаг, определяющий необходимость завершения диалога. Актуально когда необходимо принудительно завершить диалог с пользователем. Поддержка работы флага зависит от платформы.
Определяет, с колонки пользователь запустил приложение или с устройства с экраном.
Флаг отправки запроса на оценку. Определяет, нужно ли запросить оценку у пользователя. Используется для платформ, которые поддерживают данное поведение.
ID сообщения. Используется для определения начала нового диалога.
Название предыдущего интента/команды, полученное из userData.oldIntentName.
Используется для отслеживания контекста диалога.
КАК ЭТО РАБОТАЕТ:
this.thisIntentName сохраняется в userData.oldIntentNamethis.oldIntentNameТИПИЧНОЕ ИСПОЛЬЗОВАНИЕ:
bot.addStep()// Пример: Многошаговая регистрация
class RegistrationBot extends BotController {
public action(intentName: string | null): void {
// Определяем на каком шаге находимся
const previousStep = this.oldIntentName;
if (previousStep === 'enter_name') {
// Пользователь только что ввел имя, спрашиваем email
this.userData.name = this.userCommand;
this.text = 'Отлично! Теперь введите ваш email:';
this.thisIntentName = 'enter_email'; // Сохранится для следующего шага
} else if (previousStep === 'enter_email') {
// Пользователь ввел email, завершаем регистрацию
this.userData.email = this.userCommand;
this.text = 'Регистрация завершена!';
}
}
}
// Пример: Кнопка "Назад"
if (intentName === 'back') {
// Возвращаемся к предыдущему шагу
switch(this.oldIntentName) {
case 'product_list':
this.text = 'Выберите категорию:';
break;
case 'category_list':
this.text = 'Добро пожаловать!';
break;
}
}
Оригинальный запрос пользователя. Текст запроса без изменений, включая регистр и знаки препинания.
Дополнительные параметры запроса. Может содержать любые дополнительные данные полученные от платформы.
Дополнительные опции платформы. ⚠️ Внутреннее свойство. Заполняется адаптером платформы. Не предназначено для прямого использования в пользовательском коде.
Полученный запрос от платформы. Содержит оригинальный объект запроса.
Флаг, указывающий, что ответ уже отправлен через API и не требуется автоматическая отправка. Как правило, данный флаг стоит использовать для платформ, которые не ждут ответ в виде возвращаемого содержимого, а ожидают что к самой платформе будет отправлен запрос. Например, чат-бот для Telegram, для отображения результата пользователю, отправляется запрос к платформе с нужным содержимым.
Пользовательское локальное хранилище.
Используется для временного хранения данных, специфичных для текущего диалога.
Работает только при включённой опции isLocalStorage: true в конфигурации.
bot.setAppConfig({
isLocalStorage: true,
});
Правила синхронизации с базой данных (если подключена):
userData, и state:
userData сохраняется в БД,state сохраняется в локальное хранилище платформы.userData (а state пуст или равен userData):
state:
При загрузке данных:
state и userData.userData, и в state (для удобства).userData.userData — для постоянного хранения данных пользователя.
Текст, который будет отображен пользователю. Основной способ коммуникации с пользователем, так как именно этот текст пользователь увидит в интерфейсе.
Название текущего интента. Определяет следующий шаг диалога.
Текст, который пользователь может услышать. Для голосовых платформ, озвучка будет произведена силами самой платформы, для не голосовых платформ, поведение зависит непосредственно от реализации адаптера. Так для некоторых стандартных адаптеров, в случае заполнения поля и указания токена yandex SpeechKit, будет отправлен запрос на преобразование текста в аудиофайл, после чего аудиофайл будет отправлен пользователю.
Запрос пользователя в нижнем регистре.
Пользовательские данные, который были сохранены.
Пользовательские событий. Содержит информацию об авторизации или оценке.
Уникальный идентификатор пользователя.
Дополнительная информация о пользователе.
Пользовательский токен авторизации. Используется для авторизованных запросов (например, в Алисе).
Компонент для отображения различных кнопок пользователю. Позволяет создавать интерактивные элементы управления в приложении.
Компонент для отображения карточек пользователю. Позволяет создавать визуальные элементы с изображениями и текстом. Также при указании нескольких изображений, они автоматически преобразуются в карточку.
// КАТАЛОГ ТОВАРОВ (интернет-магазин):
this.text = 'Популярные товары:';
this.card
.addImage(
'http://localhost/iphone.jpg',
'iPhone 15 Pro',
'99 990 ₽\nЭкран 6.1", процессор A17 Pro'
)
.addButton('Купить')
.addImage(
'http://localhost/macbook.jpg',
'MacBook Air M2',
'124 990 ₽\n13.6", 8ГБ RAM, 256ГБ SSD'
)
.addButton('Купить');
// ГАЛЕРЕЯ ФОТОГРАФИЙ:
this.text = 'Наши работы:';
this.card
.addImage('photo1.jpg', 'Свадьба', 'Иван и Мария')
.addImage('photo2.jpg', 'Выпускной', 'Школа №123')
.addImage('photo3.jpg', 'Корпоратив', 'Компания "Рога и копыта"');
// КАРТОЧКИ НОВОСТЕЙ:
this.card
.addImage(
'news1.jpg',
'Новое обновление',
'Добавлена оплата картой и доставка',
{
title: 'Перейти',
url: 'http://localhost/news/1'
}
)
Обработанный NLU (Natural Language Understanding). Содержит результаты обработки естественного языка, как правило, данные заполняются самой платформой.
Компонент для работы со звуками. Позволяет добавлять звуковые эффекты и музыку. Используется вместе с tts.
Protected_Запуск обработки пользовательских команд с учетом метрик.
Protected_Извлекает нужную команду из запроса.
найденная команда или null если не удалось найти команду
Protected_Находит нужный интент по тексту запроса.
Текст запроса
Название интента или null
Protected_Обработка команд, добавленных через slots
OptionalisCommand: booleanOptionalisStep: booleanОчищает все временные данные необходимые для отправки ответа.
Флаг возвращающий информацию о том, были ли инициализированы кнопки или нет
Флаг возвращающий информацию о том, были ли инициализированы карточки или нет
Флаг возвращающий информацию о том, были ли инициализирован nlu или нет
Флаг возвращающий информацию о том, были ли инициализированы звуки или нет
Основной метод обработки запроса, вызываемый автоматически фреймворком.
Может быть асинхронным
КРАТКИЙ ОБЗОР РАБОТЫ:
run() определяет тип запроса (команда/интент/шаг)action() с результатомtext, buttons, card)ЧТО НЕ НУЖНО ДЕЛАТЬ:
run() вручную в своем кодеaction() для своей логикиПОСЛЕДОВАТЕЛЬНОСТЬ ОБРАБОТКИ ВНУТРИ run():
run()
├── Шаг 1: Проверяет есть ли активный шаг
│ → Если есть → вызывает action(stepName, false, true)
├── Шаг 2: Ищет команду
│ → Если нашел → вызывает action(commandName, true, false)
├── Шаг 3: Ищет интент
│ → Если нашел → вызывает action(intentName, false, false)
└── Шаг 4: Если ничего не нашел → Fallback команда
// ВАШ КОД (контроллер):
class MyController extends BotController {
public action(intentName: string | null): void {
// Ваша логика здесь
this.text = "Ответ пользователю";
}
}
// КОД ФРЕЙМВОРКА (не ваш):
// Когда приходит запрос от пользователя:
const controller = new MyController();
{...}; // Наполняет контроллер данными. Как правило, этим занимается адаптер платформы
await controller.run(); // Автоматически вызывает ваш action()
const response = ...; // Адаптер формирует ответ в зависимости от состояния контроллера
Контроллер для обработки запросов приложения по умолчанию. Используется в качестве контроллера по умолчанию, и позволяет не создавать свой контроллер, если вся обработка команд или шагов осуществляется через bot.addCommand или bot.addStep.
Контроллер из коробки обрабатывает стандартные команды (приветствие и помощь), а также сценарий, когда ни одна из команд не была найдена. Обработка базовых механик происходит только в том случае, если не была обработана ни одна команда или шаг.