我正在使用Api.ai集成在Gupshup构建机器人。我在Api.ai中有一个代理,有几个意图,每个代理通过上下文(输入和输出上下文)链接。当我使用以下代码调用Api.ai时,第一个意图被调用,我得到了答复。但是,当给出第二条消息时,机器人将其视为一条全新的消息,而不会识别它与first的关系。 我该如何解决这个问题?请帮助
<input name="q1-hf" id="q1-hf" type="hidden">
答案 0 :(得分:1)
必须为用户修复sessionId。在Gupshup bot代码中有两种方法可以做到这一点 -
使用为每个用户发送到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)
}
为每个用户生成一个唯一的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个字符。
答案 1 :(得分:0)
苏雷什, 您似乎为每个请求生成了新的会话ID:
new Date().getTime() +'api'
但是如果你想使上下文工作,它必须是属于一个用户的所有请求的一个固定值。例如,您可以使用一些全局变量。