使用 Actions SDK 构建适用于 Google 助理的 Action(第 2 级)

Google 助理是一款虚拟私人智能助理,借助 Google 助理开发者平台,您可以打造软件,从而为超过 10 亿台设备(包括智能音箱、手机、汽车、电视、头戴式耳机等)扩展 Google 助理的功能。用户可通过对话形式与 Google 助理互动,从而处理各种事务,例如购买日用品或约车。作为开发者,您可以使用 Google 助理开发者平台在用户和您自己的第三方执行方式服务之间轻松打造并管理愉悦、高效的对话体验。

本 Codelab 介绍了关于 Google 助理相关开发的中级概念,并以第 1 级 Codelab 中创建的 Action 为基础进一步构建。我们强烈建议您先完成第 1 级 Codelab,然后再开始学习本 Codelab。

您在本 Codelab 中构建的 Action 可根据用户选择的辅助物,告知用户他们探索神秘大陆 Gryffinberg 期间的运势。

构建内容

在本 Codelab 中,您要构建一个具有以下功能的复杂对话型 Action:

  • 收集用户数据,并根据收集到的值修改对话提示。
  • 对后续提问进行回应,持续推进对话
  • 创建游戏循环,以便用户能够在收到运势信息后再次与相应 Action 互动。

开始构建之前,您可以在内置 Google 助理的设备上与实际 Action 进行互动,只需说出“Ok Google,跟 Fate and Fortune 聊聊”即可。回访用户与该 Action 互动的默认路径如下所示:

dd6f5c61296b8b50.png

eba043f546aa8c51.png

学习内容

  • 如何使用向用户收集数据
  • 如何使用条件向场景添加逻辑
  • 如何添加游戏循环
  • 如何添加辅助路径

所需条件

学习本 Codelab 前,您需要做好以下准备:

  • 选择一种 IDE/文本编辑器。
  • 已安装 NodeJSnpmgit 的终端,用于运行 shell 命令。
  • 网络浏览器,例如 Google Chrome
  • 已完成的 Codelab 第 1 级 Actions 项目

我们强烈建议(但不强制要求)您熟悉 JavaScript (ES6),以便理解本 Codelab 的执行方式代码。

可选:获取示例代码

您可以选择通过此 GitHub 代码库获取第 1 级项目的完整代码,也可以通过此 GitHub 代码库获取第 2 级项目的完整代码。

在第一个 Codelab 中,您创建了一个具有单个场景 Start 的简单对话型 Action。

在本 Codelab 中,您可以扩展该 Action 的对话。在以下部分中,您可以配置该 Action 以执行以下操作:

  • 在用户想要听取自己的运势时,过渡到新的 Fortune 场景
  • 询问用户想要为自己的旅程选择哪种辅助物
  • 根据用户所做的选择提供自定义运势

过渡到并创建 Fortune 场景

在本部分中,您可以执行以下操作:

  • Start 场景中移除用于回应用户并结束对话的现有提示
  • 定义从 Start 场景向 Fortune 场景的过渡
  • 创建 Fortune 场景

如需修改 Start 场景并添加向 Fortune 场景的过渡,请按以下步骤操作:

  1. 在文本编辑器中打开第 1 级 Codelab 中构建的 Actions 项目。
  2. 打开 custom/scenes/Start.yaml 文件。
  3. 更新 yes intent 的 handler,使您的代码符合以下代码段:

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
  1. 保存文件。

如需创建名为 Fortune 的新场景,请按以下步骤操作:

  1. 在终端中导航至 Codelab 第 1 级 Actions 项目。
  2. scenes 目录中创建一个名为 Fortune.yaml 的新文件:
touch custom/scenes/Fortune.yaml

您将在下一部分中修改此文件。

Fortune 场景定义对话逻辑

在本 Codelab 中,您将配置 Fortune 场景,以便向用户提出以下问题:“What do you choose to help you on your quest, a dragon, a translator, or a compass?”(你选择哪一样辅助物来帮助你完成探索之旅,巨龙、翻译还是罗盘?)您可以使用一项名为槽填充的功能向用户收集必要的信息,然后再继续操作。

您的 Action 可针对 3 种辅助物提供对应的运势信息:dragon(巨龙)、translator(翻译)和 compass(罗盘)。若要配置您的 Action 以识别用户输入中的这 3 个选项,您必须创建一个新的“类型”。

您可以在场景的槽填充阶段使用类型来定义您想要从用户那里获取的信息。当 NLU 引擎在用户输入中检测到槽匹配时,它会将相应槽提取为已分类参数,让您能够在场景中使用该参数执行逻辑。

