Теги
theme:
theme: — точка входа смартапа, в это состояние переходит система при запуске смартапа.
Тип значения
- string
Параметры
- none
Вложенные данные
- tags
Синтаксис
Объявление темы должно начинаться с символа /
:
theme:/Hello
Внутрь тега theme:
на первом уровне могут быть вложены только стейты.
Примеры значений
- без значения:
theme: /
state: start
q!: *
a: Начинаем!
- со значением:
theme: /Start
state: start
q!: *
a: Начинаем!
Значение /start
— это название theme:
. Указание любого значения в theme:
после символа /
или его отсутствие не оказывает влияния на код.
state:
state
— состояние смартапа. Стейты могут иметь вложенную структуру. Название стейта может быть как на русском, так и на английском языках.
Тип значения
- string
Параметры
noContext
(boolean) — по умолчаниюfalse
. Используется для регулирования контекста при переходе из одного стейта в другой.modal
(boolean) — по умолчанию false. Используется, когда от пользователя нужно получить важную информацию, без которой диалог не может продолжаться.
Вложенные данные
- tags
Синтаксис
Объявление стейта происходит следующим образом:
state: Hello
state: HowAreYou
Стейты могут быть родительскими Hello
и дочерними HowAreYou
. Дочерним называется стейт, который расположен внутри родительского стейта.
Параметры разделяйте пробелами:
state: MyState name with space || noContext=true
Примеры использования
Простой пример использования стейтов:
state: hello
q: *
a: Привет!
Пример использования флага noContext=true
.
Если нужно, чтобы система не поменяла контекст при переходе с помощью паттерна или интента в другой стейт, используйте флаг noContext=true
.
state: Правила
q!: $regex</start>
a: Игра больше-меньше. Загадаю число от 0 до 100, ты будешь отгадывать. Начнем?
go!: /Правила/Согласен?
state: Согласен?
state: Да
q: * да *
go!: /Игра
state: Нет
q: * нет *
a: Ну и ладно!
state: CatchAll || noContext=true
q: *
a: Я не понял
Если пользователь ввел сообщение отличное от да
или нет
, то активируется стейт CatchAll
.
Теперь поставим в этот стейт флаг noContext=true
, чтобы остаться в контексте стейта Правила
. Если написать боту нет
, то сработает стейт /Согласен?/Нет
и появится сообщение Ну и ладно!
.
Без флага noContext=true
пользователь не сможет перейти из стейта CatchAll
в стейт Правила
. Тогда если написать боту нет
, он ответит Я не понял
.
Пример использования флага modal=true
.
Флаг modal=true
не дает диалогу совершить переход из контекста модального стейта. Флаг активен на стейте, в котором он указан, и на вложенных в него стейтах на первом уровне вложенности. Запрос может попасть только в один из его вложенных стейтов. Если среди вложенных стейтов не предусмотрен ответ и отсутствует локальный CatchAll
, то система выдаст ошибку.
theme: /
state: FlightNumber || modal = true
q!: * (когда|прибывает*) * ~рейс *
a: Здравствуйте! Какой у вас номер рейса?
state: GetNumber
q: * $Number *
a: Ожидается прибытие рейса
go!: /WhatElse
state: LocalCatchAll
event: noMatch
a: Это не похоже на номер рейса. Попробуйте еще раз.
state: WhatElse
a: Чем еще я могу помочь?
state: City
q: * $City *
a: Вас интересуют рейсы из города {{$parseTree._City}}?
В этом сценарии пользователь хочет уточнить статус своего рейса, для этого от него требуется номер рейса. Флаг modal = true
предотвращает выход диалога из контекста вопроса о номере рейса до получения необходимой информации.
Если в запросе пользователя указан город, а в стейте FlightNumber
отсутствует флаг modal = true
, то сработает стейт City
. Таким образом, пользователь выйдет из сценария уточнения рейса и не получит необходимую информацию.
q!:
q!: (от англ. question — вопрос) после тега записывается паттерн. Глобальный тег, который обрабатывает запросы пользователя из любого места сценария. Этот тег работает как с паттернами, так и с примерами фраз.
Тип значения
- multiline string
Параметры
- none
Вложенные данные
- multiline data
Примеры значений
theme: /
state:
q!: *
a: Здравствуй мир!
theme: /
state: start
q!: * *start
a: Привет!
q:
q: — (от англ. question — вопрос ) после тега записывается паттерн. Это локальный тег, переход по которому возможен из ближайшего родительского, из любого дочернего (в т.ч. из дочерних соседних стейтов) или из соседнего стейта. Подробнее — в разделе Как раб отают локальные теги.
Тип значения
- multiline string
Параметры
fromState
(string) — определяет стейт, из которого смартап может перейти по заданному паттерну.toState
(string) — определяет стейт, в который перейдет смартап при определении паттерна. При использовании параметра, паттерн, заданный в теге, будет срабатывать только в контексте текущего стейта. При переходе выполняются все реакции заданного стейта (аналогично тегу go!:).onlyThisState
(boolean) — при флагеtrue
переход в стейт может быть совершен только из указанного в параметреfromState
состояния, но не из его дочерних стейтов. По умолчаниюfalse
.
Например:
theme: /Test
state: Как дела
q!: как {(твои/у тебя) дел*}
a: А ты как?
state: Хорошо || modal = true
q: хорошо [$andYou]
q: супер || fromState = /Test, onlyThisState = true
a: Ты из какого города?
Вложенные данные
- multiline data
Примеры значений
state:
q: $Yes
a: Я могу вам помочь?
Синтаксис
- Если тег имеет только один строковый параметр, кавычки можно опустить.
q: * $Yes *
- Параметры отделяются от значения симоволом
||
.
q: * $Yes * || fromState=/theme1
- Если параметр содержит пробелы, то он должен быть заключен в кавычки.
q: * $Yes * || toState=/theme1
q: * $Yes * || toState="/theme 1"
patterns:
patterns: — после тега объявляются именованные паттерны в sc-файле, они доступны для использования во всех файлах проекта.
Иногда для удобства все именованные паттерны выносят в отдельный sc-файл.
Тип значения
- none
Параметры
- none
Вложенные данные
- named patterns — особый вид вложенных данных
Синтаксис
-
Тег
patterns
имеет особый вид вложенных данных — список именованных паттернов. Структура тега следующая:patterns:
$<pattern name> = (pattern body | multiline body)
$<pattern name> = (pattern body) || converter=dateConverter -
Каждый вложенный элемент трактуется как определение нового именованного паттерна.
-
После знака
=
задается значение типа multiline string с опциональным атрибутом converter, имеющим тип string. -
Для объявления и обращения к именованному паттерну используют
$
q!: $<pattern name>
q: $<pattern name>