1. Introducción
Estás mirando televisión, pero no encuentras el control remoto, o tal vez no quieres visitar cada canal de TV para saber si hay algo lindo en la televisión. Preguntemos al Asistente de Google qué hay en la TV. En este lab, compilarás una acción simple usando Dialogflow y aprenderás a integrarla con el Asistente de Google.
Los ejercicios están ordenados para reflejar una experiencia común de desarrollador de la nube:
- Crea un agente de Dialogflow v2
- Crea una entidad personalizada
- Crea intents
- Configura un webhook con Firebase Functions
- Prueba el chatbot
- Habilita la integración del Asistente de Google
Qué compilarás
Compilaremos un agente de chatbot de guías de TV interactivas para Asistente de Google. Puedes preguntarle a la guía de TV qué se está emitiendo en un canal en particular. Por ejemplo: "¿Qué hay en MTV?". La acción de la Guía de TV te indicará qué se está reproduciendo en este momento y qué se reproducirá a continuación. |
Qué aprenderás
- Cómo crear un chatbot con Dialogflow v2
- Cómo crear entidades personalizadas con Dialogflow
- Cómo crear una conversación lineal con Dialogflow
- Cómo configurar entregas de webhook con Dialogflow y Firebase Functions
- Cómo trasladar tu aplicación al Asistente de Google con Actions on Google
Requisitos previos
- Necesitarás una dirección de Gmail o Google Identity para crear un agente de Dialogflow.
- No es necesario tener conocimientos básicos de JavaScript, pero puede ser útil en caso de que quieras cambiar el código de entrega de webhook.
2. Cómo prepararte
Habilita la Actividad web en tu navegador
- Haz clic en http://myaccount.google.com/activitycontrols
- Asegúrate de que Web & La actividad en apps está habilitada:
Crea un agente de Dialogflow
- En la barra izquierda, debajo del logotipo, selecciona "Create New Agent". Si ya tienes agentes, haz clic en el menú desplegable primero.
- Especifica un nombre para el agente:
your-name-tvguide
(usa tu propio nombre)
- Como idioma predeterminado, elige English - en.
- Como zona horaria predeterminada, elige la más cercana.
- Haga clic en Crear.
Configura Dialogflow
- Haz clic en el ícono de ajustes en el menú de la izquierda, junto al nombre del proyecto.
- Ingresa la siguiente descripción del agente: My TV Guide.
- Desplázate hacia abajo hasta Configuración de registros y activa ambos interruptores para registrar las interacciones de Dialogflow y en Google Cloud Stackdriver. Lo necesitaremos más adelante, en caso de que queramos depurar nuestra acción.
- Haga clic en Guardar.
Cómo configurar Actions on Google
- En el panel derecho, haz clic en el vínculo Asistente de Google en Descubre cómo funciona en Asistente de Google.
Se abrirá: http://console.actions.google.com
Si es la primera vez que usas Actions on Google, primero debes completar este formulario:
- Intenta abrir tu acción en el simulador** haciendo clic en el nombre del proyecto.**
- Selecciona Test en la barra de menú.
- Asegúrense de que el simulador esté configurado en English y hagan clic en Talk to my test-app.
La acción te saludará con el intent básico predeterminado de Dialogflow. Esto significa que la configuración de la integración con Action on Google funcionó.
3. Entidades personalizadas
Las entidades son objetos en los que tu app o dispositivo realiza acciones. Piénsalo como parámetros / variables. En nuestra Guía de TV, te preguntaremos “¿Qué hay en MTV?”. MTV es la entidad y la variable. También puedo pedirte otros canales, como "National Geographic" o "Comedy Central". La entidad recopilada se usará como parámetro en mi solicitud al servicio web de la API de TV Guide.
Aquí encontrarás más información sobre las entidades de Dialogflow.
Crea la entidad de canal
- Haz clic en el elemento de menú Entities en la consola de Dialogflow.
- Haz clic en Crear entidad.
- Nombre de la entidad:
channel
(asegúrate de que todo esté en minúsculas) - Ingresa el nombre de un canal. (algunos canales necesitarán un sinónimo en caso de que Asistente de Google entienda algo más). Puedes usar las teclas Tab y de Intro mientras escribes. Ingresa el número del canal como valor de referencia. Y los nombres de los canales como sinónimos, por ejemplo:
1 - 1, Net 1, Net Station 1
5**.** Cambia al modo **Raw Edit** haciendo clic en el botón de menú junto al botón azul de guardar.
- Copiar y pega las otras entidades en formato CSV:
"2","2","Net 2, Net Station 2"
"3","3","Net 3, Net Station 3"
"4","4","RTL 4"
"5","5","Movie Channel"
"6","6","Sports Channel"
"7","7","Comedy Central"
"8","8","Cartoon Network"
"9","9","National Geographic"
"10","10","MTV"
- Haz clic en Guardar.
4. Intents
Dialogflow usa intents para categorizar las intenciones del usuario. Los intents tienen frases de entrenamiento, que son ejemplos de lo que un usuario podría decirle a tu agente. Por ejemplo, un usuario que quiere saber qué hay en la TV podría preguntar: "¿Qué hay en la TV hoy?", "¿Qué está sonando?" o di "tvguide".
Cuando un usuario escribe o dice algo, lo que se conoce como expresión de usuario, Dialogflow detecta el intent más adecuado de tu agente para esa expresión del usuario. La búsqueda de intents coincidentes también se conoce como clasificación de intent.
Aquí encontrarás más información sobre los intents de Dialogflow.
Cómo modificar el intent de bienvenida predeterminado
Cuando creas un agente de Dialogflow nuevo, se crean automáticamente dos intents predeterminados. El intent de bienvenida predeterminado es el primer flujo al que accedes cuando inicias una conversación con el agente. El intent alternativo predeterminado es el flujo que obtendrás una vez que el agente no pueda comprenderte o no pueda hacer coincidir un intent con lo que acabas de decir.
- Haz clic en Default Welcome Intent.
En el caso del Asistente de Google, se iniciará automáticamente con el intent de bienvenida predeterminado. Esto se debe a que Dialogflow está escuchando el evento de bienvenida. Sin embargo, también puedes invocar el intent diciendo una de las frases de entrenamiento ingresadas.
Este es el mensaje de bienvenida para el intent de bienvenida predeterminado:
Usuario | Agente |
“Hey Google, habla con tu-nombre-tvguide”. | “Te doy la bienvenida, soy el agente de TV Guide. Puedo decirte qué se está reproduciendo en un canal de TV. Por ejemplo, puedes preguntarme qué hay en MTV". |
- Desplázate hacia abajo hasta Respuestas.
- Borra todas las respuestas de texto.
- Crea una nueva respuesta de texto que contenga el siguiente saludo:
Welcome, I am the TV Guide agent. I can tell you what's currently playing on a TV channel. For example, you can ask me: What's on MTV?
- Haga clic en Guardar.
Cómo crear un intent de prueba temporal
Para realizar pruebas, crearemos un intent de prueba temporal, de modo que podamos probar el webhook más adelante.
- Vuelve a hacer clic en el elemento de menú Intents.
- Haz clic en Crear intent.
- Ingresa el nombre del intent:
Test Intent
(asegúrate de usar una T mayúscula y una I mayúscula. - Si escribes el intent de manera diferente, el servicio de backend no funcionará).
- Haz clic en Agregar frases de entrenamiento.
Test my agent
Test intent
- Haz clic en Entrega > Habilita la entrega
Esta vez no codificaremos una respuesta. La respuesta provendrá de una Cloud Function.
- Activa la opción Habilitar llamada de webhook para este intent.
- Haz clic en Guardar.
Crea la intención del canal
La intención del canal contendrá esta parte de la conversación:
Usuario | Agente |
"¿Qué hay en Comedy Central?" | ""Actualmente en Comedy Central a partir de las 6 p.m., está sonando Los Simpson. Luego, a las 7 p.m., comenzará Family Guy". |
- Vuelve a hacer clic en el elemento de menú Intents.
- Haz clic en Crear intent.
- Ingresa el nombre del intent:
Channel Intent
(asegúrate de usar una T mayúscula y una I mayúscula. - Si escribes el intent de manera diferente, el servicio de backend no funcionará). - Haz clic en Agregar frases de entrenamiento y agrega lo siguiente:
What's on MTV?
What's playing on Comedy Central?
What show will start at 8 PM on National Geographic?
What is currently on TV?
What is airing now.
Anything airing on Net Station 1 right now?
What can I watch at 7 PM?
What's on channel MTV?
What's on TV?
Please give me the tv guide.
Tell me what is on television.
What's on Comedy Central from 10 AM?
What will be on tv at noon?
Anything on National Geographic?
TV Guide
- Desplázate hacia abajo hasta Acción y parámetros (Action and parameters).
Observa que @channel y Entidades @sys.time que Dialogflow conoce. Más adelante en tu webhook, el nombre y el valor del parámetro se enviarán a tu servicio web. Por ejemplo:
channel=8
time=2020-01-29T19:00:00+01:00
- Marcar el canal como requivocado
Cuando converses con el agente de TV Guide, siempre deberás completar el nombre del parámetro de espacio publicitario channel. Si el nombre del canal no se mencionó al comienzo de la conversación, Dialogflow hará una pregunta adicional hasta completar todos los espacios de parámetros.
Como instrucción, ingresa lo siguiente:
For which TV channel do you want to hear the tv guide information?
In which TV channel are you interested?
- No configures el parámetro de tiempo como se requiere.
La hora será opcional. Si no se especifica la hora, el servicio web mostrará la hora actual.
- Haz clic en Fulfillment (Entrega).
Esta vez no codificaremos una respuesta. La respuesta provendrá de la Cloud Function. Por lo tanto, activa el interruptor Habilitar llamada de webhook para este intent.
- Haz clic en Guardar.
5. Entrega mediante webhook
Si tu agente necesita más que respuestas estáticas de intent, debes usar entregas para conectar tu servicio web con tu agente. Conectar tu servicio web te permite realizar acciones en función de las expresiones de los usuarios y enviarle respuestas dinámicas a estos. Por ejemplo, si un usuario desea recibir el programa de TV de MTV, tu servicio web puede acceder a tu base de datos y responderle al usuario, el programa de MTV.
- Haz clic en Fulfillment en el menú principal.
- Habilita el interruptor de Inline Editor.
Para una implementación y prueba simple de webhook, puedes usar el editor directo. Usa Cloud Functions para Firebase sin servidores.
- Haz clic en la pestaña index.js del editor y copia y pega este fragmento de JavaScript para el código de Node.js:
'use strict';
process.env.DEBUG = 'dialogflow:debug';
const {
dialogflow,
BasicCard,
Button,
Image,
List
} = require('actions-on-google');
const functions = require('firebase-functions');
const moment = require('moment');
const TVGUIDE_WEBSERVICE = 'https://tvguide-e4s5ds5dsa-ew.a.run.app/channel';
const { WebhookClient } = require('dialogflow-fulfillment');
var spokenText = '';
var results = null;
/* When the Test Intent gets invoked. */
function testHandler(agent) {
let spokenText = 'This is a test message, when you see this, it means your webhook fulfillment worked!';
if (agent.requestSource === agent.ACTIONS_ON_GOOGLE) {
let conv = agent.conv();
conv.ask(spokenText);
conv.ask(new BasicCard({
title: `Test Message`,
subTitle: `Dialogflow Test`,
image: new Image({
url: 'https://dummyimage.com/600x400/000/fff',
alt: 'Image alternate text',
}),
text: spokenText,
buttons: new Button({
title: 'This is a button',
url: 'https://assistant.google.com/',
}),
}));
// Add Actions on Google library responses to your agent's response
agent.add(conv);
} else {
agent.add(spokenText);
}
}
/* When the Channel Intent gets invoked. */
function channelHandler(agent) {
var jsonResponse = `{"ID":10,"Listings":[{"Title":"Catfish Marathon","Date":"2018-07-13","Time":"11:00:00"},{"Title":"Videoclips","Date":"2018-07-13","Time":"12:00:00"},{"Title":"Pimp my ride","Date":"2018-07-13","Time":"12:30:00"},{"Title":"Jersey Shore","Date":"2018-07-13","Time":"13:00:00"},{"Title":"Jersey Shore","Date":"2018-07-13","Time":"13:30:00"},{"Title":"Daria","Date":"2018-07-13","Time":"13:45:00"},{"Title":"The Real World","Date":"2018-07-13","Time":"14:00:00"},{"Title":"The Osbournes","Date":"2018-07-13","Time":"15:00:00"},{"Title":"Teenwolf","Date":"2018-07-13","Time":"16:00:00"},{"Title":"MTV Unplugged","Date":"2018-07-13","Time":"16:30:00"},{"Title":"Rupauls Drag Race","Date":"2018-07-13","Time":"17:30:00"},{"Title":"Ridiculousness","Date":"2018-07-13","Time":"18:00:00"},{"Title":"Punk'd","Date":"2018-07-13","Time":"19:00:00"},{"Title":"Jersey Shore","Date":"2018-07-13","Time":"20:00:00"},{"Title":"MTV Awards","Date":"2018-07-13","Time":"20:30:00"},{"Title":"Beavis & Butthead","Date":"2018-07-13","Time":"22:00:00"}],"Name":"MTV"}`;
var results = JSON.parse(jsonResponse);
var listItems = {};
spokenText = getSpeech(results);
for (var i = 0; i < results['Listings'].length; i++) {
listItems[`SELECT_${i}`] = {
title: `${getSpokenTime(results['Listings'][i]['Time'])} - ${results['Listings'][i]['Title']}`,
description: `Channel: ${results['Name']}`
}
}
if (agent.requestSource === agent.ACTIONS_ON_GOOGLE) {
let conv = agent.conv();
conv.ask(spokenText);
conv.ask(new List({
title: 'TV Guide',
items: listItems
}));
// Add Actions on Google library responses to your agent's response
agent.add(conv);
} else {
agent.add(spokenText);
}
}
/**
* Return a text string to be spoken out by the Google Assistant
* @param {object} JSON tv results
*/
var getSpeech = function(tvresults) {
let s = "";
if(tvresults['Listings'][0]) {
let channelName = tvresults['Name'];
let currentlyPlayingTime = getSpokenTime(tvresults['Listings'][0]['Time']);
let laterPlayingTime = getSpokenTime(tvresults['Listings'][1]['Time']);
s = `On ${channelName} from ${currentlyPlayingTime}, ${tvresults['Listings'][0]['Title']} is playing.
Afterwards at ${laterPlayingTime}, ${tvresults['Listings'][1]['Title']} will start.`
}
return s;
}
/**
* Return a natural spoken time
* @param {string} time in 'HH:mm:ss' format
* @returns {string} spoken time (like 8 30 pm i.s.o. 20:00:00)
*/
var getSpokenTime = function(time){
let datetime = moment(time, 'HH:mm:ss');
let min = moment(datetime).format('m');
let hour = moment(datetime).format('h');
let partOfTheDay = moment(datetime).format('a');
if (min == '0') {
min = '';
}
return `${hour} ${min} ${partOfTheDay}`;
};
exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
var agent = new WebhookClient({ request, response });
console.log('Dialogflow Request headers: ' + JSON.stringify(request.headers));
console.log('Dialogflow Request body: ' + JSON.stringify(request.body));
let channelInput = request.body.queryResult.parameters.channel;
let requestedTime = request.body.queryResult.parameters.time;
let url = `${TVGUIDE_WEBSERVICE}/${channelInput}`;
var intentMap = new Map();
intentMap.set('Test Intent', testHandler);
intentMap.set('Channel Intent', channelHandler);
agent.handleRequest(intentMap);
});
- Haz clic en la pestaña package.json en el editor y copia y pega este fragmento de código JSON, que importa todas las bibliotecas del administrador de paquetes de Node.js (NPM):
{
"name": "tvGuideFulfillment",
"description": "Requesting TV Guide information from a web service.",
"version": "1.0.0",
"private": true,
"license": "Apache Version 2.0",
"author": "Google Inc.",
"engines": {
"node": "8"
},
"scripts": {
"start": "firebase serve --only functions:dialogflowFirebaseFulfillment",
"deploy": "firebase deploy --only functions:dialogflowFirebaseFulfillment"
},
"dependencies": {
"actions-on-google": "^2.2.0",
"firebase-admin": "^5.13.1",
"firebase-functions": "^2.0.2",
"request": "^2.85.0",
"request-promise": "^4.2.5",
"moment" : "^2.24.0",
"dialogflow-fulfillment": "^0.6.1"
}
}
- Haga clic en el botón Implementar. Tomará un momento, porque está implementando tu función sin servidores. En la parte inferior de la pantalla, aparecerá una ventana emergente que te indicará el estado.
- Probemos el webhook para ver si el código funciona. En el simulador del lado derecho, escribe lo siguiente:
Test my agent.
Cuando todo esté correcto, deberías ver: "Este es un mensaje de prueba".
- Probemos la intención del canal y hazte la siguiente pregunta:
What's on MTV?
Cuando todo esté correcto, deberías ver lo siguiente:
"En MTV desde las 4:30 p.m., se está reproduciendo MTV Unwired. Luego, a las 5:30 p.m., comenzará Rupauls Drag Race".
Pasos opcionales: Firebase
Cuando pruebes esto con un canal diferente, notarás que los resultados de TV son los mismos. Esto se debe a que la Cloud Function aún no recupera datos desde un servidor web real.
Para ello, necesitaremos establecer una conexión de red saliente.
Si quieres probar esta aplicación con un servicio web, actualiza tu plan de Firebase a Blaze. Nota: Estos pasos son opcionales. También puedes continuar con los pasos siguientes de este lab para seguir probando tu aplicación en Actions on Google.
- Navega a Firebase console: https://console.firebase.google.com
- En la parte inferior de la pantalla, presiona el botón Actualizar.
Selecciona el plan Blaze en la ventana emergente.
- Ahora que sabemos que el webhook funciona, podemos continuar y reemplazar el código de
index.js
por el siguiente. Esto garantizará que puedas solicitar información sobre la guía de TV desde el servicio web:
'use strict';
process.env.DEBUG = 'dialogflow:debug';
const {
dialogflow,
BasicCard,
Button,
Image,
List
} = require('actions-on-google');
const functions = require('firebase-functions');
const moment = require('moment');
const { WebhookClient } = require('dialogflow-fulfillment');
const rp = require('request-promise');
const TVGUIDE_WEBSERVICE = 'https://tvguide-e4s5ds5dsa-ew.a.run.app/channel';
var spokenText = '';
var results = null;
/* When the Test Intent gets invoked. */
function testHandler(agent) {
let spokenText = 'This is a test message, when you see this, it means your webhook fulfillment worked!';
if (agent.requestSource === agent.ACTIONS_ON_GOOGLE) {
let conv = agent.conv();
conv.ask(spokenText);
conv.ask(new BasicCard({
title: `Test Message`,
subTitle: `Dialogflow Test`,
image: new Image({
url: 'https://dummyimage.com/600x400/000/fff',
alt: 'Image alternate text',
}),
text: spokenText,
buttons: new Button({
title: 'This is a button',
url: 'https://assistant.google.com/',
}),
}));
// Add Actions on Google library responses to your agent's response
agent.add(conv);
} else {
agent.add(spokenText);
}
}
/* When the Channel Intent gets invoked. */
function channelHandler(agent) {
var listItems = {};
spokenText = getSpeech(results);
for (var i = 0; i < results['Listings'].length; i++) {
listItems[`SELECT_${i}`] = {
title: `${getSpokenTime(results['Listings'][i]['Time'])} - ${results['Listings'][i]['Title']}`,
description: `Channel: ${results['Name']}`
}
}
if (agent.requestSource === agent.ACTIONS_ON_GOOGLE) {
let conv = agent.conv();
conv.ask(spokenText);
conv.ask(new List({
title: 'TV Guide',
items: listItems
}));
// Add Actions on Google library responses to your agent's response
agent.add(conv);
} else {
agent.add(spokenText);
}
}
/**
* Return a text string to be spoken out by the Google Assistant
* @param {object} JSON tv results
*/
var getSpeech = function(tvresults) {
let s = "";
if(tvresults && tvresults['Listings'][0]) {
let channelName = tvresults['Name'];
let currentlyPlayingTime = getSpokenTime(tvresults['Listings'][0]['Time']);
let laterPlayingTime = getSpokenTime(tvresults['Listings'][1]['Time']);
s = `On ${channelName} from ${currentlyPlayingTime}, ${tvresults['Listings'][0]['Title']} is playing.
Afterwards at ${laterPlayingTime}, ${tvresults['Listings'][1]['Title']} will start.`
}
return s;
}
/**
* Return a natural spoken time
* @param {string} time in 'HH:mm:ss' format
* @returns {string} spoken time (like 8 30 pm i.s.o. 20:00:00)
*/
var getSpokenTime = function(time){
let datetime = moment(time, 'HH:mm:ss');
let min = moment(datetime).format('m');
let hour = moment(datetime).format('h');
let partOfTheDay = moment(datetime).format('a');
if (min == '0') {
min = '';
}
return `${hour} ${min} ${partOfTheDay}`;
};
exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
var agent = new WebhookClient({ request, response });
console.log('Dialogflow Request headers: ' + JSON.stringify(request.headers));
console.log('Dialogflow Request body: ' + JSON.stringify(request.body));
let channelInput = request.body.queryResult.parameters.channel;
let requestedTime = request.body.queryResult.parameters.time;
let url = `${TVGUIDE_WEBSERVICE}/${channelInput}`;
if (requestedTime) {
console.log(requestedTime);
let offsetMin = moment().utcOffset(requestedTime)._offset;
console.log(offsetMin);
let time = moment(requestedTime).utc().add(offsetMin,'m').format('HH:mm:ss');
url = `${TVGUIDE_WEBSERVICE}/${channelInput}/${time}`;
}
console.log(url);
var options = {
uri: encodeURI(url),
json: true
};
// request promise calls an URL and returns the JSON response.
rp(options)
.then(function(tvresults) {
console.log(tvresults);
// the JSON response, will need to be formatted in 'spoken' text strings.
spokenText = getSpeech(tvresults);
results = tvresults;
})
.catch(function (err) {
console.error(err);
})
.finally(function(){
// kick start the Dialogflow app
// based on an intent match, execute
var intentMap = new Map();
intentMap.set('Test Intent', testHandler);
intentMap.set('Channel Intent', channelHandler);
agent.handleRequest(intentMap);
});
});
6. Acciones en Google
Actions on Google es una plataforma de desarrollo para Asistente de Google. Permite el desarrollo de "acciones" por parte de terceros, es decir, applets para Asistente de Google que proporcionan funcionalidad extendida.
Deberás invocar una Acción de Google. Para ello, deberás pedirle a Google que abra una app o hable con ella.
Se abrirá la acción, cambiará la voz y dejarás la opción “nativa” Permiso del Asistente de Google. Es decir, todo lo que le pidas a tu agente a partir de este momento lo debes crear tú. De repente, no puedes pedirle al Asistente de Google información meteorológica de Google si eso es lo que quieres. primero debes dejar (cerrar) el alcance de la acción (tu app).
Cómo probar tu acción en el simulador de Asistente de Google
Probemos la siguiente conversación:
Usuario | Asistente de Google |
"Hey Google, habla con your-name-tv-guide". | "Por supuesto. Déjame buscar your-name-tv-guide”. |
Usuario | Agente de tu nombre, guía de TV |
- | “¡Te doy la bienvenida, soy la guía de TV...!” |
Probar mi agente | "Este es un mensaje de prueba. Si lo ves, significa que la entrega del webhook funcionó". |
¿Qué hay en MTV? | En MTV desde las 4 a las 30 p.m., se está reproduciendo MTV Un Connected. Luego, a las 5:30 p.m., comenzará Rupauls Drag Race. |
- Vuelve al simulador de Asistente de Google
Abrir: https://console.actions.google.com
- Haz clic en el ícono del micrófono y pregunta lo siguiente:
Talk to my test agent
Test my agent
Asistente de Google debería responder con lo siguiente:
- Ahora preguntamos:
What's on Comedy Central?
Se debería mostrar lo siguiente:
En este momento en Comedy Central a partir de las 6 p.m., está sonando Los Simpsons. Luego, a las 7 p.m., comenzará Family Guy.
7. Felicitaciones
Felicitaciones, creaste tu primera acción del Asistente de Google con Dialogflow.
Como habrás notado, tu acción se estaba ejecutando en modo de prueba, que está vinculado a tu Cuenta de Google. Si quieres acceder en tu dispositivo Nest o en la app de Asistente de Google en tu teléfono iOS o Android, con la misma cuenta También podrías probar tu acción.
Esta es una demostración de taller. Sin embargo, cuando compilas aplicaciones para el Asistente de Google de verdad, puedes enviar tu acción para que se apruebe. Para obtener más información, lee esta guía.
Temas abordados
- Cómo crear un chatbot con Dialogflow v2
- Cómo crear entidades personalizadas con Dialogflow
- Cómo crear una conversación lineal con Dialogflow
- Cómo configurar entregas de webhook con Dialogflow y Firebase Functions
- Cómo trasladar tu aplicación al Asistente de Google con Actions on Google
¿Qué sigue?
¿Te gustó este codelab? Echa un vistazo a estos excelentes labs.
Continúa este codelab integrándolo para Google Chat:
Crea una guía para TV de Google Chat con G Suite y Dialogflow
- Crea acciones para el Asistente de Google con Dialogflow (nivel 1)
- Crea acciones para el Asistente de Google con Dialogflow (nivel 2)
- Crea acciones para el Asistente de Google con Dialogflow (nivel 3)
- Comprende la entrega a través de la integración de Dialogflow en el Calendario de Google
- Integra la API de Google Cloud Vision con Dialogflow