视觉选择响应

如果您希望用户从多个选项中选择一个,请使用视觉选择响应 以继续您的 Action。您可以使用以下直观示意图 选择响应类型作为提示的一部分:

  • 列表
  • 集合
  • 浏览集合

在定义视觉选择响应时,请使用带有 RICH_RESPONSE 显示 capability,以便 Google 助理仅返回 响应。每个 content 只能使用一条富响应 对象。

添加视觉选择响应

视觉选择响应使用场景中的槽填充来呈现选项 用户可以选择并处理所选项。当用户选择某项内容后 Google 助理将选定项的值作为参数传递给 webhook。然后, ,则会收到所选项目的键。

您必须先定义一个类型,然后才能使用视觉选择响应 表示用户稍后选择的响应。在网络钩子中,您可以替换 输入您想显示以供选择的内容。

如需在 Actions Builder 中为场景添加视觉选择响应,请按以下步骤操作: 步骤:

  1. 在场景中,向槽位填充部分添加一个槽位。
  2. 为视觉选择响应选择之前定义的类型,并 为其命名webhook 稍后会使用此槽名称引用该类型。
  3. 勾选 Call your webhook 复选框,并提供事件处理脚本的名称 。
  4. 勾选 Send prompts 复选框。
  5. 在提示符中,根据 视觉选择响应。
  6. 在 webhook 中,按照处理所选商品中的步骤操作。

如需了解可用的提示属性和替换示例,请参阅下面的列表集合集合浏览部分 。

处理所选商品

视觉选择响应要求您处理用户在 webhook 代码。当用户从视觉选择响应中选择内容时, Google 助理会使用该值填充槽位。

在以下示例中,webhook 代码会接收并存储所选的选项, 中的以下参数:

Node.js

app.handle('Option', conv => {
  // Note: 'prompt_option' is the name of the slot.
  const selectedOption = conv.session.params.prompt_option;
  conv.add(`You selected ${selectedOption}.`);
});

JSON

{
  "responseJson": {
    "session": {
      "id": "session_id",
      "params": {
        "prompt_option": "ITEM_1"
      }
    },
    "prompt": {
      "override": false,
      "firstSimple": {
        "speech": "You selected ITEM_1.",
        "text": "You selected ITEM_1."
      }
    }
  }
}

列表

移动设备上的列表选择响应示例

列表可向用户显示包含多个项目的纵向列表, 通过触控或语音输入选择模式。当用户从列表中选择商品后, Google 助理生成包含列表标题的用户查询(聊天气泡) 内容。

列表适用于消除选项的歧义,或者 需要在需要完整扫描的选项之间进行选择。对于 “Peter”你需要跟 Peter Jons 或 Peter Hans 对话吗?

列表必须包含至少 2 到 30 个列表项。您获得的 元素最初的显示取决于用户的设备, 为 10 项。

创建列表

创建列表时,您的提示仅包含用户 可供选择。在网络钩子中,您可以定义与这些键对应的项 基于 Entry 类型。

定义为 Entry 对象的列表项具有以下显示内容: 特征:

  • 标题
    • 固定的字体和字号
    • 长度上限:1 行(用省略号截断...)
    • 必须唯一(以便支持语音选择)
  • 说明(可选) <ph type="x-smartling-placeholder">
      </ph>
    • 固定的字体和字号
    • 长度上限:2 行(用省略号截断...)
  • 图片(可选) <ph type="x-smartling-placeholder">
      </ph>
    • 尺寸:48x48 像素

视觉选择响应要求您使用 处于 TYPE_REPLACE 模式的运行时类型。在网络钩子中 事件处理脚本,请引用要按其广告位名称(在 添加选择响应)。name

覆盖某个类型后,生成的类型表示项目列表 用户可以从 Google 助理显示的内容中选择

属性

列表响应类型具有以下属性:

属性 类型 要求 说明
items ListItem 组成的数组 必填 表示列表中可供用户选择的项。每个 ListItem 包含一个键,该键映射到 列表项。
title 字符串 可选 列表的纯文本标题,仅限一行。如果没有标题 指定值时,卡片高度会收起。
subtitle 字符串 可选 列表的纯文本副标题。

示例代码

