Azure Bot NodeJS等待其他对话框完成

时间:2018-03-18 16:24:21

标签: node.js azure botframework azure-bot-service

我目前正在使用Azure的Bot服务构建聊天机器人。我使用NLU-Bot,与瀑布流混合,因为依赖于我想获得一些特定信息的意图。 因此,我匹配intent1并希望

var intents = new builder.IntentDialog({ recognizers: [recognizer] })
.matches('intent1', (session, args, results) =>{

    session.beginDialog("getRequiredInformations");
    session.send("I received your information");
})

bot.dialog('getRequiredInformations', [
    (session) =>{       
        var levels = ['Beginner', 'Intermediate', 'Expert'];
        builder.Prompts.choice(session, "What's your level ?", levels, { listStyle: builder.ListStyle.button, maxRetries: 0 });
    },
    (session, results) => {
        session.conversationData.level = results.response.entity;
    }
]);

我想要做的是等到我们从getRequiredInformations对话框收到答案,然后继续包含已识别意图的原始对话框。使用上面的代码,session.send("I received your information");将在用户输入答案之前发送。

我也试过bot.beginDialogAction('getRequiredInformations', 'getRequiredInformations');,但我认为不可能在对话框中调用它。

我如何实现这一目标?

2 个答案:

答案 0 :(得分:1)

将发送移至intent1对话框的下一个瀑布步骤。我认为这应该有用。

var intents = new builder.IntentDialog({ recognizers: [recognizer] })
.matches('intent1', [(session, args, results) =>{

    session.beginDialog("getRequiredInformations");
}, (session, args, results) =>{
    session.send("I received your information");
}]);

matches方法需要 IWaterfallStep IWaterfallStep [] 。更多信息EnvironmentConfig

答案 1 :(得分:1)

在您的代码段中发现了一些错误信息,请参阅以下修改:

bot.dialog('intent1', [(session, args, next) => {
    session.beginDialog("getRequiredInformations");
}, (session, args, next) => {
    session.send("I received your information");
    session.send(session.conversationData.level)
}]).triggerAction({
    matches: 'intent1'
})

bot.dialog('getRequiredInformations', [
    (session) => {
        var levels = ['Beginner', 'Intermediate', 'Expert'];
        builder.Prompts.choice(session, "What's your level ?", levels, {
            listStyle: builder.ListStyle.button,
            maxRetries: 0
        });
    },
    (session, results) => {
        session.conversationData.level = results.response.entity;
        session.endDialog();
    }
]);
  

但这意味着没有机会等待对话完成回调或任何事情,我需要用瀑布做这个吗?

如果我理解正确,只有在堆栈中没有对话框时,您才可以尝试使用以下代码段来启用luis识别器。

var recognizer = new builder.LuisRecognizer(luisAppUrl)
 .onEnabled(function (context, callback) {
     var enabled = context.dialogStack().length == 0;
     callback(null, enabled);
 });