1. Antes de comenzar
En este codelab, aprenderás a compilar un chatbot de comercio minorista con Dialogflow CX, una plataforma de IA conversacional (CAIP) para compilar IU conversacionales. Dialogflow CX puede implementar agentes virtuales, como chatbots, voicebots y puertas de enlace telefónicas, y admite múltiples canales en más de 50 idiomas diferentes.
En este codelab, se te guiará para que compiles un chatbot de sitio web para una tienda minorista. La empresa ficticia para la que crearemos el chatbot se llama G-Records. G-Records es un sello discográfico de rock con sede en California. El sello discográfico tiene 4 bandas de rock firmadas: Alice Googler, G's N' Roses, The Goo Fighters y The Google Dolls. G-Records vende productos de bandas a todos los fanáticos del rock.
Al final de este codelab, podrás usar el chatbot para pedir camisetas o música, o bien preguntar sobre tu pedido.

Qué aprenderás
Aprenderás los beneficios de Dialogflow CX en comparación con Dialogflow ES. Incluye los siguientes conceptos:
- Cómo crear un agente virtual de Dialogflow CX en Google Cloud
 - Aprende a crear flujos
 - Aprende a crear entidades
 - Aprende a crear intents
 - Aprende a crear páginas y páginas de transición con controladores de estado
 - Aprende a realizar la transición de páginas con rutas de intents
 - Aprende a realizar la transición de páginas con parámetros y rutas de condición
 - Aprende a devolver respuestas condicionales con funciones del sistema
 - Más información para crear mensajes de resguardo
 - Aprende a usar el simulador
 - Aprende a crear casos de prueba y cobertura de pruebas
 
El diseño final del agente de Dialogflow CX se verá de la siguiente manera:

Requisitos
- Necesitarás una identidad de Google o una dirección de Gmail para crear un agente de Dialogflow CX.
 - Acceso a Google Cloud
 
2. Configuración del entorno
Crea un proyecto de Google Cloud
Como Dialogflow CX se ejecuta en Google Cloud, debes crear un proyecto de Google Cloud. En él, se organizan todos tus recursos de Google Cloud. Consiste en un conjunto de colaboradores, API habilitadas (y otros recursos), herramientas de supervisión, datos de facturación y controles de autenticación y acceso.
Cuando crees un proyecto nuevo, deberás ingresar un nombre. Además, deberás vincularla a una cuenta de facturación y a una organización existentes.
Se usa una cuenta de facturación para definir quién paga por un conjunto específico de recursos y puede vincularse a uno o más proyectos. El uso del proyecto se cobra a la cuenta de facturación vinculada. En la mayoría de los casos, configuras la facturación cuando creas un proyecto. Para obtener más información, consulta la documentación de facturación. Asegúrate de que la facturación esté habilitada para tu proyecto de Cloud.

Habilita la API de Dialogflow
Para usar Dialogflow, deberás habilitar la API de Dialogflow en tu proyecto.
- Selecciona el proyecto para el que deseas habilitar la API y haz clic en Continuar.
 - Contraer el menú de APIs y servicios y hacer clic en Crear credenciales
 - Haz clic en Datos de la aplicación.
 - Dile No, no los uso, ya que, por el momento, no usas Kubernetes Engine, App Engine ni Cloud Functions.
 - Haga clic en Listo
 

Crea un agente nuevo de Dialogflow CX
Para crear un agente de Dialogflow CX nuevo, primero abre la consola de Dialogflow CX:
- Elige el proyecto de Google Cloud que creaste anteriormente.
 - Haz clic en Create agent.
 
Completa el formulario de configuración básica del agente:
- Puedes elegir cualquier nombre visible.
 - Como Location, elige us-central1.
 - Selecciona tu zona horaria preferida.
 - Selecciona en - English como idioma predeterminado.
 
Haz clic en Crear.

Muy bien, ya está todo listo. Por último, podemos comenzar a modelar nuestro agente virtual.
3. Flows
Los diálogos complejos suelen incluir varios temas de conversación. En el caso del chatbot que estamos creando para G-Records, para vender productos de bandas, tendríamos diálogos sobre el catálogo de productos, el pago, el estado del pedido y las preguntas de atención al cliente. Podríamos dividir estos temas de conversación en flujos.

Los flujos permiten que los equipos trabajen en rutas de conversación individuales. Una buena práctica sería simplificar el flujo para que quepa fácilmente en una pantalla y sea más modular.
Los flujos son un concepto nuevo en Dialogflow CX. Dialogflow Essentials tiene el concepto de agentes combinados, que son similares a los flujos. Sin embargo, usarías Flows con mucha más frecuencia.
Más adelante en este lab, usaremos controladores de estado que pueden finalizar un flujo (por lo que volverá a un flujo siguiente o anterior), o bien puedes finalizar la sesión completa del agente.
Vamos a crear algunos flujos.
Cómo crear flujos
- En Dialogflow CX, haz clic en el ícono + > Crear flujo.
 - Especifica el nombre: 
Catalogy presiona Intro. 

Se creó tu primer flujo Catálogo. Ahora, crea los otros flujos:
Order ProcessMy OrderCustomer Care

Más adelante en este lab, estableceremos controladores de estado de la página, lo que garantizará que, finalmente, la visualización se vea de la siguiente manera:

de Pixel
En el lado derecho de la consola de Dialogflow CX, puedes probar el agente virtual con el simulador integrado. Puedes probar la conversación desde el principio o desde un flujo en particular.
- Haz clic en el botón Test Agent, en la parte superior derecha de la pantalla.
 - En el campo para hablar con el agente, escribe: 
Hello. El agente virtual responderá con un texto de bienvenida predeterminado: ¡Saludos! ¿En qué puedo ayudarte? 

Modifiquemos este texto de bienvenida predeterminado.
Flujo de inicio predeterminado
Comencemos por crear una ruta de intent que se activará una vez que saludes al agente virtual.
- En la barra lateral izquierda Crear > Flujos, haz clic en Flujo de inicio predeterminado y selecciona el nodo del árbol Inicio.
 
Se abrirá la página Inicio. Se seleccionó automáticamente la página de inicio en la sección de la barra lateral Compilación > Páginas.
- En Start > Routes, haz clic en Default Welcome Intent.
 
Un intent categoriza la intención del usuario final para un turno de conversación. En Dialogflow CX, los intents pueden formar parte de un controlador de estado para enrutar la siguiente página o entrega activa.
- Quita todas las entradas de El agente dice y agrega este texto nuevo:
 
Welcome, I am the virtual agent of G-Records, a fictional rock label. You can order artists merchandise, ask questions about your order or shipping, and I can tell you more which artists are currently signed with us. How can I help?
Para agilizar la conversación, también necesitaremos algunos botones de respuesta rápida o chips de sugerencias.
- Haz clic en Add dialogue option > Custom payload y usa el siguiente fragmento de código.
 - Usa el siguiente fragmento de código como carga útil personalizada y presiona Guardar.
 
Para obtener más información sobre las cargas útiles personalizadas, consulta la documentación.
{
    "richContent": [
      [
        {
          "type": "chips",
          "options": [
            {
              "text": "Which artists?"
            },
            {
              "text": "Which products?"
            },
            {
              "text": "About my order..."
            }
          ]
        }
      ]
    ]
  }

- Continúa y prueba el intent de bienvenida en el simulador.
 
Probablemente te preguntes por qué no ves ningún contenido enriquecido. Esto se debe a que el contenido enriquecido, como los chips de sugerencias, depende de una integración. En los siguientes pasos, se requiere una cuenta de facturación, pero puedes omitirlos si no tienes una.
- En la barra lateral izquierda, haz clic en Administrar > Integraciones.
 - Elige Dialogflow Messenger y haz clic en Conectar.
 - En la ventana emergente, haz clic en Habilitar.
 

Se mostrará otra ventana emergente, esta vez con el código JavaScript de integración que puedes pegar en tu sitio web para integrar el componente de Dialogflow Messenger. Como aún no tenemos un sitio web, probaremos el agente virtual directamente en la herramienta.

- Haz clic en el vínculo Probar ahora.
 - Haz clic en el ícono de chatbot de la esquina inferior derecha para abrir la ventana de chat. Escribe 
Hellopara iniciar la conversación. 

Por el momento, cuando hagas clic en las sugerencias, el agente virtual no comprenderá lo que quieres decir. Esto se debe a que nuestro agente virtual aún no cambia de estado. Podemos hacerlo en Dialogflow CX con páginas. Continuemos con el lab. Primero, crearemos algunas entidades y algunos intentos.
4. Tipos de entidad
Los tipos de entidades se usan para controlar cómo se extraen los datos de la entrada del usuario final. Los tipos de entidades de Dialogflow CX son muy similares a los tipos de entidades de Dialogflow ES. Dialogflow proporciona entidades del sistema predefinidas que pueden detectar coincidencias con muchos tipos de datos comunes. Por ejemplo, hay entidades del sistema que detectan coincidencias con fechas, horas, colores, direcciones de correo electrónico, etcétera. También puedes crear tus propias entidades personalizadas para detectar coincidencias en datos personalizados.
Comencemos por preparar todas las entidades personalizadas antes de diseñar las páginas de un flujo. Crearemos las siguientes entidades:

Cómo crear entidades
Creemos una entidad Artist.
- Haz clic en Administrar > Tipos de entidades.
 - Haz clic en + Crear.
 
