Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 在Gupshup bot调用Api.ai中维护会话_Json_Chatbot_Dialogflow Es_Facebook Chatbot_Gupshup - Fatal编程技术网

Json 在Gupshup bot调用Api.ai中维护会话

Json 在Gupshup bot调用Api.ai中维护会话,json,chatbot,dialogflow-es,facebook-chatbot,gupshup,Json,Chatbot,Dialogflow Es,Facebook Chatbot,Gupshup,我正在Gupshup中使用Api.ai集成构建一个机器人。我在Api.ai中有一个代理,有几个意图,每个意图都通过上下文(输入和输出上下文)链接。当我使用下面的代码调用Api.ai时,会调用第一个意图并得到回复。但是,当给出第二条消息时,bot会将其视为一条全新的消息,而不标识其与第一条消息的关系。 我如何解决这个问题?好心帮忙 function MessageHandler(context, event) { // var nlpToken = "xxxxxxxxxxxxxxxxxxx

我正在Gupshup中使用Api.ai集成构建一个机器人。我在Api.ai中有一个代理,有几个意图,每个意图都通过上下文(输入和输出上下文)链接。当我使用下面的代码调用Api.ai时,会调用第一个意图并得到回复。但是,当给出第二条消息时,bot会将其视为一条全新的消息,而不标识其与第一条消息的关系。 我如何解决这个问题?好心帮忙

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);
}
苏雷什, 您似乎为每个请求生成了新的会话id:

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

但是,如果您想让上下文工作,那么对于属于一个用户的所有请求,它必须是一个固定值。例如,您可以为它使用一些全局变量。

必须为用户固定sessionId。在Gupshup bot代码中有两种方法可以做到这一点-

  • 为每个用户使用发送到bot的唯一用户标识。 要获得此值,可以使用-

    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)
    }
    
    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,并将其存储在数据库中以供使用。在下面的示例中,我将sessionId存储在roomleveldata中,这是Gupshup提供的默认持久性,要了解更多信息,请检查此项

    样本代码-

    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)
    }
    
    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个字符。

    嘿,史莱扬,我有一个关于Wit.ai的新问题。你能帮忙吗?嗨,苏雷什,我在过去的两个星期里一直在AFK。现在看到这个。是的,我可以帮你。