Mantenere sessione Gupshup bot chiama a Api.ai

voti
1

Sto costruendo un bot in Gupshup con l'integrazione Api.ai. Ho un agente in Api.ai con diversi intenti e ciascuno di loro collegati mediante contesti (contesti di input e output). Quando uso il seguente codice per chiamare Api.ai, il primo intento è chiamato e ho la risposta. Tuttavia quando viene dato il secondo messaggio, il bot prende come un nuovo messaggio, senza identificare la sua relazione con il primo. Come posso risolvere questo problema? aiuto gentilmente

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);
}
È pubblicato 05/11/2016 alle 06:58
fonte dall'utente
In altre lingue...                            


2 risposte

voti
0

Suresh, Sembra che si genera nuovo id di sessione per ogni richiesta:

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

Ma se si vuole fare contesti di lavoro che deve essere un valore fisso per tutte le richieste che appartengono a un utente. Ad esempio, è possibile utilizzare una variabile globale per esso.

Risposto il 07/11/2016 a 05:12
fonte dall'utente

voti
1

Il sessionId deve essere fissato per un utente. Ci sono due modi si può fare questo nel codice bot Gupshup -

  1. Utilizzare l'userID unico che viene inviato al bot per ogni utente. Per ottenere questo valore è possibile utilizzare -

    event.senderobj.channelid

    Ma questo valore dipende da come i diversi canali di messaggistica fornisce e api.ai ha un limite di 36 caratteri.

    Codice d'esempio -

    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. Genera un unico sessionId per ogni utente e memorizzarlo nel database per utilizzarlo. Nel campione di seguito, sto memorizzando i sessionId a roomleveldata che è la persistenza predefinito fornito da Gupshup, per saperne di più controllare questo manuale .

    Codice d'esempio -

    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;
     }
    }
    

Ricordate che sessionId non deve superare i 36 caratteri.

Risposto il 08/11/2016 a 06:32
fonte dall'utente

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