- Nombre visible: 
Artist - Entidades:
 The Google Dolls(con sinónimo:Google Dolls)The Goo Fighters(con sinónimo:Goo Fighters)G's N' Roses(con sinónimo:Gs and Roses)Alice Googler- Haz clic en Opciones avanzadas y marca Coincidencia parcial. (Si escribes mal el nombre de la banda, es posible que se siga asociando con la entidad correcta).
 - En Opciones avanzadas, también marca Redact in log. (Si escribes mal el nombre de la banda, se corregirá en el registro).
 
- Haga clic en Guardar.
 
También necesitaremos una entidad para el elemento Merch:
- Haz clic en Administrar > Tipos de entidades.
 - Haz clic en + Crear.
 
- Nombre visible: 
Merch - Entidades:
 T-shirtLongsleeve(con sinónimo:Longsleeve shirt)Tour MovieDigital Album(con sinónimo:MP3 Album,MP3)CD(con sinónimosDisc,Physical CD)
- Haga clic en Guardar.
 
También necesitaremos una entidad para el álbum:
- Haz clic en Administrar > Tipos de entidades.
 - Haz clic en + Crear.
 
- Nombre visible: 
Album - Entidades:
 LiveGreatest Hits(con sinónimo:Hits)
- Haga clic en Guardar.
 
También necesitaremos una entidad para los tamaños de la ropa:
- Haz clic en Administrar > Tipos de entidades.
 - Haz clic en + Crear.
 
- Nombre visible: 
ShirtSize - Entidades:
 XS(con sinónimo:Extra Small)S(con sinónimo:Small)M(con sinónimo:Medium)L(con sinónimo:Large)XL(con sinónimo:Extra Large)2XL(con sinónimo:Extra Extra Large)3XL
- Haga clic en Guardar.
 
Y una entidad para los números de pedido, que suelen ser 4 caracteres alfanuméricos y 3 números. (como ABCD123)
- Haz clic en Administrar > Tipos de entidades.
 - Haz clic en + Crear.
 
- Nombre visible: 
OrderNumber - Entidades de expresión regular
 - Entidad: [A-Z]{4}[0-9]{3}
 
- Haga clic en Guardar.
 
La configuración de tu entidad debería ser similar a la siguiente:
@Artista: 
@Merch: 
@Álbum: 
@ShirtSize: 
@OrderNumber: 
Una vez que se preparan las entidades personalizadas, podemos preparar los intents. Continuemos con el lab.
5. Intents
Un intent categoriza la intención de un usuario final para un turno de conversación. Se simplificaron considerablemente en Dialogflow CX y ya no son un componente fundamental para el control de la conversación. Dialogflow CX solo usa intents para hacer coincidir lo que dicen los usuarios. En Dialogflow ES, debías vincular todo a un intent (parámetros, eventos, cumplimiento, etc.). Los intents en Dialogflow CX solo contienen frases de entrenamiento y, por lo tanto, son reutilizables. Ya no controla la conversación. Por lo tanto, el proceso de creación de intents será sencillo:
Las frases de entrenamiento en las intents pueden usar entidades para extraer la entrada "variable", por lo que es una buena práctica crear tus tipos de entidades con anticipación, que es lo que hicimos en la página anterior de los pasos del lab.
Crear intents
Comencemos por preparar todos los intents antes de diseñar las páginas de un flujo.
- Haz clic en Administrar > Intents.
 - Haz clic en + Crear.
 
Usa los siguientes detalles:
- Nombre visible: 
redirect.artists.overview - Descripción 
Artists overview: The bands supported by the label 

Desplázate hacia abajo y crea las siguientes frases de entrenamiento:
Which bands are signed?Which bandsWhich artistsWhich artists are part of the record labelWho is part of the labelFrom which bands can I buy merchandiseBand merchandiseWhich music do you have?I would like to know who are signed to the labelWho are supported by the labelFrom who can I buy shirtsWhat music can I orderCan I get an overview of all the artists

- Haz clic en Guardar.
 
- Ahora continuemos y creemos todos los demás intents. Usa tu propia imaginación para crear más frases de entrenamiento. Una práctica recomendada sería tener al menos 10 frases de entrenamiento por intent para abarcar las diferentes formas en que un usuario podría activar ese intent. Para los fines de este lab, tener menos también debería ser suficiente.
 
Ten en cuenta lo siguiente:
- Ten en cuenta que, a medida que ingreses tu frase de entrenamiento, Dialogflow CX anotará automáticamente tus entidades. Si no lo hace, es posible que debas actualizar tu entidad (agregando un sinónimo) o anotar manualmente la frase de entrenamiento.
 - Frases de entrenamiento más cortas: El sistema de PNL de Dialogflow también puede trabajar con frases de entrenamiento más cortas, y aquí proporcionamos algunos ejemplos.
 - Sobreentrenamiento: Demasiadas frases de entrenamiento para un intent pueden causar sobreentrenamiento y un resultado menos deseable. Se recomienda usar pruebas iterativas e incrementales, y agregar frases de entrenamiento en caso de que no haya una coincidencia de intent.
 
Nombre visible  | Frases de entrenamiento  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
Ahora que nuestros elementos reutilizables (flujos, entidades e intents) están preparados, podemos crear páginas y controladores de estado para unirlos.
6. Controladores de estado y páginas
Una conversación de Dialogflow CX (una sesión) se puede describir y visualizar como una máquina de estados finitos. Tomemos como ejemplo una máquina expendedora, que se podría modelar como una máquina de estados finitos. Tiene los siguientes estados: Waiting for Coins, Select Candy, Give Candy y, dado un conjunto de entradas, se mueve entre esos estados. Por ejemplo, insertar una moneda hace que la máquina expendedora pase de Esperando monedas a Seleccionar caramelo. Las páginas son la forma en que podemos modelar estos estados para un agente virtual de Dialogflow CX.
A medida que un usuario final interactúa con Dialogflow CX en una conversación, esta se desplaza de una página a otra, de modo que, en un momento determinado, exactamente una página es la página actual, esta se considera activa y el flujo asociado a esa página también se considera activo.
Para cada flujo, defines muchas páginas, en las que tus páginas combinadas pueden controlar una conversación completa sobre los temas para los que se diseñó el flujo. Cada flujo tiene una página de inicio especial. Cuando un flujo se activa al principio, la página de inicio se convierte en la página actual. En cada turno de la conversación, la página actual se mantendrá igual o pasará a otra página. Este concepto te permitirá crear agentes más grandes con muchas páginas y múltiples turnos de conversación.
Las páginas contienen cumplimientos (diálogos de entrada estáticos o webhooks), parámetros y controladores de estado. El control de la conversación se realiza a través de controladores de estado, lo que te permite crear varias rutas de transición para pasar a otra página de Dialogflow CX, incluso de forma condicional (para la ramificación de conversaciones).
El estado de una conversación se controla mediante el manejo de transiciones entre páginas con tres tipos diferentes de rutas:
- Rutas de intents: Cuando se debe detectar una coincidencia con un intent (p. ej., cambiar de página según lo que dice un usuario final) (Líneas azules en el diagrama visual)
 - Rutas de condición: Cuando se debe verificar una condición (p. ej., cambiar de página según ciertos parámetros almacenados en la sesión) (líneas naranjas en el diagrama visual)
 - Controladores de eventos: Cuando se debe controlar un evento de resguardo determinado (p. ej., controlar la falta de entrada o de coincidencias para desambiguar al usuario final hacia una ruta de condición o de intent) (líneas verdes en el diagrama visual)
 
Las expresiones de la conversación (es decir, el contenido o la respuesta al usuario) se definen mediante la entrega, que puede ser estática o dinámica:
- Entrega estática: Cuando se proporciona una respuesta de entrega estática
 - Entrega dinámica: Cuando se llama a un webhook de entrega para respuestas dinámicas
 
Para nuestro bot de venta minorista, crearemos algunas rutas de intents y proporcionaremos algunas respuestas de cumplimiento de entrada estático, que se presentarán al usuario en cuanto se active una página. Más adelante, crearemos parámetros con rutas de condición para recopilar la información que necesitarás para realizar un pedido de artículos promocionales.
Rutas de intents de la página
Cómo crear las páginas en el flujo de inicio predeterminado
Este es un diagrama de flujo del flujo de inicio predeterminado:

Hagamos clic juntos:
- Haz clic en Build > Default Start Flow.
 - Haz clic en Start Page.
 - Haz clic en el ícono + junto a Routes.
 - Agrega redirect.artists.overview
 - Desplázate hacia abajo hasta Transition y realiza la transición al flujo de Catalog.
 - Haz clic en Guardar.
 - Repite los pasos anteriores para 
redirect.product.overviewy las otras 11 filas de esta tabla: 
Página (en el flujo)  | Rutas > Intención  | Rutas > Transición a  | 
Iniciar  | 
  | -  | 
Iniciar  | 
  | Flujo: Catálogo  | 
Iniciar  | 
  | Flujo: Catálogo  | 
Iniciar  | 
  | Flujo: Catálogo  | 
Iniciar  | 
  | Flujo: Catálogo  | 
Iniciar  | 
  | Flujo: Catálogo  | 
Iniciar  | 
  | Flujo: Catálogo  | 
Iniciar  | 
  | Flujo: Atención al cliente  | 
Iniciar  | 
  | Flujo: Atención al cliente  | 
Iniciar  | 
  | Flujo: Atención al cliente  | 
Iniciar  | 
  | Flujo: Mi pedido  | 
