1. Обзор
Платформа для разработчиков Google Assistant позволяет создавать программное обеспечение для расширения функциональности Google Assistant, виртуального персонального помощника, на более чем миллиарде устройств, включая умные колонки, телефоны, автомобили, телевизоры, наушники и многое другое. Пользователи взаимодействуют с Assistant в диалоге, чтобы выполнять задачи, такие как покупка продуктов или заказ такси. Как разработчик, вы можете использовать платформу для разработчиков Assistant, чтобы легко создавать и управлять удобными и эффективными диалогами между пользователями и вашим собственным сторонним сервисом выполнения заказов.
Этот практический урок охватывает концепции среднего уровня сложности для разработки приложений с использованием Google Assistant и основан на действии, созданном в практическом уроке « Создание действий для Google Assistant с помощью Actions SDK (Уровень 1)» . Мы настоятельно рекомендуем пройти практический урок уровня 1, прежде чем приступать к этому.
Действие, которое вы создадите в этом практическом задании, предскажет пользователям судьбу в их путешествии по мифической стране Гриффинберг, в зависимости от выбранной ими помощи.
Что вы построите
В этом практическом занятии вы создадите сложную диалоговую функцию, включающую следующие возможности:
- Собирает данные от пользователя и, в зависимости от значения, изменяет диалоговые подсказки.
- Задает уточняющие вопросы для продолжения разговора.
- Создает игровой цикл, позволяющий пользователю снова взаимодействовать с действием после получения предсказания.
Прежде чем начать разработку, вы можете взаимодействовать с этим действием на своем устройстве с поддержкой Google Ассистента, сказав: «Привет, Google, поговори с Судьбой и Удачей» . Для повторного пользователя стандартный путь взаимодействия с этим действием будет выглядеть следующим образом:


