Как навык Алисы запоминает пользователя: 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 остаётся тем же, различия берёт на себя адаптер.

Куда дальше

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

Две новые функциональности для разработки

Две новые функциональности для разработки

На платформе Яндекс.Диалоги стали доступны две новые функциональности: приватные навыки и шаринг. Они помогут вам при разработке и тестировании навыков.

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

Мониторинг — новый раздел консоли разработчика для эффективной поддержки навыков умного дома

Мониторинг — новый раздел консоли разработчика для эффективной поддержки навыков умного дома

У разработчиков появилась возможность мониторинга навыков для умного дома. В консоли разработчиков, добавлен новый раздел Мониторинг.

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

Яндекс.Станцию теперь можно взять на тест-драйв

Яндекс.Станцию теперь можно взять на тест-драйв

Яндекс стал бесплатно выдавать Станции на две недели, чтобы люди могли опробовать их дома. Если умная колонка с Алисой придётся по душе, её можно купить и оставить себе, а если нет — вернуть обратно.

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

Датчики в Умном доме с Алисой: новый API

Датчики в Умном доме с Алисой: новый API

Мы рады анонсировать большое обновление умного дома Яндекса — сервис уведомлений о событиях и его API.

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

Оплаты в навыках Алисы: успешный кейс и продолжение тестирования

Оплаты в навыках Алисы: успешный кейс и продолжение тестирования

Недавно на платформе Яндекс произошел важный запуск: в навыке «Аудиокниги ЛитРес» появилась возможность не только прослушивать, но и оплачивать аудиокниги.

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

Комментарии

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

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

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

Телефон:

+7(909) 281 35-20

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

info@maxim-m.ru

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

ВверхВверх 👆