Iniciar  | 
  | Flujo: Mi pedido  | 
Iniciar  | 
  | Flujo: Mi pedido  | 
Iniciar  | 
  | Página: End Session  | 

El flujo de inicio predeterminado funcionará como un menú de opciones cuando llames a un centro de llamadas. Sin embargo, en este agente virtual, se entrena con lenguaje natural, con las frases de entrenamiento en intents. Por lo tanto, la interacción se basa en la conversación y no en las opciones de DTMF, y es más natural y humana.

Crea las páginas en el flujo del catálogo
La siguiente transcripción del chat pertenece al flujo del catálogo:
> "Hi"
"Welcome, I am the virtual agent of G-Records, a fictional rock label.
You can order artists merchandise, ask questions about your order or shipping,
and I can tell you more which artists are currently signed with us. How can I help?"
> "Which bands are signed with this record label?"
"The following bands are signed with G-Records:
Alice Googler, G's N' Roses, The Goo Fighters and The Google Dolls.
From which of these artists would you like to order merchandise?"
> "Alice Googler"
"You want to rock with Alice Googler merchandise. Awesome!
We sell shirts, music or the tour movie.
Which merchandise item do you want?"
"(Suggestion chips: [Shirts] [Music] [Tour Movie])"
> "I would like to buy a Shirt"
"Do you want a longsleeve or a t-shirt?"
"(Suggestion chips: [T-shirt, Longsleeve, Price?])"
> "What's the price difference?"
"A t-shirt costs $25 and a longsleeve costs $30.
Do you want a longsleeve or a t-shirt?"
> "A t-shirt",
"What shirt size do you want?"
"(Suggestion chips: [XS, S, M, L, XL, 2XL, 3XL])"
> "M"
"A T-shirt of Alice Googler size: M costs $25. Shall I continue to order?"
El diálogo será diferente cuando elijas Música o Película de viaje: En el caso de Música, el diálogo se verá de la siguiente manera:
 > "Music"
"We have a Greatest Hits Album or the Live Album. Which one do you want?"
"(Suggestion chips: [Greatest Hits, Live, Price?])"
> "The Live Album"
"Do you want this album on CD or MP3?"
"(Suggestion chips: [CD, MP3])"
> "What's the price difference?"
"A CD costs $15. The digital album on MP3 costs $10.
Do you want this album on CD or MP3?"
> "Digital Album",
"The Digital Album: Alice Googler - Live costs $10. Shall I continue to order?"
En el caso de la película del recorrido, el diálogo se verá de la siguiente manera:
 > "Tour Movie"
"The Tour Movie of G's N' Roses costs $25. Shall I continue to order?
A continuación, se muestra un diagrama de flujo de todas las páginas del flujo del catálogo:

Observa la complejidad de este flujo:
- Podría omitir la pregunta sobre los artistas y preguntar de inmediato "¿Qué artículos de merchandising están disponibles?".
 - Desde el flujo de inicio predeterminado, podría preguntar: "Quiero comprar la camiseta de Google Dolls" o "Quiero comprar algo". Esto significa que el agente virtual hará preguntas de seguimiento para completar los espacios de estos parámetros obligatorios. Se dirige directamente a la página del producto.
 - El diálogo Precio proviene de la página Precio que se reutilizará.
 - Aunque el diálogo de la película del recorrido parece el más simple, en realidad haremos algo especial con él. Reutilizaremos esta parte del diálogo para que los usuarios finales también puedan ingresarla directamente para uno de los otros productos, si especializan toda la información a la vez:
 
 > "I want The Goo Fighters longsleeve size S."
"The longsleeve of The Goo Fighters size S costs $30. Shall I continue to order?"
Primero, conectemos las páginas.
- Haz clic en Build > Catalog.
 - Haz clic en Start Page.
 - Haz clic en el ícono + junto a Routes.
 - Agrega redirect.artists.overview
 - Desplázate hacia abajo hasta Transition, selecciona Page y elige + new Page.
 - Usa el nombre de la página: 
Artist Overviewy presiona Guardar. 
Ahora, completemos el resto del flujo:
- Los pasos anteriores se pueden repetir con las siguientes páginas, intents y fulfillments. Apoderarse de esta mesa Página es la página que seleccionarás en el flujo. Rutas > Transición a es el nuevo flujo o la nueva página que crearás y a la que harás la transición.
 
Página (en el flujo)  | Rutas > Intención  | Rutas > Transición a  | 
Inicio del catálogo  | 
  | Descripción general del artista  | 
Inicio del catálogo  | 
  | Producto  | 
Inicio del catálogo  | 
  | Descripción general del producto  | 
Inicio del catálogo  | 
  | Descripción general del producto  | 
Inicio del catálogo  | 
  | Camisas  | 
Inicio del catálogo  | 
  | Música  | 
Inicio del catálogo  | 
  | Cerrar sesión  | 
Inicio del catálogo  | 
  | Finalizar flujo  | 
Descripción general del artista  | 
  | Descripción general del producto  | 
Ahora, continuemos y agreguemos más cumplimientos estáticos.
- En el flujo del catálogo, haz clic en la página Descripción general del artista.
 - Haz clic en Edit fulfillment en la sección Entry fulfillment.
 - Usa los siguientes cumplimientos estáticos (El agente dice):
 
The following bands are signed with G-Records: Alice Googler, G's N' Roses, The Goo Fighters and The Google Dolls.
- Haga clic en Guardar.
 - En el flujo del catálogo, haz clic en la página Descripción general del producto.
 - Haz clic en Edit fulfillment en la sección Entry fulfillment.
 - Usa el siguiente cumplimiento estático (Agent says):
 
We sell shirts, music or the tour movie.
- Haga clic en Guardar.
 
Parámetros de página
Los parámetros se usan para capturar y hacer referencia a los valores que proporcionó el usuario final durante una sesión. Cada parámetro tiene un nombre y un tipo de entidad. @Artist y @Merch son los parámetros mínimos que necesitamos recopilar para realizar un pedido de artículos. En el caso de las camisetas o las camisetas de manga larga, también querrás recopilar @ShirtSize y, si quieres pedir música, también necesitarás un nombre de @Carrier y @Album.
Esos parámetros deberán marcarse como obligatorios. Y, una vez que sea necesario, querrás proporcionar instrucciones personalizadas para recordar a tu usuario final y brindar las respuestas correctas para que se puedan recopilar estos parámetros. Dialogflow CX ofrece algunos mecanismos que pueden ayudarte con esta tarea.
Por ejemplo, puedes proporcionar mensajes de entrega estáticos personalizados en la sección Parámetro. Si el parámetro es obligatorio, se mostrarán estos cumplimientos de parámetros. Estos mensajes de respuesta se agregarán a la cola de respuestas. Durante el turno de un agente, es posible (y, a veces, conveniente) llamar a varias entregas, cada una de las cuales puede generar un mensaje de respuesta. Dialogflow mantiene estas respuestas en una cola de respuestas. Para obtener más información sobre el ciclo de vida de la página y el orden en que se agregarán estas acciones de cumplimiento a la cola de respuestas, consulta la documentación de las páginas de Dialogflow CX.
Cómo crear los parámetros en la página de descripción general del artista
Definamos algunos parámetros de página:
- En el flujo Catálogo, haz clic en la página Descripción general del artista.
 - Haz clic en el botón + en el bloque Parameters. Agrega el parámetro artist:
 
- Nombre visible: 
artist - Tipo de entidad: 
@Artist - Obligatorio: Marca de verificación
 - Ocultar en el registro: Verificado
 
- Ahora agregaremos algunos mensajes de cumplimiento de parámetros personalizados. Si el agente virtual aún no recopiló el parámetro artist, el usuario final recibirá esta respuesta del agente agregada a la cola de respuestas:
 
From which of these artists would you like to order merchandise?
- Agrega una segunda opción de diálogo que proporcione chips de sugerencias enriquecidas. Haz clic en Agregar opción de diálogo y usa este código (en JSON):
 
{
  "richContent": [
    [
      {
        "options": [
          {
            "text": "The Google Dolls"
          },
          {
            "text": "The Goo Fighters"
          },
          {
            "text": "Alice Googler"
          },
          {
            "text": "G's N' Roses"
          }
        ],
        "type": "chips"
      }
    ]
  ]
}
Es posible controlar diferentes mensajes de entrega de resguardo según la cantidad de intentos que realizó el usuario final para responderlos. Esto se haría con controladores de eventos de parámetros. Hay varios controladores de eventos integrados entre los que puedes elegir, como Invalid Parameters, Utterances too long, No input, No input 1st try, 2nd try o No Match. La diferencia entre no hay entrada y no hay coincidencia es que, en el primer caso, el usuario nunca proporcionó una respuesta, mientras que, en el segundo, el usuario sí proporcionó una respuesta, pero Dialogflow CX no pudo hacer coincidir la intención con una página.
- Desplázate hacia abajo hasta la sección Reprompt event handlers.
 - Haz clic en Agregar controlador de eventos y selecciona el evento: 
No-match default - Usa el siguiente texto de entrega estático del evento:
 
I missed that. Please, specify the artist. You can choose between: Alice Googler, G's N' Roses, The Google Dolls or The Goo Fighters. Which artist do you want to buy merchandise from?
- Haga clic en Guardar.
 - Haz clic en Add event handler y selecciona el evento: 
No-input default - Usa el siguiente texto de entrega estático del evento:
 
