Bot en Telegram con Watson Assistant y Node-red 2

Publicado por Danilo Toro en

Imagen representativa de un chatbot

En el post anterior explique los primero pasos que se deben realizar para crear un bot en telegram con Watson Asisistant. Vimos como iniciar Nodered, como crear conversaciones básicas con Watson Assistant y como crear el bot usando BotFather.

En este post me enfocaré en explicar los pasos para poder enviar opciones e imágenes desde Watson Assistant a Telegram y en el uso de nuevos nodos de Nodered.

Watson Assistant

Lo primero que debemos hacer es crear la conversación en el servicio de IBM. Para esto, en la pestaña “Dialog” , creamos un nodo que será activado cuando Watson reconozca el “intent” apropiado. En mi bot tengo los intents #Location, donde responderé con una imagen que mostrará la ruta de como llegar y #Reserve, donde me dará dos opciones a elegir.

Nota: Si no entiendes lo que digo, puedes revisar el post anterior, Bot en Telegram con Watson Assistant y Node-red, ahí explico esto con más detalle

Respuestas con imágenes en Watson Assistant

Hacer que nuestro bot responda con una imagen es muy sencillo. Lo primero que tenemos que hacer es crear un nuevo nodo, hacer click en “Add response type” y seleccionar “Image”.

Nota: Para este ejemplo, es necesario eliminar la opción de texto, y dejar solo la respuesta con imagen. Para que nuestro bot realice multiples respuestas es necesario un poco de programacion.

Dialog – Watson Assistant

El servicio de Watson Assistant no almacena imagenes directamente, así que es necesario pasarle la imagen como una url. También tienes la opción de colocar un título y una descripción, pero prefiero dejarlas en blanco. Listo!

Image – Watson Assistant

Opciones en Watson Assistant

Los pasos para responder con opciones son similares a los anteriores. Primero creamos el nodo de conversación, eliminamos el texto haciendo click en el basurero y haciendo click en “Add response type” seleccionamos “option”.

Option – Watson Assistant

Las opciones requieren: título y opciones (obvio jajaja). El título es la pregunta que hará el bot. En mi caso, ¿Que necesita? y las opciones serán, Clases particulares y Ayudantías.

Para agregar una opción debemos hacer click en “Add option” y debemos completar los datos, donde “List label” es el mensaje que envía Watson como nombre de la opción y “Value” es el valor que envía Watson para luego analizarlo y detectar un intent.

Nota: De la manera que configuro el Nodered y como lo muestro en este post, la casilla “Value” puede estar vacía, ya que solo se enviarán los datos de la columna “List label”.

Nodered

Ahora que tenemos lista nuestra conversación, debemos adaptar nuestro Nodered para que envíe el mensaje a Telegram, ya que nuestro flujo solo es capaz de enviar texto.

Inject and debug

Cada ves que recibimos datos nuevos o falla algo en Nodered, hay dos nodos obligatorios de usar. Inject y Debug.

  • Inject es un nodo que nos permite pasar cualquier tipo de información a otro nodo. Esto nos sirve para poder probar nuestra lógica cuando algo falla, o cuando queremos pasar información de manera más rápida.
  • Debug es un nodo que nos permite saber que información está saliendo de algún nodo. Esto nos sirve cuando no sabemos en que nodo se está cortando nuestro flujo, entonces colocamos el nodo a la salida del nodo sospechoso para saber que ocurre.

Lo primero que debemos hacer es saber como llega la información desde Watson Assistant. Para esto colocamos un nodo inject antes de entrar al nodo assistant y un nodo debug a la salida. (Recuerda desconectar el flujo hacia telegram para que no se produzca un error, ver imagen mas abajo).

El nodo inject por defecto nos entrega un timestamp, por lo que debemos cambiarlo a String y escribir alguna frase que active los intent que retornan una imagen u opciones.

Nodo Inject

Una vez que le damos Deploy, hacemos click en el cuadrado que está a la izquierda del nodo Inject. Esto inyectará el mensaje al Assistant y la respuesta la recibirá el nodo Debug.

Inject – Debug – Nodered

En el costado derecho del navegador, tenemos una barra lateral que dice info. Si hacemos click en el insecto que se encuentra al lado superior derecho, nos mostrará el debug.
Si hiciste el Deploy y clickeaste el Inject, te debería aparecer algo como en la imagen