Что вы узнаете
- Как использовать слоты для сбора данных от пользователя
- Как использовать условия для добавления логики в сцену
- Как добавить игровой цикл
- Как добавить вспомогательную дорожку
Что вам понадобится
Для участия в этом практическом занятии необходимы следующие предварительные условия:
- Среда разработки/текстовый редактор на ваш выбор.
- Терминал для выполнения команд оболочки при установленных NodeJS , npm и git .
- Веб-браузер, например, Google Chrome .
- Завершенный проект Codelab Level 1 Actions.
Для понимания кода выполнения этого практического задания настоятельно рекомендуется, хотя и не обязательно, знание JavaScript (ES6).
Необязательно: получите пример кода.
При желании вы можете получить полный код проекта уровня 1 из репозитория GitHub Actions Builder Codelab Level 1, чтобы следовать инструкциям в этом практическом занятии. Также вы можете просмотреть полный код проекта уровня 2 в этом репозитории GitHub .
2. Продолжать разработку разговорного интерфейса.
В первом практическом задании вы создали простое диалоговое действие с одной сценой — Start .
В этом практическом занятии вы расширите диалог вашего действия. В следующих разделах вы настроите ваше действие для выполнения следующих действий:
- Переход к новой сцене
Fortune, когда пользователь захочет узнать свою судьбу. - Спросите пользователя, какое средство помощи он хотел бы выбрать для своей поездки.
- Предоставьте пользователю персонализированное предсказание судьбы, основанное на его выборе.
Переход к созданию сцены Fortune
В этом разделе вам необходимо выполнить следующие действия:
- Удалите из
Startсцены существующее сообщение, которое отвечает пользователю и завершает разговор. - Определите переход от
Startсцены к сценеFortune. - Создайте сцену
Fortune
Чтобы изменить Start сцену и добавить переход к сцене Fortune , выполните следующие действия:
- Откройте свой проект Actions из практического задания 1-го уровня в текстовом редакторе.
- Откройте файл
custom/scenes/Start.yaml. - Обновите
handlerдля намеренияyes, чтобы ваш код соответствовал приведенному ниже фрагменту:
Start.yaml
intentEvents:
- intent: "yes"
transitionToScene: Fortune
- handler:
staticPrompt:
candidates:
- promptResponse:
firstSimple:
variants:
- speech: I understand, stranger. Best of luck on your quest! Farewell.
intent: "no"
transitionToScene: actions.scene.END_CONVERSATION
- Сохраните файл.
Чтобы создать новую сцену под названием Fortune , выполните следующие шаги:
- Перейдите в терминале к проекту Codelab Level 1 Actions.
- Создайте новый файл с именем
Fortune.yamlв каталогеscenes:
touch custom/scenes/Fortune.yaml
Вы отредактируете этот файл в следующем разделе.
Определите логику диалога для сцены Fortune .
В этом практическом задании вы настраиваете сцену Fortune таким образом, чтобы она задавала пользователю вопрос: « Что вы выберете в качестве помощника в вашем приключении: дракона, переводчика или компаса?» Вы можете использовать функцию заполнения слотов , чтобы получить необходимую информацию от пользователя перед продолжением.
Ваше действие предсказывает судьбу для трех вспомогательных средств: дракона, переводчика и компаса. Чтобы настроить ваше действие на распознавание этих трех вариантов во вводимых пользователем данных, необходимо создать новый тип.
В процессе заполнения слотов сцены вы можете использовать типы для определения информации, которую хотите получить от пользователя. Когда механизм обработки естественного языка обнаруживает совпадение со слотом во входных данных пользователя, он извлекает слот в качестве типизированного параметра, что позволяет выполнять с ним логику в сцене.
Создать тип available_options
В этом разделе вы создаёте новый тип с именем available_options , который определяет три варианта, которые пользователи могут выбрать (дракон, переводчик и компас) в ответ на запрос. Вы также определяете несколько синонимов для этих вариантов на случай, если пользователь скажет что-то похожее. В последующем разделе вы добавите тип available_options в слот, чтобы указать, что хотите получить выбор пользователя.
Для создания типа available_options выполните следующие действия:
- Создайте новую директорию с именем
types:
mkdir custom/types
- Создайте новый файл с именем
available_options.yamlв каталогеtypes:
touch custom/types/available_options.yaml
- Откройте
custom/types/available_options.yamlв текстовом редакторе.
Типы настраиваются как пары ключ-значение, где ключ — это имя типа, а значения — синонимы этого ключа. При определении ключа он автоматически добавляется в качестве значения. В Actions SDK ключи представляются как entities , а значения — как synonyms .
Чтобы добавить три варианта на выбор пользователя, выполните следующие шаги:
- Добавьте следующие
entitiesиsynonymsв файлavailable_options.yaml:
available_options.yaml
synonym:
entities:
dragon:
synonyms:
- dragon
- hydra
- lizard
translator:
synonyms:
- translator
- communicator
- machine
- decoder
- translate
compass:
synonyms:
- compass
- direction
- guide
- navigator
matchType: EXACT_MATCH
- Сохраните файл.
Теперь ваше действие понимает, что available_options — это dragon, translator и compass, а также может распознавать несколько соответствующих синонимов.
Настройка заполнения слотов
Далее необходимо настроить заполнение слотов в сцене Fortune . Для настройки логики заполнения слотов выполните следующие шаги:
- Откройте
custom/scenes/Fortune.yamlв текстовом редакторе. - Добавьте следующие данные
slotsв файлFortune.yaml:
Fortune.yaml
slots:
- commitBehavior:
writeSessionParam: chosenOptions
name: chosenOptions
promptSettings:
initialPrompt:
staticPrompt:
candidates:
- promptResponse:
firstSimple:
variants:
- speech: What do you choose to help you on your quest, a dragon, a translator, or a compass?
suggestions:
- title: Dragon
- title: Translator
- title: Compass
required: true
type:
name: available_options
- Сохраните файл.
Теперь вы добавили тип available_options к слоту, который сообщает вашему действию, какую информацию вам необходимо собрать от пользователя (его выбор вспомогательного средства), прежде чем продолжить. Вы также настроили подсказку внутри слота, которая добавляется в очередь подсказок, когда пользователь достигает этапа заполнения слота в сцене.
Когда вы присваиваете слоту имя chosenOptions , поле writeSessionsParam обновляется с тем же именем ( $session.params.chosenOptions ). Вы можете получить доступ к этому параметру по этому имени в подсказке и в вашем запросе через клиентскую библиотеку.
Добавить условие
Теперь, когда вы добавили слот, требующий выбора пользователем вспомогательного средства, вы можете добавить условие для проверки того, что данные слота получены, прежде чем пользователь сможет продолжить разговор.
В этом разделе вы добавляете условие scene.slots.status == "FINAL" , которое проверяет, завершено ли заполнение слотов. Как только все слоты будут заполнены, условие добавляет запрос ( You picked $session.params.chosenOptions. ) в очередь запросов.
Чтобы установить условие scene.slots.status == "FINAL" , выполните следующие действия:
- Откройте
custom/scenes/Fortune.yamlв текстовом редакторе. - Добавьте данные
conditionalEventsв начало файлаFortune.yaml:
Fortune.yaml
conditionalEvents:
- condition: scene.slots.status == "FINAL"
handler:
staticPrompt:
candidates:
- promptResponse:
firstSimple:
variants:
- speech: You picked $session.params.chosenOptions.
- Сохраните файл.
Проверьте свои действия в симуляторе.
На этом этапе вы определили, какие варианты пользователь должен выбрать для заполнения поля. После получения этой информации от пользователя ваше действие должно отобразить подсказку, указывающую на конкретный выбранный им вариант.
Чтобы протестировать ваше действие, выполните следующие шаги:
- В терминале выполните следующую команду:
gactions deploy preview
В результате вы должны получить сообщение примерно следующего вида:
✔ Done. You can now test your changes in Simulator with this URL: http://console.actions.google.com/project/{project-id}/simulator?disableAutoPreview
- Скопируйте предоставленный URL-адрес и вставьте его в браузер.
- В поле ввода нажмите или введите
Talk to my test appи нажмите Enter . - Введите
Yesв поле ввода и нажмите Enter . Также вы можете нажать на значок подсказки «Да» .

