Node.js 我如何处理;取消“;已在对话框中时的意图?

Node.js 我如何处理;取消“;已在对话框中时的意图?,node.js,botframework,Node.js,Botframework,在MicrosoftBot框架中,我已经开始了一个对话,并且有一些意图在运行,比如说“登录”,但是当我询问用户用户名或密码时,他可能会说“取消那个”或“取消登录”,我如何获得这个意图:“取消”以及如何通过取消当前对话框来处理它 // Login Dialog bot.dialog('login', [ (session:Builder.Session) => { Builder.Prompts.text(session, 'What\'s your account

在MicrosoftBot框架中,我已经开始了一个对话,并且有一些意图在运行,比如说“登录”,但是当我询问用户用户名或密码时,他可能会说“取消那个”或“取消登录”,我如何获得这个意图:“取消”以及如何通过取消当前对话框来处理它

// Login Dialog
bot.dialog('login', [
    (session:Builder.Session) => {
        Builder.Prompts.text(session, 'What\'s your account email?');
    },
    (session:Builder.Session, results: any) => {
        session.dialogData.email = results.response;
        Builder.Prompts.text(session, 'What\'s your password?');
    },
    (session:Builder.Session, results: any) => {
        session.dialogData.passWord = results.response;
        CheckAccountLogin(session, session.dialogData.email,session.dialogData.passWord)
            .then((result:boolean)=>{
                if(result === true){
                    session.send('Login Successful');
                    session.userData.loginSuccessful = true;
                    session.userData.email = session.dialogData.email;
                }else{
                    session.userData.loginSuccessful = false;
                }
                session.endDialog();
            });
    },
]);
请参阅本文:

您基本上可以注册一个
CancelIntent
识别器,该识别器将使会话转发到您想要的对话框,然后触发该对话框。例如:

bot.recognizer(new builder.RegExpRecognizer( 
    "CancelIntent", 
    { en_us: /^(cancel|nevermind)/i, ja_jp: /^(キャンセル)/ })
);
这使用正则表达式来检测用户何时要取消,取消当前对话框的一种方法就是结束对话:

bot.dialog('CancelDialog', function (session) {
    session.endConversation("Ok, cancelling loggin.");
}).triggerAction({ matches: 'CancelIntent' });
请注意,上面的代码告诉bot框架结束对话,因此登录对话框将结束,从而取消操作

以下是一些有用的示例:

编辑

要设置Luis意图识别器,您首先需要删除以前注册的RegexRecognizer,然后通过执行以下操作创建LuisRecognizer的新实例:

// Make sure you add code to validate these fields
var luisAppId = process.env.LuisAppId;
var luisAPIKey = process.env.LuisAPIKey;
var luisAPIHostName = process.env.LuisAPIHostName || 'westus.api.cognitive.microsoft.com';

const LuisModelUrl = 'https://' + luisAPIHostName + '/luis/v2.0/apps/' + luisAppId + '?subscription-key=' + luisAPIKey;

// Create a recognizer that gets intents from LUIS, and add it to the bot
var recognizer = new builder.LuisRecognizer(LuisModelUrl);
然后将Luis识别器注册到:

bot.recognizer(recognizer);
您的CancelDialog应该看起来相同,它将与triggerAction的意图相匹配。matches:

bot.dialog('CancelDialog', function (session) {
    session.endConversation("Ok, cancelling loggin.");
}).triggerAction({ matches: 'CancelIntent' });
设置完成后,在Luis应用程序中创建
CancelIntent
,向其中添加一些示例话语(至少三个),一旦检测到CancelIntent,对话应自动转发到CancelDialog


这里有更多信息:

另一种方法是使用内置的取消事件。路易斯仍然会工作。这是基于哈维尔的回答:

// Setup Luis Recognizer first:
const LuisModelUrl = 'https://westus.api.cognitive.microsoft.com/luis/v2.0/apps/' + LuisID + '?subscription-key=' + LuisKey;
var recognizer = new Builder.LuisRecognizer(LuisModelUrl);
bot.recognizer(recognizer);

// Dialog definition
bot.dialog('login', [
    (session:Builder.Session) => {
        // Your dialog stuff here
    }
]).cancelAction(
    "Cancel", "What would you like to do next?",
    {
        matches: "Cancel",
        confirmPrompt: "This will cancel your dialog.  Are you ure?"
    }
);

是否可以将Microsoft Luis认知识别应用于识别器?它将比正则表达式识别器精确得多。是的,你可以!我根据你的评论更新了我的答案