Debug – Nodered

Lo que ves es el mensaje principal que fluye entre los nodos, llamado “Payload”, que es un atributo del objeto msg. Si hacemos click sobre el mensaje, luego sobre output, despues sobre generic y finalmente en cero, veremos que, ya sea que responda con una imagen o una opción, Watson nos envía una variable llamada “Response_type“.

Debug – Respuesta con imagenes
Debug – Respuesta con opciones

La variable Response_type, contiene el tipo de mensaje que sale desde Watson Assistant. Estos pueden ser “text”, “option”, “image” o “pause”.

Ahora que sabemos donde está la variable que contiene el tipo de mensaje, (msg.payload.output.generic[0].response_type) podemos preparar el mensaje para que pueda ser enviado a Telegram.

En las funciones de la barra de nodos, existe un nodo llamado “switch”. Este nodo nos permite crear bifurcaciones de nuestro flujo según las condiciones que le entregemos.

Barra de nodos

El nodo requiere los siguientes datos:

  • Property: Es la variable que usaremos para separar nuestro mensaje. Esta debe ser escrita desde el “msg”. Como nuestra variable se llama response_type y se encuentra en msg.payload.output.generic[0].response_type .
  • Lógica: Es un menú desplegable en el que podemos seleccionar como queremos realizar la comparación, puede ser: igual (==), mayor que (>), menor que (<), distinto (!=), verdadero (is true), falso (is false), entre muchas otras.
  • Valor: Es el valor que puede tomar la variable utilizada para separar el flujo. Esta puede ser un caracter (string), numero (number), un atributo del msg (msg.), etc.

Nuestra lógica es sencilla. Hacemos click en el botón “add” tres veces (porque tenemos tres tipos de mensajes), en los menús desplegables de la izquierda seleccionamos “==” y en los de la derecha “string” y luego escribimos en las casillas los valores que puede tomar nuestra variable (text, image y option).

Ahora nuestro nodo cambia y tiene tres salidas que deben ir hacia tres funciones diferentes, según el tipo de respuesta que queremos dar.
Para las respuestas tipo texto, usaremos la misma función del tutorial anterior y para la salida tipo imagen haremos un pequeño cambio. En el atributo “content” cambiamos al final “text” por “source” y en el campo type cambiamos “message”, por “photo”.

Función Images_to_Telegram

Para las respuesta tipo opción, hay que saber un poquito acerca de los tipos de datos en Javascript para entender. Te dejo el script para que copies y pegues. Pd: Aprende a programar, te cambiará la vida!

Function Option_to_Telegram

Ya tenemos una función por cada tipo de mensaje, solo nos queda conectar los nodos al nodo “sender” de Telegram y listo.

Flujo Nodered

¡Ahora tu bot puede responder de tres formas diferentes!

Nota: Puedes tener el flujo completo en tu nodered importando mi script. Ve mi respositorio en github


4 comentarios

Abi · 5 agosto, 2019 a las 8:43 AM

Gracias Danilo! por compartir tus conocimientos, me ha servido muchoo!!

Saludos

Blanca · 12 mayo, 2020 a las 4:43 PM

Buenas tardes Danilo!
Lo primero muchas gracias por el tutorial muy útil!
Pero tengo una duda si ponemos msg.payload.output.generic[0].source lo que nos muestra es la url no la imagen, ¿sabes cómo hacerlo para que muestre la imagen?
Muchas gracias!

    Blanca · 12 mayo, 2020 a las 5:38 PM

    Es decir, muestra las dos cosas, imagen y url pero yo quiero que aparezca solo la imagen sin url, me puedes ayudar?
    Muchas gracias!

    Danilo Toro · 14 mayo, 2020 a las 2:01 PM

    Hola Blanca,

    En el Mail que te respondí te comenté que no existía forma sencilla de hacerlo, pero acabo de encontrar un nodo que podría ayudarte.
    Instala el nodo llamado node-red-contrib-image-tool. Este te permite transformar una imagen que tengas como url a un buffer o base64. Prueba haciendo la conversión a alguno de esos dos antes de enviarla al nodo de telegram.

    Si tienes dudas de como utilizar el nodo me avisas 😉

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *