如何从提示中分离触发操作中的对话框(Microsoft Botbuilder SDK)

时间:2018-02-14 19:44:46

标签: node.js botframework

注意

我正在使用ES6 babel在node.js中使用Microsoft Botbuilder SDK。

问题

我有一个对话框'/ MainMenu',提示用户进行自由回复回复,以便深入到另一个更相关的对话框中。但是,我也希望用户能够触发与主题完全无关的动作(即询问机器人的对话框,“你好吗?”),返回原来的MainMenu对话框就像他们离开了。我知道在SDK的文档中,onSelectAction可用于将触发的对话框放在堆栈顶部而不是替换整个堆栈,但是一旦'/ HowAreYou'对话框结束,机器人也认为响应是针对最初的MainMenu提示,回答“我不明白。请再试一次”,如下:

Bot dialog screenshot

代码

// I am using the builder.Library routing standard, and have confirmed that     
// this gets triggered as expected. this dialog exists in a different file
lib.dialog('/HowAreYou', [
    (session, args, next) => {
        session.send('I\'m doing well. Thanks for asking!');
        builder.Prompts.text(session, 'How are you doing today?');
    }, (session, results) => {
        session.endDialog('Good to hear that!');
    }
]).triggerAction({
    matches: /^how are you?$/i,
    onSelectAction: (session, args, next) => {
        // Add the help dialog to the top of the dialog stack (override the    
        // default behavior of replacing the stack)
        session.beginDialog(args.action, args);
    }
});

bot.dialog('mainMenu', [
    (session, args, next) => {
        builder.Prompts.text(session, 'Hi there! What can I do for you today?');
    },
    (session, results) => {
        session.endConversation('Goodbye!');
    }
]).beginDialogAction('weatherAction', '/Weather', {
    matches: /^weather$/i,
}).beginDialogAction('sportsAction', '/Sports', {
    matches: /^sports$/i,
}).beginDialogAction('cookingAction', '/Cooking', {
    matches: /^cooking$/i,
});

期望的行为

虽然目前的结果非常接近理想的行为,但理想情况下我希望机器人在HowAreYou对话框结束后以相同的MainMenu提示回复,不说它不理解

问题

这可能吗?如果是这样,怎么样?如果没有,有什么替代方案?

感谢您提供任何帮助。

1 个答案:

答案 0 :(得分:0)

https://github.com/Microsoft/BotBuilder/issues/2421处有关于GitHub的解释,我们可以意识到Prompts是内置对话框,处理输入验证

首次进入mainMenu中的“提示”对话框,然后在第一个“提示”对话框等待输入文本时触发HowAreYou对话框。
然后,HowAreYousession.endDialog('Good to hear that!');结尾,mainMenu中的第一个提示对话框没有结果,但验证失败。

根本原因应该等同于输入builder.Prompts.text(session, 'Hi there! What can I do for you today?');的空文本。

更新

找到IPromptOptions的{​​{3}}属性以进行提示对话,我想到了这个问题。我认为这应该是设计的。

因为句子I don't understand...是属性retryPrompt的默认文本。因此,当您结束HowAreYou对话框并返回到mainPage对话框堆栈时。提示对话框将重新启动并将retryPrompt发送给用户,这会引发您的问题。

对于辅助功能,您可以尝试使用:

builder.Prompts.text(session, 'Hi there! What can I do for you today?', {
            retryPrompt: 'Hi there! What can I do for you today?'
        });