Si no conoces de qué va esto del Dialog Management te recomiendo leer primero mi post sobre conceptos y algunos recursos básicos :)
En mi skill Estrenos de cine uso un slot de tipo Amazon.DATE para recoger la fecha para la cual un usuario quiere consultar los estrenos.
En uno de los posts donde contaba cómo crear ese slot y recoger su valor en el back señalaba que había que tener en cuenta que nos podía llegar el valor "null". Ese escenario se daba cuando Alexa, ante el utterance de un usuario, identificaba el intent pero no conseguía rellenar ese slot para enviar la request del intent al back. Investigando la Alexa Developer Console y la documentación oficial descubrí la solución.
Alexa nos ofrece una forma de simplificar cómo recoger, validar y confirmar valores de los slots. Para ello tenemos que hacer dos cosas: crear lo que han llamado un dialog model y delegar el diálogo a Alexa. Gracias a esto pude simplificar código del back en favor de cosas que ya sabe hacer muy bien Alexa.
Delegar el diálogo a Alexa
Antes de entrar en la definición del dialog model voy a contar cómo configurar la delegación del diálogo a Alexa. Podéis ver en la doc oficial más cosas en profundidad, yo sólo me voy a centrar en enseñar los pasos para el caso de uso que necesito.
Hay dos formas de delegar el diálogo a Alexa: automática o manual. La forma automática está orientada a casos simples donde Alexa usará el dialog model para ir avanzando en el diálogo, sin código en el back necesario. La forma manual es más flexible y te permite tomar decisiones en tiempo de ejecución pero con código en el back.
Lo que hay que hacer en la Alexa Developer Console es configurar la estrategia de delegación que quieres usar para el skill y luego, si fuera necesario, cambiarla a nivel de intent concreto.
Para mi caso me vale la delegación automática que usará el dialog model que definiremos después. Cada skill ya tiene por defecto habilitado este tipo de delegación, lo podemos ver en la consola.
En la sección de Intefaces nos aparece un listado con la opción de Auto Delegation que debe estar habilitada para lo que queremos hacer. Aclarar que a día de hoy todos los skill vienen con el Auto Delegation a nivel de skill activado por defecto.
Para el intent donde necesitamos esa delegación no hace falta que hagamos nada ya que, por defecto, usará la estrategia definida a nivel de skill. Si quisiéramos tener delegación manual podríamos indicarlo y tendría precedencia sobre lo que está configurado a nivel de skill.
Definir el Dialog model
El primer paso de configuración de nuestro skill ya estaría listo. Ahora, para que Alexa sepa controlar los pasos del diálogo, tenemos que definir el dialog model.
Podemos ver el dialog model como una extensión del intent model básico que ayudará a Alexa a recoger, validar y confirmar valores de slots e intents. El dialog model nos va a permitir concretamente: configurar slots obligatorios, definir reglas de validación para valores de un slot y controlar la confirmación tanto a nivel de slots como de intents.
En este post sólo me voy a centrar en contar lo relacionado con la configuración de un slot obligatorio. Escribiré otros posts donde contaré el resto de cosas que nos ofrece dialog model.
Configurando un slot obligatorio
En el skill de Estrenos de Cine teníamos un slot de tipo Amazon.DATE para que el usuario indicara el periodo de tiempo para el cual quería conocer las películas que se estrenaban. Vamos a definir el dialog model necesario para que ese slot tenga un valor de forma obligatoria antes de que Alexa envíe la intent request al back.
Para ello tenemos que irnos a la pantalla de edición del slot dentro del intent haciendo click en la acción Edit Dialog. En esta pantalla tendremos todas las opciones necesarias para definir el dialog model divididas en dos bloques: diálogos (si es obligatorio y si hay que pedir confirmación) y validaciones.
Para este post vamos a habilitar simplemente la opción de que el slot sea obligatorio para completar el intent. Clickando en el toggle switch de Is this slot required to fulfill the intent? habilitamos la edición del dialog model que usará Alexa en este caso.
Hay dos cosas que necesitamos definir:
- Alexa speech prompts, son las preguntas que usará Alexa para pedir al usuario un valor para el slot. Se pueden definir tantas como queramos y se usan de forma aleatoria. Recuerda usar preguntas relacionadas con el tipo de slot y el contexto del mismo.
- User utterances, son las respuestas del usuario a las preguntas anteriores. Aquí aplicamos las mismas reglas que para los utterance de un intent y definimos igualmente la parte del utterance que será el slot.
Para info más detallada dejo aquí el enlace a la documentación oficial para esta parte del dialog model.
Es bastante sencillo usar esta funcionalidad del dialog model de Alexa y hacer tu skill mucho más robusto sin tener que añadir complejidad en la parte back. Yo lo descubrí a posteriori y ahora me parece bastante básico. Puedes probar cómo va a funcionar tu skill en el simulador forzando el diálogo por parte de Alexa con utterances incompletos o usar el Utterance Profiler sin llegar al back. Yo recomiendo el uso del Utterance Profiler. Y, si lo prefieres, puedes definir todo con el modelo JSON igualmente.
En el siguiente post sobre Dialog Management veremos cómo indicamos a Alexa que queremos la confirmación del valor de un slot o la confirmación de intent al completo antes de que envíe la request al back :)