以下示例定义了网络钩子代码或 JSON webhookResponse 。不过,您可以 Actions Builder(采用 YAML 或 JSON 格式)。

Node.js

const ASSISTANT_LOGO_IMAGE = new Image({
  url: 'https://developers.google.com/assistant/assistant_96.png',
  alt: 'Google Assistant logo'
});

app.handle('List', conv => {
  conv.add('This is a list.');

  // Override type based on slot 'prompt_option'
  conv.session.typeOverrides = [{
    name: 'prompt_option',
    mode: 'TYPE_REPLACE',
    synonym: {
      entries: [
        {
          name: 'ITEM_1',
          synonyms: ['Item 1', 'First item'],
          display: {
             title: 'Item #1',
             description: 'Description of Item #1',
             image: ASSISTANT_LOGO_IMAGE,
                }
        },
        {
          name: 'ITEM_2',
          synonyms: ['Item 2', 'Second item'],
          display: {
             title: 'Item #2',
             description: 'Description of Item #2',
             image: ASSISTANT_LOGO_IMAGE,
                }
        },
        {
          name: 'ITEM_3',
          synonyms: ['Item 3', 'Third item'],
          display: {
             title: 'Item #3',
             description: 'Description of Item #3',
             image: ASSISTANT_LOGO_IMAGE,
                }
        },
        {
          name: 'ITEM_4',
          synonyms: ['Item 4', 'Fourth item'],
          display: {
             title: 'Item #4',
             description: 'Description of Item #4',
             image: ASSISTANT_LOGO_IMAGE,
                }
        },
        ]
    }
  }];

  // Define prompt content using keys
  conv.add(new List({
    title: 'List title',
    subtitle: 'List subtitle',
    items: [
      {
        key: 'ITEM_1'
      },
      {
        key: 'ITEM_2'
      },
      {
        key: 'ITEM_3'
      },
      {
        key: 'ITEM_4'
      }
    ],
  }));
});

JSON

{
 "responseJson": {
   "session": {
     "id": "session_id",
     "params": {},
     "typeOverrides": [
       {
         "name": "prompt_option",
         "synonym": {
           "entries": [
             {
               "name": "ITEM_1",
               "synonyms": [
                 "Item 1",
                 "First item"
               ],
               "display": {
                 "title": "Item #1",
                 "description": "Description of Item #1",
                 "image": {
                   "alt": "Google Assistant logo",
                   "height": 0,
                   "url": "https://developers.google.com/assistant/assistant_96.png",
                   "width": 0
                 }
               }
             },
             {
               "name": "ITEM_2",
               "synonyms": [
                 "Item 2",
                 "Second item"
               ],
               "display": {
                 "title": "Item #2",
                 "description": "Description of Item #2",
                 "image": {
                   "alt": "Google Assistant logo",
                   "height": 0,
                   "url": "https://developers.google.com/assistant/assistant_96.png",
                   "width": 0
                 }
               }
             },
             {
               "name": "ITEM_3",
               "synonyms": [
                 "Item 3",
                 "Third item"
               ],
               "display": {
                 "title": "Item #3",
                 "description": "Description of Item #3",
                 "image": {
                   "alt": "Google Assistant logo",
                   "height": 0,
                   "url": "https://developers.google.com/assistant/assistant_96.png",
                   "width": 0
                 }
               }
             },
             {
               "name": "ITEM_4",
               "synonyms": [
                 "Item 4",
                 "Fourth item"
               ],
               "display": {
                 "title": "Item #4",
                 "description": "Description of Item #4",
                 "image": {
                   "alt": "Google Assistant logo",
                   "height": 0,
                   "url": "https://developers.google.com/assistant/assistant_96.png",
                   "width": 0
                 }
               }
             }
           ]
         },
         "typeOverrideMode": "TYPE_REPLACE"
       }
     ]
   },
   "prompt": {
     "override": false,
     "content": {
       "list": {
         "items": [
           {
             "key": "ITEM_1"
           },
           {
             "key": "ITEM_2"
           },
           {
             "key": "ITEM_3"
           },
           {
             "key": "ITEM_4"
           }
         ],
         "subtitle": "List subtitle",
         "title": "List title"
       }
     },
     "firstSimple": {
       "speech": "This is a list.",
       "text": "This is a list."
     }
   }
 }
}

