在 Gupshup 机器人调用中维护会话 Api.ai
Maintaining session in Gupshup bot calls to Api.ai
我正在使用 Api.ai 集成在 Gupshup 中构建一个机器人。我在 Api.ai 中有一个代理,有多个意图,每个意图都通过上下文(输入和输出上下文)链接。当我使用以下代码调用 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);
}
苏雷什,
您似乎为每个请求生成了新的会话 ID:
new Date().getTime() +'api'
但是如果你想让上下文工作,它必须是属于一个用户的所有请求的一个固定值。例如,您可以为其使用一些全局变量。
必须为用户固定 sessionId。您可以通过两种方式在 Gupshup 机器人代码中执行此操作 -
使用发送给每个用户的机器人的唯一用户 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)
}
为每个用户生成一个唯一的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个字符。
我正在使用 Api.ai 集成在 Gupshup 中构建一个机器人。我在 Api.ai 中有一个代理,有多个意图,每个意图都通过上下文(输入和输出上下文)链接。当我使用以下代码调用 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);
}
苏雷什, 您似乎为每个请求生成了新的会话 ID:
new Date().getTime() +'api'
但是如果你想让上下文工作,它必须是属于一个用户的所有请求的一个固定值。例如,您可以为其使用一些全局变量。
必须为用户固定 sessionId。您可以通过两种方式在 Gupshup 机器人代码中执行此操作 -
使用发送给每个用户的机器人的唯一用户 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) }
为每个用户生成一个唯一的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个字符。