El mantenimiento de la sesión en GupShup bot llama a Api.ai

votos
1

Estoy construyendo un robot en GupShup con la integración Api.ai. Tengo un agente en Api.ai con varios intentos y cada uno de ellos unido a través de contextos (de entrada y salida contextos). Cuando utilizo el siguiente código para llamar Api.ai, la primera intención se llama y me da la respuesta. Sin embargo, cuando se le da el segundo mensaje, el bot toma como un completamente nuevo mensaje, sin identificar su relación con la primera. ¿Cómo puedo solucionar este problema? amable ayuda

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);
}
Publicado el 05/11/2016 a las 03:58
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
0

Suresh, Parece que generan nuevo identificador de sesión para cada solicitud de:

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

Pero si desea realizar contextos de trabajo que debe ser un valor fijo para todas las peticiones que pertenecen a un usuario. Por ejemplo, se puede utilizar una variable global para ella.

Respondida el 07/11/2016 a las 02:12
fuente por usuario

votos
1

El sessionId tiene que ser fijado para un usuario. Hay dos maneras de hacer esto en el código bot GupShup -

  1. Utilice el ID de usuario única que se envía al robot para cada usuario. Para obtener este valor se puede utilizar -

    event.senderobj.channelid

    Sin embargo, este valor depende de cómo los diferentes canales de mensajería proporciona api.ai y tiene un límite de 36 caracteres.

    Código de muestra -

    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. Generar un sessionId única para cada usuario y almacenarlo en la base de datos para utilizarla. En el ejemplo siguiente, estoy almacenando la sessionId en roomleveldata que es la persistencia predeterminada proporcionada por GupShup, para saber más comprobar esta guía .

    Código de muestra -

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

Recuerde que sessionId no debe superar los 36 caracteres.

Respondida el 08/11/2016 a las 03:32
fuente por usuario

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