Конструктор базового адаптера платформы.
OptionalplatformToken: stringТокен платформы (опционально)
OptionaladditionalPlatformOptions: IAdapterOptionsДополнительные опции платформы (опционально)
Protected Optional_platformOptionsProtected Optional_tokenOptionalappContextКонтекст приложения
Голосовая ли платформа (TTS-ответ в теле HTTP). Чат-платформы переопределяют на false.
Лимит запросов/сек для входящего rateLimiter; null — не ограничивать. Переопределяется адаптером платформы.
ProtectedMAX_TIME_REQUESTМаксимальное время обработки запроса в миллисекундах: при его превышении в лог записывается ошибка (ответ платформе при этом не модифицируется)
Идентификатор платформы Маруся.
OptionalsignatureNameИмя поля в заголовке запроса, по которому можно проверить корректность полученного запроса от платформы.
Универсальные события Маруси: текстовые сообщения и привязка аккаунта (auth).
ProtectedWARNING_TIME_REQUESTПорог предупреждения в миллисекундах: при его превышении в лог записывается warning
Protected_getResponseФормирует ответ для пользователя. Собирает текст, TTS, карточки и кнопки в единый объект ответа
Контроллер приложения
Объект ответа для Маруси
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, если для платформы он недоступен
Метод, который вызывается при уничтожении плагина. В данном методе можно добавить отписку, либо выполнить другие действия.
Основной класс приложения
Формирует итоговый webhook-ответ Маруси: версию протокола, response, данные сессии и выбранное state-хранилище (с проверкой лимита байт).
Контроллер приложения
OptionalstateData: Record<string, unknown> | nullСостояние для сохранения (user/session)
Готовый ответ для webhook Маруси
Возвращает состояние из request.state (user/session).
Контроллер приложения
Получает время выполнения запроса в миллисекундах
Время выполнения запроса
Формирует пример webhook-запроса Маруси для локального тестирования (BotTest).
Текст команды пользователя
Идентификатор пользователя
Номер сообщения в сессии (0 — новая сессия)
Состояние (session/user) для подстановки в запрос
Заготовка запроса в формате webhook Маруси
Формирует ответ на запрос оценки (по умолчанию — обычный ответ 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, если состояние есть (не null)
Проверяет, что входящий webhook-запрос принадлежит Марусе.
Отличает Марусю от Алисы по заголовку подписи, meta.client_id и виду
session.application.application_id.
Входящий webhook-запрос
Optionalheaders: Record<string, unknown>Заголовки HTTP-запроса (проверяется подпись x-marusia-signature)
true, если запрос относится к платформе Маруся
Проверка подписи включена, когда выполнены оба условия базовой HMAC-схемы:
задан секрет платформы и имя заголовка подписи. Платформы, переопределившие
isCorrectQuery (Telegram, VK, MAX), переопределяют и этот метод —
источник секрета у них другой (webhookSecret / secret_key).
Используется ядром при старте для предупреждения о вебхуке без защиты.
Маруся не поддерживает push-сообщения, поэтому всегда возвращает false.
Сохраняет данные в локальное хранилище платформы.
данные для сохранения
контроллер приложения
Разбирает запрос Маруси и наполняет контроллер данными: команда, NLU, идентификатор пользователя, состояние, метаданные, health-check ping.
Входящий webhook-запрос Маруси
Контроллер приложения
true, если запрос успешно разобран
Обрабатывает TTS через импортируемую функцию soundProcessing
из ./Sound: подставляет стандартные звуки (эффекты не поддерживаются).
Контроллер приложения
Публичная точка входа для сброса времени начала обработки запроса. Вызывайте перед началом бизнес-логики, чтобы метрики (см. getProcessingTime) считались отсюда.
StaticisVoiceМетод-флаг: указывает, что платформа голосовая (например, Алиса, Маруся).
Адаптер, обеспечивающий полную поддержку платформы Маруси от ВК. Позволяет разрабатывать навыки для Маруси на TypeScript с использованием всего функционала платформы: от обработки голосовых запросов до работы с карточками и кнопками.
Этот адаптер автоматически обрабатывает входящие вебхуки от Маруси, преобразует их в унифицированный формат фреймворка и формирует ответ, совместимый с требованиями платформы. Подключается одной строкой и не мешает работе других адаптеров (например, для Telegram или VK).
Поддерживает:
<speaker effect>(только стандартные звуки);ping→pong);Подключается как любой другой адаптер:
bot.use(new MarusiaAdapter(token)). Несколько адаптеров могут работать одновременно — система сама выберет подходящий на основе заголовков и структуры входящего запроса.Example
See