Переменные и память диалога
Всё, что бот узнаёт по ходу разговора (номер карты, выбранный продукт, ответ внешней системы), хранится в переменных. У каждой переменной есть хранилище, которое определяет, как долго она живёт и кому видна.
| Хранилище | Как долго живёт | Для чего | Пример |
|---|---|---|---|
temp | До конца текущего процесса: сбрасывается, когда процесс завершается или клиент возвращается в начало | Промежуточные данные одного сценария: введённые цифры, результат проверки, ответ API | temp.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. - Очищайте то, что больше не нужно: действие «Удалить переменную» или сброс сессии в конце сценария.