Сохранение сеанса в Gupshup боте вызовов Api.ai

голоса
1

Я строй бота Gupshup с интеграцией Api.ai. У меня есть агент в Api.ai с несколькими намерениями и каждый из них связан между собой через контексты (входные и выходные контексты). Когда я использую следующий код для вызова Api.ai, то первое намерение называется, и я получаю ответ. Однако, когда второе сообщение дается, бот воспринимает это как совершенно новое сообщение, не идентифицируя его связь с первым. Как я могу решить эту проблему? Просьба помочь

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);
}
Задан 05/11/2016 в 06:58
источник пользователем
На других языках...                            


2 ответов

голоса
0

Суреш, кажется вы создаете новый идентификатор сессии для каждого запроса:

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

Но если вы хотите, чтобы контексты работать он должен быть один фиксированное значение для всех запросов, принадлежащих одному пользователю. Например, вы могли бы использовать некоторые глобальные переменные для него.

Ответил 07/11/2016 в 05:12
источник пользователем

голоса
1

SESSIONID должна быть установлена ​​для пользователя. Есть два способа сделать это в коде бота Gupshup -

  1. Используйте уникальный идентификатор пользователя, который отправляется на бот для каждого пользователя. Чтобы получить это значение, которое вы можете использовать -

    event.senderobj.channelid

    Но это значение зависит от того, как различные каналы передачи сообщений обеспечивает его и api.ai имеет предел 36 символов.

    Образец кода -

    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. Создать уникальный SESSIONID для каждого пользователя и сохранить его в базе данных , чтобы использовать его. В примере ниже, я хранение SESSIONID в roomleveldata , который по умолчанию настойчивость обеспечивается Gupshup, чтобы узнать больше проверить это руководство .

    Образец кода -

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

Помните, что SESSIONID не должна превышать 36 символов.

Ответил 08/11/2016 в 06:32
источник пользователем

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