创建 available_options 类型

在本部分中,您将创建一个名为 available_options 的新类型,该类型可以指定用户在对提示做出回应时可以选择的 3 个选项(dragon、translator 和 compass)。您还可以针对这些选项定义几个同义词,以便在用户说出类似内容时也能识别。在后续部分中,您要将 available_options 类型添加到某个槽中,以便指明您想要获取用户的选择。

如需创建 available_options 类型,请按以下步骤操作:

  1. 创建名为 types 的新目录:
mkdir custom/types
  1. types 目录中创建一个名为 available_options.yaml 的新文件:
touch custom/types/available_options.yaml
  1. 在文本编辑器中打开 custom/types/available_options.yaml

类型将被配置为信息键值对,其中“键”为类型的名称,而“值”为相应键的同义词。定义键后,系统会自动为该键添加值。在 Actions SDK 中,您将键表示为 entities,值表示为 synonyms

如需添加用户可选择的 3 个选项,请按以下步骤操作:

  1. available_options.yaml 文件中添加以下 entitiessynonyms

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
  1. 保存文件。

现在,您的 Action 不仅可以理解 available_options 是 dragon、translator 和 compass,还能识别出各选项对应的一些同义词。

配置槽填充

接下来,您需要配置 Fortune 场景中的槽填充。如需配置槽填充逻辑,请按以下步骤操作:

  1. 在文本编辑器中打开 custom/scenes/Fortune.yaml
  2. 将以下 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
  1. 保存文件。

现在,您已将 available_options 类型添加到相应的槽,以便告知 Action 您需要先向用户收集哪些信息(用户选择哪个辅助物),然后再继续操作。此外,您还在该槽中配置了提示;在用户到达场景的槽填充阶段后,系统会将该提示添加到提示队列。

将槽命名为 chosenOptions 后,writeSessionsParam 字段会更新为相同的名称 ($session.params.chosenOptions)。您可以在提示中使用该名称访问此参数,也可以通过客户端库在执行方式中使用该名称访问此参数。

添加条件

现在,您已添加了需要用户选择辅助物的槽,接下来可以添加条件,确保在用户继续对话之前已获取槽数据。

在本部分中,您将添加条件 scene.slots.status == "FINAL",用于检查槽填充是否已完成。所有槽均填充后,条件会向提示队列添加一个提示 (You picked $session.params.chosenOptions.)。

如需配置 scene.slots.status == "FINAL" 条件,请按以下步骤操作:

  1. 在文本编辑器中打开 custom/scenes/Fortune.yaml
  2. conditionalEvents 数据添加到 Fortune.yaml 文件的顶部:

Fortune.yaml

conditionalEvents:
- condition: scene.slots.status == "FINAL"
  handler:
    staticPrompt:
      candidates:
      - promptResponse:
          firstSimple:
            variants:
            - speech: You picked $session.params.chosenOptions.
  1. 保存文件。

在模拟器中测试您的 Action

此时,您已定义用户可选择哪些选项以填充槽。向用户获取这些信息后,您的 Action 应该会提供提及用户所选的特定选项的提示。

如需测试您的 Action,请按以下步骤操作:

  1. 在终端中,运行以下命令:
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
  1. 复制提供的网址,并将其粘贴到浏览器中。
  2. Input 字段中点击或输入 Talk to my test app,然后按 Enter 键。
  3. Input 字段中输入 Yes,然后按 Enter 键。或者,您也可以点击 Yes 建议内容信息卡。

a899d45c542668f6.png

  1. 点击、输入或说出 dragon。您应该会收到内容为“You have pick dragon”(您已选择巨龙)的提示。

在下一部分中,您可以自定义用户可选的每个辅助物对应的提示。

使用条件自定义提示

在本部分中,您将为用户可选的每个选项添加条件,然后为每个条件添加一条自定义提示。

自定义 dragon 选项对应的运势

如需针对用户选择“dragon”的情况更新条件并自定义提示,请按以下步骤操作:

  1. 在文本编辑器中打开 custom/scenes/Fortune.yaml
  2. Fortune.yaml 文件中 conditionalEvents 数据替换为以下代码段:

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.
  1. 保存文件。

现在,当用户说出“dragon”或其同义词时,您的 Action 会根据该选项提供对应的运势信息。接下来,您可以为剩余的两个选项添加运势。

自定义 translatorcompass 选项对应的运势

如需针对用户说出“translator”或“compass”的情况更新条件并自定义提示,请按以下步骤操作:

  1. 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.
  1. 保存文件。

