Respuestas de selección visual

Usa una respuesta de selección visual si quieres que el usuario seleccione una de varias. opciones para continuar con tu Acción. Puedes usar la siguiente imagen tipos de respuesta de selección como parte de una instrucción:

  • Lista
  • Colección
  • Explorar colecciones

Cuando definas una respuesta de selección visual, usa un candidatos con el RICH_RESPONSE para que el Asistente de Google solo muestre el en dispositivos compatibles. Solo puedes usar una respuesta enriquecida por content un objeto en un mensaje.

Cómo agregar una respuesta de selección visual

Las respuestas de selección visual usan el relleno de espacios en una escena para presentar opciones que un usuario puede seleccionar y para controlar un elemento seleccionado. Cuando los usuarios seleccionan un elemento, Asistente pasa el valor del elemento seleccionado a tu webhook como un argumento. Luego, en el valor del argumento, recibirás la clave del elemento seleccionado.

Antes de poder usar una respuesta de selección visual, debes definir un tipo que representa la respuesta que un usuario selecciona posteriormente. En tu webhook, anulas ese escribe con el contenido que deseas mostrar para la selección.

Para agregar una respuesta de selección visual a una escena en Actions Builder, sigue estos pasos: pasos:

  1. En la escena, agrega una ranura a la sección Relleno de ranuras.
  2. Selecciona un tipo definido previamente para tu respuesta de selección visual y ponle un nombre. Tu webhook usa este nombre de ranura para hacer referencia al tipo más adelante.
  3. Marca la casilla Call your webhook y proporciona el nombre del controlador de eventos. de tu webhook que quieras usar para la respuesta de selección visual.
  4. Marca la casilla Send prompts.
  5. En la instrucción, proporciona el contenido JSON o YAML adecuado según el visual de selección visual que quieres devolver.
  6. En tu webhook, sigue los pasos que se indican en Cómo manejar los elementos seleccionados.

Consulta las secciones de lista, colección y exploración de colecciones a continuación para conocer las propiedades de mensajes disponibles y los ejemplos de anulación. de tipos de datos.

Cómo controlar los elementos seleccionados

Las respuestas de selección visual requieren que controles la selección de un usuario en tu el código de webhook. Cuando el usuario selecciona algo de una respuesta de selección visual, Asistente de Google llena el espacio con ese valor.

En el siguiente ejemplo, el código de webhook recibe y almacena la opción seleccionada. en una variable:

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."
      }
    }
  }
}

Lista

Ejemplo de una respuesta de selección de lista en un dispositivo móvil

Una lista presenta a los usuarios una lista vertical de varios elementos y les permite selecciona una de forma táctil o entrada de voz. Cuando un usuario selecciona un elemento de la lista, Asistente genera una consulta del usuario (burbuja de chat) que contiene el título de la lista elemento.

Las listas son útiles cuando es importante desambiguar las opciones o cuando el usuario necesita elegir entre opciones que deben analizarse en su totalidad. Para ejemplo, qué "Peter" necesitas hablar con Peter Jons o Peter Hans?

Las listas deben contener un mínimo de 2 y un máximo de 30 elementos. El número de elementos que se muestran inicialmente depende del dispositivo del usuario, y los elementos de inicio el número es 10 elementos.

Cómo crear una lista

Cuando creas una lista, tu mensaje solo contiene claves para cada elemento que un usuario que puedes seleccionar. En tu webhook, defines los elementos que corresponden a esas claves. según el tipo Entry.

Los elementos de lista definidos como objetos Entry tienen la siguiente pantalla características:

  • Título
    • Fuente y tamaño de fuente fijos
    • Longitud máxima: 1 línea (truncada con elipses...)
    • Debe ser único (para admitir la selección de voz).
  • Descripción (opcional)
    • Fuente y tamaño de fuente fijos
    • Longitud máxima: 2 líneas (truncadas con puntos suspensivos...)
  • Imagen (opcional)
    • Tamaño: 48 x 48 px

Las respuestas de selección visual requieren que anules un tipo por su nombre de ranura mediante Un tipo de entorno de ejecución en el modo TYPE_REPLACE En tu webhook de eventos, hace referencia al tipo que se anulará por su nombre de ranura (definido en Agrega respuestas de selección) en la propiedad name.

Después de reemplazar un tipo, el tipo resultante representa la lista de elementos que el usuario pueda elegir entre las pantallas de Asistente.

Propiedades

El tipo de respuesta de lista tiene las siguientes propiedades:

Propiedad Tipo Requisito Descripción
items array de ListItem Obligatorio Representa un elemento de la lista que los usuarios pueden seleccionar. Cada ListItem contiene una clave que se asigna a un tipo al que se hace referencia para el elemento de la lista.
title string Opcional Es el título de texto sin formato de la lista, restringido a una sola línea. Si no tiene título se especifica la altura de la tarjeta, se contrae la altura.
subtitle string Opcional Subtítulo de texto sin formato de la lista.

Código de muestra

En los siguientes ejemplos, se define el contenido del mensaje en el código del webhook o en La respuesta de webhook de JSON. Sin embargo, puedes definir el contenido del prompt en Actions Builder (como YAML o 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."
     }
   }
 }
}

Colección

Una colección se desplaza horizontalmente y permite que los usuarios seleccionen un elemento de manera táctil o entrada de voz. En comparación con las listas, las colecciones tienen mosaicos grandes y permiten un contenido más enriquecido. Los mosaicos que conforman una colección son similares a los tarjeta básica con imagen. Cuando los usuarios seleccionan un elemento de una colección, Asistente Genera una consulta de usuario (burbuja de chat) que contiene el título del elemento.

