2016-11-05 82 views
1

我正在與Api.ai集成在Gupshup中構建一個機器人。我在Api.ai中有一個代理,有幾個意圖,並且每個代理都通過上下文鏈接(輸入&輸出上下文)。當我使用下面的代碼來調用Api.ai時,第一個意圖被調用並且我得到了答覆。然而,當第二條消息被給出時,機器人將它作爲一個全新的消息,而不是先識別它的關係。 我該如何解決這個問題?好心幫維護會議在Gupshup機器人調用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. 使用其發送給機器人爲每個用戶的唯一用戶ID。 爲了得到這個值,你可以使用 -

    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存儲在由Gupshup提供的默認持久性的roomleveldata中,要了解更多,請檢查此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

嘿Shreyans,我與Wit.ai有一個新的問題。你能幫我嗎? –

+0

嗨蘇雷什,我是過去兩週的AFK。現在看到這個。是的,我可以幫助你。 – Shreyans

0

蘇雷什, 看來你產生新的會話ID爲每一個請求:

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

但是,如果你想使環境工作,它必須是屬於一個所有的請求一個固定值用戶。例如,你可以爲它使用一些全局變量。