在模拟器中测试您的 Action

此时,您的 Action 应该会根据用户的所选项为用户提供自定义的运势信息。

如需测试您的 Action,请按以下步骤操作:

  1. 在终端中,运行以下命令:
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
  1. 复制提供的网址,并将其粘贴到浏览器中。
  2. Input 字段中输入 Talk to my test app,然后按 Enter 键。
  3. Input 字段中输入“Yes”,然后按 Enter 键。或者,点击 Yes 建议内容信息块。
  4. 点击、输入或说出 Translator

29e17f950bd0dd71.png

您应该会收到“translator”选项对应的运势信息。

在本部分中,您将配置 Action,以便用户在选择某选项后,能够改选其他选项并听取对应的运势信息。这项更改与游戏结束时显示的“Do you want to play again?”(要再玩一次吗?)消息类似。如需构建此循环,您可以重复使用之前创建的 yesno intent,然后将其添加到名为 Again 的新场景。

创建 Again 场景

在本部分中,您将创建一个新的 Again 场景,然后添加提示,以询问用户是否要选择其他选项。

如需创建和配置 Again 场景,请按以下步骤操作:

  1. scenes 目录中创建一个名为 Again.yaml 的新文件:
touch custom/scenes/Again.yaml
  1. 在文本编辑器中打开 custom/scenes/Again.yaml
  2. 将以下 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"
  1. 保存文件。

添加从 FortuneAgain 场景的过渡

在用户收到运势信息后,对话需要过渡到新的 Again 场景。

如需添加从 Fortune 场景到 Again 场景的过渡,请按以下步骤操作:

  1. 在文本编辑器中打开 custom/scenes/Fortune.yaml
  2. 为每个条件添加 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
  1. 保存文件。

在模拟器中测试您的 Action

此时,在用户收到运势信息后,您的 Action 应该为用户提供以下提示:“That is what I see for you. Would you like to choose a different option and explore another future?”(我预见到你的运势就是这样。是否要选择其他选项,探索未来的另一种走向?)

如需测试您的 Action,请按以下步骤操作:

  1. 在终端中,运行以下命令:
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
  1. 复制提供的网址,并将其粘贴到浏览器中。
  2. Input 字段中输入 Talk to my test app,然后按 Enter 键。
  3. Input 字段中输入 Yes,然后按 Enter 键。或者,点击 Yes 建议内容信息块。
  4. 点击、输入或说出 dragon

b299e9fed9aedb69.png

您应该会收到 dragon 选项对应的运势和 Again 提示。

添加 intent 以及向 Again 场景的过渡

在本部分中,您将向 Again 场景添加 yesno intent,以便您的 Action 能够理解用户是否想要选择新选项。此外,您还可以针对 yesno intent 添加适当的过渡。yes intent 会过渡到 Fortune 场景,而 no intent 会过渡到系统场景 End conversation

