【问题标题】:Azure Bot Framework(Node.js) - Waterfall doesn't work in dialog using Web ChatAzure Bot Framework(Node.js) - 瀑布在使用网络聊天的对话框中不起作用
【发布时间】:2018-08-15 10:00:30
【问题描述】:

我有这个代码:

bot.on('conversationUpdate', (message) => {
  if (message.membersAdded) {
    message.membersAdded.forEach((identity) => {
      if (identity.id === message.address.bot.id) {
        bot.beginDialog(message.address, 'start');
      }
    });
  }
});
  bot.dialog('start', [
  (session) => {
    var msg = new builder.Message(session);
    msg.attachments([
      new builder.HeroCard(session)
      .title('test')
      .buttons([{ title: 'testButton', type: 'imBack', value: 'testButton' }])
      ]);
      builder.Prompts.choice(session, msg, ['testButton']);
  },
  (session, results) => {
    session.send('Reached 2nd function!');
    console.dir(results);
    var message = results.response.entity;
    session.beginDialog('anotherDialog', message);
  }
]);

使用 Bot Framework Emulator 可以正常工作。 Bot Framework Emulator Result

但是,通过使用网络聊天(Azure 控制台),它没有达到瀑布步骤中的第二个功能。 Test in Web Chat Result

Bot Framework Emulator 和 Web Chat 的行为有何不同?

我应该在代码中修改什么?

你有什么想法吗?

  • Node.js 版本:8.10.0
  • Bot Framework 模拟器版本:4.0.15-alpha

【问题讨论】:

  • 我可以重现同样的问题,并且在this github issue“ConversationUpdate 没有发送足够的信息来构造数据包,因此对话状态没有持久化。” i>,这可能会导致问题。
  • 你们两个使用的是 BotBuilder SDK v3 还是 v4?
  • 另外,让这个功能由根对话框而不是对话更新产生是否可以接受?

标签: node.js botframework


【解决方案1】:

我了解您想要做的是让机器人开始对话,而不是等待用户说些什么,这是一个非常常见的目标。不幸的是,使用内置功能这并不是一件容易的事,但幸运的是有一个blog post explaining how to do it。这篇博文取自在 GitHub issue 中发布的解决方法,该解决方法与飞汉链接的链接有关。

要点是conversationUpdate 事件不包含足够的信息来允许机器人状态,因此不应从事件处理程序产生对话框和提示等。您可以通过在客户端代码中生成自己的事件来解决此问题。当然,在 Azure 门户中进行测试时,这可能对您没有帮助。

一般而言,您应该期望不同渠道之间存在许多差异,尤其是在涉及渠道产生的事件的性质时。 conversationUpdate 是一个特别有争议的事件,众所周知,它在 Bot Emulator 中的行为与其他渠道不同。来自博客文章(强调我的):

如果您使用的是 WebChat 或直接电话,机器人的 ConversationUpdate 是 在创建对话和用户方时发送 ConversationUpdate 在他们第一次发送消息时发送。什么时候 最初发送 ConversationUpdate,没有足够的信息 在消息中构造对话框堆栈。之所以这样 似乎在模拟器中工作,是模拟器模拟排序 的伪 DirectLine,但两个会话更新都在 同时在模拟器中,实际情况并非如此 服务执行。

如果您想避免编写客户端代码并且您确定您的机器人只会在支持conversationUpdate 事件的频道中使用,我可能会为您提供另一种解决方法。即使博客文章明确指出您不应该使用conversationUpdate,但在您只需要发送一条消息的情况下仍然可以接受。您可以通过在事件处理程序中发送一条消息来模拟提示,然后表现得好像您正在根对话框中跟进该消息。这是一个概念证明:

bot.on('conversationUpdate', (message) => {
    if (message.membersAdded) {
        message.membersAdded.forEach((identity) => {
            if (identity.id === message.address.bot.id) {
                var msg = new builder.Message()
                    .address(message.address)
                    .attachments([
                        new builder.HeroCard()
                            .title('test')
                            .buttons([{ title: 'testButton', type: 'imBack', value: 'testButton' }])
                    ]);

                bot.send(msg);
            }
        });
    }
});

bot.dialog('/', function (session) {
    if (session.message.text == "testButton") {
        session.send('Reached 2nd function!');
        session.beginDialog('/getStarted');
    } else {
        builder.Prompts.choice(session, "I didn’t understand. Please choose an option from the list.", ['testButton']);
    }
});

请注意,这种概念证明远非可靠。由于可能会从真实机器人中的许多不同位置访问根对话框,因此您可能希望在其中放置一个条件以确保它只响应一次介绍提示,并且您可能还想生成其他对话框。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-11
    • 2020-03-30
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多