Nouvelles Chroniques d'Amethyste

Penser au Sens, pas au Verbe

Sauvegarde des états dans un bot

Poster un commentaire

La sauvegarde des états est une des fonctions clefs d’un bot. Un bot bien conçu doit:

  • Rendre le service web sans états (stateless)
  • Garder une trace du contexte de la conversation

Ce n’est pas le service qui gère cela, c’est le bot. Tous les bots proposent ce genre de service.

 

Dire que l’on sauvegarde est une chose, mais encore faut t’il préciser la portée et la durée de vie de la sauvegarde.

Si par exemple vous avez besoin d’une portée qui s’étend au delà du bot on peut envisager une sauvegarde en base de données.

Le Framework ne propose aucun support particulier pour la sauvegarde en base de données. On le fait avec du code absolument standard. Je n’aborderai donc pas la question ici.

Les paramètres clefs d’une conversation sont les suivants:

  • Utilisateur
  • Conversation

Les combinaisons de ces éléments définissent autant de portées locales que l’on peut exploiter dans notre code. Il y en a donc 3:

  1. Utilisateur
  2. Conversation
  3. Utilisateur + Conversation

Il existe par contre un support pour ces portées dans le SDK que nous allons explorer dans cet article.

La compréhension de la sauvegarde des états est important car c’est cela qui permet de maintenir une conversation plus sophistiquées qu’une simple Question/Réponse.

 

Avant de lire la suite (re)lisez ceci:

https://amethyste16.wordpress.com/2017/01/22/mon-premier-bots/

L’architecture de Microsoft Bot Framework

L’offre Microsoft est composée de 3 parties:

botframework_overview_july

 

Bot Builder est un SDK qui existe en 3 versions:

  1. .Net
  2. Node.js
  3. REST appelé aussi  Direct Line Chanel

 

Comme déjà mentionné il est disponible en open source dans Github.

 

Le portail développeur a également été aperçu dans l’article précédent. C’est dans ce portail que l’on va enregistrer notre bot et le publier dans l’annuaire public. On pourra ainsi le sécuriser et le configurer pour dialoguer avec divers canaux. Le portail offre également des fonctions de test et d’administration.

Bot directory est un annuaire de bots mis à disposition par la communauté. Les bots sont publiés et approuvés. La publication est optionnelle et n’empêche pas d’utiliser le bot. Toutefois certains canaux ont des limitations avec des bots qui n’ont pas été approuvés.

L’annuaire est accessible ici:

https://bots.botframework.com/

L’annuaire propose diverses options comme la possibilité de recherche dans la liste des bots. Une fois trouvé le bot qui vous intéresse, le portail vous permet de l’ajouter dans un des canaux pour lequel il a été configuré. Par exemple regardez AzureBot qui pourrait vous intéresser:

https://bots.botframework.com/bot?id=azurebot

A ce jour Microsoft ne propose pas d’annuaire privé.

Sauvegarde des états

L’Activity est un des éléments clefs d’une conversation car c’est par une instance de cette classe que circulent toutes interaction entre bot et utilisateur. Je détaillerai le point dans l’article suivant. Retenons juste que c’est par là que circule non seulement les messages émis par l’utilisateur ou le bot, mais aussi les informations d’état et de contexte.

Sauvegarde dans le service d’états

Les connecteurs gèrent un service d’états (state service). Ce service permet à un bot de sauvegarder des états via son contexte. La portée du service est le cycle de vie du connecteur.

Tant qu’il n’est pas relancé, toutes les conversations y ont accès.

 

La sauvegarde des états à lieu dans une classe BotData que l’on obtient soit du service d’états si on est dans un contrôleur par exemple, soit du contexte si on est dans une conversation.

Le service d’états est une instance de StateClient, on procède donc ainsi:


StateClient stateClient = activity.GetStateClient();
BotData userData = await stateClient.BotState.GetUserDataAsync(activity.ChannelId, activity.From.Id);

 

Nous avons notre conteneur, il ne reste plus qu’à s’en servir!

Comme précisé en introduction il y a la question du contexte. L’offre proposée par le SDK est la suivante:

2017-01-29_18-39-13

Ce tableau se provient de la doc sauf qu’il est en français et que j’ai corrigé les erreurs!

Botbuilder distingue donc 2 portées:

  1. Utilisateur
  2. Conversation

On peut également les combiner.

 

Les méthodes existent en version synchrone et asynchrone. Je vais surtout utiliser la version asynchrone qui se caractérise par le suffixe async.

Le choix fait par Microsoft est donc de proposer une méthode spécifique pour chaque portée.

 

On va s’essayer avec la portée ‘Utilisateur’. Essayons d’alimenter le conteneur:


userData.SetProperty("nom", "Amethyste");
await stateClient.BotState.SetUserDataAsync(activity.ChannelId, activity.From.Id, userData);

La méthode SetProperty() alimente le BotData avec une propriété appelée nom. SetUserDataAsync() permet de persister BotData pour le rendre accessible lors des requêtes suivantes. Justement vérifions.

Remplaçons les deux lignes qui précèdent par celle-ci et relançons le bot:


string nom = userData.GetProperty<string>("nom");

 

Et ça fonctionne, regardez!

2017-01-25_22-37-34

Ce code est le code de base applicable à toutes les portées. Il n’y a que la méthode d’appel qui change.

Sauvegarde dans le dialogue

Il existe une autre méthode qui n’utilise pas les méthodes précédentes. Sa portée est la conversation. Elle sera démontrée dans le chapitre suivant:

https://amethyste16.wordpress.com/2017/01/26/un-vrai-dialogue-avec-un-bot/

C’est le dernier chapitre.

 

Nous avons les bases pour construire de vrais dialogues.

Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s