如需向 Again 场景添加 intent 和过渡,请按以下步骤操作:

  1. 在文本编辑器中打开 custom/scenes/Again.yaml
  2. Again.yaml 文件的顶部添加 intentEvents 数据(位于 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
  1. 保存文件。

在模拟器中测试您的 Action

现在,您的 Action 应该能够理解用户是要选择新选项,还是要结束对话。

如需测试 yes intent,请按以下步骤操作:

  1. 在终端中,运行以下命令:
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
  1. 复制提供的网址,并将其粘贴到浏览器中。
  2. Input 字段中输入 Talk to my test app,然后按 Enter 键。
  3. Input 字段中输入 Yes,然后按 Enter 键。或者,点击 Yes 建议内容信息块。
  4. 点击、输入或说出其中一个选项。
  5. 在“Input”字段中输入 Yes,然后按 Enter 键。

5d0690332efe2e29.png

您应该会收到以下提示:“What do you choose to help you on your quest, a dragon, a translator, or a compass?”

如需测试 no intent,请按以下步骤操作:

  1. 点击、输入或说出其中一个选项。
  2. 在“Input”字段中输入 No,然后按 Enter 键。

您应该会收到 End conversation 提示:“It pleases me that you are satisfied with your choice. Best of luck on your quest. Farewell.“(看来你对自己的选择很满意,我很欣慰。祝你顺利完成探索之旅。后会有期。)

现在,您已经构建了大多数用户在您的 Action 中选择的主要路径。不过,对于 Fortune 场景中的提示“What do you choose to help you on your quest, a dragon, a translator, or a compass?”,用户在回应时可能会选择所提供选项范围外的其他内容。

在本部分中,您将配置 Action,使其能够在用户选择“magic”(魔法)、“money”(钱)、“horse”(马)或“phone”(手机)时理解用户意图,并在用户选择此类选项中的某一项时重新提示用户从原有的 3 个选项中选择一项。如需配置此逻辑,您需要创建一个新的 type(其中包含范围外的其他选项),以及一个新的 intent other_option(当用户说出范围外的某一选项时,便会与该 intent 匹配)。此外,您还需要为 other_option intent 中的训练短语添加注解,以便识别并提取 intent 参数。

Google 助理的自然语言处理引擎在用户输入中检测到参数匹配后,会将相应值提取为已分类参数,让您能够在场景中使用该参数执行逻辑。在本 Codelab 中,您将配置 Action,以便提取用户选择的辅助物,并在提示中提及相应选择。

创建 unavailable_options 类型

现在,您可以创建包含各种其他选项的 unavailable_options 类型,以便您的 Action 可以识别用户输入中的此类数据。

如需创建 unavailable_options 类型,请按以下步骤操作:

  1. types 目录中创建一个名为 unavailable_options.yaml 的新文件:
touch custom/types/unavailable_options.yaml
  1. 在文本编辑器中打开 custom/types/unavailable_options.yaml
  2. 将以下 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
  1. 保存文件。

创建 other_option intent

接下来,您要创建一个名为 other_option 的 intent,并添加 unavailable_options 类型包含的部分选项作为训练短语。如果用户选择 unavailable_options 类型中包含的选项,便会与该 intent 匹配。

如需创建和配置 other_option intent,请按以下步骤操作:

  1. intents 目录中创建一个名为 other_option.yaml 的新文件:
touch custom/intents/other_option.yaml
  1. 在文本编辑器中打开 custom/intents/other_option.yaml
  2. 将以下 parameters 数据和 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,您可以提取选项的名称,并在提示中使用相应选项,我们将在下一部分完成此操作。

  1. 保存文件。

Fortune 场景添加 other_option intent

您现在已经有了一个 intent (other_option),它可以处理用户指定原有选项范围外的其他选项的情况。在本部分中,您将向 Fortune 场景添加 other_option intent。您可以使用该 intent 参数,根据用户输入自定义提示。

如需向 Fortune 场景添加 other_option intent,请按以下步骤操作:

  1. 在文本编辑器中打开 custom/scenes/Fortune.yaml
  2. conditionalEvents 数据和 slots 数据之间添加以下 intentEvents 数据:

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
  1. 保存文件。

表达式 $intent.params.chosenUnavailableOption 指代 intent 参数对象,而 $intent.params.chosenUnavailableOption.original 指代该对象的值。original 属性指的是用户指定的原始输入。

如果用户在 Fortune 场景中说出 unavailable_options 类型中列出的某个选项,则会与 other_option intent 匹配,并向提示队列添加提示。由于未指定过渡,因此场景执行循环会通过重新评估条件阶段的方式继续运行。然后,chosenOptions 槽会将其提示添加到提示队列,接着,系统会将提示队列分发到用户。

在模拟器中测试您的 Action

现在,用户选择 unavailable_options 类型中列出的某个选项后,您的 Action 应该会作出适当回应,并明确说出用户所选的辅助物。然后,您的 Action 应该重新提示用户选择原有选项之一(dragon、translator 或 compass)。

如需在模拟器中测试您的 Action,请按以下步骤操作:

  1. 在终端中,运行以下命令:
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
  1. 复制提供的网址,并将其粘贴到浏览器中。
  2. Input 字段中输入 Talk to my test app,然后按 Enter 键。
  3. Input 字段中输入 Yes,然后按 Enter 键。或者,点击 Yes 建议内容信息块。
  4. Input 字段中输入 magic,然后按 Enter 键。

3a42c33eca435f32.png

您可能会发现,如果用户选择“magic”,由于在该字词前面放置了冠词“a”,因此提示听起来有错误。您将在后面的部分中解决该问题。

添加 unavailable_options 处理脚本

如需在 unavailable_options 类型中的适当选项前面加上冠词“a”,您可以在执行方式逻辑中配置事件处理脚本,以便检查用户选择的选项前面是否需要冠词“a”。首先,您需要将配置 Action 为从 Fortune 场景中调用处理脚本。

如需向 Fortune 场景添加 unavailable_options 处理脚本,请按以下步骤操作:

  1. 在文本编辑器中打开 custom/scenes/Fortune.yaml
  2. 使用以下 intentEvents 数据更新 Fortune.yaml 文件:

Fortune.yaml

intentEvents:
- handler:
    webhookHandler: unavailable_options
  intent: other_option
  1. 保存文件。

更新和部署执行方式

现在,您已将 Action 配置为调用 unavailable_options 事件处理脚本,接下来,您可以在您的执行方式中更新该处理脚本并进行部署。

如需更新您的执行方式,请按以下步骤操作:

  1. 在文本编辑器中打开 webhooks/ActionsOnGoogleFulfillment/index.js
  2. 将以下代码添加到 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);
});
  1. const app = conversation({debug:true}); 下方添加以下代码:

