AbstractКонструктор базового адаптера платформы.
OptionalplatformToken: stringТокен платформы (опционально)
OptionaladditionalPlatformOptions: IAdapterOptionsДополнительные опции платформы (опционально)
Protected Optional_platformOptionsProtected Optional_tokenOptionalappContextКонтекст приложения
Голосовая ли платформа (TTS-ответ в теле HTTP). Чат-платформы переопределяют на false.
Лимит запросов/сек для входящего rateLimiter; null — не ограничивать. Переопределяется адаптером платформы.
ProtectedMAX_TIME_REQUESTМаксимальное время обработки запроса в миллисекундах: при его превышении в лог записывается ошибка (ответ платформе при этом не модифицируется)
Имя платформы
OptionalsignatureNameИмя поля в заголовке запроса, по которому можно проверить корректность полученного запроса от платформы.
Универсальные события (TEventType), которые этот адаптер может выставить
в controller.eventType.
Источник знания для валидации bot.addEvent(...): обработчик на событие,
которое ни один подключённый адаптер не поддерживает, — почти всегда
опечатка, и о ней предупреждают при регистрации. Таблица живёт у адаптера,
а не в ядре: кастомная платформа, унаследованная от BasePlatform,
объявляет собственный перечень и автоматически участвует в проверке.
Для кастомных платформ: перечислите события, которые ваш setQueryData
реально записывает в controller.eventType:
class MyPlatformAdapter extends BasePlatform {
supportedEvents: readonly TEventType[] = ['message', 'photo', 'callback'];
// ...
}
Если платформа умеет только текст — поле можно не трогать: базовое значение
['message'] уже корректно. Событий вне TEventType (например, платформенная
«покупка») в валидации не участвуют — их можно отслеживать в action() по
requestObject.
Базовое значение — только 'message': самый минимум, верный для любой
платформы. Встроенные адаптеры переопределяют поле (Telegram — медиа и
callback/inline, VK — callback, MAX — start/edited и т.д.).
ProtectedWARNING_TIME_REQUESTПорог предупреждения в миллисекундах: при его превышении в лог записывается warning
Protected_initTTSProtectedИнициализирует TTS (Text-to-Speech) в контроллере. Обрабатывает звуки и стандартные звуковые эффекты
Контроллер приложения
Protected_timeLimitLogПри превышении допустимого времени обработки запроса логирует информацию.
Вызывается вручную в конце getContent() голосовых адаптеров (Alisa, Marusia, SmartApp);
адаптеры чат-платформ его не вызывают.
>= WARNING_TIME_REQUEST (по умолчанию 2000 мс) — warning в лог.>= MAX_TIME_REQUEST (по умолчанию 2900 мс) — текст ошибки пишется
в controller.platformOptions.error (не в лог).Пороги вынесены в protected поля — при необходимости переопределите в потомке.
Создаёт API-фасад платформы для controller.api — унифицированный доступ
к исходящим возможностям платформы (sendPhoto, answerCallback и т.д.).
Базовая реализация возвращает null: фасад считается недоступным. Ядро
подключает фасад к контроллеру только у адаптеров, переопределивших этот
метод, — поэтому добавить фасад своей платформе можно без правок ядра.
Для кастомных платформ: если платформа умеет исходящие API-вызовы
(отправка медиа, ответ на callback-кнопку), переопределите метод и
верните свой фасад IControllerApi. Удобно завернуть готовую фабрику
и дополнить её, либо собрать фасад с нуля. Для голосовых платформ
(ответ формируется телом webhook) переопределять не нужно.
Контроллер текущего запроса (не используется базовой реализацией; доступен переопределяющим методам)
Фасад либо null, если для платформы он недоступен
Метод, который вызывается при уничтожении плагина. В данном методе можно добавить отписку, либо выполнить другие действия.
Основной класс приложения
AbstractgetContentФормирует тело ответа для отправки пользователю.
Возвращает платформо-специфичный ответ (например, JSON для Алисы).
Для платформ, которые отправляют ответ напрямую (например, Telegram через sendMessage),
метод может возвращать строку 'ok' или объект.
контроллер с готовым ответом
OptionalstateData: Record<string, unknown> | nullданные для локального хранилища
ответ в формате, понятном платформе
Получает данные из локального хранилища платформы.
контроллер приложения
данные, сохранённые ранее
Получает время выполнения запроса в миллисекундах
Время выполнения запроса
Генерирует пример входящего запроса для локального тестирования вашего приложения. Позволяет эмулировать запрос от платформы с заданным текстом, ID пользователя, номером сообщения и состоянием. Необходимо указывать для того, чтобы можно было корректно проверить работоспособность приложения.
Обязательно определите метод, если планируется тестирование приложения через инструменты предоставляемые платформой. Это существенно упростит процесс разработки приложения.
Запрос пользователя
Идентификатор пользователя
Порядковый номер запроса
Данные из локального хранилища
Пример входящего запроса платформы (Record)
Формирует ответ на запрос оценки (по умолчанию — обычный ответ getContent; спец-формат — например, SmartApp).
контроллер приложения
Инициализация адаптера. Определять не обязательно. Стоит указывать в случаях, когда нужно выполнить доп логику, например указать токены или писать какую-то статистику по использованию.
Контекст приложения
Проверяет полученный запрос от платформы на корректность. Из коробки проверка идет по sha256-hmac и включается только если одновременно заданы:
appConfig.tokens[<platformName>].token — секретный ключthis.signatureName — имя http-заголовка с подписьюЕсли хотя бы один из этих параметров не задан, метод вернёт true без проверки — это opt-in механизм.
⚠️ Важно: не все платформы используют HMAC-SHA256 от тела. Переопределите этот метод в адаптере платформы, если её формат подписи отличается:
x-telegram-bot-api-secret-token).x-viber-content-signature как HMAC-SHA256(auth_token, body)).secret из тела запроса с secret_key из конфигурации
(plain-сравнение через timingSafeEqual, без HMAC).x-max-bot-api-secret со значением webhook-secret
(options.secret / tokens.max_app.webhookSecret).signatureName.Объект запроса от платформы
Optionalheaders: Record<string, unknown>HTTP-заголовки запроса
true — запрос валиден / проверка не включена, false — подпись не сошлась или отсутствует.
Указывает, поддерживает ли платформа локальное хранилище.
контроллер приложения
true, если локальное хранилище доступно
AbstractisPlatformOnQueryВозвращает признак того, соответствует ли запрос текущей платформе или нет
Запрос, который пришел в приложение
Optionalheaders: Record<string, unknown>Заголовок с которым был отправлен запрос
true, если запрос относится к этой платформе, иначе false
Проверка подписи включена, когда выполнены оба условия базовой HMAC-схемы:
задан секрет платформы и имя заголовка подписи. Платформы, переопределившие
isCorrectQuery (Telegram, VK, MAX), переопределяют и этот метод —
источник секрета у них другой (webhookSecret / secret_key).
Используется ядром при старте для предупреждения о вебхуке без защиты.
Отправка текста пользователю
Этот метод используется для активных рассылок — когда голосовой навык или чат-бот инициирует диалог первым (например, уведомление).
В методе реализована механика преобразования текстового значения controllerOrText в контроллер, а также базовый механизм для отправки ответа.
Переопределять данный метод не рекомендуется. Переопределить стоит только в том случае, если по каким-то технических условиям текущая реализация метода вам не подходит.
Если платформа не поддерживает возможность начать диалог самостоятельно, то можно оставить метод пустым, либо вывести любую заглушку.
Ид пользователя, которому нужно отправить сообщение
Контроллер приложения или текст. Если необходимо отправить просто текст, можно передать строку, в случае, если необходимо передать картинку звук и тд, то необходимо корректно заполнить контроллер.
Результат getContent() — ответ в формате платформы (TContent), либо boolean для платформ без рассылки
Сохраняет данные в локальное хранилище платформы.
данные для сохранения
контроллер приложения
AbstractsetQueryDataОбрабатывает входящий запрос и заполняет контроллер данными.
Обязательно установите:
controller.userCommand и controller.originalUserCommand — текст сообщения пользователяcontroller.userId — уникальный ID пользователяcontroller.appType = this.platformNameОпционально:
controller.userToken — если платформа присылает токен авторизацииcontroller.userMeta — если платформа присылает метаданныеcontroller.state — если платформа поддерживает локальное хранилищеcontroller.nlu — если платформа присылает NLU/интенты (через controller.nlu.setNlu(...))Запрос от платформы
Контроллер приложения
false, если запрос повреждён или не может быть обработан; иначе true
Дополнительная обработка для звуков. В данном методе стоит реализовать логику, с помощью которой будут наложены дополнительные эффекты для озвучивания текста пользователю
Контроллер бота
Публичная точка входа для сброса времени начала обработки запроса. Вызывайте перед началом бизнес-логики, чтобы метрики (см. getProcessingTime) считались отсюда.
StaticisVoiceМетод-флаг: указывает, что платформа голосовая (например, Алиса, Маруся).
Базовый адаптер для создания голосовых навыков и чат-ботов для собственной платформы (WeChat, WhatsApp, Slack и др.).
Чтобы подключить другую платформу, которая не поставляется из коробки, унаследуйтесь от класса и реализуйте все абстрактные методы. Адаптер автоматически зарегистрируется в системе при подключении через
bot.use(new MyPlatformAdapter()).=== Обязательные методы ===
controllerданными=== Опциональные ===
See