CREANDO MI PRIMERA SKILL EN ALEXA AMAZON
Alexa es el servicio de voz basado en la nube que tiene Amazon, este nos permite interactuar en lenguaje natural con muchos de los productos de este gigante de la tecnología y actualmente con algunos de terceros.
Desde activar funciones domóticas o pedir que te lea un libro, son un poco de los muchas SKILLS que puede tener Alexa, puesto que te provee de toda una tienda en la que puedes conseguir y adicionar mas SKILLS para tu asistente virtual.
¿Suena muy interesante cierto?, Y si te digo que tu también puedes construir tus propias SKILLS. Ya sea para facilitarte algunas tareas sencillas como leer tu bandeja de entrada de la pagina de tu negocio en Facebook o también enviar correos únicamente hablándole el contenido de este a Alexa.
En este post te enseñare lo básico que necesitas conocer para que tu puedas desarrollar tu propia SKILL. Realizaremos un pequeño SKILL para consultar POKEMONES con la ya tan conocida POKEAPI.
INPORTANTE:
- Todo el código del este post lo encuentras en este repositorio, incluye un JSON que se debe exportar en el entorno de ALEXA DEVELOPER y puedas tener contexto de algunos INTENTS Y SLOTS que uso en este POST
- https://github.com/DevSylar/PokeSkill .
- Usaremos NODEJS; ya que es rápido, sencillo y porque Amazon tiene habilitado su modulo ASK-SDK (La librería necesaria para ambientar tu función lambda) para este lenguaje.
- Aprenderemos a programar la SKILL en una función lambda para poder generar un ENDPOINT, por eso sugiero ver este post, el cual te explica sobre el entorno de ALEXA DEVELOPER y puedas terminar la configuración del ENDPOINT.
- https://medium.com/mybots-latam/conceptos-generales-construyendo-mi-alexa-skill-8d3e99e186bc
COMENZEMOS:
Lo primero por comentar es la forma de trabajo en la función lambda, se tiene que exportar un Alexa HANDLER, el cual se encargara de enrutar todos los INTENTS y tipos de REQUEST que Alexa detecta. A este HANDLER también se le agregan HANDLERS HIJOS, los cuales se activarán dependiendo a si se detecta un INTENT o tipo de REQUEST especifico.
NOTA:
- Cuando se detecta un INTENT se entiende que es un REQUEST de tipo “IntentRequest”.
Es decir, que si Alexa detecta el INTENT “Saludo”, el Alexa HANDLER en nuestro lambda buscara si existe un HANDLER HIJO que espera una solicitud de tipo “IntentRequest” y que el INTENT detectado sea “Saludo”.
DEFINIENDO VARIABLES UTILES
Comenzamos definiendo unas variables constantes, para tener una relación de tipos elementales de POKEMONES de ingles a español y unos mensajes ya definidos. Y también requerimos los módulos necesarios para el ejercicio (request y ask-sdk)
CREANDO HANDLERS HIJOS PARA MANEJAR LOS TIPOS DE REQUEST Y LOS INTENTS PREARMADOS
Los HANDLERS HIJOS son objetos que tienen siempre 2 llaves necesarias “canHandler” y “handler”.
En el “canHandler” se devuelve un TRUE o FALSE, si es TRUE se ejecutará lo que esta en el “handler”.
NOTA:
- El Alexa HANDLER consulta los “canHandler” de sus HANDLERS HIJOS para validarlos.
Hablamos de los tipos de REQUEST que detecta Alexa y algunos de ellos son:
- LaunchRequest (Cuando el SKILL es lanzado)
- SessionEndedRequest (Cuando sueles decir “adiós” o se cierra el SKILL)
- IntentRequest (Cuando el input del usuario se relaciona con algún INTENT)
También existen INTENTS ya pre armados, como lo son los INTENTS que comienzan por “AMAZON.”. Estos INTENTS sirven para identificar formas de decir algo que normal mente necesitarían muchos ejemplos como training.
Ahora sabiendo estos conceptos aplicamos lógica en los “canHandler” para detectar INTENTS y los eventos mas comunes.
Para enviar la respuesta que Alexa hablara al usuario, tenemos que retornar en el “handler” una respuesta construida a partir del parámetro “handlerInput” que tiene varias funciones que te permiten estructurar tu respuesta (puedes definir respuestas como para echo dot, echo show y otros dispositivos que usen a Alexa).
CREANDO HANDLER HIJO PERSONALIZADO
Este HANDLER se encargará mediante el modulo request el obtener la información del POKEMON deseado y procederá a enviar la información de este POKEMON a Alexa para que lo reproduzca. El INTENT que se debe cumplir para lanzar este HANDLER es el de “BuscarPokemonIntent”.
Primero, creamos una función que se encarga de hacer la solicitud al POKEAPI, recibirá como parámetro el nombre del POKEMON y devolverá la información de este si existe. Y si no existe, retornara “Pokemon no encontrado”.
Siguiente, creamos el HANDLE PERSONALIZADO que usara la función anteriormente creada.
Como observamos, Alexa también maneja el concepto de SLOTS que es básicamente capturar una palabra que tenga relación a una entidad. En este caso la entidad es POKEMON que esta entrenada con los nombres estos. Así que cuando pregunte el usuario por PIKACHU o cualquier otro, el nombre sde ese POKEMON se guardara en el SLOT POKEMON.
Una ves consultado el valor del SLOT, se pasa a validar si hay un valor si o no, si hay, se pasa a ejecutar la función creada anteriormente pasándole el nombre del POKEMON detectado y si no, se le envía un mensaje para que intente nuevamente.
HANDLER PARA MANEJAR LOS ERRORES
Existe un tipo de HANDLER que se invocara cuando en alguno de los HANDLERS HIJOS ocurra una excepción. Funcionaria a algo similar a un CATCH.
Este siempre tendrá que estar retornado un TRUE en el “canHandler” ya que no nos importa validar, porque queremos que este atento ante cualquier excepción. Y en su atributo “handle” recibe 2 parámetros, el ya conocido “handlerInput” que te permite armar tu respuesta y el “error” que contiene información de la excepción que ocurrió.
CREACION DEL ALEXA HANDLER
Este seria el ultimo paso para tener listo y ya funcionando nuestra función lambda. Lo ultimo que queda por realizar es usar la variable “Alexa” que esta conteniendo al modulo “ASK-SDK”, creamos un “SkillBulders” de tipo “standard”. Luego ya tendremos acceso a la función “addRequestHandlers”, al cual le enviaremos como parámetros todos los HANDLERS HIJOS creados a excepción del ERRORHANDLER, ya que a este lo pasaremos en una de sus otras funciónes que es el “addErrorHandler” para que pueda manejar los errores, utilizaremos la función “lambda” y lo exportamos como handler.
Ya con eso podemos desplegar la función lambda y ya esta listo para que utilices la url de ENDPOINT en la configuración en el ALEXA DEVELOPER.