index.js

const optionsNeedA = new Set();
optionsNeedA.add('horse').add('phone');
  1. 保存文件。

了解代码

unavailable_options 处理脚本会执行以下操作:

  • conv 对象获取 option 数据,并将 option 分配给 original 属性(用户的原始输入)
  • 将适用于 unavailable_options 类型的键 optionKey 分配给 resolved 属性
  • 检查 optionKey 是否为需要“a”的选项之一;如果是,则在构建消息时加上“a”
  • 通过 conv.add(message) 添加消息

更新处理脚本

若要让 Action 能够使用 unavailable_options,请将 unavailable_options 处理脚本添加到 webhooks/ActionsOnGoogleFulfillment.yaml 中。

  1. unavailable_options 处理脚本名称添加到 ActionsOnGoogleFulfillment.yaml 中:

ActionsOnGoogleFulfillment.yaml

handlers:
- name: greeting
- name: unavailable_options
inlineCloudFunction:
  executeFunction: ActionsOnGoogleFulfillment
  1. 保存文件。

在模拟器中测试您的 Action

现在,您的 Action 应该会根据用户在 unavailable_options 类型中选择的选项前面是否需要冠词“a”来调整提示。

如需测试您的 Action,请按以下步骤操作:

  1. 在终端中,运行以下命令:
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
  1. 复制提供的网址,并将其粘贴到浏览器中。
  2. Input 字段中点击或输入 Talk to my test app,然后按 Enter 键。
  3. Input 字段中输入 Yes,然后按 Enter 键。或者,点击 Yes 建议内容信息块。
  4. Input 字段中输入 magic,然后按 Enter 键。然后,在 Input 字段中输入 horse 并按 Enter 键。

54ee24c5c3c56e.png

您的 Action 应该会在“horse”选项前面添加冠词“a”,而在针对“magic”选项构建提示时则不会添加冠词“a”。

Actions SDK 与名为 Actions Builder 的基于 Web 的 IDE 可进行互操作,后者已集成到 Actions 控制台中。您可以使用 gactions push 命令,将本地文件系统推送为控制台中的 Action 草稿。Actions 控制台可直观地呈现您的 Action 配置。直观地呈现您的 Action 在开发过程中会很有用,并不会影响为测试提供的 Action 版本。

如需推送您的 Actions 项目并在 Actions 控制台中查看该项目,请按以下步骤操作:

  1. 在终端中,运行以下命令,将您的项目推送到 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.
  1. 复制提供的网址,并将其粘贴到浏览器中。
  2. Actions 控制台中,点击顶部导航栏中的 Develop
  3. 点击 Scenes 旁的下拉箭头,然后点击 Start。您应该会看到 Action 的 Start 场景的直观视图,如以下屏幕截图所示:

cae526c647f8d40f.png

恭喜您!

现在,您已掌握使用 Actions SDK 构建适用于 Google Assistant 的 Action 所需的中级技能。

所学内容

  • 如何使用 Node.js 执行方式库开发对话型 Action
  • 如何使用槽向用户收集数据
  • 如何使用条件向场景添加逻辑
  • 如何添加游戏循环
  • 如何添加辅助路径

其他学习资源

您可以探索以下资源,了解如何构建适用于 Google 助理的 Action:

欢迎关注我们的 Twitter 帐号 @ActionsOnGoogle,及时了解我们的最新公告,还可以使用标签 #AoGDevs 发布 Twitter 微博,分享您构建的成果!

清理项目 [推荐]

为避免可能产生的费用,建议您移除不想使用的项目。如需删除您在本 Codelab 中创建的项目,请按以下步骤操作:

  1. 如需删除 Cloud 项目和资源,请完成关停(删除)项目部分中所列的步骤。
  1. 可选:如需立即从 Actions 控制台中移除您的项目,请完成删除项目部分中所列的步骤。如果您未完成该步骤,系统会在大约 30 天后自动移除您的项目。

反馈调查问卷

在您离开本页面前,请填写简短的调查问卷,与我们分享您的体验。