I am sorry, I could understand the artist's name. You can choose between Alice Googler, G's N' Roses, The Google Dolls or The Goo Fighters. Which artist do you want to buy merchandise from?
- Haga clic en Guardar.
 
Rutas de condición de la página
Los parámetros son muy útiles en combinación con las rutas condicionales de página. Cuando una condición se evalúa como verdadera, se llamará a la ruta de página asociada. Una condición podría ser Un parámetro es igual a un valor específico, Un parámetro no puede faltar o Un formulario que se completó, entre muchas otras. Puedes encontrar más información sobre los parámetros y las condiciones en la documentación de Dialogflow CX.
En el caso de nuestro agente virtual de comercio minorista, deberemos recopilar una secuencia de parámetros, por lo que tendremos que crear una condición para verificar si se completó un "formulario". Un formulario es una lista de parámetros que se deben recopilar del usuario final para la página. El agente virtual interactúa con el usuario final durante varios turnos de conversación hasta que haya recopilado todos los parámetros de formulario necesarios, que también se conocen como parámetros de página.
Dialogflow CX establece automáticamente los valores de parámetros proporcionados por el usuario final durante el proceso para completar formularios. Para verificar si se completó el formulario actual de la página, usa la siguiente condición: $page.params.status = "FINAL"
Cómo crear las rutas condicionales en la página Resumen del artista
Creemos una ruta condicional que realizará la transición a la siguiente página una vez que se conozca al artista:
- En la página Resumen del artista, haz clic en el ícono + en la sección Rutas.
 - Desplázate hacia abajo hasta la sección Condition.
 - Selecciona Al menos uno (OR).
 - A continuación, escribiremos una expresión que
 
- Parámetro: 
$page.params.status - Operador: 
= - Valor: 
"FINAL" 
- Ahora, crearemos un mensaje de cumplimiento estático específico en la ruta, que confirme la elección del usuario final. Desplázate hacia abajo hasta el bloque Fulfillment y escribe los siguientes mensajes de entrega:
 
$session.params.artist, great choice! Rock on!You want to rock with $session.params.artist merchandise. Awesome!
- Cuando la condición sea verdadera, debes realizar la transición a la página Product Overview. Desplázate hacia abajo hasta la sección Transition y usa la siguiente página: 
Product Overview - Haga clic en Guardar.
 

Cómo crear las rutas en la página Product Overview
Ahora que sabemos cómo crear parámetros y rutas condicionales, creemos más parámetros para las siguientes páginas:
Descripción general del producto
- Crea el parámetro 
artisten la página Descripción general del producto: 
- Nombre visible: 
artist - Tipo de entidad: 
@Artist - Obligatorio: Marca de verificación
 - Ocultar en el registro: Verificado
 - Entrega de la instrucción inicial: 
From which of these artists would you like to order merchandise? 
{
  "richContent": [
    [
      {
        "options": [
          {
            "text": "The Google Dolls"
          },
          {
            "text": "The Goo Fighters"
          },
          {
            "text": "Alice Googler"
          },
          {
            "text": "G's N' Roses"
          }
        ],
        "type": "chips"
      }
    ]
  ]
}
- Controlador de eventos > 
No-match default:To buy merchandise you can choose between the following artists: Alice Googler, G's N' Roses, The Google Dolls or The Goo Fighters. Which artist do you want to buy merchandise from? - Carga útil personalizada:
 
{
  "richContent": [
    [
      {
        "options": [
          {
            "text": "The Google Dolls"
          },
          {
            "text": "The Goo Fighters"
          },
          {
            "text": "Alice Googler"
          },
          {
            "text": "G's N' Roses"
          }
        ],
        "type": "chips"
      }
    ]
  ]
}
- Controlador de eventos > 
No-input default:To buy merchandise you can choose between the following artists: Alice Googler, G's N' Roses, The Google Dolls or The Goo Fighters. Which artist were you trying to mention? - Carga útil personalizada:
 
{
  "richContent": [
    [
      {
        "options": [
          {
            "text": "The Google Dolls"
          },
          {
            "text": "The Goo Fighters"
          },
          {
            "text": "Alice Googler"
          },
          {
            "text": "G's N' Roses"
          }
        ],
        "type": "chips"
      }
    ]
  ]
}
- Crea un parámetro 
merch: 
- Nombre visible: 
merch - Tipo de entidad: 
@Merch - Obligatorio: Marca de verificación
 - Ocultar en el registro: Verificado
 - Cumplimiento: 
Which merchandise item do you want? - Haz clic en Add dialogue option > Custom payload:
 
{
    "richContent": [
      [
        {
          "type": "chips",
          "options": [
            {
              "text": "Shirts"
            },
            {
              "text": "Music"
            },
            {
              "text": "Tour movie"
            }
          ]
        }
      ]
    ]
  }
- Controlador de eventos > 
No-match default - Entrega del controlador de eventos: 
We sell Shirts, Music or the Tour movie. Which of these items do you want? - Carga útil personalizada:
 
{
    "richContent": [
      [
        {
          "type": "chips",
          "options": [
            {
              "text": "Shirts"
            },
            {
              "text": "Music"
            },
            {
              "text": "Tour movie"
            }
          ]
        }
      ]
    ]
  }
- Controlador de eventos > 
No-input default - Entrega del controlador de eventos: 
I couldn't understand which merchandise item you wanted to buy. You can choose between: Shirts, Music or the Tour movie. Which item do you want? - Carga útil personalizada:
 
{
    "richContent": [
      [
        {
          "type": "chips",
          "options": [
            {
              "text": "Shirts"
            },
            {
              "text": "Music"
            },
            {
              "text": "Tour movie"
            }
          ]
        }
      ]
    ]
  }
- Crea una ruta que realice la transición a la página Producto cuando se proporcione 
artisty el elementomerch. 
- Condición:
 - Coincide con TODAS las reglas (Y)
 - Expresión: 
$session.params.artist != null - Expresión: 
$session.params.merch != null - Cumplimiento: 
Alright! $session.params.merch of $session.params.artist, let's go! - Transición: Página: 
Product 
- Crea una ruta para cuando el usuario diga "Camisas".
 
- Intent: redirect.shirts
 - Transición: Página: 
Shirts 
- Crea una ruta para cuando el usuario diga "Música".
 
- Intent: redirect.music
 - Transición: Página: 
Music 
- Crea una ruta para cuando el usuario solicite información sobre el precio
 
- Intent: redirect.price
 - Transición: Crear página nueva: 
Price 
Cuando hayas establecido la configuración anterior, verás una visualización similar a la siguiente imagen. Ten en cuenta que las rutas de intención son azules en el diagrama y las rutas de condición son naranjas. Si bien no se muestran, los controladores de eventos son verdes y, cuando varios tipos de rutas realizan la transición a una página, la línea será gris.

Hasta ahora, aprendiste a crear flujos, entidades, intents y páginas con controladores de estado, como rutas de intents y rutas condicionales basadas en parámetros. Más adelante en este lab, usaremos la ramificación condicional en el cumplimiento para proporcionar diferentes diálogos según la entrada.
Puedes usar las siguientes configuraciones para finalizar nuestro agente virtual.
Página de camisetas:
- Crea las siguientes configuraciones en la página Camisas:
 
- Entrega de entrada: 
Do you want a longsleeve or a t-shirt? - Carga útil personalizada de la entrega de entrada:
 
{
    "richContent": [
      [
        {
          "type": "chips",
          "options": [
            {
              "text": "T-shirt"
            },
            {
              "text": "Longsleeve"
            },
            {
              "text": "Price?"
            }
          ]
        }
      ]
    ]
  }
- Crea una ruta de intent: 
redirect.pricecon una transición a la páginaPrice. - Crea el siguiente parámetro:
 
- Parámetro: 
merch- Tipo de entidad:@Merch,RequiredyRedact in log - Parámetro > Controlador de eventos > 
No-match default - Parámetro > Entrega del controlador de eventos: 
You can choose between a t-shirt or a longsleeve. Which of these do you want? - Parámetro > Carga útil personalizada de cumplimiento del controlador de eventos:
 
{
    "richContent": [
      [
        {
          "type": "chips",
          "options": [
            {
              "text": "T-shirt"
            },
            {
              "text": "Longsleeve"
            }
          ]
        }
      ]
    ]
  }
- Parámetro > Controlador de eventos > 
No-input default - Parámetro > Entrega del controlador de eventos: 
I couldn't understand if you want the t-shirt or the longsleeve. Which of these do you want? - Parámetro > Carga útil personalizada de cumplimiento del controlador de eventos:
 
{
    "richContent": [
      [
        {
          "type": "chips",
          "options": [
            {
              "text": "T-shirt"
            },
            {
              "text": "Longsleeve"
            }
          ]
        }
      ]
    ]
  }
- Haz clic en la entrada de cumplimiento y desplázate hacia abajo hasta Parameter presets. Cada vez que se active la página de camisetas, el parámetro de categoría se establecerá en camisetas:
 
Parámetro  | Valor  | 
  | 
  | 
- Agrega una ruta condicional:
 
- Coincide con AL MENOS UNA regla (OR)
 - Expresión: 
$session.params.merch = "T-shirt" - Expresión: 
$session.params.merch = "Longsleeve" - Transición a la página nueva: 
Shirt Size 
Página de precios:
Como los mensajes de precios dependerán del artículo o la categoría de productos elegidos (música o camisetas), corregiremos esta parte más adelante en el lab. Por el momento, basta con ingresar un marcador de posición.
- Crea las siguientes configuraciones en la página Precio:
 
