Сведения о компонентах и каскадных диалогах

ПРИМЕНИМО К: Пакет SDK версии 4

Диалоги бывают несколькими различными типами. В этой статье описываются диалоговые окна компонентов, каскадов и запросов. Общие сведения о диалоговых окнах см. в статье библиотеки диалогов . Сведения о адаптивных диалогах см. в разделе "Введение в адаптивные диалоги".

Каскадное диалоговое окно (или каскадное) определяет последовательность шагов, позволяя боту направлять пользователя через линейный процесс. Эти диалоги предназначены для работы в контексте диалогового окна компонента.

Диалоговое окно компонента — это тип диалогового окна контейнера, который позволяет диалогам в наборе вызывать другие диалоги в наборе, например каскадное диалоговое окно, вызывающее диалоговые окна или другой каскадный диалог. Диалоги компонентов управляют набором дочерних диалогов, таких как каскадные диалоги, запросы и т. д. Вы можете разработать диалоговое окно компонента для обработки определенных задач и повторного его использования в одном боте или нескольких ботах.

Диалоговые окна ( запросы) — это диалоги, предназначенные для запроса пользователя определенных типов сведений, таких как число, дата или имя и т. д. Запросы предназначены для работы с каскадными диалогами в диалоговом окне компонента.

Компонентные диалоги

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

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

Каскадные диалоги

Каскадным диалогом называют особую реализацию диалога, которая часто используется для сбора информации от пользователя или предоставления пользователю инструкций по выполнению ряда задач. Каждый шаг диалога реализуется как асинхронная функция, которая принимает параметр контекста каскадного шага (step). На каждом шаге бот запрашивает у пользователя ввод ( или может начать дочернее диалоговое окно, но часто это запрос), ожидает ответа, а затем передает результат следующему шагу. Результат выполнения первой функции передается в виде аргумента следующую функцию и т. д.

На следующей диаграмме показана последовательность шагов каскада и выполняемых операций стека. Сведения об использовании стека диалогов см. ниже в разделе об использовании диалогов.

Представление того, как сообщения сопоставляют каскадные шаги.

При выполнении шагов каскадного диалога сохраняется соответствующий контекст. Контекст шага аналогичен контексту диалогового окна и предоставляет доступ к текущему контексту и состоянию поворота. Контекстный объект шага каскада используется для взаимодействия с набором диалогов из шага каскада.

Значение, возвращаемое диалогом, можно обрабатывать в другом каскадном шаге этого же диалога или в основном обработчике шагов бота. Обычно достаточно только проверить состояние результата шага диалога, полученное от логики обработчика шагов. Внутри шага каскада диалог возвращает значение в контексте шага каскада в виде свойства result.

Свойства контекста для каскадного шага

Контекст каскадного шага содержит следующие свойства:

  • Параметры — входные данные для диалога.
  • Значения — сведения, которые можно добавить в контекст и передать в последующие шаги.
  • Результат — результат, полученный от предыдущего шага.