- Нажмите, введите или произнесите
dragon. Вы должны увидеть сообщение «Вы выбрали дракон».
В следующем разделе вы настраиваете подсказки для каждого вспомогательного средства, которое может выбрать пользователь.
Настройте подсказки с помощью условий.
В этом разделе вы добавляете условия для каждого варианта, который может выбрать пользователь, и добавляете пользовательский запрос для каждого условия.
Настройте удачу dragon
Чтобы изменить условие и настроить подсказку при выборе пользователем слова «дракон», выполните следующие действия:
- Откройте
custom/scenes/Fortune.yamlв текстовом редакторе. - Замените данные
conditionalEventsследующим фрагментом кода в файлеFortune.yaml:
Fortune.yaml
conditionalEvents:
- condition: scene.slots.status == "FINAL" && session.params.chosenOptions == "dragon"
handler:
staticPrompt:
candidates:
- promptResponse:
firstSimple:
variants:
- speech: The people of Gryffinberg will be awestruck by the beauty and
power of the ancient dragon. Much to your dismay, the townspeople
fall into dispute over who will receive the honor of riding the dragon
first. You return home from your quest without everlasting glory or
a dragon.
- Сохраните файл.
Теперь, когда пользователь произносит слово «дракон» или что-то похожее, ваше действие выдает предсказание, основанное на этом выборе. Затем вы добавите оставшиеся два варианта.
Настройте translator и гадание compass
Чтобы добавить условия и настроить подсказки, которые будут появляться, когда пользователь скажет «переводчик» или «компас» , выполните следующие действия:
- В файле
custom/scenes/Fortune.yamlдобавьте два других условия в раздел условияdragon:
Fortune.yaml
- condition: scene.slots.status == "FINAL" && session.params.chosenOptions == "translator"
handler:
staticPrompt:
candidates:
- promptResponse:
firstSimple:
variants:
- speech: With the help of the translator, the rival factions in Gryffinberg
are finally able to communicate with each other and resolve their
disputes. You will complete your quest to restore peace in the town.
The translator will be used on many other journeys across the
earth. After its work is done, it retires honorably to a premier location
in the Gryffinberg History Museum.
- condition: scene.slots.status == "FINAL" && session.params.chosenOptions == "compass"
handler:
staticPrompt:
candidates:
- promptResponse:
firstSimple:
variants:
- speech: The compass will help you find the mystical and ancient Library
of Gryffinberg. Among its infinite stacks of dusty books, you find
one entitled "Wisdom of the Ages". By the time you've read the 50,000-page
tome, the townspeople have forgotten their problems. You will write
a second edition of "Wisdom of the Ages", but have limited commercial
success.
- Сохраните файл.
Проверьте свои действия в симуляторе.
На этом этапе ваше действие должно предоставить пользователю персонализированное предсказание судьбы в зависимости от выбранного им варианта.
Чтобы протестировать ваше действие, выполните следующие шаги:
- В терминале выполните следующую команду:
gactions deploy preview
В результате вы должны получить сообщение примерно следующего вида:
✔ Done. You can now test your changes in Simulator with this URL: http://console.actions.google.com/project/{project-id}/simulator?disableAutoPreview
- Скопируйте предоставленный URL-адрес и вставьте его в браузер.
- Введите в поле ввода текст
Talk to my test appи нажмите Enter . - Введите «Да» в поле ввода и нажмите Enter. Также можно нажать на значок подсказки «Да» .
- Нажмите, введите текст или произнесите
Translator.

