根据Microsoft's Botframework Documentation here,通过triggerAction
使用onSelectAction
,如果用户的话语包含匹配的词组,则可以将对话框添加到堆栈顶部。
但是,如果用户的话语包含两个匹配的短语,那么如何在堆栈中添加多个对话框?
例如,如果用户说...
我想要一个汉堡和薯条
我想将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();
},
];
但是,只有一个对话框被调用...然后它就结束了游戏!
感谢任何帮助!
答案 0 :(得分:2)
正如您所发现的,一次只能触发一个对话框,因此,作为触发多个对话框的变通方法,我们可以先触发一个对话框并分析用户输入以调用不同的子对话框。
例如:
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.Burgers
和MyOrder.Fries
的实体,如下所示: