将多个对话框添加到 Microsoft botframework 对话框堆栈

Adding multiple dialogs to Microsoft botframework dialog stack

根据 Microsoft's Botframework Documentation here,通过将 triggerActiononSelectAction 结合使用,如果用户的话语包含匹配的短语,您可以将对话添加到堆栈的顶部。

但是,如果用户的话语包含两个匹配的短语,如何将多个对话添加到堆栈中?

例如,如果用户说...

I want a burger and fries

我想将 burgers 对话框和 fries 对话框添加到堆栈中,这样我们就可以提出有关它们的问题。

我试过这样的事情:

bot.dialog('burgers', require('./burgers'))
    .triggerAction({
        matches: [/burger/i],
            onSelectAction: (session, args, next) => {
                session.beginDialog(args.action, args);
            }
    });

bot.dialog('fries', require('./fries'))
    .triggerAction({
        matches: [/fries/i],
            onSelectAction: (session, args, next) => {
                session.beginDialog(args.action, args);
            }
    });

这是汉堡对话框的示例(薯条对话框相同):

var builder = require('botbuilder');
var Store = require('./store');

module.exports = [
    // Destination
    function (session) {
        session.send('Burger dialog test');
        builder.Prompts.text(session, 'I am just testing the burger dialog');
    },
    function (session, results, next) {
        session.send('Now we should go to the next dialog in the stack', results.response);
        session.endDialog();
    },

];

但是,只有一个对话框被调用...然后游戏就结束了!

感谢任何帮助!

如您所见,一次只会触发一个对话框,因此作为触发多个对话框的解决方法,我们可以先触发一个对话框,然后分析用户输入以调用不同的子对话框。

例如:

bot.dialog('addOrder', (session, args)=>{
    var text = session.message.text;
    var found = text.match(/burger/i);
    if(found!=null){
        session.beginDialog('burger');
    }
    var found = text.match(/fries/i);
    if(found!=null){
        session.beginDialog('fries');
    }    
}).triggerAction({
    matches: [/burger/i, /fries/i]
});

bot.dialog('burger',(session)=>{
    session.send("burgers");
    //logic of 'burger' dialog
    session.endDialog();
});

bot.dialog('fries', (session)=>{
    session.send("fries!");
    //logic of 'fries' dialog
    session.endDialog();
}); 

正如你在这里看到的,我们可以使用正则表达式数组先触发addOrder对话框,然后在这个addOrder对话框中调用其他对话框。

或者您可以像这样训练 LUIS 并在您的机器人中使用它:

const LuisModelUrl = 'YOUR-BOT-ENDPOINT';
var recognizer = new builder.LuisRecognizer(LuisModelUrl);
var intents = new builder.IntentDialog({recognizers:[recognizer]})
.matches('MyOrder',(session, args)=>{
   var entities = args.entities;
   //handle entities
});

bot.dialog('/',intents);

我创建了一个名为 MyOrder 的意图和两个名为 MyOrder.BurgersMyOrder.Fries 的实体,如下所示: