Как навык Алисы запоминает пользователя: state и база данных

Где хранить данные пользователя в навыке Алисы: session_state, application_state и user_state, лимит 1 КБ, частые ошибки и когда нужна своя база данных.

Как навык Алисы запоминает пользователя: state и база данных

26 Сентября, 2026 Автор: Максим М

Как навык Алисы запоминает пользователя: session_state, application_state, user_state и база данных

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

Почти любой навык сложнее «вопрос — ответ» должен что-то помнить: на каком шаге сценария пользователь, сколько очков набрал в игре, как его зовут, что он заказал в прошлый раз. Алиса умеет хранить такие данные сама — без сервера баз данных, прямо в запросах и ответах. Но у встроенного хранилища три уровня с разным временем жизни и жёсткий лимит объёма. Разберём, как это устроено, что выбрать под свою задачу и как работать с состоянием на TypeScript.

Как Алиса передаёт состояние

Навык не хранит связь с пользователем между запросами: каждая реплика — отдельный HTTP-запрос. Поэтому хранилище Алисы работает «по кругу»: навык возвращает данные в ответе, а платформа присылает их обратно в поле state следующего запроса. Чтобы это заработало, использование хранилища нужно включить в настройках навыка в консоли Яндекс.Диалогов.

Три уровня хранилища

Уровень Поле в ответе Сколько живёт Для чего подходит
Сессия session_state До конца текущего разговора с навыком Шаг сценария, текущий вопрос викторины, временный счёт
Приложение (устройство) application_state Между сессиями, привязано к конкретному устройству или приложению Настройки и прогресс, когда вход в аккаунт Яндекса не гарантирован
Пользователь user_state_update Между сессиями и устройствами, для авторизованного пользователя Яндекса Прогресс, который должен быть и на колонке, и в телефоне

Общее ограничение — объём: на каждый уровень приходится около 1 КБ данных. Этого хватает на номер шага, счёт и пару флагов, но не на историю заказов или список избранного.

Как работать с состоянием в umbot

В фреймворке umbot вам не нужно помнить названия полей и собирать их в ответ. Включите локальное хранилище в конфигурации — и работайте с обычным объектом userData:

import { Bot } from 'umbot';
import { AlisaAdapter } from 'umbot/plugins';

const bot = new Bot()
    .use(new AlisaAdapter())
    .setAppConfig({ isLocalStorage: true }); // хранить userData в хранилище Алисы

bot.addCommand('quiz_start', ['начать викторину', 'играть'], (_, bc) => {
    bc.userData.score = 0;
    bc.userData.question = 1;
    bc.text = 'Вопрос 1. Столица Австралии?';
    bc.buttons.addBtn('Сидней').addBtn('Канберра');
    bc.thisIntentName = 'quiz_answer';
});

bot.addStep('quiz_answer', (bc) => {
    if (bc.userCommand?.includes('канберра')) {
        bc.userData.score = Number(bc.userData.score) + 1;
    }
    bc.text = `Ваш счёт: ${bc.userData.score}.`;
    bc.thisIntentName = null;
});

bot.start('0.0.0.0', 3000);

Всё, что вы положили в userData, фреймворк сам отправит в хранилище Алисы и восстановит из следующего запроса. Текущий шаг сценария (thisIntentName) хранится там же. Уровень выбирается по тому, что прислала платформа, в порядке приоритета: пользователь → приложение → сессия, то есть данные живут так долго, как это позволяет конкретный запрос.

Три правила, о которые спотыкаются

  • Удаление поля. delete bc.userData.foo не сработает: платформа вернёт старое значение, потому что его никто не перезаписал. Чтобы очистить поле, присвойте null.
  • Превышение лимита. Если данные больше лимита или не сериализуются в JSON, поле состояния не отправляется, а прежнее значение на стороне Алисы остаётся. umbot пишет об этом ошибку в лог — следите за ним.
  • Платформа не прислала state. Например, использование хранилища не включено в консоли. Тогда umbot переключается на сессию в памяти процесса: навык продолжит работать, но данные пропадут при перезапуске сервера и не будут общими для нескольких экземпляров. Во время отладки обращайте внимание на предупреждение об этом в логе.
  • Незаконченный шаг из прошлой сессии. Если данные живут дольше сессии (уровни приложения и пользователя), вместе с ними сохраняется и текущий шаг сценария. Пользователь, бросивший викторину вчера, сегодня при запуске навыка попадёт сразу в ответ на вопрос. Чтобы начинать заново, в обработчике шага проверяйте начало сессии:
    bot.addStep('quiz_answer', (bc) => {
        if (bc.messageId === 0) {
            return false; // новая сессия — шаг пропускается, диалог начинается сначала
        }
        // ...обычная логика шага
    });

Когда нужна своя база данных

