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

时间:2016-11-05 06:58:22

标签: json chatbot dialogflow facebook-chatbot gupshup

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

<input name="q1-hf" id="q1-hf" type="hidden">

2 个答案:

答案 0 :(得分:1)

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

  1. 使用为每个用户发送到bot的唯一userID。 要获得此值,您可以使用 -

      

    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;
     }
    }
    
  3. 请记住,sessionId不应超过36个字符。

答案 1 :(得分:0)

苏雷什, 您似乎为每个请求生成了新的会话ID:

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

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