Вы должны получить соответствующее предсказание, если вы выберете опцию "переводчик".
3. Добавить игровой цикл
В этом разделе вы настраиваете действие таким образом, чтобы пользователь мог выбрать другой вариант и услышать другое предсказание после выбора. Это изменение похоже на сообщение «Хотите сыграть снова?» в конце игры. Чтобы создать этот цикл, вы можете повторно использовать ранее созданные намерения yes и no и добавить их в новую сцену под названием Again .
Создать Again сцена)
В этом разделе вы создаете новую сцену Again и добавляете подсказку, которая спрашивает пользователя, хочет ли он выбрать другой вариант.
Для создания и настройки сцены Again выполните следующие шаги:
- Создайте новый файл с именем
Again.yamlв каталогеscenes:
touch custom/scenes/Again.yaml
- Откройте
custom/scenes/Again.yamlв текстовом редакторе. - Добавьте следующие данные
onEnterвAgain.yaml:
Again.yaml
onEnter:
staticPrompt:
candidates:
- promptResponse:
firstSimple:
variants:
- speech: That is what I see for you. Would you like to choose a different option and explore another future?
suggestions:
- title: "Yes"
- title: "No"
- Сохраните файл.
Добавить переход от сцены Fortune к сцене Again
После того, как пользователь получит предсказание, диалог должен перейти к новой сцене Again .
Чтобы добавить переход от сцены Fortune к сцене Again , выполните следующие шаги:
- Откройте
custom/scenes/Fortune.yamlв текстовом редакторе. - Добавьте
transitionToScene: Againк каждому условию, как показано в следующем фрагменте кода:
Fortune.yaml
conditionalEvents:
- condition: scene.slots.status == "FINAL" && session.params.chosenOptions == "dragon"
handler:
staticPrompt:
candidates:
- promptResponse:
firstSimple:
variants:
- speech: The people of Gryffinberg will be awestruck by the beauty and
power of the ancient dragon. Much to your dismay, the townspeople
fall into dispute over who will receive the honor of riding the dragon
first. You return home from your quest without everlasting glory or
a dragon.
transitionToScene: Again
- condition: scene.slots.status == "FINAL" && session.params.chosenOptions == "translator"
handler:
staticPrompt:
candidates:
- promptResponse:
firstSimple:
variants:
- speech: With the help of the translator, the rival factions in Gryffinberg
are finally able to communicate with each other and resolve their
disputes. You will complete your quest to restore peace in the town.
The translator will be used on many other journeys across the
earth. After its work is done, it retires honorably to a premier location
in the Gryffinberg History Museum.
transitionToScene: Again
- condition: scene.slots.status == "FINAL" && session.params.chosenOptions == "compass"
handler:
staticPrompt:
candidates:
- promptResponse:
firstSimple:
variants:
- speech: The compass will help you find the mystical and ancient Library
of Gryffinberg. Among its infinite stacks of dusty books, you find
one entitled "Wisdom of the Ages". By the time you've read the 50,000-page
tome, the townspeople have forgotten their problems. You will write
a second edition of "Wisdom of the Ages", but have limited commercial
success.
transitionToScene: Again
- Сохраните файл.
Проверьте свои действия в симуляторе.
На этом этапе ваше действие должно отобразить пользователю после получения предсказания: «Это то, что я вижу для вас. Хотите ли вы выбрать другой вариант и рассмотреть другое будущее?»
Чтобы протестировать ваше действие, выполните следующие шаги:
- В терминале выполните следующую команду:
gactions deploy preview
В результате вы должны получить сообщение примерно следующего вида:
✔ Done. You can now test your changes in Simulator with this URL: http://console.actions.google.com/project/{project-id}/simulator?disableAutoPreview
- Скопируйте предоставленный URL-адрес и вставьте его в браузер.
- Введите в поле ввода текст
Talk to my test appи нажмите Enter . - Введите
Yesв поле ввода и нажмите Enter . В качестве альтернативы, нажмите на значок подсказки «Да» . - Нажмите, наберите текст или произнесите
dragon.

