2016-11-05 7 views
1

Я создаю бота в Gupshup с интеграцией Api.ai. У меня есть агент в Api.ai с несколькими намерениями, и каждый из них связан через контексты (входные контексты вывода &). Когда я использую следующий код для вызова Api.ai, вызывается первое намерение, и я получаю ответ. Однако, когда дано второе сообщение, бот воспринимает его как совершенно новое сообщение, не определяя его отношения с первым. Как я могу решить эту проблему? Пожалуйста, помогитеПоддержание сессии в Gupshup bot вызывает 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); 
} 

ответ

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, чтобы узнать больше об этом guide.

    Пример кода -

    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 символов.

+0

Эй, Шрейанс, у меня есть новая проблема с Wit.ai. Вы можете помочь? –

+0

Привет, Суреш, я был АФК в течение последних двух недель. Увидев это сейчас. Да, я могу помочь вам. – Shreyans

0

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

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

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

Смежные вопросы