- Entrega de entrada: 
PRICE TODO 
Como puedes solicitar el precio desde varios lugares de la conversación, siempre debería darte una respuesta y transferirte a la parte anterior del diálogo para continuar con el pedido. Hay 5 lugares en el árbol de diálogo en los que puedes ramificarte para obtener información sobre los precios. (Camiseta, Talla de camiseta, Música, Operador y también directamente a través de una ruta de intención), por lo que necesitaremos algunas rutas condicionales para volver:
- Agrega una ruta condicional:
 
- Coincide con TODAS las reglas (Y)
 - Expresión: 
$session.params.category = "shirts" - Expresión: 
$session.params.merch = "null" - Transición a la página nueva: 
Shirts 
- Agrega una ruta condicional:
 
- Coincide con TODAS las reglas (Y)
 - Expresión: 
$session.params.category = "shirts" - Expresión: 
$session.params.size = "null" - Transición a la página nueva: 
Shirt Size 
- Agrega una ruta condicional:
 
- Coincide con TODAS las reglas (Y)
 - Expresión: 
$session.params.category = "music" - Expresión: 
$session.params.album = "null" - Transición a la página nueva: 
Music 
- Agrega una ruta condicional:
 
- Coincide con TODAS las reglas (Y)
 - Expresión: 
$session.params.category = "music" - Expresión: 
$session.params.merch = "null" - Transición a la página nueva: 
Carrier 
- Agrega una ruta condicional:
 
- Coincide con TODAS las reglas (Y)
 - Expresión: 
$session.params.category = "null" - Transición a la página nueva: 
Product Overview 
Página de tallas de camisetas:
- Crea las siguientes configuraciones en la página Shirt Size:
 
- Entrega de entrada: 
What shirt size do you want? - Carga útil personalizada de la entrega de entrada:
 
{
    "richContent": [
      [
        {
          "type": "chips",
          "options": [
            {
              "text": "XS"
            },
            {
              "text": "S"
            },
            {
              "text": "M"
            },
            {
              "text": "L"
            },
            {
              "text": "XL"
            },
            {
              "text": "2XL"
            },
            {
              "text": "3XL"
            }
          ]
        }
      ]
    ]
  }
- Crea una ruta de intent: 
redirect.pricecon una transición a la páginaPrice. - Crea el siguiente parámetro:
 
- Parámetro: 
shirtsize- Tipo de entidad:@ShirtSize-Required,Redact In Log - Parámetro > Controlador de eventos > 
No-match default - Parámetro > Entrega del controlador de eventos: 
Please tell me the shirt size, such as XL. - Parámetro > Carga útil personalizada de cumplimiento del controlador de eventos:
 
{
    "richContent": [
      [
        {
          "type": "chips",
          "options": [
            {
              "text": "XS"
            },
            {
              "text": "S"
            },
            {
              "text": "M"
            },
            {
              "text": "L"
            },
            {
              "text": "XL"
            },
            {
              "text": "2XL"
            },
            {
              "text": "3XL"
            }
          ]
        }
      ]
    ]
  }
- Parámetro > Controlador de eventos > 
No-input default - Parámetro > Entrega del controlador de eventos: 
I couldn't understand the shirt size. What size do you want? - Parámetro > Carga útil personalizada de cumplimiento del controlador de eventos:
 
{
    "richContent": [
      [
        {
          "type": "chips",
          "options": [
            {
              "text": "XS"
            },
            {
              "text": "S"
            },
            {
              "text": "M"
            },
            {
              "text": "L"
            },
            {
              "text": "XL"
            },
            {
              "text": "2XL"
            },
            {
              "text": "3XL"
            }
          ]
        }
      ]
    ]
  }
- Agrega una ruta condicional:
 
- Coincide con TODAS las reglas (Y)
 - Expresión: 
$page.params.shirtsize != "null" - Transición a la página: 
Product 
Página de música:
- Crea los siguientes parámetros de configuración en la página Música:
 
- Entrega de entrada: 
We have a Greatest Hits Album or the Live Album. Which one do you want? - Carga útil personalizada de la entrega de entrada:
 
{
    "richContent": [
      [
        {
          "type": "chips",
          "options": [
            {
              "text": "Greatest Hits"
            },
            {
              "text": "Live"
            },
            {
              "text": "Price?"
            }
          ]
        }
      ]
    ]
  }
- Crea una ruta de intent: 
redirect.pricecon una transición a la página:Price. - Crea el siguiente parámetro:
 
- Parámetro: 
album- Tipo de entidad:@Album-Required,Redact In Log - Parámetro > Controlador de eventos > 
No-match default - Parámetro > Entrega del controlador de eventos: 
You can choose between Greatest Hits and Live Album. Which of these do you want? - Parámetro > Carga útil personalizada de cumplimiento del controlador de eventos:
 
{
    "richContent": [
      [
        {
          "type": "chips",
          "options": [
            {
              "text": "Greatest Hits"
            },
            {
              "text": "Live"
            }
          ]
        }
      ]
    ]
  }
- Parámetro > Controlador de eventos > 
No-input default - Parámetro > Entrega del controlador de eventos: 
I couldn't understand if you want the album: Greatest Hit or Live. Which of these do you want? - Parámetro > Carga útil personalizada de cumplimiento del controlador de eventos:
 
{
    "richContent": [
      [
        {
          "type": "chips",
          "options": [
            {
              "text": "Greatest Hits"
            },
            {
              "text": "Live"
            }
          ]
        }
      ]
    ]
  }
- Haz clic en la entrada de cumplimiento y desplázate hacia abajo hasta Parameter presets. Cada vez que se active la página Música, el parámetro de categoría se establecerá en music:
 
Parámetro  | Valor  | 
  | 
  | 
- Agrega una ruta condicional:
 
- Coincide con TODAS las reglas (Y)
 - Expresión: 
$page.params.album != "null" - Transición a la página: 
Carrier 
Página del operador:
- Crea las siguientes configuraciones en la página Carrier:
 
- Entrega de entrada: 
Do you want this album on CD or MP3? - Carga útil personalizada de la entrega de entrada:
 
{
    "richContent": [
      [
        {
          "type": "chips",
          "options": [
            {
              "text": "CD"
            },
            {
              "text": "MP3"
            },
            {
              "text": "Price?"
            }
          ]
        }
      ]
    ]
  }
- Crea una ruta de intent: 
redirect.priceque realice la transición a la páginaPrice. - Crea el siguiente parámetro:
 
- Parámetro: 
merch- Tipo de entidad:@Merch-Required,Redact In Log - Parámetro > Controlador de eventos > 
No-match default - Parámetro > Entrega del controlador de eventos: 
Do you want a physical CD or the digital album? - Parámetro > Entrega del controlador de eventos: Carga útil personalizada:
 
{
    "richContent": [
      [
        {
          "type": "chips",
          "options": [
            {
              "text": "CD"
            },
            {
              "text": "Digital Album"
            }
          ]
        }
      ]
    ]
  }
- Parámetro > Controlador de eventos > 
No-input default - Parámetro > Entrega del controlador de eventos: 
I couldn't understand if you mean CD or MP3. Which one do you want? - Parámetro > Entrega del controlador de eventos: Carga útil personalizada:
 
{
    "richContent": [
      [
        {
          "type": "chips",
          "options": [
            {
              "text": "CD"
            },
            {
              "text": "MP3"
            }
          ]
        }
      ]
    ]
  }
- Agrega una ruta condicional:
 
- Coincide con TODAS las reglas (Y)
 - Expresión: 
$page.params.merch != "null" - Transición a la página: 
Product 
Página del producto:
- Crea los siguientes parámetros:
 
Nombre visible del parámetro  | Tipo de entidad del parámetro  | Verificaciones  | 
  | 
  | Obligatorio, Ocultar en el registro  | 
  | 
  | Obligatorio, Ocultar en el registro  | 
- El parámetro artist necesita el siguiente cumplimiento de la instrucción inicial, que se mostrará cuando no se conozca al artista. 
You didn't mention which artist you are interested in. You can ask me to buy the $session.params.merch of the artist you like or ask which artists we signed. How can I help? 
{
  "richContent": [
    [
      {
        "options": [
          {
            "text": "Which artists?"
          }
        ],
        "type": "chips"
      }
    ]
  ]
}
- También agrega un controlador de eventos 
No-input defaultcon cumplimiento:I couldn't understand what you just said. Ask me which artists are signed. - Y un controlador de eventos 
No-match defaultcon entrega:I missed that. Please ask me which artists are signed. 
- El parámetro merch también necesita controladores de eventos de solicitud nueva.
 
- Agrega un controlador de eventos 
No-input defaultcon cumplimiento:I couldn't understand what you just said. Which merchandise item do you want? - Y un controlador de eventos 
No-match defaultcon entrega:I missed that. Which merchandise item do you want? 
La siguiente ruta hará la transición a la página de confirmación cuando se conozca al artista y el usuario elija una "Película de la gira".
- Agrega una ruta condicional:
 
- Coincide con TODAS las reglas (Y)
 - Expresión: 
$session.params.artist != null - Expresión: 
$session.params.merch = "Tour Movie" - Ajustes predeterminados de los parámetros Agregar parámetro > 
price = 25 - Transición a la página nueva: 
Confirmation 
La siguiente ruta de navegación pasará a la página de confirmación cuando se conozca al artista y el usuario elija una "camiseta" y el tamaño de la camiseta.
- Agrega una ruta condicional:
 
