¿Quieres manejar cómodamente tus proyectos software desde Slack (o similares)? O, aún mejor, ¿quieres ayudar a usuarios inexpertos a explicar mejor los errores que encuentran en tu software para no perder el tiempo intentando recopilar toda la información que necesitas para reproducir sus errores?. La solución a todos tus problemas es crear un chatbot que se entienda con GitHub. Aquí te enseñamos como puedes construirlo.

De hecho, veremos como crear dos chatbots:

  1. (para usuarios) Un bot que ayude a los usuarios a escribir unos buenos bug reports para facilitar tu vida (ya sabemos que uno de las grandes amenazas a la sostenibilidad del software libre es la gran carga de trabajo que implica gestionar la comunidad, este tipo de chatbots puede liberar parte de tu carga)
  2. (para los responsables) Un bot que te avisa en Slack cada vez que una nueva issue o bug se abre y que te permite etiquetarlo y asignarlo a alguien sin salir de Slack.

Para crear estos bots necesitamos coordinarnos con las APIs de Slack, de GitHub y algún librería/servicio NLP/NLU que nos ayude con el tratamiento del lenguaje natural, como por ejemplo DialogFlow. Pero no te asustes, en lugar de escribir los conectores para todos ellos, nos basaremos en la plataforma de desarrollo de bots Xatkit. Xatkit es un proyecto de software libre con lo que lo podéis descargar y utilizar sin problemas.

Xatkit ya viene con soporte para Slack, GitHub y DialogFlow predefinidos (y lo mismo para otras muchas plataformas). Esto facilita mucho la creación de chatbots para ellas: en lugar de escribir código que ataque las respectivas APIs, usamos las abstracciones de Xatkit para explicar lo qué queremos que el bot haga con ellas a más alto nivel.

De forma similar a otras plataformas, en Xatkit, el chatbot se define especificando la lista de Intents que el bot puede reconocer y la lista de acciones que el bot tiene que ejecutar como respuesta a cada intent. Esta respuesta usuario puede ser textual o la ejecución de un servicio externo. una vez hechas las “presentaciones” veamos como podemos usar Xatkit para crear los dos bots que queremos desarrollar.

Un chatbot para escribir bug reports desde Slack

Si miras el repositorio de cualquier proyecto open source, verás que las primeras interacciones en cada nuevo error que se reporta tienen que ver con el responsable del proyecto intentando sacar toda la información al usuario (cuándo se produce el bug, qué sistema operativo utiliza, qué versión…) para poderlo reproducir y arreglar. Y como esto es una comunicación asíncrona, pueden pasar varios días antes de qué se pueda empezar realmente a trabajar en un parche para el bug.

Veamos pues como podría ser un chatbot que se encargará automáticamente de esto. Como ejemplo, vamos a imaginar que el usuario se está quejando de un error en un plugin de WordPress. En este caso, las dos primeras preguntas siempre son que versión de WordPress y que versión de PHP se están utilizando. Crearemos un bot que se va a asegurar que el usuario nos da esta información antes de realmente crear el bug report en GitHub.

Empecemos definiendo los posibles intents. Fijaros que algunos solo pueden evaluarse si otro intent previo ha sido ya emparejado. Fijaros también que vamos recogiendo información de la conversación que usaremos al final para abrir el bug.

intent OpenBug {   inputs {   "The plugin is not working"   "I have a problem with the plugin"   "I'd like to report an error"   "I want to open a bug"   "I want to report a bug"   "There is an error in the plugin"   }    }    intent DescribeBug follows OpenBug {   inputs {   "My error is Error"   "The problem is Error"   "I get this error: Error"   "My error is that Error"   "The problem is that Error"   "I get the error Error"   }   creates context bug {   sets parameter title from fragment Error (entity any)   }  }    intent TellWPVersion follows DescribeBug {   requires context bug   inputs {   "My version number is WPVersion"   "I use number WPVersion"   "It's version WPVersion"   }   creates context bug {   sets parameter wpversion from fragment WPVersion (entity number)   }  }    intent TellPHPVersion follows TellWPVersion {   requires context bug   inputs {   "My version is PHPVersion"   "I use PHPVersion"   "It's version PHPVersion"   "The server is on php version PHPVersion"   }   creates context bug {   sets parameter phpversion from fragment PHPVersion (entity number)   }  }

Éste sería un ejemplo de conversación con el chatbot que acabamos de definir