Кроме того, следующий метод (NextAsync в C#, далее в JavaScript и Python) продолжает следующий шаг каскадного диалога в том же шаге, что позволяет боту пропустить определенный шаг при необходимости.

Запросы

Запросы из библиотеки диалогов — это простой способ запросить у пользователя определенные сведения и оценить ответы. Например, для запроса на номер указывается вопрос или сведения, которые вы запрашиваете, и запрос автоматически проверяет, получил ли он допустимый номер ответа. Если это так, беседа может продолжиться; Если это не так, он передаст пользователю допустимый ответ.

Запросы данных, по сути, являются диалогами из двух этапов. Сначала запрос предлагает ввести данные, а затем возвращает допустимое значение или повторяет цикл запроса.

Запросы имеют параметры запроса, которые предоставляются при вызове запроса. Они позволяют указать текст для строки приглашения, строку повторного запроса при неудачной проверке и варианты ответа на запрос. Как правило, свойства запроса и повторных попыток представляют собой действия, хотя есть некоторые варианты того, как это обрабатывается на разных языках программирования.

Кроме того, вы можете добавить в запрос пользовательские проверки при его создании. Предположим, что мы хотим узнать размер компании с помощью запроса числа, но этот размер будет ограничен значениями от 2 до 12. Запрос сначала проверяет, получено ли оно допустимое число, а затем выполняет пользовательскую проверку, если она указана. Если пользовательская проверка завершается сбоем, пользователь будет повторно просвещен, как показано выше.

Завершенный запрос явным образом возвращает значение, которое было запрошено. При возвращении этого значения можно убедиться, что он прошел как встроенную проверку запроса, так и любые дополнительные пользовательские проверки, которые могли быть предоставлены.

Примеры разных запросов и их использования см. в руководстве по сбору вводимых пользователем данных с помощью библиотеки диалогов.

Типы запросов

Запросы данных, по сути, являются диалогами из двух этапов. Во-первых, запрос запрашивает ввод; во-вторых, возвращает допустимое значение или перезапускается из верхней части с повторным выпуском. Библиотека диалогов предлагает различные базовые запросы, каждый из которых используется для сбора различных типов ответов. Базовые запросы могут интерпретировать входные данные на естественном языке, например числа "ten" (десять) или "a dozen" (дюжина) и указания времени "tomorrow" (завтра) или "Friday at 10am" (в 10 вечера в пятницу).

prompt Описание Результаты
Запрос вложений Предложение передать одно или несколько вложений, например документов или изображений. Коллекция объектов вложений.
Запрос выбора Предложение выбрать один параметр из набора. Объект найденного выбора.
Запрос подтверждения Запрашивается подтверждение. Значение типа Boolean.
Запрос даты и времени Предложение ввести дату и (или) время. Коллекция объектов разрешения даты и времени.
Запрос числа Предложение ввести число. Числовое значение.
Запрос текста Предложение ввести входные данные в простом текстовом виде. Строка.

Чтобы запросить ввод данных от пользователя, определите запрос на основе одного из встроенных классов, например текстового запроса, и добавьте этот запрос в набор диалогов. Запросы имеют фиксированное идентификаторы, уникальные в пределах набора диалогов. Для каждого запроса вы можете создать пользовательский проверяющий элемент управления, а для некоторых — еще и указать языковой стандарт по умолчанию.

Языковой стандарт для запроса

Языковой стандарт используется для определения поведения, зависящего от языка, в запросах выбора, подтверждения, даты и времени и числа. Для каждого полученного от пользователя сообщения действует следующее правило: если канал передает в сообщении языковой стандарт, то используется именно он. Если для запроса задан языковой стандарт по умолчанию при вызове конструктора строки или позднее, то используется именно он. Если ни ни из этих языковых стандартов не указаны, английский ("en-us") используется в качестве языкового стандарта.

Языковой стандарт представляет собой код ISO 639 с двумя, тремя или четырьмя символами, представляющими языковой стандарт или семейство языков.

Параметры запроса

Второй параметр для метода prompt контекста шага принимает объект аргументов запроса с указанными ниже свойствами.

Свойство Описание
Prompt Исходное действие, отправляемое пользователю для получения входных данных.
Retry Prompt Действие для отправки пользователя, если их первые входные данные не были проверены.
Choices Список вариантов, из которых может выбрать пользователь при использовании запроса выбора.
Validations Дополнительные параметры для пользовательского проверяющего элемента управления.
Style Определяет, как варианты запроса выбора или подтверждения будут отображаться пользователю.

Всегда следует указывать начальное действие запроса для отправки пользователю, а запрос повтора для экземпляров, когда входные данные пользователя не проверяются.

Если входные данные пользователя недопустимы, запрос повтора отправляется пользователю; Если не указана повторная попытка, используется начальный запрос. Тем не менее если действие отправляется пользователю из проверяющего элемента управления, запрос повторной попытки не отправляется.

Проверка запроса

Вы можете проверить ответ на запрос, прежде чем значение будет возвращено на следующем шаге каскада. Функция проверяющего элемента управления принимает параметр контекста проверяющего элемента управления запроса и возвращает логическое значение, которое подтверждает успешное прохождение проверки для входных данных. Контекст проверяющего элемента управления запроса поддерживает указанные ниже свойства.

Свойство Описание
Контекст Текущий контекст реплики для бота.
Recognized Результат распознавателя запроса, который содержит сведения о входных данных после обработки распознавателем.
Параметры Содержит варианты выбора для запроса, предоставленные в вызове, который запускал этот запрос.

Результат распознавателя запроса имеет описанные ниже свойства.

Свойство Описание
Успешно Указывает, смог ли распознаватель успешно выполнить синтаксический анализ входных данных.
Значение Возвращаемое распознавателем значение. При необходимости это значение можно изменять в коде проверки.

Использование диалогов

Диалоги можно рассматривать как структуру программного стека, который называется стеком диалогов. Управление стеком выполняет обработчик шагов диалога, и он же вызывается при пустом стеке. Самый верхний элемент в этом стеке считается активным диалогом, а контекст диалога направляет все входные данные в активное диалоговое окно.

Когда начинается диалоговое окно, оно помещается в стек и теперь является активным диалогом. Он остается активным диалогом до тех пор, пока он не закончится, он удаляется методом замены или другим диалогом помещается в стек (с помощью обработчика поворота или активного диалога) и становится активным диалогом. Когда новый диалог закончится, он выскочил из стека, а следующий диалог снова становится активным. Это позволяет повторять или разветвлять диалог, как описано ниже.

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

Для доступа к состоянию диалогового окна методу выполнения требуется метод доступа к свойству состояния состояния. Этот метод доступа создается и используется так же, как другие методы доступа к состоянию, но является свойством самого себя, основанным на состоянии диалога. См. дополнительные сведения об управлении состоянием, а также о последовательном потоке диалога.

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

Начало диалога

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

  • Запрос и методы запуска диалогов будут отправлять новый экземпляр диалогового окна, на который ссылается ссылка, в начало стека.
  • С помощью метода replace dialog текущий диалог извлекается из стека и в стек помещается новый диалог. Замененный диалог будет отменен, а все сведения, содержащиеся в этом экземпляре, удалены.

Используйте параметр options для передачи сведений в новый экземпляр диалога. Параметры, передаваемые в новый диалог, можно получить из контекста шага с помощью свойства options на любом шаге диалога. Дополнительные сведения см. в статье о создании расширенного потока общения с помощью ветвей и циклов.

Продолжение диалога

В каскадном диалоговом окне используйте свойство значений контекста шага для сохранения состояния между поворотами. Любое значение, добавляемое в эту коллекцию на предыдущем шаге, будет доступно на следующих шагах. Дополнительные сведения см. в статье о создании расширенного потока общения с помощью ветвей и циклов.

Завершение диалога

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

Вы можете вызвать метод end из любого места в контексте диалогов, но для бота этот вызов всегда будет выглядеть как поступивший из текущего активного диалога.

Совет

Рекомендуется явно вызвать метод завершения диалога в конце диалога.

Очистка всех диалогов

Если нужно извлечь все диалоги из стека, можно очистись стек диалога, вызвав метод cancel all dialogs для контекста диалога.

Повторение диалога

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

Примечание

Если вам нужно сохранить внутреннее состояние текущего диалога, передайте сведения новому экземпляру диалога в вызове метода replace dialog, а затем соответствующим образом инициализируйте этот диалог.

Ветвление диалога

Контекст диалога поддерживает стек диалогов и помнит следующий шаг для каждого диалога в стеке. Его метод begin dialog создает дочерний диалог и помещает его на вершину стека, а метод end dialog извлекает из стека верхний диалог. End dialog обычно вызывается из диалога, работу которого нужно завершить.

Диалог может начать новый диалог внутри того же набора диалогов, вызвав метод begin dialog контекста диалога и указав идентификатор нового диалога. При этом новый диалог становится текущим активным диалогом. Исходный диалог по-прежнему находится в стеке, но вызовы метода continue dialog для контекста диалога отправляются только тому диалогу, который находится на вершине стека, т. е. активному диалогу. Когда диалог извлекается из стека, контекст диалога продолжает выполнение со следующего шага в каскадной последовательности, хранящейся в стеке, на котором остановился исходный диалог.

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

Дополнительные сведения