代码之家  ›  专栏  ›  技术社区  ›  fsulser

Azure机器人节点等待其他对话框完成

  •  0
  • fsulser  · 技术社区  · 7 年前

    我目前正在使用Azure的机器人服务构建聊天机器人。我使用一个NLU机器人,它与瀑布流混合在一起,因为根据我的意图,我想获得一些特定的信息。 因此,我匹配 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 回复  |  直到 7 年前
        1
  •  1
  •   Gary Liu    7 年前

    发现您的代码段中有几个错误,请参考以下修改:

    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);
     });
    
        2
  •  1
  •   Master Chief    7 年前

    将发送移动到 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) IWaterfallStep[] . 更多信息 here