集合

集合可水平滚动,并允许用户通过触摸选择一项内容 或语音输入。与列表相比,集合包含大图块和 以便提供更丰富的内容组成集合的图块与 包含图片的基本卡片当用户从集合中选择内容后,Google 助理 生成包含相应项标题的用户查询(聊天气泡)。

当向用户显示各种选项时,就非常适合使用集合,但 之间不需要直接比较(与列表相比)。一般来说,最好 lists 添加到集合中,因为列表更便于直观地浏览和 语音互动。

集合必须包含 2 到 10 个图块。已开启 支持显示的设备上,用户只需左右滑动即可滚动浏览卡片 然后才能选择项。

创建集合

创建集合时,您的提示仅包含 用户可以选择的选项在网络钩子中,您可以定义与这些项相对应的项 根据 Entry 类型确定键。

定义为 Entry 对象的集合项具有以下显示内容: 特征:

  • 图片(可选) <ph type="x-smartling-placeholder">
      </ph>
    • 图片的高度必须为 128 dp x 232 dp
    • 如果图片宽高比与图片边界框不匹配, 那么图片会居中对齐,两侧各有条形
    • 如果图片链接损坏,则会改用占位符图片
  • 标题(必填) <ph type="x-smartling-placeholder">
      </ph>
    • 纯文本,不支持 Markdown。与 基本卡片丰富的响应
    • 如果未指定标题,卡片高度会收起。
    • 必须唯一(以便支持语音选择)
  • 说明(可选) <ph type="x-smartling-placeholder">
      </ph>
    • 纯文本,不支持 Markdown。与 基本卡片丰富的响应

视觉选择响应要求您使用 处于 TYPE_REPLACE 模式的运行时类型。在网络钩子中 事件处理脚本,请引用要按其广告位名称(在 添加选择响应)。name

覆盖某个类型后,生成的类型表示 可供用户选择的选项。

属性

集合响应类型具有以下属性:

属性 类型 要求 说明
items CollectionItem 组成的数组 必填 表示集合中用户可以选择的项。每个 CollectionItem 包含一个映射到所引用类型的键 。
title 字符串 可选 合集的纯文本标题。每个字段中的标题必须是唯一的 来支持语音选择。
subtitle 字符串 可选 合集的纯文本副标题。
image_fill ImageFill 可选 卡片与图片容器之间的边界, 图片的宽高比与图片容器的宽高比不一致 宽高比。

示例代码

以下示例定义了网络钩子代码或 JSON 网络钩子响应。不过,您可以 Actions Builder(采用 YAML 或 JSON 格式)。

Node.js

const ASSISTANT_LOGO_IMAGE = new Image({
  url: 'https://developers.google.com/assistant/assistant_96.png',
  alt: 'Google Assistant logo'
});

app.handle('Collection', conv => {
  conv.add("This is a collection.");

  // Override type based on slot 'prompt_option'
  conv.session.typeOverrides = [{
    name: 'prompt_option',
    mode: 'TYPE_REPLACE',
    synonym: {
      entries: [
        {
          name: 'ITEM_1',
          synonyms: ['Item 1', 'First item'],
          display: {
             title: 'Item #1',
             description: 'Description of Item #1',
             image: ASSISTANT_LOGO_IMAGE,
                }
        },
        {
          name: 'ITEM_2',
          synonyms: ['Item 2', 'Second item'],
          display: {
             title: 'Item #2',
             description: 'Description of Item #2',
             image: ASSISTANT_LOGO_IMAGE,
                }
        },
        {
          name: 'ITEM_3',
          synonyms: ['Item 3', 'Third item'],
          display: {
             title: 'Item #3',
             description: 'Description of Item #3',
             image: ASSISTANT_LOGO_IMAGE,
                }
        },
        {
          name: 'ITEM_4',
          synonyms: ['Item 4', 'Fourth item'],
          display: {
             title: 'Item #4',
             description: 'Description of Item #4',
             image: ASSISTANT_LOGO_IMAGE,
                }
        },
        ]
    }
  }];

  // Define prompt content using keys
  conv.add(new Collection({
    title: 'Collection Title',
    subtitle: 'Collection subtitle',
    items: [
      {
        key: 'ITEM_1'
      },
      {
        key: 'ITEM_2'
      },
      {
        key: 'ITEM_3'
      },
      {
        key: 'ITEM_4'
      }
    ],
  }));
});