- Expresión personalizada: 
$session.params.artist != null AND $session.params.merch = "T-shirt" AND $session.params.shirtsize != null - Ajustes predeterminados de los parámetros Agregar parámetro > 
price = 25 - Transición a la página: 
Confirmation 
La siguiente ruta de navegación pasará a la página de confirmación cuando se conozca al artista y el usuario elija una "manga larga" y el tamaño de la camiseta.
- Agrega una ruta condicional:
 
- Expresión personalizada: 
$session.params.artist != null AND $session.params.merch = "Longsleeve" AND $session.params.shirtsize != null - Ajustes predeterminados de los parámetros Agregar parámetro > 
price = 30 - Transición a la página: 
Confirmation 
La siguiente ruta de acceso realizará la transición a la página de confirmación cuando se conozca al artista y el usuario elija un "CD", y también se elija el nombre del álbum.
- Agrega una ruta condicional:
 
- Expresión personalizada: 
$session.params.artist != null AND $session.params.merch = "CD" AND $session.params.album != null - Ajustes predeterminados de los parámetros Agregar parámetro > 
price = 15 - Transición a la página: 
Confirmation 
La siguiente ruta de acceso realizará la transición a la página de confirmación cuando se conozca al artista y el usuario elija un "Álbum digital" y se elija el nombre del álbum.
- Agrega una ruta condicional:
 
- Expresión personalizada: 
$session.params.artist != null AND $session.params.merch = "Digital Album" AND $session.params.album != null - Ajustes predeterminados de los parámetros Agregar parámetro > 
price = 10 - Transición a la página: 
Confirmation 
A continuación, crearemos algunas condiciones avanzadas con instrucciones que detecten la información faltante. La siguiente ruta volverá a la página de música cuando se conozca al artista y el usuario elija un "CD" o un "Álbum digital", pero no se haya elegido el nombre del álbum.
- Agrega una ruta condicional:
 
- Expresión personalizada: 
$session.params.artist != null AND ($session.params.merch = "CD" OR $session.params.merch = "Digital Album") AND $session.params.album = null - Cumplimiento: 
I would also need to know which album you would like to buy! - Transición a la página: 
Music 
La última ruta pasará a la página de confirmación cuando se conozca al artista y el usuario elija una "camiseta" o una "camiseta de manga larga", pero cuando no se haya elegido el tamaño de la camiseta.
- Agrega una ruta condicional:
 
- Expresión personalizada: 
$session.params.artist != null AND ($session.params.merch = "T-shirt" OR $session.params.merch = "Longsleeve") AND $session.params.shirtsize = null - Cumplimiento: 
I would also need to know which shirt size you need! - Transición a la página: 
Shirt Size 
En la siguiente parte del lab, usaremos los cumplimientos condicionales para mostrar diferentes mensajes de cumplimiento según la entrada.
7. Respuestas condicionales
Algunas respuestas mostrarán un diálogo diferente según la entrada. Los diálogos se ramificarán, y a esto lo llamamos respuestas condicionales. Esto puede ser interesante cuando no usas la entrega por webhook, en la que las respuestas condicionales se determinaron en el backend. Un ejemplo podría verse así:
if [condition]
  [response]
elif [condition]
  [response]
elif [condition]
  [response]
else
  [response]
endif
- Un ejemplo de una [condición] podría ser: 
$session.params.user-age >= 21. Usa un formato similar al de las condiciones en las rutas. - Una [respuesta] toma la respuesta de texto estático
 - Las respuestas condicionales siempre comienzan con 
if. - Los bloques 
elifyelseson opcionales 
Dialogflow CX también puede usar funciones del sistema integradas. Por ejemplo, para dar formato a una fecha u hora, o para mostrar la hora actual ($sys.func.NOW())
Finalicemos el flujo de Catalog corrigiendo las páginas de Confirmation y Price.
Página de confirmación:
Ahora, crearemos la página de confirmación. Tiene los siguientes requisitos:
- Si el artículo promocional es un CD o un álbum digital En la confirmación, se mostrarán los siguientes campos: artista, productos, álbum y precio.
 - Si merch es T-shirt o Longsleeve. En la confirmación, se mostrarán los siguientes campos: artista, productos, talla y precio.
 - De lo contrario (y, por lo tanto, si merch es Tour Movie) En la confirmación, se mostrarán los siguientes campos: artista, productos y precio.
 
- Haz clic en la página Confirmación.
 - Haz clic en Editar cumplimiento > Respuestas del agente > Opción Agregar diálogo > Respuesta condicional:
 
if ($session.params.merch = "CD" OR $session.params.merch = "Digital Album")
  The $session.params.merch: $session.params.artist - $session.params.album costs $$session.params.price. Shall I continue to order?
elif ($session.params.merch = "T-shirt" OR $session.params.merch = "Longsleeve")
  A $session.params.merch of $session.params.artist size: $session.params.shirtsize costs $$session.params.price. Shall I continue to order?
elif $session.params.merch = "Tour Movie"
  The $session.params.merch of $session.params.artist costs $$session.params.price. Shall I continue to order?
else
  It looks like something went wrong with your order. You can say "Reset", to restart the order process.
endif
- Create the following Custom payload:
 
- Custom payload:
 
{
  "richContent": [
    [
      {
        "options": [
          {
            "text": "Yes, confirm"
          }
        ],
        "type": "chips"
      }
    ]
  ]
}
Next, create two intent routes:
confirm.proceed.ordertransitions to:Order ProcessFlow.decline.proceed.ordertransitions toEnd Flow
When the user declines the order, and does not want to proceed the order process, we will have to transition back to the welcome page, but all the parameters have to be cleared. We can do this by specifically setting null to all the possible parameters. You can do this with Parameter presets.
- In the decline.proceed.order intent route, scroll down to Parameter presets and add the following parameters:
 
Parameter  | Value  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
  | 
Notice that we have created an additional parameter called restart. If this parameter is present, the Default Start Flow, should know to continue the conversation by showing a customized message.
- Click on the Default Start Flow, Start Page, and create another Conditional Route:
 
$session.params.restart = "true"- Fulfillment: 
"Welcome back, as the virtual agent of G-Records, I can help you order artists merchandise, you can ask questions about your order or shipping, and I can tell you more which artists are currently signed with us. How can I help?" - Custom payload:
 
{
    "richContent": [
      [
        {
          "type": "chips",
          "options": [
            {
              "text": "Which artists?"
            },
            {
              "text": "Which products?"
            },
            {
              "text": "About my order..."
            }
          ]
        }
      ]
    ]
  }
- Select the Start Page and click on the 
redirect.endintent. Create the following fulfillment:Thank you for contacting G-Records! Have a nice day! 
Price Page:
Let's also fix the Price TODOs. The price information will be static for now. Click on the Price Page in the Catalog Flow, and use the following entry fulfillment:
- Delete the Agent Says entry fulfillment.
 - Create a new Conditional Response:
 
if $session.params.category = "shirts"
  A t-shirt costs $25 and a longsleeve costs $30.
elif $session.params.category = "music"
  A CD costs $15. The digital album on MP3 costs $10.
else
  A t-shirt costs $25 and a longsleeve costs $30. A CD costs $15 and a digital album on MP3 $10. In case you are interested in the Tour Movie, that one is $25.
endif

Well done, by now you completed the Catalog flow. Your flow should look similar to this diagram:
8. Wrapping up the agent
We are almost at the end of this lab. Let's configure the last flows together, and take in practice all the new things that we have learned.
Creating the My Order Flow
- Go to the My Order Flow, and create the following intent transitions:
 
Page (In Flow)  | Routes > Intent  | Routes > Transition To  | 
My Order Start  | 
  | My Order  | 
My Order Start  | 
  | My Order Status  | 
My Order Start  | 
  | My Order Cancellation  | 
My Order Start  | 
  | End Session  | 
My Order Start  | 
  | End Flow  | 
My Order  | 
  | My Order Status  | 
My Order  | 
  | My Order Cancellation  | 
Default Start Flow  | 
  | Flow: My Order  | 
Default Start Flow  | 
  | Flow: My Order  | 
- Let's create the following entry fulfillment for the My Order Page:
 
- Entry fulfillment: 
I can look up the status of your order, or I can cancel an order. 
- In the My Order Page create the following parameter:
 
- Displayname: 
ordernumber - Entity Type: 
@OrderNumber - Required: checked
 - Initial prompt fulfillment:  
What's the order number? For example ABCD123. - Event Handler: 
No-match default:To proceed with your order I will need an order number. Order numbers start with 4 characters and end with 3 numbers, such as ABCD123. Which order number may I use? - Event Handler: 
No-input default:I missed that. To proceed with your order I will need an order number. Order numbers start with 4 characters and end with 3 numbers, such as ABCD123. Which order number may I use? 
- Create the following conditional route:
 
- Customize Expression: 
$page.params.status = "FINAL" - Fulfillment: 
And do you want to Cancel your order, or should I look up the status? 
- Click on Add state handler > Event Handlers and create the Event Handler: 
No-input default 
- Fulfillment:  
I'm sorry, what was that? Would you like me to cancel an order or look up the status? - Custom payload:
 
{
  "richContent": [
    [
      {
        "options": [
          {
            "text": "Status"
          },
          {
            "text": "Cancel"
          }
        ],
        "type": "chips"
      }
    ]
  ]
}
- Create the Event Handler: 
No-match default 
- Fulfillment:  
Would you like me to cancel an order or lookup the status? - Custom payload:
 