Вы должны получить предсказание, соответствующее варианту с драконом, и подсказку Again .
Добавьте намерения и переход к сцене Again
В этом разделе вы добавляете в сцену Again намерения yes и no , чтобы ваше действие понимало, хочет ли пользователь выбрать новый вариант или нет. Вы также добавляете соответствующие переходы для намерений yes и no . Намерение yes переходит в сцену Fortune , а намерение no — в системную сцену End conversation .
Чтобы добавить интенты и переходы в сцену Again , выполните следующие действия:
- Откройте
custom/scenes/Again.yamlв текстовом редакторе. - Добавьте данные
intentEventsв начало файлаAgain.yaml, вышеOnEnter:
Again.yaml
intentEvents:
- intent: "yes"
transitionToScene: Fortune
- handler:
staticPrompt:
candidates:
- promptResponse:
firstSimple:
variants:
- speech: It pleases me that you are satisfied with your choice. Best
of luck on your quest. Farewell.
intent: "no"
transitionToScene: actions.scene.END_CONVERSATION
- Сохраните файл.
Проверьте свои действия в симуляторе.
Теперь ваше действие должно понимать, хочет ли пользователь выбрать новый вариант или завершить диалог.
Чтобы проверить yes ответ, выполните следующие шаги:
- В терминале выполните следующую команду:
gactions deploy preview
В результате вы должны получить сообщение примерно следующего вида:
✔ Done. You can now test your changes in Simulator with this URL: http://console.actions.google.com/project/{project-id}/simulator?disableAutoPreview
- Скопируйте предоставленный URL-адрес и вставьте его в браузер.
- Введите в поле ввода текст
Talk to my test appи нажмите Enter . - Введите
Yesв поле ввода и нажмите Enter . В качестве альтернативы, нажмите на значок подсказки «Да» . - Нажмите, введите текст или произнесите один из предложенных вариантов.
- Введите
Yesв поле ввода и нажмите Enter.