JSON

{
  "responseJson": {
    "session": {
      "id": "ABwppHHz--uQEEy3CCOANyB0J58oF2Yw5JEX0oXwit3uxDlRwzbEIK3Bcz7hXteE6hWovrLX9Ahpqu8t-jYnQRFGpAUqSuYjZ70",
      "params": {},
      "typeOverrides": [
        {
          "name": "prompt_option",
          "synonym": {
            "entries": [
              {
                "name": "ITEM_1",
                "synonyms": [
                  "Item 1",
                  "First item"
                ],
                "display": {
                  "title": "Item #1",
                  "description": "Description of Item #1",
                  "image": {
                    "alt": "Google Assistant logo",
                    "height": 0,
                    "url": "https://developers.google.com/assistant/assistant_96.png",
                    "width": 0
                  }
                }
              },
              {
                "name": "ITEM_2",
                "synonyms": [
                  "Item 2",
                  "Second item"
                ],
                "display": {
                  "title": "Item #2",
                  "description": "Description of Item #2",
                  "image": {
                    "alt": "Google Assistant logo",
                    "height": 0,
                    "url": "https://developers.google.com/assistant/assistant_96.png",
                    "width": 0
                  }
                }
              },
              {
                "name": "ITEM_3",
                "synonyms": [
                  "Item 3",
                  "Third item"
                ],
                "display": {
                  "title": "Item #3",
                  "description": "Description of Item #3",
                  "image": {
                    "alt": "Google Assistant logo",
                    "height": 0,
                    "url": "https://developers.google.com/assistant/assistant_96.png",
                    "width": 0
                  }
                }
              },
              {
                "name": "ITEM_4",
                "synonyms": [
                  "Item 4",
                  "Fourth item"
                ],
                "display": {
                  "title": "Item #4",
                  "description": "Description of Item #4",
                  "image": {
                    "alt": "Google Assistant logo",
                    "height": 0,
                    "url": "https://developers.google.com/assistant/assistant_96.png",
                    "width": 0
                  }
                }
              }
            ]
          },
          "typeOverrideMode": "TYPE_REPLACE"
        }
      ]
    },
    "prompt": {
      "override": false,
      "content": {
        "collection": {
          "imageFill": "UNSPECIFIED",
          "items": [
            {
              "key": "ITEM_1"
            },
            {
              "key": "ITEM_2"
            },
            {
              "key": "ITEM_3"
            },
            {
              "key": "ITEM_4"
            }
          ],
          "subtitle": "Collection subtitle",
          "title": "Collection Title"
        }
      },
      "firstSimple": {
        "speech": "This is a collection.",
        "text": "This is a collection."
      }
    }
  }
}

浏览集合

集合类似,集合浏览是一个富响应 让用户能够滚动浏览选项卡片集合浏览模式现为 专为 Web 内容设计,并在网页上打开所选图块 浏览器(如果所有图块均已启用 AMP,则为 AMP 浏览器)。

集合浏览响应至少包含 2 个图块,最多包含 10 个图块。已开启 支持显示的设备,用户可以通过上下滑动来滚动浏览卡片 然后再选择内容

创建集合浏览

创建集合浏览时,请考虑用户与此内容互动的方式 提示。每次集合浏览 item 都会打开其定义的网址,因此请提供有用的信息 向用户发送详细信息

集合浏览项具有以下显示特征:

  • 图片(可选) <ph type="x-smartling-placeholder">
      </ph>
    • 图片高度强制为 128 dp x 232 dp。
    • 如果图片宽高比与图片边界框不匹配,则图片为 两侧或顶部和底部均以横条居中显示。该 条形由集合浏览 ImageFill 属性决定。
    • 如果图片链接已损坏,则系统会使用占位符图片代替它。
  • 标题(必填) <ph type="x-smartling-placeholder">
  • 说明(可选) <ph type="x-smartling-placeholder">
  • 页脚(可选) <ph type="x-smartling-placeholder">
      </ph>
    • 纯文本;不支持 Markdown。

