Ведение сессии в боте Gupshup вызывает Api.ai
Я строю бота в Gupshup с интеграцией Api.ai. У меня есть агент в 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);
}
2 ответа
Идентификатор сессии должен быть зафиксирован для пользователя. Есть два способа сделать это в коде бота Gupshup -
Используйте уникальный идентификатор пользователя, который отправляется боту для каждого пользователя. Чтобы получить это значение, вы можете использовать -
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 в roomleveldata, который является постоянством по умолчанию, предоставляемым Gupshup, чтобы узнать больше, посмотрите это руководство.
Образец кода -
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 символов.
Suresh, кажется, вы генерируете новый идентификатор сессии для каждого запроса:
new Date().getTime() +'api'
Но если вы хотите, чтобы контексты работали, это должно быть одно фиксированное значение для всех запросов, принадлежащих одному пользователю. Например, вы можете использовать для этого некоторую глобальную переменную.