Le maintien de session en bot Gupshup appelle à Api.ai

voix
1

Je construis un robot à l'intégration Gupshup Api.ai. J'ai un agent Api.ai avec plusieurs intentions et chacun d'entre eux liés par des contextes (contextes d'entrée et de sortie). Lorsque j'utilise le code suivant pour appeler Api.ai, la première intention est appelée et je reçois la réponse. Toutefois, lorsque le second message est donné, le robot prend comme un message complètement nouveau, sans identifier sa relation avec le premier. Comment puis-je résoudre ce problème? Aide aimablement

function MessageHandler(context, event) {
    // var nlpToken = xxxxxxxxxxxxxxxxxxxxxxx;//Your API.ai token
    // context.sendResponse(JSON.stringify(event));
    sendMessageToApiAi({
        message : event.message,
        sessionId : new Date().getTime() +'api',
        nlpToken : 3626fe2d46b64cf8a9c0d3bee99a9sb3,
        callback : function(res){
            //Sample response from apiai here.
            context.sendResponse(JSON.parse(res).result.fulfillment.speech);
        }
    },context)
}

function sendMessageToApiAi(options,botcontext) {
    var message = options.message; // Mandatory
    var sessionId = options.sessionId || ; // optinal
    var callback = options.callback;
    if (!(callback && typeof callback == 'function')) {
       return botcontext.sendResponse(ERROR : type of options.callback should be function and its Mandatory);
    }
    var nlpToken = options.nlpToken;

    if (!nlpToken) {
       if (!botcontext.simpledb.botleveldata.config || !botcontext.simpledb.botleveldata.config.nlpToken) {
           return botcontext.sendResponse(ERROR : token not set. Please set Api.ai Token to options.nlpToken or context.simpledb.botleveldata.config.nlpToken);
       } else {
           nlpToken = botcontext.simpledb.botleveldata.config.nlpToken;
       }
    }
    var query = '?v=20150910&query='+ encodeURIComponent(message) +'&sessionId='+sessionId+'&timezone=Asia/Calcutta&lang=en    '
    var apiurl = https://api.api.ai/api/query+query;
    var headers = { Authorization: Bearer  + nlpToken};
    botcontext.simplehttp.makeGet(apiurl, headers, function(context, event) {
       if (event.getresp) {
           callback(event.getresp);
       } else {
           callback({})
       }
    });
}

/** Functions declared below are required **/
function EventHandler(context, event) {
    if (!context.simpledb.botleveldata.numinstance)
        context.simpledb.botleveldata.numinstance = 0;
    numinstances = parseInt(context.simpledb.botleveldata.numinstance) + 1;
    context.simpledb.botleveldata.numinstance = numinstances;
    context.sendResponse(Thanks for adding me. You are: + numinstances);
}

function HttpResponseHandler(context, event) {
    // if(event.geturl === http://ip-api.com/json)
    context.sendResponse(event.getresp);
}

function DbGetHandler(context, event) {
    context.sendResponse(testdbput keyword was last get by: + event.dbval);
}

function DbPutHandler(context, event) {
    context.sendResponse(testdbput keyword was last put by: + event.dbval);
}
Créé 05/11/2016 à 06:58
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
0

Suresh, Il vous semble générer de nouvelles id de session pour chaque demande:

new Date().getTime() +'api'

Mais si vous voulez faire des contextes de travail, il doit être une valeur fixe pour toutes les demandes appartenant à un utilisateur. Par exemple, vous pouvez utiliser une variable globale pour elle.

Créé 07/11/2016 à 05:12
source utilisateur

voix
1

Le sessionId doit être fixé pour un utilisateur. Il y a deux façons dont vous pouvez le faire dans le code de bot Gupshup -

  1. Utilisez le code d'utilisateur unique qui est envoyé au bot pour chaque utilisateur. Pour obtenir cette valeur, vous pouvez utiliser -

    event.senderobj.channelid

    Mais cette valeur dépend de la façon dont les différents canaux de messagerie et fournit api.ai a une limite de 36 caractères.

    Exemple de code -

    function MessageHandler(context, event) {
    sendMessageToApiAi({
        message : event.message,
        sessionId : event.senderobj.channelid,
        nlpToken : "3626fe2d46b64cf8a9c0d3bee99a9sb3",
        callback : function(res){
            //Sample response from apiai here.
            context.sendResponse(JSON.parse(res).result.fulfillment.speech);
         }
       },context)
    }
    
  2. Générer un sessionId unique pour chaque utilisateur et le stocker dans la base de données de l' utiliser. Dans l'exemple ci - dessous, je stocke le sessionId à roomleveldata qui est la persistence par défaut fourni par Gupshup, pour en savoir plus vérifier ce manuel .

    Exemple de code -

    function MessageHandler(context, event) {
    sendMessageToApiAi({
        message : event.message,
        sessionId : sessionId(context),
        nlpToken : "84c813598fb34dc5b1f3e1c695e49811",
        callback : function(res){
            //Sample response from apiai here.
            context.sendResponse(JSON.stringify(res));
        }
       },context)
    }
    function sessionId(context){
     var userSession = context.simpledb.roomleveldata.sessionID;
     if(!userSession){
       userSession = new Date().getTime() +'api';
        context.simpledb.roomleveldata.sessionID = userSession;
       return userSession;
     }else{
        return userSession;
     }
    }
    

Rappelez-vous que sessionId ne doit pas dépasser 36 caractères.

Créé 08/11/2016 à 06:32
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more