Вам должно быть задано следующее: «Что вы выберете в качестве помощника в вашем приключении: дракона, переводчика или компаса?»
Чтобы проверить no намерения, выполните следующие шаги:
- Нажмите, введите текст или произнесите один из предложенных вариантов.
- Введите
Noв поле ввода и нажмите Enter .
End conversation вы должны получить сообщение: «Мне приятно, что вы довольны своим выбором. Желаю удачи в ваших поисках. До свидания».
4. Добавьте вспомогательную дорожку.
Теперь вы создали основной путь, по которому следует большинство пользователей в вашем действии. Однако пользователь может ответить на вопрос из сцены Fortune : « Что вы выберете в качестве помощника в вашем приключении: дракона, переводчика или компаса?», выбрав вариант, которого нет в предложенных.
В этом разделе вы настраиваете действие таким образом, чтобы оно понимало, когда пользователь произносит слова «магия» , «деньги» , «лошадь» или «телефон» , и повторно предлагало пользователю выбрать один из трех исходных вариантов, когда он выберет один из этих вариантов. Для настройки этой логики вам необходимо создать новый type , содержащий эти другие варианты, и новый интент, other_option , который будет совпадать, когда пользователь произносит один из этих вариантов. Вам также необходимо добавить аннотации к обучающим фразам в интент other_option , чтобы идентифицировать и извлечь параметры интента.
Когда механизм обработки естественного языка ассистента обнаруживает совпадение параметров во вводимых пользователем данных, он извлекает значение в виде типизированного параметра, чтобы вы могли выполнять с ним логику в сцене. В этом практическом задании вы настроите действие таким образом, чтобы оно извлекало выбранную пользователем помощь и ссылалось на этот выбор в подсказке.
Создать тип unavailable_options
Теперь вы можете создать тип unavailable_options , содержащий различные варианты, чтобы ваше действие могло идентифицировать эти данные во вводимых пользователем данных.
Для создания типа unavailable_options выполните следующие действия:
- Создайте новый файл с именем
unavailable_options.yamlв каталогеtypes:
touch custom/types/unavailable_options.yaml
- Откройте
custom/types/unavailable_options.yamlв текстовом редакторе. - Добавьте следующие данные
synonymsв файлunavailable_options.yaml:
unavailable_options.yaml
synonym:
entities:
money:
synonyms:
- money
- cash
- gold
horse:
synonyms:
- horse
- stallion
- steed
magic:
synonyms:
- magic
- enchanted
- spells
phone:
synonyms:
- phone
- cell
- apps
matchType: EXACT_MATCH
- Сохраните файл.
Создать намерение other_option
Далее вы создаете намерение с именем other_option и добавляете обучающие фразы, включающие варианты из типа unavailable_options . Это намерение срабатывает, когда пользователь выбирает вариант, содержащийся в типе unavailable_options .
Чтобы создать и настроить интент other_option , выполните следующие шаги:
- Создайте новый файл с именем
other_option.yamlв каталогеintents:
touch custom/intents/other_option.yaml
- Откройте
custom/intents/other_option.yamlв текстовом редакторе. - Добавьте следующие
parametersdata иtrainingPhrasesв файлother_option.yaml:
other_option.yaml
parameters:
- name: chosenUnavailableOption
type:
name: unavailable_options
trainingPhrases:
- I want to use ($chosenUnavailableOption 'spells' auto=true)
- I really really want to use a ($chosenUnavailableOption 'phone' auto=true)
- ($chosenUnavailableOption 'magic' auto=true)!
- ($chosenUnavailableOption 'cash' auto=true)
- I want to ride a ($chosenUnavailableOption 'horse' auto=true)
Здесь вы вручную добавляете к обучающим фразам недоступные варианты, указанные в предыдущем разделе. Параметр intent, chosenUnavailableOption , позволяет извлечь имя варианта и использовать его в подсказке, что вы сделаете в следующем разделе.
- Сохраните файл.
Добавьте намерение other_option в сцену Fortune
Теперь у вас есть интент other_option , который может обрабатывать запрос пользователя, указывающего вариант, не входящий в исходный список. В этом разделе вы добавляете интент other_option в сцену Fortune . Вы используете параметр интента для настройки подсказки в зависимости от ввода пользователя.
Чтобы добавить интент other_option в сцену Fortune , выполните следующие действия:
- Откройте
custom/scenes/Fortune.yamlв текстовом редакторе. - Добавьте следующие данные
intentEventsмежду даннымиconditionalEventsи даннымиslots:
Fortune.yaml
intentEvents:
- handler:
staticPrompt:
candidates:
- promptResponse:
firstSimple:
variants:
- speech: I have seen the future and a $intent.params.chosenUnavailableOption.original will not aid you on your journey.
intent: other_option
- Сохраните файл.
Выражение $intent.params.chosenUnavailableOption относится к объекту параметра намерения, а $intent.params.chosenUnavailableOption.original — к значению этого объекта. Свойство original относится к исходным данным, указанным пользователем.
Когда пользователь выбирает вариант из списка, указанного в поле unavailable_options , во время сцены Fortune , срабатывает интент other_option , и запрос добавляется в очередь запросов. Поскольку переход не указан, цикл выполнения сцены продолжается путем повторной оценки этапа условий. Затем слот chosenOptions добавляет свой запрос в очередь запросов, и очередь запросов доставляется пользователю.
Проверьте свои действия в симуляторе.
Теперь ваше действие должно корректно реагировать, когда пользователь выбирает один из вариантов, перечисленных в типе unavailable_options , и указывать, какой именно вспомогательный инструмент он выбрал. Затем ваше действие должно повторно предложить пользователю выбрать один из исходных вариантов (дракон, переводчик или компас).
Чтобы протестировать ваше действие в симуляторе, выполните следующие шаги:
- В терминале выполните следующую команду:
gactions deploy preview
В результате вы должны получить сообщение примерно следующего вида:
✔ Done. You can now test your changes in Simulator with this URL: http://console.actions.google.com/project/{project-id}/simulator?disableAutoPreview
- Скопируйте предоставленный URL-адрес и вставьте его в браузер.
- Введите в поле ввода текст
Talk to my test appи нажмите Enter . - Введите
Yesв поле ввода и нажмите Enter . В качестве альтернативы, нажмите на значок подсказки «Да» . - Введите
magicв поле ввода и нажмите Enter .