Las colecciones son buenas cuando se presentan varias opciones al usuario, pero no se requiere comparación directa entre ellas (en lugar de listas). En general, es preferible que lists a colecciones, ya que las listas son más fáciles de examinar y de visualizar visualmente. interactúan con la voz.

Las colecciones deben contener un mínimo de 2 y un máximo de 10 mosaicos. Activada dispositivos con pantalla, los usuarios pueden deslizar el dedo hacia la izquierda o la derecha para desplazarse por las tarjetas de una colección antes de seleccionar un elemento.

Cómo crear una colección

Cuando creas una colección, tu mensaje solo contiene claves para cada elemento al que usuario puede seleccionar. En tu webhook, defines los elementos que corresponden basadas en el tipo Entry.

Los elementos de la colección definidos como objetos Entry tienen la siguiente visualización características:

  • Imagen (opcional)
    • Se forzó la imagen para que mida 128 dp de alto por 232 dp de ancho.
    • Si la relación de aspecto no coincide con el cuadro de límite de la imagen, Entonces, la imagen se centra con barras a cada lado.
    • Si el vínculo de una imagen no funciona, se usa una imagen de marcador de posición.
  • Título (obligatorio)
    • Texto sin formato; Markdown no es compatible. Las mismas opciones de formato que respuesta enriquecida de tarjeta básica
    • La altura de la tarjeta se contrae si no se especifica un título.
    • Debe ser único (para admitir la selección de voz).
  • Descripción (opcional)
    • Texto sin formato; Markdown no es compatible. Las mismas opciones de formato que respuesta enriquecida de tarjeta básica

Las respuestas de selección visual requieren que anules un tipo por su nombre de ranura mediante Un tipo de entorno de ejecución en el modo TYPE_REPLACE En tu webhook de eventos, hace referencia al tipo que se anulará por su nombre de ranura (definido en Agrega respuestas de selección) en la propiedad name.

Después de reemplazar un tipo, el tipo resultante representa la colección de elementos que el usuario puede elegir de los que muestra Asistente.

Propiedades

El tipo de respuesta de colección tiene las siguientes propiedades:

Propiedad Tipo Requisito Descripción
items array de CollectionItem Obligatorio Representa un elemento en la colección que los usuarios pueden seleccionar. Cada CollectionItem contiene una clave que se asigna a un tipo al que se hace referencia. para el elemento de la colección.
title string Opcional Es el título de la colección con texto sin formato. Los títulos deben ser únicos en cada colección para admitir la selección de voz.
subtitle string Opcional Subtítulo de la colección con texto sin formato.
image_fill ImageFill Opcional Borde entre la tarjeta y el contenedor de imágenes que se usará cuando la relación de aspecto de la imagen no coincide con el aspecto del contenedor de la imagen proporción.

Código de muestra

En los siguientes ejemplos, se define el contenido del mensaje en el código del webhook o en Es la respuesta de webhook JSON. Sin embargo, puedes definir el contenido del prompt en Actions Builder (como YAML o 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."
      }
    }
  }
}

Explorar colecciones

Similar a una colección, la exploración de colecciones es una respuesta enriquecida. que permite que los usuarios se desplacen por las tarjetas de opciones. La exploración de la colección es diseñado específicamente para contenido web y abre el mosaico seleccionado en una página web navegador (o de AMP si todos los mosaicos están habilitados para AMP).

Las respuestas de exploración de colecciones contienen un mínimo de 2 y un máximo de 10 mosaicos. Activada dispositivos con pantalla, los usuarios pueden deslizar el dedo hacia arriba o hacia abajo para desplazarse por las tarjetas antes de seleccionar un elemento.

Creando una exploración de la colección

Cuando crees una exploración de la colección, ten en cuenta cómo interactuarán los usuarios con ella. mensaje. Cada colección item abre su URL definida, por lo que debes proporcionar información útil detalles al usuario.

Los elementos de navegación por colecciones tienen las siguientes características en la pantalla:

  • Imagen (opcional)
    • La imagen se fuerza a 128 dp de alto x 232 dp de ancho.
    • Si la relación de aspecto no coincide con el cuadro delimitador de la imagen, esta centrado con barras a los lados o en la parte superior e inferior. El color del las barras están determinadas por la propiedad ImageFill de exploración de la colección.
    • Si el vínculo de una imagen está roto, se usa una imagen de marcador de posición en su lugar.
  • Título (obligatorio)
  • Descripción (opcional)
  • Pie de página (opcional)
    • Texto sin formato; Markdown no es compatible.

Propiedades

El tipo de respuesta de exploración de colecciones tiene las siguientes propiedades:

Propiedad Tipo Requisito Descripción
item objeto Obligatorio Representa un elemento en la colección que los usuarios pueden seleccionar.
image_fill ImageFill Opcional Borde entre la tarjeta y el contenedor de imagen que se usará cuando la relación de aspecto de la imagen no coincida con la del contenedor de la imagen.

La exploración de la colección item tiene las siguientes propiedades:

Propiedad Tipo Requisito Descripción
title string Obligatorio Título con texto sin formato del elemento de la colección.
description string Opcional Descripción del elemento de la colección.
footer string Opcional Texto del pie de página del elemento de la colección, que se muestra debajo de la descripción.
image Image Opcional Se muestra la imagen del elemento de la colección.
openUriAction OpenUrl Obligatorio Es el URI que se debe abrir cuando se selecciona el elemento de la colección.

Código de muestra

En los siguientes ejemplos, se define el contenido del mensaje en el código del webhook o en Es la respuesta de webhook JSON. Sin embargo, puedes definir el contenido del prompt en Actions Builder (como YAML o 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."
      }
    }
  }
}