{
  "richContent": [
    [
      {
        "options": [
          {
            "text": "Status"
          },
          {
            "text": "Cancel"
          }
        ],
        "type": "chips"
      }
    ]
  ]
}
- In the My Order Status Page create the following parameter:
 
- Displayname: 
ordernumber - Entity Type: 
@OrderNumber - Required checked
 - Initial prompt fulfillment:  
What's the order number? For example ABCD123. - Event Handler: 
No-match default:To proceed with your order I will need an order number. Order numbers start with 4 characters and end with 3 numbers, such as ABCD123. Which order number may I use? - Event Handler: 
No-input default:I missed that. To proceed with your order I will need an order number. Order numbers start with 4 characters and end with 3 numbers, such as ABCD123. Which order number may I use? 
- In the My Order Status Page create the following conditional route:
 
- Customize Expression: 
$session.params.ordernumber != null - Fulfillment: 
Your order $session.params.ordernumber has been shipped, it can take up to approx 2 weeks before you will receive your items. - Add dialogue option > Text: 
Is there anything else I can help you with? 
- In the My Order Cancelation Page create the following parameter:
 
- Displayname: 
ordernumber - Entity Type: 
@OrderNumber - Required checked
 - Initial prompt fulfillment:  
What's the order number? For example ABCD123. - Event Handler: 
No-match default:To proceed with your order I will need an order number. Order numbers start with 4 characters and end with 3 numbers, such as ABCD123. Which order number may I use? - Event Handler: 
No-input default:I missed that. To proceed with your order I will need an order number. Order numbers start with 4 characters and end with 3 numbers, such as ABCD123. Which order number may I use? 
- In the My Order Cancelation Page create the following conditional route:
 
- Customize Expression: 
$session.params.ordernumber != null - Fulfillment: 
Your order $session.params.ordernumber has been canceled. - Add dialogue option > Text: 
Is there anything else I can help you with? 
- Test the flow and create the following two test scenarios:
 
>"About my order"
>"ABCD123"
>"Status"
And:
>"What's the status of order DEFG222"
- Select the Start Page and click on the 
redirect.endintent. Create the following fulfillment:Thank you for contacting G-Records! Have a nice day! - Select the Start Page and click on the 
redirect.homeintent. Create the following parameter preset:restart = true 
Default Negative intents (Fallback)
When you create a virtual agent, a default negative intent is created for you. You can add training phrases to this intent that act as negative examples that will trigger a No-match event. There may be cases where end-user input has a slight resemblance to training phrases in normal intents, but you do not want these inputs to match any normal intents.
- Try in the simulator: 
I don't like Alice Googler. 
You will see that the virtual agent answers with the Product Overview Page, to continue ordering Alice Googler merchandise. However, your end user does not like that artist. Let's use the Default Negative Intent for this.
- Go to Manage > Intents and select the Default Negative Intent.
 - Add the following training phrases that will trigger the No-match event.
 
I don't like Alice GooglerI am not a fan of G's N' RosesI can't stand the music of the Google Dolls
- Hit Save and test the following sentence in the simulator: 
I am really not a fan of the Goo Fighters 
This time the No-match event was triggered, you stayed on the Start Page.
Default Fallback Messages
- Click the Default Start Flow, select the 
sys.no-input-defaultevent handler. 
The No-input fallback basically means: No text or speech answers were detected. Likely no answers were given, or the system couldn't hear it. Therefore, let's make the fallback messages more specific. Use the tab key, to create alternative dialogues:
- Remove all answers, and add these text dialogues:
 
I'm sorry, I didn't receive an answer. Can you say it again?I missed your answer, can you say it again?Sorry, I didn't hear anything. Can you say it again?I couldn't hear what you were saying, what was that?I'm sorry, I missed your answer. What were you trying to say?
Don't forget to click Save.
- Click the Default Start Flow, select the 
sys.no-match-defaultevent handler. 
The No Match fallback basically means: Text or speech answers were detected but nothing in Dialogflow CX got matched.
- Remove all answers, and add these text dialogues:
 
Sorry, I didn't get that. Can you please rephrase?I'm sorry, I don't understand. Can you please rephrase?I don't understand, please rephrase.Sorry, I didn't get that. What was that?I didn't get that, can you please rephrase?
Don't forget to click Save.
- It's advised to repeat these steps for the Catalog, My Order, Order Process and Customer Care flows.
 
Here's a tip: when creating fallback messages, make them more explicit, by rephrasing the previous question or by mentioning an example. You could create these type of No-match and No-input events on Page level when creating parameters. In our labs, we have already done this.
Creating the Order Process Flow
- Go to the Order Process Flow, and create the following intent transitions:
 
Page (In Flow)  | Routes > Intent  | Routes > Transition To  | 
Order Process Start  | 
  | End Session  | 
Order Process Start  | 
  | End Flow  | 
Order Process Start  | 
  | New Page: Shipping Details  | 
- Let's create the following entry fulfillment for the Shipping Details Page:
 
- Entry fulfillment: 
To complete your order I will first need to collect your shipping details. 
- Create the following parameters:
 
These parameters will make use of built-in system entities. System entity support differs for each language. See the docs for more information.
Parameter Display name  | Entity  | Required?  | Initial prompt fulfillment  | No-match default  | No-input default  | 
  | @sys.person  | Required  | 
  | 
  | 
  | 
  | @sys.person  | Required  | 
  | 
  | 
  | 
  | @sys.address  | Required  | 
  | 
  | 
  | 
  | @sys.any  | Required  | 
  | 
  | 
  | 
  | @sys.geo-city  | Required  | 
  | 
  | 
  | 
  | @sys.geo-country  | Required  | 
  | 
  | 
  | 
  | @sys.email  | Required  | 
  | 
  | 
  | 
- Create the following conditional route:
 
- Customize Expression: 
$page.params.status = "FINAL" - Transition to new Page: 
Payment Details 
- Create the following entry fulfillment.
 
Let's fake it that this virtual agent makes use of Google Pay. Don't worry this tutorial won't make real transactions. Create the following entry dialogues:
- Agent Says:
 
Alright $session.params.firstname! We will make use of Google Pay, that's connected to your email account: $session.params.email.
- Conditional Response
 
if $session.params.merch != "Digital Album"
  Shipping costs an additional 5 dollars. This will make the total price $$sys.func.TO_TEXT($sys.func.ADD($session.params.price, 5)).
  Your merchandise will be shipped to:
  $session.params.firstname $session.params.lastname
  $session.params.address
  $session.params.zipcode $session.params.city
  $session.params.country
  To continue the order process please explicitly say "I confirm". Do you want to confirm your $session.params.artist $session.params.merch order?
else
  The total costs will be: $$session.params.price.
  After purchasing the digital album, you will receive an email with the download link.
  To continue the order process please explicitly say "I confirm".
  Do you want to confirm your $session.params.artist $session.params.merch order?
endif
- Crea la siguiente ruta de intent
 
- Intent: 
confirm.proceed.order - El agente dice: 
Thank you for your order! Your merchandise will be shipped today! - Add Dialogue Option > Text: 
Here's the order number: ABCD123. - Add Dialogue Option > Text: 
Have a good day! - Transición: 
End Session 
- Selecciona la página Start y haz clic en el intent 
redirect.end. Crea el siguiente cumplimiento:Thank you for contacting G-Records! Have a nice day! - Selecciona la página Start y haz clic en el intent 
redirect.home. Crea el siguiente parámetro predeterminado:restart = true 
¡Genial! A estas alturas, ya tenemos un chatbot de comercio minorista que funciona a la perfección. En el siguiente lab, probaremos el rendimiento del agente virtual.
9. Prueba tu agente virtual
Puedes usar el simulador integrado para probar los diálogos de tu agente virtual. La ventaja de probar los flujos en el simulador es que verás una descripción general de los flujos, las páginas, los parámetros y los eventos (DTMF) que recopiló el simulador mientras recorrías tus flujos. Esto facilita las pruebas en comparación con la prueba directa en una integración, ya que esos tipos de información estarán ocultos para el usuario final. Incluso es posible crear casos de prueba, guardarlos y volver a usarlos. Esto tiene mucho sentido cuando mantienes o editas tus flujos con el tiempo y quieres asegurarte de que ninguno de tus cambios interrumpa tu trabajo anterior.
También es posible exportar e importar casos de prueba creados anteriormente almacenando las pruebas en Google Cloud Storage o de forma local. Cuando exportes una prueba, se descargará un archivo BLOB. Para obtener más información sobre el simulador y los casos de prueba, consulta la documentación del simulador y los casos de prueba.
Antes de crear algunos casos de prueba, primero finalicemos el resto de nuestro agente virtual:
Cómo crear el flujo de atención al cliente
- Ve al flujo de Atención al cliente y crea las siguientes transiciones de intención:
 
Página (en el flujo)  | Rutas > Intención  | Rutas > Transición a  | 
Inicio de Customer Care  | 
  | Envío  | 
Inicio de Customer Care  | 
  | Reembolso  | 
Inicio de Customer Care  | 
  | Intercambio  | 
Inicio de Customer Care  | 
  | Finalizar flujo  | 
Inicio de Customer Care  | 
  | Cerrar sesión  | 

- Crea los siguientes cumplimientos de entrada para la página Envío:
 
Shipping physical merchandise items can take up to 2 weeks.Is there anything else I can help you with?
- Crea los siguientes cumplimientos de entrada para la página Refund:
 
