Para retransmitir información a tu aplicación web, debes enviar una respuesta Canvas
desde tu lógica de conversación. Una respuesta Canvas
puede realizar cualquiera de las siguientes acciones:
- Renderizar la app web de pantalla completa en el dispositivo del usuario
- Pasa datos para actualizar la app web
En las siguientes secciones, se describe cómo mostrar una respuesta de Canvas para cada situación.
Habilitar Interactive Canvas
Debes configurar la acción de una forma específica para usar Interactive Canvas.
Crear una acción que use Interactive Canvas requiere una configuración adicional en la Consola de Actions (y, para el SDK de Actions, debe modificar el archivo settings.yaml
). Si deseas ver el procedimiento completo para crear y configurar una acción de Interactive Canvas con el SDK de Actions, consulta Cómo crear un proyecto.
Cuando uses Actions Builder, sigue estos pasos adicionales para habilitar Interactive Canvas:
- Si no seleccionaste la tarjeta Juego en la pantalla What type of Action do you want to build?, haz clic en Implementar en la navegación superior. En Información adicional, selecciona la categoría Juegos y diversión. Haga clic en Guardar.
- Haga clic en Develop, en la barra de navegación superior de la Consola de Actions.
- Haz clic en Interactive Canvas en el panel de navegación izquierdo.
- En ¿Deseas que tu acción use Interactive Canvas?, selecciona una de las siguientes opciones:
- Habilita Interactive Canvas con entregas de webhook de servidor. Esta opción depende del webhook para acceder a ciertas funciones y, con frecuencia, usa
onUpdate()
a fin de pasar datos a la app web. Cuando se habilita, las coincidencias de intents se controlan en las escenas, y puedes optar por llamar al webhook antes de hacer la transición a otra escena o finalizar la conversación. - Habilita Interactive Canvas con entregas de clientes. Esta opción te permite mover la lógica de entrega de webhook a la aplicación web y limitar las llamadas de webhook a solo las funciones de conversación que lo requieran, como la vinculación de cuentas. Cuando se habilita, puedes usar
expect()
para registrar los controladores de intents en el lado del cliente.
- Habilita Interactive Canvas con entregas de webhook de servidor. Esta opción depende del webhook para acceder a ciertas funciones y, con frecuencia, usa
- Opcional: Ingresa la URL de tu aplicación web en el campo Establece la URL predeterminada de la aplicación web. Esta acción agrega a tu invocación principal una respuesta
Canvas
predeterminada con el campo URL. - Haz clic en Guardar.
Cuando uses el SDK de Actions, sigue estos pasos adicionales para habilitar Interactive Canvas:
- Configura el campo
category
del archivosettings.yaml
comoGAMES_AND_TRIVIA
para describir y ayudar a los usuarios a descubrir tu acción. - Establece el campo
usesInteractiveCanvas
en tu archivosettings.yaml
entrue
.
Verifica la capacidad de la superficie
El framework de Interactive Canvas se ejecuta solo en dispositivos con Asistente integrado que proporcionan una interfaz visual, por lo que tu acción debe verificar la capacidad de INTERACTIVE_CANVAS
en el dispositivo del usuario. Cuando defines mensajes en Actions Builder, puedes especificar una lista de capacidades del dispositivo en el campo selector
del objeto candidates
. El selector de mensajes selecciona el candidato del mensaje que sea más apropiado para la capacidad del dispositivo del usuario.
Para mostrar una respuesta Canvas
, la lógica de tu acción debe hacer lo siguiente:
- Comprueba que el dispositivo del usuario sea compatible con la función
INTERACTIVE_CANVAS
. De ser así, envíale una respuestaCanvas
al usuario. - Si la capacidad de Interactive Canvas no está disponible, verifica si el dispositivo del usuario es compatible con la función
RICH_RESPONSE
. Si es así, envíale una respuesta enriquecida al usuario. - Si la función de respuesta enriquecida no está disponible, envíale una respuesta simple al usuario.
Los siguientes fragmentos muestran la respuesta adecuada según las capacidades del dispositivo del usuario:
YAML
candidates: - selector: surface_capabilities: capabilities: - INTERACTIVE_CANVAS canvas: url: 'https://example.web.app' - selector: surface_capabilities: capabilities: - RICH_RESPONSE content: card: title: Card title text: Card Content image: url: 'https://example.com/image.png' alt: Alt text button: name: Link name open: url: 'https://example.com/' - first_simple: variants: - speech: Example simple response.
JSON
{ "candidates": [ { "selector": { "surface_capabilities": { "capabilities": [ "INTERACTIVE_CANVAS" ] } }, "canvas": { "url": "https://example.web.app" } }, { "selector": { "surface_capabilities": { "capabilities": [ "RICH_RESPONSE" ] } }, "content": { "card": { "title": "Card title", "text": "Card Content", "image": { "url": "https://example.com/image.png", "alt": "Alt text" }, "button": { "name": "Link name", "open": { "url": "https://example.com/" } } } } }, { "first_simple": { "variants": [ { "speech": "Example simple response." } ] } } ] }
Node.js
const supportsRichResponse = conv.device.capabilities.includes("RICH_RESPONSE"); const supportsInteractiveCanvas = conv.device.capabilities.includes("INTERACTIVE_CANVAS"); if (supportsInteractiveCanvas) { // Respond with a Canvas response conv.add(new Canvas({ url: 'https://example.web.app', })); } else if (supportsRichResponse) { // Respond with a rich response conv.add(new Card({ title: 'Card title', image: new Image({ url: 'https://example.com/image.png', alt: 'Alt text', }), button: new Link({ name: 'Link name', open: { url: 'https://example.com/', }, }), })); } else { // Respond with a simple response conv.add('Example simple response.'); }
Renderiza la app web
Una acción que usa Interactive Canvas incluye una app web con elementos visuales personalizados que envías a los usuarios como respuesta. Una vez que se renderiza la app web, los usuarios continúan interactuando con ella mediante voz, texto o acciones táctiles hasta que finaliza la conversación.
Tu primera respuesta de Canvas
debe contener la URL de la aplicación web. Este tipo de respuesta de Canvas
le indica al Asistente de Google que renderice la aplicación web en esa dirección en el dispositivo del usuario. Por lo general, envías la primera respuesta de Canvas
inmediatamente después de que el usuario invoque tu acción. Cuando se carga la app web, se carga la biblioteca de Interactive Canvas y esta registra un controlador de devolución de llamada con la API de Interactive Canvas.
Puedes especificar la URL de tu aplicación web en Actions Builder, como se muestra en la siguiente captura de pantalla:
Si creas un mensaje que incluye una respuesta Canvas
después de especificar la URL de la aplicación web, Actions Builder propaga automáticamente el campo URL de la respuesta Canvas
. Para obtener más información sobre cómo configurar la URL de la aplicación web en la consola, consulta la sección Cómo habilitar Interactive Canvas.
En los siguientes fragmentos, se muestra cómo crear respuestas de Canvas
que renderizan la aplicación web en Actions Builder y en tu webhook:
YAML
candidates: - first_simple: variants: - speech: >- Welcome! Do you want me to change color or pause spinning? You can also tell me to ask you later. canvas: url: 'https://your-web-app.com'
JSON
{ "candidates": [ { "first_simple": { "variants": [ { "speech": "Welcome! Do you want me to change color or pause spinning? You can also tell me to ask you later." } ] }, "canvas": { "url": "https://your-web-app.com" } } ] }
Node.js
app.handle('welcome', (conv) => { conv.add('Welcome! Do you want me to change color or pause spinning? ' + 'You can also tell me to ask you later.'); conv.add(new Canvas({ url: `https://your-web-app.com`, })); });
JSON
{ "session": { "id": "session_id", "params": {} }, "prompt": { "override": false, "firstSimple": { "speech": "Welcome! Do you want me to change color or pause spinning? You can also tell me to ask you later.", "text": "Welcome! Do you want me to change color or pause spinning? You can also tell me to ask you later." }, "canvas": { "data": [], "suppressMic": false, "url": "https://your-web-app.com" } } }
Pasa datos para actualizar la app web
Después de enviar la respuesta inicial de Canvas
, puedes usar respuestas de Canvas
adicionales para proporcionar actualizaciones a data
, que la lógica personalizada de tu aplicación web utiliza para realizar cambios en ella. Cuando envías una respuesta de Canvas
que pasa datos a la aplicación web, se producen los siguientes pasos:
- Cuando se detecta una coincidencia con el intent dentro de una escena, se activa un evento y se envía una respuesta
Canvas
que contiene un campodata
con una carga útil JSON. - El campo
data
se pasa a una devolución de llamadaonUpdate
y se usa para actualizar la aplicación web. Tu acción de conversación puede enviar una respuesta
Canvas
nueva y proporcionar información en el campodata
para enviar actualizaciones o cargar estados nuevos.
Puedes pasar datos a tu aplicación web de dos maneras:
- Con Actions Builder. Actions Builder propaga automáticamente el campo
data
en la respuesta deCanvas
con los metadatos necesarios para actualizar la aplicación web. - Con un webhook. Si tienes un webhook, puedes configurar una carga útil de datos personalizados para actualizar la aplicación web en tu respuesta de
Canvas
.
En las siguientes secciones, se describe cómo pasar datos a través de Actions Builder y de un webhook.
Cómo usar Actions Builder para pasar datos
Con Actions Builder, no necesitas definir un webhook para administrar los metadatos que se envían a tu aplicación web. En cambio, cuando configuras tu controlador de intents en la IU de Actions Builder, puedes incluir una respuesta de Canvas
. Un campo data
se propaga automáticamente con los metadatos necesarios para actualizar tu app web, como el nombre del intent, los parámetros capturados de la entrada del usuario y la escena actual.
Por ejemplo, el siguiente controlador de intents Guess
indica que deseas incluir una respuesta Canvas
:
YAML
candidates: - canvas: send_state_data_to_canvas_app: true
JSON
{ "candidates": [ { "canvas": { "send_state_data_to_canvas_app": true } } ] }
De manera opcional, puedes agregar el siguiente fragmento al controlador del intent para enviar un mensaje TTS:
...
- first_simple:
variants:
- speech: Optional message.
Actions Builder extiende automáticamente la respuesta de Canvas
con metadatos para actualizar la aplicación web, como se muestra en los siguientes fragmentos. En este caso, el usuario adivinó la letra "a" en un juego de adivinanzas de palabras:
YAML
candidates: - canvas: data: - google: intent: params: letter: resolved: a original: a name: guess scene: Game sendStateDataToCanvasApp: true
JSON
{ "candidates": [ { "canvas": { "data": [ { "google": { "intent": { "params": { "letter": { "resolved": "a", "original": "a" } }, "name": "guess" }, "scene": "Game" } } ], "sendStateDataToCanvasApp": true } } ] }
Esta respuesta actualiza tu aplicación web con la respuesta del usuario y pasa a la escena adecuada.
Usa tu webhook para pasar datos
Puedes configurar manualmente el campo data
de las respuestas de Canvas
en tu webhook con la información de estado necesaria para actualizar tu aplicación web. Este enfoque se recomienda si necesitas incluir una carga útil de data
personalizada en una respuesta de Canvas
, en lugar de pasar solo los metadatos típicos necesarios para actualizar la aplicación web.
En los siguientes fragmentos, se muestra cómo pasar datos en una respuesta Canvas
de tu webhook:
Node.js
app.handle('start_spin', (conv) => { conv.add(`Ok, I'm spinning. What else?`); conv.add(new Canvas({ data: { command: 'SPIN', spin: true, }, })); });
JSON
{ "session": { "id": "session_id", "params": {} }, "prompt": { "override": false, "firstSimple": { "speech": "Ok, I'm spinning. What else?", "text": "Ok, I'm spinning. What else?" }, "canvas": { "data": { "command": "SPIN", "spin": true }, "suppressMic": false, "url": "" } } }
Lineamientos y restricciones
Cuando crees tu acción, ten en cuenta los siguientes lineamientos y restricciones para las respuestas de Canvas
:
- Cada controlador de webhook en tu entrega debe incluir
Canvas
. Si la respuesta del webhook no incluyeCanvas
, se cierra la aplicación web. - Solo debes incluir la URL de tu aplicación web en la primera respuesta de
Canvas
que envíes al usuario. - La URL de respuesta
Canvas
debe ser válida y su protocolo debe ser https. - La respuesta
Canvas
debe tener un tamaño de 50 KB o menos.