使用botframework(NodeJS)基于用户会话的Bot响应

时间:2017-11-17 10:58:58

标签: node.js botframework ibm-watson

如何根据NodeJS中的用户会话发送bot响应。

我使用botframework创建了一个示例NodeJS应用程序,并连接到IBM watson来处理用户查询以获得适当的响应并以10秒延迟发回响应。

我已生成ngrok URL并为web通道配置了bot框架。当我在mutipl浏览器中同时测试这个时,我得到了相同的响应,而不是基于用户会话和用户请求。

它向每个用户提供最新的请求处理响应。我已经复制了下面的示例nodejs代码。

有人可以查看我的代码并建议我如何基于用户会话/ conversationID发送响应吗?

NodeJS sample code :

'use strict';

var restify = require('restify');
var builder = require('botbuilder');
var Conversation = require('watson-developer-cloud/conversation/v1'); 
require('dotenv').config({silent: true});

var server = restify.createServer();

var contexts = { CandidateID : "89798" , Location : "USA"  }
var workspace= 'XXXXXXXXXXXXXXXX';

let name,id,message,addr,watson;
var savedAddress;

server.listen(process.env.port || process.env.PORT || 3000, function () {
  console.log('%s listening to %s', server.name, server.url);
});

// Create the service wrapper
var conversation = new Conversation({
    username: 'XXXXXXXXXXXXXXXX',
    password: 'XXXXXXXXXXXXXXXX',
    url: 'https://gateway.watsonplatform.net/conversation/api',
    version_date: 'XXXXXXXXXXXXXXXX'
});

// setup bot credentials
var connector = new builder.ChatConnector({
  appId: 'XXXXXXXXXXXXXXXX',
  appPassword: 'XXXXXXXXXXXXXXXX'
});

var bot = new builder.UniversalBot(connector,);

server.post('/api/messages', connector.listen());

// root dialog
bot.dialog('/', function (session, args) {
	
    name = session.message.user.name;
	id = session.message.user.id;
	message = session.message.text;
	savedAddress = session.message.address;
		 
    var payload = {
        workspace_id: workspace,
        context: contexts,
        input: {
            text: session.message.text
        }
    };
	
    var conversationContext = {
        workspaceId: workspace,
        watsonContext: contexts
    };

    if (!conversationContext) {
        conversationContext = {};
    }

    payload.context = conversationContext.watsonContext;
		
    conversation.message(payload, function(err, response) {
        if (err) {
            console.log(err);
            session.send(err);
        } else {			
            console.log(JSON.stringify(response, null, 2));          
            conversationContext.watsonContext = response.context;
			watson = response.output.text;
        }
    });	
  
	console.log(message);
  
	setTimeout(() => {
		startProactiveDialog(savedAddress);
	}, 10000);
});

// handle the proactive initiated dialog
bot.dialog('/survey', function (session, args, next) {
  if (session.message.text === "done") {
    session.send("Great, back to the original conversation");
    session.endDialog();
  } else {
   session.send(id + ' ' + watson);
  }
});

// initiate a dialog proactively 
function startProactiveDialog(address) {
  bot.beginDialog(address, "*:/survey");
}

2 个答案:

答案 0 :(得分:0)

您需要确保它为该用户的会话来回传递所有系统上下文。我们的botkit中间件基本上是为你做的。

https://github.com/watson-developer-cloud/botkit-middleware

答案 1 :(得分:0)

您似乎正在利用https://github.com/Microsoft/BotBuilder-Samples/tree/master/Node/core-proactiveMessages/startNewDialog处的示例向特定用户发送基于对话框的主动消息。

该示例仅供参考,它仅保存最新的转换,仅声明一个变量savedAddress,每次新用户进入时,新的会话地址将分配给savedAddress并覆盖旧的价值。

您可以尝试定义一个对象以保存用户地址以进行快速测试:

var savedAddress = {};
bot.dialog('/', function (session, args) {

  savedAddress[session.message.address.id] = session.message.address;

  var message = 'Hey there, I\'m going to interrupt our conversation and start a survey in a few seconds.';
  session.send(message);

  message = 'You can also make me send a message by accessing: ';
  message += 'http://localhost:' + server.address().port + '/api/CustomWebApi';
  session.send(message);

  setTimeout(() => {
    startProactiveDialog(savedAddress[session.message.address.id]);
  }, 5000);
});

对于生产阶段,您可以利用Redis或其他缓存存储来存储此地址列表。

希望它有所帮助。