属性

集合浏览响应类型具有以下属性:

属性 类型 要求 说明
item 对象 必填 表示集合中用户可以选择的项。
image_fill ImageFill 可选 图片的宽高比与图片容器的宽高比不一致时,要使用的卡片与图片容器之间的边框。

集合浏览 item 具有以下属性:

属性 类型 要求 说明
title 字符串 必填 集合项的纯文本标题。
description 字符串 可选 集合项的说明。
footer 字符串 可选 集合项的页脚文本,显示在说明下方。
image Image 可选 显示合集项的图片。
openUriAction OpenUrl 必填 选择集合项时打开的 URI。

示例代码

以下示例定义了网络钩子代码或 JSON 网络钩子响应。不过,您可以 Actions Builder(采用 YAML 或 JSON 格式)。

YAML

candidates:
  - first_simple:
      variants:
        - speech: This is a collection browse.
    content:
      collection_browse:
        items:
          - title: Item #1
            description: Description of Item #1
            footer: Footer of Item #1
            image:
              url: 'https://developers.google.com/assistant/assistant_96.png'
            open_uri_action:
              url: 'https://www.example.com'
          - title: Item #2
            description: Description of Item #2
            footer: Footer of Item #2
            image:
              url:  'https://developers.google.com/assistant/assistant_96.png'
            open_uri_action:
              url: 'https://www.example.com'
        image_fill: WHITE

JSON

{
 "candidates": [
   {
     "firstSimple": {
       "speech": "This is a collection browse.",
       "text": "This is a collection browse."
     },
     "content": {
       "collectionBrowse": {
         "items": [
           {
             "title": "Item #1",
             "description": "Description of Item #1",
             "footer": "Footer of Item #1",
             "image": {
               "url": "https://developers.google.com/assistant/assistant_96.png"
             },
             "openUriAction": {
               "url": "https://www.example.com"
             }
           },
           {
             "title": "Item #2",
             "description": "Description of Item #2",
             "footer": "Footer of Item #2",
             "image": {
               "url": "https://developers.google.com/assistant/assistant_96.png"
             },
             "openUriAction": {
               "url": "https://www.example.com"
             }
           }
         ],
         "imageFill": "WHITE"
       }
     }
   }
 ]
}

Node.js

// Collection Browse
app.handle('collectionBrowse', (conv) => {
  conv.add('This is a collection browse.');
  conv.add(new CollectionBrowse({
    'imageFill': 'WHITE',
    'items':
      [
        {
          'title': 'Item #1',
          'description': 'Description of Item #1',
          'footer': 'Footer of Item #1',
          'image': {
            'url': 'https://developers.google.com/assistant/assistant_96.png'
          },
          'openUriAction': {
            'url': 'https://www.example.com'
          }
        },
        {
          'title': 'Item #2',
          'description': 'Description of Item #2',
          'footer': 'Footer of Item #2',
          'image': {
            'url': 'https://developers.google.com/assistant/assistant_96.png'
          },
          'openUriAction': {
            'url': 'https://www.example.com'
          }
        }
      ]
  }));
});

JSON

{
  "responseJson": {
    "session": {
      "id": "session_id",
      "params": {},
      "languageCode": ""
    },
    "prompt": {
      "override": false,
      "content": {
        "collectionBrowse": {
          "imageFill": "WHITE",
          "items": [
            {
              "title": "Item #1",
              "description": "Description of Item #1",
              "footer": "Footer of Item #1",
              "image": {
                "url": "https://developers.google.com/assistant/assistant_96.png"
              },
              "openUriAction": {
                "url": "https://www.example.com"
              }
            },
            {
              "title": "Item #2",
              "description": "Description of Item #2",
              "footer": "Footer of Item #2",
              "image": {
                "url": "https://developers.google.com/assistant/assistant_96.png"
              },
              "openUriAction": {
                "url": "https://www.example.com"
              }
            }
          ]
        }
      },
      "firstSimple": {
        "speech": "This is a collection browse.",
        "text": "This is a collection browse."
      }
    }
  }
}