Ведение сессии в боте Gupshup вызывает Api.ai

Я строю бота в 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);
}

2 ответа

Решение

Идентификатор сессии должен быть зафиксирован для пользователя. Есть два способа сделать это в коде бота 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 в 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 символов.

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

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

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

Другие вопросы по тегам