Cuando tenemos ya toda la información que necesitamos, sólo hay que juntarlo todo y proceder con la apertura de la issue en GitHub. Esto lo hacemos en el modelo de ejecución del bot. Además de crear el bug report, aprovechamos también para etiquetarlo ya directamente para facilitar su proceso posterior (y podríamos hacer muchas otras cosas, ya depende de hasta donde queráis llegar).

on intent TellPHPVersion do action SlackPlatform.Reply(message : "Thanks for your detailed info")      def newissue = action GithubPlatform.OpenIssue(user : "jcabot", repository : "xatkit-tests", issueTitle : context(bug).get("title") , issueContent : "WP version is " + context(bug).get("wpversion") + " PHP version is " + context(bug).get("phpversion")    )     action GithubPlatform.SetLabel(issue : newissue, label : "bug")

Siguiendo con la conversación anterior, la ejecución del chatbot acabaría generando la siguiente issue en GitHub.

De GitHub a Slack: recibir (y reaccionar) a notificaciones de GitHub

Veamos ahora como podemos crear un chatbot que se “despierte” cuando GitHub envíe una notificación y nos permita responder a ella sin salir de Slack o nuestra herramienta de mensajería / comunicación preferida.

Como ejemplo, nos centraremos en la notificación Open issue (justamente la que se generaría si un usuario de nuestro proyecto utiliza el chatbot creado en la sección anterior). Queremos un chatbot que:

  • Reciba este tipo de notificaciones de GitHub
  • Nos permita asignar etiquetas y una persona responsable a la nueva issue.

Para conseguir que GitHub propague esta notificación a Slack, nos basta con escribir:

on event Issue_Opened do action SlackPlatform.PostMessage(message : "An issue has been opened with the title " + context(issue).get("issue->title"), channel: config(slack.channel))     def issue = action GithubPlatform.GetIssue(user : config(github.repository.username), repository : config(github.repository.name), issueNumber : context(issue).get("issue->number"))   session.store("issue", issue)

donde lo que hacemos es recibir el evento de GitHub y enviarlo como nuevo mensaje a Slack. El mensaje se crea a partir de los parámetros del evento. Una vez más, fijaros que Xatkit nos evita toda la complejidad de, en este caso, procesar el JSON que realmente envía GitHub. Xatkit lo parsea y procesa por nosotros y nos da los datos ya digeridos para su fácil tratamiento. La issue en sí nos la guardamos también en la sesión para su uso posterior.

Una vez nos llega la notificación, el chatbot se pone en modo escucha a ver si queremos expresar la intención de asignar etiquetas o responsables a la issue. La definición de los intents correspondientes sería:

intent SetLabel {  requires context issue  inputs {  "Set label Label"  "Give label Label"  }  creates context issue {  sets parameter issueLabel from fragment Label (entity any)  }  }    intent AssignUser {  requires context issue  inputs {  "Assign user Username"  "Username will take care of it"  }  creates context issue {  sets parameter assignedUsername from fragment Username (entity any)  }  }

Como el chatbot anterior para cada intent definimos un pequeño conjunto de sentencias de entramiento que serán usadas por el motor de NLP/NLU para analizar el texto que escribamos en Slack y intentar emparejarlo con una de las dos intenciones que admite este bot. Al usar DialogFlow para esto, variaciones de las sentencias de entrenamiento serán también reconocidas con éxito, no hace falta que haya un exact match. Por ejemplo si escribo Add Label en lugar de Set o Give, se va a reconocer igual que lo que quiero es añadir una etiqueta.

Con este chat y las acciones asociadas a los intents anteriores

on intent SetLabel do   action GithubPlatform.SetLabel(issue : session.get("issue"), label : context(issue).get("issueLabel"))   action SlackPlatform.Reply(message : "Done!")

, actualizaremos de forma automática el estado de esta issue en GitHub:

Resumen: Hablando con GitHub

Hemos visto como en unas pocas líneas de código podemos crear bots bidireccionales que enlazan tus proyectos software con herramientas como Slack.

Hemos visto sólo un par de ejemplos sencillos pero espero que suficientes para que te haya quedado claro la de cosas interesantes que se podrían llegar a hacer (ej. mira otros bots que podrían beneficiarse también de una interfaz conversacional) para agilizar la gestión de las comunidades open source.

Tienes el código completo del ejemplo aquí. ¡Anímate a probarlo y crear tus propios GitHub chatbots!

Por Jordi Cabot

Soy Profesor de Investigación ICREA en la Universitat Oberta de Catalunya (UOC) y co-fundador de Xatkit una plataforma open source para la creación de chatbots especializada en chatbots para eCommerce.

Deja una respuesta

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