Вы можете заметить, что подсказка звучит некорректно, когда пользователь выбирает «магия», из-за артикля «a», стоящего перед ней. Вы рассмотрите эту проблему в следующих разделах.
Добавить обработчик unavailable_options
Чтобы добавить артикль «a» перед соответствующими вариантами из типа unavailable_options , вы можете настроить обработчик событий в своей логике выполнения, который будет проверять, требуется ли артикль «a» перед выбранным пользователем вариантом. Сначала вам нужно настроить ваше действие так, чтобы оно вызывало обработчик из сцены Fortune .
Чтобы добавить обработчик unavailable_options в сцену Fortune , выполните следующие действия:
- Откройте
custom/scenes/Fortune.yamlв текстовом редакторе. - Обновите файл
Fortune.yaml, добавив следующие данныеintentEvents:
Fortune.yaml
intentEvents:
- handler:
webhookHandler: unavailable_options
intent: other_option
- Сохраните файл.
Обновить и развернуть выполнение
Теперь, когда вы настроили действие для вызова обработчика события unavailable_options , вы можете обновить обработчик в своем запросе на выполнение и развернуть его.
Для обновления данных о выполнении заказа выполните следующие действия:
- Откройте
webhooks/ActionsOnGoogleFulfillment/index.jsв текстовом редакторе. - Добавьте следующий код в
index.jsв раздел обработчикаgreeting:
index.js
app.handle('unavailable_options', conv => {
const option = conv.intent.params.chosenUnavailableOption.original;
const optionKey = conv.intent.params.chosenUnavailableOption.resolved;
let message = 'I have seen the future and ';
if(optionsNeedA.has(optionKey)){
message = message + 'a ';
}
message = message + `${option} will not aid you on your journey. `;
conv.add(message);
});
- Добавьте следующий код под строкой
const app = conversation({debug:true});`
index.js
const optionsNeedA = new Set();
optionsNeedA.add('horse').add('phone');
- Сохраните файл.
Разберитесь в коде.
Обработчик unavailable_options выполняет следующие действия:
- Получает данные
optionиз объектаconvи присваиваетoptionoriginalсвойству, которое представляет собой необработанный ввод пользователя. - Присваивает свойство
resolvedoptionKey, который является ключом для типаunavailable_options - Проверяет, является ли
optionKeyодним из параметров, требующих символа "a"; если да, то формирует сообщение с добавленным символом "a". - Добавляет сообщение с помощью
conv.add(message)
Обработчики обновлений
Чтобы разрешить действию использовать unavailable_options , добавьте обработчик unavailable_options в webhooks/ActionsOnGoogleFulfillment.yaml .
- Добавьте имя обработчика
unavailable_optionsв файлActionsOnGoogleFulfillment.yaml:
ActionsOnGoogleFulfillment.yaml
handlers: - name: greeting - name: unavailable_options inlineCloudFunction: executeFunction: ActionsOnGoogleFulfillment
- Сохраните файл.
Проверьте свои действия в симуляторе.
Теперь ваше действие должно корректировать подсказку в зависимости от того, требуется ли перед выбором пользователя из типа unavailable_options артикль "a".
Чтобы протестировать ваше действие, выполните следующие шаги:
- В терминале выполните следующую команду:
gactions deploy preview
В результате вы должны получить сообщение примерно следующего вида:
✔ Done. You can now test your changes in Simulator with this URL: http://console.actions.google.com/project/{project-id}/simulator?disableAutoPreview
- Скопируйте предоставленный URL-адрес и вставьте его в браузер.
- В поле ввода нажмите или введите
Talk to my test appи нажмите Enter . - Введите
Yesв поле ввода и нажмите Enter . В качестве альтернативы, нажмите на значок подсказки «Да» . - Введите
magicв поле ввода и нажмите Enter . Затем введитеhorseв поле ввода и нажмите Enter.

В вашем действии следует добавить артикль "a" перед вариантом "лошадь", а вариант "магия" должен быть составлен без артикля "a".
5. Визуализация действий в консоли действий.
SDK Actions совместим с веб-IDE Actions Builder , интегрированной в консоль Actions. Вы можете отправить содержимое вашей локальной файловой системы в черновик вашего Action в консоли с помощью команды gactions push . Консоль Actions предоставляет визуальное представление конфигурации вашего Action. Визуальное отображение конфигурации вашего Action может быть полезно во время разработки и не влияет на версию Action, используемую для тестирования.
Чтобы отправить свой проект Actions и просмотреть его в консоли Actions, выполните следующие действия:
- В терминале выполните следующую команду, чтобы отправить свой проект в консоль Actions:
gactions push
В результате вы должны получить сообщение примерно следующего вида:
✔ Done. Files were pushed to Actions Console, and you can now view your project with this URL: https://console.actions.google.com/project/{project-id}/overview. If you want to test your changes, run "gactions deploy preview", or navigate to the Test section in the Console.
- Скопируйте предоставленный URL-адрес и вставьте его в браузер.
- В консоли «Действия» нажмите «Разработка» в верхней панели навигации.
- Щелкните стрелку раскрывающегося списка рядом с пунктом «Сцены» и выберите «Начало» . Вы должны увидеть визуальное представление
Startсцены вашего действия, как показано на следующем снимке экрана:

Приведите свой проект в порядок [рекомендуется]
Во избежание возможных дополнительных расходов рекомендуется удалять проекты, которые вы не собираетесь использовать. Чтобы удалить проекты, созданные в этом практическом занятии, выполните следующие действия:
- Для удаления облачного проекта и ресурсов выполните действия, описанные в разделе «Завершение (удаление) проектов» .
- Необязательно: чтобы немедленно удалить свой проект из консоли «Действия», выполните действия, описанные в разделе «Удаление проекта» . Если вы не выполните этот шаг, ваш проект будет автоматически удален примерно через 30 дней.
6. Поздравляем!
Теперь вы знаете навыки среднего уровня, необходимые для создания действий для Google Ассистента с помощью Actions SDK.
Что вы осветили
- Как разрабатывать диалоговые действия с использованием библиотеки Infillment в Node.js
- Как использовать слоты для сбора данных от пользователя
- Как использовать условия для добавления логики в сцену
- Как добавить игровой цикл
- Как добавить вспомогательную дорожку
Узнать больше
Для изучения создания действий для Google Ассистента вы можете ознакомиться с этими ресурсами:
- Документация по разработке действий для Google Ассистента
- Действия на странице Google GitHub для примеров кода и библиотек
- Официальное сообщество Reddit для разработчиков, работающих с Google Ассистентом.
- Рекомендации по проектированию диалогов, содержащие лучшие практики и руководства по диалоговым действиям.
Подписывайтесь на нас в Твиттере @ActionsOnGoogle , чтобы быть в курсе наших последних анонсов, и делитесь своими разработками в твиттере с хэштегом #AoGDevs !
Опрос обратной связи
Перед уходом, пожалуйста, заполните короткую анкету о ваших впечатлениях.