Перейти к основному содержимому
Версия: 3.0

Переменные и память диалога

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

ХранилищеКак долго живётДля чегоПример
tempДо конца текущего процесса: сбрасывается, когда процесс завершается или клиент возвращается в началоПромежуточные данные одного сценария: введённые цифры, результат проверки, ответ APItemp.card, temp.valid, temp.response
sessionПока идёт сессия клиента: по умолчанию 30 минут без сообщений (dialog.sessionTimeoutInterval)То, что нужно нескольким процессам в одном разговоре: «поздоровались», выбранный язык, идентификатор обращенияsession.greeted, session.topic
userПостоянно, у каждого клиента своё; администратор может задать срок хранения отдельных полей (dataRetention)Данные клиента между разговорами: имя, согласие на рассылку, предпочтенияuser.name, user.language
botПостоянно, общее для всех клиентов бота; читается при каждом сообщении, записывается только действием «Задать глобальную переменную»Общие настройки сценария: идёт ли акция, режим работы, адрес внешней системыbot.promoActive

Как записать значение​

  • Действие «Задать переменную» (builtin/setVariable) в звене: выберите хранилище, имя и значение. Значение может быть текстом, числом или шаблоном, например {{event.preview}} (последнее сообщение клиента) или {{event.nlu.slots.amount.value}}. Подробнее о действиях в разделе «Действия и хуки».
  • Навыки записывают результат сами: «Вызов API» и «ИИ-агент» кладут ответ в переменную, которую вы указали на вкладке «Ответ» (по умолчанию temp.response), «Заполнение слота» сохраняет значение слота в session, «Выбор» записывает выбранный вариант в переменную с указанным именем.
  • Собственное действие пишет напрямую: temp.total = 100, event.state.user.name = 'Анна'.
  • Глобальные переменные бота задаются действиями «Задать глобальную переменную» (с необязательным сроком хранения) и читаются «Получить глобальную переменную», которое копирует значение в temp.

Как использовать значение​

  • В тексте сообщения: двойные фигурные скобки, По карте …{{temp.card}} доступно {{temp.response.body.balance}} ₽. Так же подставляются переменные в параметры навыков и действий.
  • В условии перехода: вариант «Если соответствует параметрам» (хранилище, имя, выражение === 'да', > 1000) или выражение на JavaScript, например temp.valid && temp.response.status === 200.
  • В действии: обычные объекты JavaScript, event.state.temp, event.state.session, event.state.user; короткие имена temp, session, user, bot доступны прямо в коде действия.

Что ещё помнит платформа​

  • Контекст процесса (event.state.context): текущий процесс и звено, точки возврата. Платформа ведёт его сама; условия переходов к нему не обращаются.
  • История последних реплик (session.lastMessages): кто что сказал и откуда взялся ответ (процесс, QnA, ИИ-агент). Её используют звено «ИИ-агент» (вкладка «История диалога») и автотесты.
  • Сброс: действие «Сбросить сессию» очищает temp и session; тайм-аут (dialog.timeoutInterval, по умолчанию 25 минут без сообщений) возвращает клиента в начало процесса, см. «Тайм-ауты и ошибки».

Советы​

  • Не храните в переменных пароли и полные номера карт: содержимое user и session попадает в историю событий и журналы. В демонстрационном боте хранятся только четыре последние цифры.
  • Давайте переменным говорящие имена латиницей без пробелов: temp.cardLast4, а не temp.x.
  • Очищайте то, что больше не нужно: действие «Удалить переменную» или сброс сессии в конце сценария.