Встроенного хранилища не хватает, если:

  • данных больше 1 КБ: история, корзина, избранное, длинные тексты;
  • данные нужны вне навыка: в CRM, админке, аналитике — хранилище Алисы видит только сам навык в момент запроса;
  • навык работает ещё и в мессенджерах: у Telegram, VK и MAX своего хранилища нет, и состояние нужно держать на вашей стороне;
  • нужно, чтобы данные гарантированно пережили смену устройства без входа в аккаунт.

В umbot база подключается одним адаптером:

import { MongoAdapter } from 'umbot/plugins';

bot.use(new MongoAdapter({ host: 'mongodb://localhost:27017', database: 'skill' }));
bot.setAppConfig({ isLocalStorage: false }); // userData — только из БД

Для небольших проектов на одном сервере есть FileAdapter — хранение в файлах без отдельного сервера БД. Для serverless и нескольких экземпляров приложения файловое хранение не подходит: файловая система облачных функций доступна лишь на чтение, а у каждого экземпляра она своя — нужна внешняя база или хранилище платформы.

Гибридный вариант: БД и хранилище платформы одновременно

Иногда удобно разделить данные: долгоживущие (профиль, история) — в базе, короткоживущие (шаг текущего разговора) — в хранилище Алисы. Для этого подключают БД и оставляют isLocalStorage: true: тогда userData берётся из базы, а отдельный объект bc.state — из хранилища платформы. Подход используется редко, но хорош для навыков, где на каждый запрос не хочется ходить в базу ради номера шага.

Как выбрать: короткая шпаргалка

Ситуация Решение
Навык только для Алисы, мало данных Хранилище Алисы (isLocalStorage: true), без БД
Алиса + мессенджеры БД (MongoDB), isLocalStorage: false
Много данных или нужна аналитика БД
Serverless (Yandex Cloud Functions) Хранилище Алисы или внешняя БД, не файлы
Профиль в БД + шаг диалога без лишних запросов БД + isLocalStorage: true

Как проверить, что состояние сохраняется

Удобнее всего — локально, без публикации. Консольный режим BotTest с опцией isShowStorage показывает после каждой реплики, что навык запомнил о пользователе, а в автотестах состояние из ответа передаётся в следующий вызов simulate() — так же, как это делает Алиса. Подробно — в статье как тестировать навык Алисы без публикации.

Частые вопросы

Можно ли узнать, что это тот же пользователь, в новой сессии? Да, если пользователь вошёл в аккаунт Яндекса: у него есть постоянный идентификатор и хранилище пользовательского уровня. Без входа данные привязаны к устройству.

Надёжно ли хранить в state важные данные? Для служебных данных диалога — да. Для того, что нельзя терять (оплаты, заказы), нужна своя база: хранилище платформы вы не можете ни выгрузить, ни восстановить.

Работает ли то же самое в Марусе? У Маруси похожая модель хранилища; в umbot код с userData остаётся тем же, различия берёт на себя адаптер.

Куда дальше

Рекомендую к прочтению следующие статьи:

Новый способ монетизации - возможность подключить рекламу в навыках

Новый способ монетизации - возможность подключить рекламу в навыках

Яндекс продолжает развивать возможности монетизации голосовых приложений, чтобы разработчики могли получать дополнительный доход. Теперь в навыках Яндекс.Диалогов появилась возможность подключить рекламу и зарабатывать на показах мини-баннеров.

Читать статью

10 интересных вещей о Google Assistant

10 интересных вещей о Google Assistant

Сегодня мы рассмотрим 10 действенных способов максимально использовать Google Assistant на различных устройствах.

Читать статью

Алиса комментирует музыку, которую вы слушаете

Алиса комментирует музыку, которую вы слушаете

В «Яндекс.Музыке» появился умный плейлист от «Алисы». Теперь Алиса даст свои ироничные и веселы комментарии к вашим любимым песням.

Читать статью

Открыт предзаказ «Яндекс.Станции Мини»

Открыт предзаказ «Яндекс.Станции Мини»

Компания "Яндекс" объявила о старте приема предварительных заказов на умную колонку "Станция Мини". В широкую продажу девайс поступит 31 октября - купить колонку можно будет в "Связном" и маркетплейсе "Беру".

Читать статью

Утреннее шоу «Алисы» от «Яндекса» теперь можно персонализировать

Утреннее шоу «Алисы» от «Яндекса» теперь можно персонализировать

Яндекс добавил возможность персональной настройки утреннего шоу голосового помощника «Алиса».

Читать статью

Комментарии

Оставить комментарий

Как со мной связаться?

Свяжитесь со мной по любому поводу!
Я с радостью отвечу на все вопросы!

Телефон:

+7(909) 281 35-20

Дополнительная почта:

info@maxim-m.ru

Я в социальных сетях:

ВверхВверх 👆