Piloter votre Bot (Wit.ai) en langage Groovy

odelia-groovy-wit est une librairie Groovy dont je suis l'auteur et qui permet de s'interfacer avec l'API du moteur de Bots de Wit.ai.
Le but est de pouvoir développer des applications conversationnelles en s'appuyant sur le moteur de Wit.ai : celui-ci analyse les phrases qu'on lui soumet et indique quelle devrait être la prochaine action à exécuter, et c'est donc votre application qui pilote l'avancement de la conversation avec votre bot.

Pour vous donner un exemple d'utilisation de la librairie odelia-groovy-wit, voici le code de la classe Weather qui interagit avec un bot créé en suivant l'exemple d'application Quick start donnée sur le site web de Wit.ai.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package odelia.groovy.wit.examples

import odelia.groovy.wit.Wit

class Weather {

    static void main(String[] args) {

        def getWeather = { location -> 'Sunny' }

        def actions = [
            say: { String sessionId, Map context, String message, Closure cb ->
                println message
                cb()
            },
            merge: { String sessionId, Map context, Map entities, Closure cb ->
                if (!context.loc) {
                    if (entities?.location) {
                        context.loc = entities.location[0].value
                    }
                }
                cb(context)
            },
            'fetch-weather': { String sessionId, Map context, Closure cb ->
                if (context.loc) {
                    context.forecast = getWeather(context.loc)
                }
                cb(context)
            }
        ]

        def wit = new Wit(System.env.'WIT_TOKEN')
        wit.actions = actions

        wit.interactive()
    }

}

La classe Weather permet de démarrer une session interactive avec votre bot grâce à la classe Wit instanciée avec un jeton qui identifie votre bot, préalablement défini sur le compte qui devez avoir ouvert chez Wit.ai.

Après le lancement de l'application, vous pourrez interroger votre bot en langage naturel pour demander le temps qu'il fait dans une ville ; par exemple :

What's the weather in Antibes?

Sans entrer dans les détails, voici le rôle des actions définies dans la variable actions :

  • say permet d'afficher ce que le bot répond ;
  • merge, de tenir compte des informations collectées par le bot (ici context.loc contiendra le nom de la ville) ;
  • fetch-weather : il s'agit d'une action personnalisée, qui permettra de récupérer le temps qu'il fait dans la ville dont le nom est passé en paramètre.

Déterminer le temps qu'il fait dans une ville est confié à la Closure Groovy getWeather qui se contente (dans notre exemple) de simplement renvoyer Sunny.
Pour que ce soit plus réalise, cette information peut être demandée à l'API d'OpenWeatherMap, grâce au builder Groovy HTTPBuilder par ailleurs utilisé dans le projet odelia-groovy-wit :

1
2
3
4
5
6
7
8
9
10
11
12
13
def getWeather = { location ->
    def http = new HTTPBuilder('http://api.openweathermap.org/data/2.5/weather')
    def weather = http.request(GET) {
        uri.query = [q: location, APPID: 'YOUR_OPENWEATHER_APPID']
        response.success = { response, json ->
            json.weather.main
        }
        response.failure = {
            log.error("Error in getWeather: ${it.statusLine.statusCode}")
        }
    }
    weather[0].toLowerCase()
}