We offer free returns and refunds. We provide one free return label for each order. You can use it within 30 days from receiving your order. If your refund is accepted, we will refund the price you paid for your item back to your original payment method.Is there anything else I can help you with?
- Crea los siguientes cumplimientos de entrada para la página Swapping:
 
If you would like to change your item for a different one, please return your unwanted item and place a new order. If your refund is accepted, we will refund the price you paid for your item back to your original payment method.Is there anything else I can help you with?
- Selecciona la página Start y haz clic en el intent 
redirect.end. Crea el siguiente cumplimiento:Thank you for contacting G-Records! Have a nice day! - Selecciona la página Start y haz clic en el intent 
redirect.home. Crea el siguiente parámetro predeterminado:restart = true 
Crea casos de prueba
- Haz clic en el botón Probar el agente en el lado derecho de la pantalla.
 
Cuando abres el simulador por primera vez, debes seleccionar un entorno de agente y un flujo activo. En la mayoría de los casos, debes usar el entorno borrador y el flujo de inicio predeterminado.
- Tipo: 
Hi 

- Pregunta: 
Which artists are signed with your label? - Di: 
The Google Dolls - Di: 
I am interested in buying a shirt - Di: 
A t-shirt - Di: 
Medium - Ahora haz clic en el botón para guardar el caso de prueba. Puedes encontrarlo en la parte superior del simulador (junto a la flecha de rehacer y el ícono de papelera de restablecer).
 

- Proporciona los siguientes detalles:
 
- Nombre del caso de prueba: 
Buy Google Dolls t-shirt size M - Etiquetas: #catalog, #shirts, #t-shirt, #TheGoogleDolls
 
- Haga clic en Guardar.
 
Creemos más casos de prueba.
- Primero, borra el diálogo actual haciendo clic en el ícono de restablecer (papelera).
 - Crea los siguientes casos de prueba:
 
Compra la camiseta de Alice Googler:
>"Buy the Alice Googler t-shirt."
>"XL"
- Nombre del caso de prueba: 
Buy the Alice Googler t-shirt - Etiquetas: 
#catalog, #shirts, #t-shirt, #AliceGoogler 
Comprar una camiseta de talla M: (Ten en cuenta que no se mencionó el nombre del artista, pero quieres omitir la descripción general de las bandas, la descripción general de los productos, las camisetas y las páginas de tallas de camisetas).
>"Buy a t-shirt size M"
>"The Google Fighters"
- Nombre del caso de prueba: 
Buy a t-shirt size M - Etiquetas: 
#catalog, #shirts, #t-shirt, #TheGoogleFighters - Descripción: (Ten en cuenta que no se mencionó el nombre del artista, pero sí quieres omitir la descripción general de las bandas, la descripción general de los productos, las páginas de camisetas y las páginas de tallas de camisetas).
 
Compra música de G's N' Roses (ten en cuenta que se omitirán la descripción general de las bandas y la página de descripción general de los productos)
>"Purchase music of G's N' Roses"
>"Live"
>"CD"
- Nombre del caso de prueba: 
Purchase music of G's N' Roses - Etiquetas: 
#catalog, #music, #CD, #GsNRoses, #live - Descripción: (ten en cuenta que esto omitirá la descripción general de las bandas y la página de descripción general de los productos)
 
Verifica la información de precios:
>"Which products"
>"Shirts"
>"What's the price difference?"
>"Longsleeve"
>"What does it cost?"
>"M"
>"The Google Dolls"
>"No"
>"Which bands"
>"The Gooo Fighters"
>"Music"
>"How much does it cost?"
>"Greatest Hits"
>"What's the price difference?"
>"Mp3"
>"No"
>"I want to buy the tour movie"
>"Alice Googler"
>"Yes"
- Nombre del caso de prueba: 
Price info - Etiquetas: 
#catalog, #music, #tourmovie, #shirts - Descripción: Prueba la información de precios en varios puntos del diálogo.
 
Prueba casos de prueba pregrabados
- Selecciona Administrar > Casos de prueba en el menú principal de Dialogflow que se encuentra a la izquierda.
 - Selecciona todos los casos de prueba y presiona el botón Ejecutar que se encuentra sobre la tabla.
 
Dialogflow CX ejecutará todos los casos de prueba seleccionados en la grabación que se guardó como un "caso de prueba de referencia". Si los resultados son los mismos que cuando la guardaste, se aprobarán las pruebas. - Si cambió algo en los flujos, como páginas que no están configuradas correctamente o intents que lo dirigieron a las páginas incorrectas, las pruebas fallarán.

- En el simulador, haz la siguiente pregunta: 
How long will shipping take? - Anota el resultado y guarda el caso de prueba como 
Shippingcon la etiqueta#shipping. - Ve al panel Administrar > Casos de prueba y presiona el botón Ejecutar en la parte superior derecha de la cuadrícula para ejecutar solo el caso de prueba 
Shipping. 
Esta prueba debería aprobarse.
- Vuelve al flujo de atención al cliente, selecciona la página Inicio y haz clic en el encabezado Rutas.
 
Se mostrará una pantalla con una cuadrícula que muestra todas las rutas.
- Quita el 
redirect.shipping.info route. - Ve al panel Administrar > Casos de prueba y presiona el botón Ejecutar en la parte superior derecha de la cuadrícula para ejecutar solo el caso de prueba 
Shipping. 
Esta prueba debería fallar.
- Puedes hacer clic en la prueba fallida para ver los detalles del error.
 
En este caso, la prueba falló con el siguiente mensaje de error:
Page: Page mismatch:
Expected: Shipping
Actual: Start Page
El motivo es que la página ya no existe en el flujo. Esperábamos la página Shipping, pero nunca salimos de la página Start. (o tus usuarios finales recibirían un mensaje de resguardo).
En otras palabras, esta es una solicitud perdida, un resultado de prueba de falso negativo. Se produjo un error en la prueba. Esperábamos la página Shipping, pero no sucede nada o se muestra un mensaje de resguardo.
- Regresa al flujo de atención al cliente y agrega 
redirect.shipping.infocomo una ruta de intents a la página Start. No olvides pasar a la página Envío y hacer clic en Guardar. - En el simulador, registra el siguiente caso de prueba: 
I want to swap my itemy guárdalo comoSwapping#swapping. - Abre Administrar > Intents > redirect.refund.info y agrega la siguiente frase de entrenamiento: 
I want to swap this item for a refund 
Sin esa frase de entrenamiento, cuando un usuario pidiera cambiar un artículo para obtener un reembolso, se activaría la intención redirect.swapping.info, pero no queremos brindar información sobre el cambio de artículos, sino sobre los reembolsos.
- Crea el siguiente caso de prueba golden: 
I want to swap this item for a refunden el simulador y guarda este caso de prueba comoSwap for Refund#refund. - Vuelve a la intención Manage > Intents > redirect.refund.info y quita la línea 
I want to swap this item for a refund. - Vuelve a Manage > Test Cases, selecciona el caso de prueba Swap for Refund y haz clic en Run.
 
Tu prueba más reciente falló y mostró el siguiente mensaje de error:
If you would like to change your item for a different one, please return your unwanted item and place a new order. If your refund is accepted, we will refund the price you paid for your item back to your original payment method.`
Is there anything else I can help you with?
 Page: Page mismatch:
Expected: Refund
Actual: Swapping
En otras palabras, esta es una solicitud malinterpretada, un resultado de prueba de falso positivo. Se produjo un error en la prueba. Esperábamos la página Refund, pero se activó la página Swapping.
Cobertura
En Dialogflow CX, la cobertura de las pruebas es una medida que se usa para describir el grado en que se ejecuta el diálogo del agente virtual (páginas e intents) cuando se ejecuta un conjunto de pruebas en particular. Un agente virtual con una alta cobertura de pruebas, medida como un porcentaje, tuvo más diálogos ejecutados durante las pruebas, lo que sugiere que tiene menos probabilidades de contener errores no detectados (como solicitudes mal comprendidas) en comparación con un agente virtual con una baja cobertura de pruebas.
- Para ver un informe de cobertura de pruebas en todos los casos de pruebas, haz clic en Cobertura.
 - Haz clic en la pestaña Transiciones.
 
Se mostrará la cobertura de pruebas para todas las transiciones de página.

- Haz clic en la pestaña Intents.
 
Se mostrará la cobertura de pruebas para todos los intents.

¡Felicitaciones! Ya creaste y probaste un ejemplo completo del mundo real de un bot de comercio minorista. Vamos a la siguiente página del lab para leer la conclusión y encontrar algunas referencias útiles.
10. Conclusión
Dialogflow CX es una plataforma de IA conversacional (CAIP) para crear agentes virtuales, como chatbots o bots de voz. Dialogflow CX permite que tu equipo acelere la creación de experiencias conversacionales a nivel empresarial a través de compiladores visuales de bots, intents reutilizables y la capacidad de abordar conversaciones de varios turnos.
En este codelab, aprendiste a compilar un agente virtual de venta minorista del mundo real. Abordamos los siguientes conceptos:
- Flows
 - Parámetros, entidades personalizadas y del sistema
 - Páginas
 - Controladores de estado, como rutas de intents y rutas de condición
 - Mensajes de entrega estáticos y respuestas condicionales
 - Intents de resguardo
 - Simulador, casos de prueba y cobertura
 

Referencias
Para obtener más información sobre Dialogflow CX, consulta los siguientes blogs y la documentación.