最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

基于验证重复对话步骤

IT培训 admin 13浏览 0评论

基于验证重复对话步骤

我目前正在使用Bot Framework v4构建配置机器人,并将其与Microsoft Graph集成。

Microsoft Graph用于验证用户输入,因此在这种情况下,它将检查组名是否已经存在。但是,如果验证发现该组存在,我遇到的问题是让机器人重复上一步。

我已经阅读了整个论坛并看到了许多解决方案,特别是,我遇到了step.activeDialog.state['stepIndex']-2方法,但是无法使其起作用。这是退一步NodeJS的可行解决方案,还是我应该考虑另一种方法?

async nameStep(step) {
        // User selected a group type and now is required to enter the name of the group
        step.values.sitetype = step.result.value;
        return await step.prompt(NAME_PROMPT, 'What do you want to name it');
    }

    async ownerStep(step) {
        // Retrieve the value from the previous step and check against the Microsoft Graph to see if the name has been used previously
        step.values.name = step.result;
        const getToken =
            await axios.post(TOKEN_ENDPOINT, qs.stringify(postData))
            .then(response => {
                return {
                    headers: {
                        'Authorization': 'Bearer ' + response.data.access_token
                    }
                }
            })
            .catch(error => {
                console.log(error);
            });

        const graphCall =
            await axios.get(".0/groups?$filter=startswith(displayName,'" + `${step.result}` + "')", getToken)
            .then((response) => {
                if (response.data.value[0] != null) {
                    return true;
                }
            })
            .catch((error) => {
                console.log(error);
            })

        if (!graphCall) {
            return await step.prompt(NAME_PROMPT, 'What is your email address');
        } else {
            await step.context.sendActivity("Group already exists");
            return await step.activeDialog.state['stepIndex']-2
        }
    }

先谢谢您

回答如下:

您可以通过使用component dialog来实现。本质上,您可以将要重复的步骤外推到一个单独的对话框中,该对话框仅在当前(父)对话框中被调用。在家长中,您可以开立支票。如果检查失败,则再次调用组件对话框。如果成功,则父对话框继续。

在下面的代码中,我的父对话框通过为用户提供两个选项,立即调用组件对话框进行第一次遍历。每个都将发送一个预定的文本值,将检查该文本值以查看是否存在LUIS意图。

第一个选项“ Hello”将在找到意图后成功。然后,它重新启动父对话框。父对话框以文本"You have a choice to make in life..."开头,它将在父对话框再次开始时重新显示。

第二个选项将失败,并使用户返回组件对话框,然后重试。组件对话框以"Text me something! I'll see if my maker setup a LUIS intent for it."开头单击两个按钮中的任何一个都会显示此文本,因为在两个实例中都运行了组件对话框。但是,当LUIS无法找到意图并重新启动组件对话框时,仅显示此文本。

旁注-此示例中的父对话框实际上是我的主对话框的组件对话框,这就是为什么它在末尾导出的原因。因此,是的,您可以在组件对话框中包含组件对话框。

父对话框:

const { ComponentDialog, WaterfallDialog } = require('botbuilder-dialogs');
const { LuisRecognizer } = require('botbuilder-ai');

const { ChoiceDialogSub, CHOICE_DIALOG_SUB } = require('./choiceDialog_Sub');
const CHOICE_DIALOG = 'choiceDialog';

class ChoiceDialog extends ComponentDialog {
    constructor(id) {
        super(id);

        this.addDialog(new ChoiceDialogSub(CHOICE_DIALOG_SUB));
        this.addDialog(new WaterfallDialog(CHOICE_DIALOG, [
            this.welcomeStep.bind(this),
            this.choiceLuisStep.bind(this)
        ]));

        this.initialDialogId = CHOICE_DIALOG;

        try {
            this.recognizer = new LuisRecognizer({
                applicationId: process.env.LuisAppId,
                endpointKey: process.env.LuisAPIKey,
                endpoint: `https://${ process.env.LuisAPIHostName }`
            }, {}, true);
        } catch (err) {
            console.warn(`LUIS Exception: ${ err } Check your LUIS configuration`);
        }
    }

    async welcomeStep(stepContext) {
        await stepContext.context.sendActivity('You have a choice to make in life...');
        return await stepContext.beginDialog(CHOICE_DIALOG_SUB);
    }

    async choiceLuisStep(stepContext) {
        if (stepContext.context.activity.text) {
            const stepResults = stepContext.context.activity.text;
            const recognizerResult = await this.recognizer.recognize(stepContext.context);
            const intent = await LuisRecognizer.topIntent(recognizerResult);

            if (intent === 'Greeting') {
                await stepContext.context.sendActivity(`'${ stepResults }' identified in the {${ intent }} intent.`);
                return await stepContext.beginDialog(CHOICE_DIALOG);
            } else {
                await stepContext.context.sendActivity(`No LUIS intent was found for '${ stepResults }'.`);
                return await stepContext.beginDialog(CHOICE_DIALOG_SUB);
            }
        } else {
            await stepContext.context.sendActivity('I need text, fool!');
            return await stepContext.next();
        }
    }
}

module.exports.ChoiceDialog = ChoiceDialog;
module.exports.CHOICE_DIALOG = CHOICE_DIALOG;

组件对话框:

const { ChoicePrompt, ChoiceFactory, ComponentDialog, WaterfallDialog } = require('botbuilder-dialogs');

const CHOICE_DIALOG_SUB = 'choiceDialogSub';
const CHOICE_DIALOG_SUB_PROMPT = 'choicePromptSub';

class ChoiceDialogSub extends ComponentDialog {
    constructor(id) {
        super(id);

        this.addDialog(new ChoicePrompt(CHOICE_DIALOG_SUB_PROMPT))
            .addDialog(new WaterfallDialog(CHOICE_DIALOG_SUB, [
                this.choiceStep.bind(this)
            ]));

        this.initialDialogId = CHOICE_DIALOG_SUB;
    }

    async choiceStep(stepContext) {
        const choices = ['Hello', 'No soup for you!'];
        return await stepContext.prompt(CHOICE_DIALOG_SUB_PROMPT, {
            prompt: "Text me something! I'll see if my maker setup a LUIS intent for it.",
            choices: ChoiceFactory.toChoices(choices)
        });
    }
}

module.exports.ChoiceDialogSub = ChoiceDialogSub;
module.exports.CHOICE_DIALOG_SUB = CHOICE_DIALOG_SUB;

希望帮助!

基于验证重复对话步骤

我目前正在使用Bot Framework v4构建配置机器人,并将其与Microsoft Graph集成。

Microsoft Graph用于验证用户输入,因此在这种情况下,它将检查组名是否已经存在。但是,如果验证发现该组存在,我遇到的问题是让机器人重复上一步。

我已经阅读了整个论坛并看到了许多解决方案,特别是,我遇到了step.activeDialog.state['stepIndex']-2方法,但是无法使其起作用。这是退一步NodeJS的可行解决方案,还是我应该考虑另一种方法?

async nameStep(step) {
        // User selected a group type and now is required to enter the name of the group
        step.values.sitetype = step.result.value;
        return await step.prompt(NAME_PROMPT, 'What do you want to name it');
    }

    async ownerStep(step) {
        // Retrieve the value from the previous step and check against the Microsoft Graph to see if the name has been used previously
        step.values.name = step.result;
        const getToken =
            await axios.post(TOKEN_ENDPOINT, qs.stringify(postData))
            .then(response => {
                return {
                    headers: {
                        'Authorization': 'Bearer ' + response.data.access_token
                    }
                }
            })
            .catch(error => {
                console.log(error);
            });

        const graphCall =
            await axios.get(".0/groups?$filter=startswith(displayName,'" + `${step.result}` + "')", getToken)
            .then((response) => {
                if (response.data.value[0] != null) {
                    return true;
                }
            })
            .catch((error) => {
                console.log(error);
            })

        if (!graphCall) {
            return await step.prompt(NAME_PROMPT, 'What is your email address');
        } else {
            await step.context.sendActivity("Group already exists");
            return await step.activeDialog.state['stepIndex']-2
        }
    }

先谢谢您

回答如下:

您可以通过使用component dialog来实现。本质上,您可以将要重复的步骤外推到一个单独的对话框中,该对话框仅在当前(父)对话框中被调用。在家长中,您可以开立支票。如果检查失败,则再次调用组件对话框。如果成功,则父对话框继续。

在下面的代码中,我的父对话框通过为用户提供两个选项,立即调用组件对话框进行第一次遍历。每个都将发送一个预定的文本值,将检查该文本值以查看是否存在LUIS意图。

第一个选项“ Hello”将在找到意图后成功。然后,它重新启动父对话框。父对话框以文本"You have a choice to make in life..."开头,它将在父对话框再次开始时重新显示。

第二个选项将失败,并使用户返回组件对话框,然后重试。组件对话框以"Text me something! I'll see if my maker setup a LUIS intent for it."开头单击两个按钮中的任何一个都会显示此文本,因为在两个实例中都运行了组件对话框。但是,当LUIS无法找到意图并重新启动组件对话框时,仅显示此文本。

旁注-此示例中的父对话框实际上是我的主对话框的组件对话框,这就是为什么它在末尾导出的原因。因此,是的,您可以在组件对话框中包含组件对话框。

父对话框:

const { ComponentDialog, WaterfallDialog } = require('botbuilder-dialogs');
const { LuisRecognizer } = require('botbuilder-ai');

const { ChoiceDialogSub, CHOICE_DIALOG_SUB } = require('./choiceDialog_Sub');
const CHOICE_DIALOG = 'choiceDialog';

class ChoiceDialog extends ComponentDialog {
    constructor(id) {
        super(id);

        this.addDialog(new ChoiceDialogSub(CHOICE_DIALOG_SUB));
        this.addDialog(new WaterfallDialog(CHOICE_DIALOG, [
            this.welcomeStep.bind(this),
            this.choiceLuisStep.bind(this)
        ]));

        this.initialDialogId = CHOICE_DIALOG;

        try {
            this.recognizer = new LuisRecognizer({
                applicationId: process.env.LuisAppId,
                endpointKey: process.env.LuisAPIKey,
                endpoint: `https://${ process.env.LuisAPIHostName }`
            }, {}, true);
        } catch (err) {
            console.warn(`LUIS Exception: ${ err } Check your LUIS configuration`);
        }
    }

    async welcomeStep(stepContext) {
        await stepContext.context.sendActivity('You have a choice to make in life...');
        return await stepContext.beginDialog(CHOICE_DIALOG_SUB);
    }

    async choiceLuisStep(stepContext) {
        if (stepContext.context.activity.text) {
            const stepResults = stepContext.context.activity.text;
            const recognizerResult = await this.recognizer.recognize(stepContext.context);
            const intent = await LuisRecognizer.topIntent(recognizerResult);

            if (intent === 'Greeting') {
                await stepContext.context.sendActivity(`'${ stepResults }' identified in the {${ intent }} intent.`);
                return await stepContext.beginDialog(CHOICE_DIALOG);
            } else {
                await stepContext.context.sendActivity(`No LUIS intent was found for '${ stepResults }'.`);
                return await stepContext.beginDialog(CHOICE_DIALOG_SUB);
            }
        } else {
            await stepContext.context.sendActivity('I need text, fool!');
            return await stepContext.next();
        }
    }
}

module.exports.ChoiceDialog = ChoiceDialog;
module.exports.CHOICE_DIALOG = CHOICE_DIALOG;

组件对话框:

const { ChoicePrompt, ChoiceFactory, ComponentDialog, WaterfallDialog } = require('botbuilder-dialogs');

const CHOICE_DIALOG_SUB = 'choiceDialogSub';
const CHOICE_DIALOG_SUB_PROMPT = 'choicePromptSub';

class ChoiceDialogSub extends ComponentDialog {
    constructor(id) {
        super(id);

        this.addDialog(new ChoicePrompt(CHOICE_DIALOG_SUB_PROMPT))
            .addDialog(new WaterfallDialog(CHOICE_DIALOG_SUB, [
                this.choiceStep.bind(this)
            ]));

        this.initialDialogId = CHOICE_DIALOG_SUB;
    }

    async choiceStep(stepContext) {
        const choices = ['Hello', 'No soup for you!'];
        return await stepContext.prompt(CHOICE_DIALOG_SUB_PROMPT, {
            prompt: "Text me something! I'll see if my maker setup a LUIS intent for it.",
            choices: ChoiceFactory.toChoices(choices)
        });
    }
}

module.exports.ChoiceDialogSub = ChoiceDialogSub;
module.exports.CHOICE_DIALOG_SUB = CHOICE_DIALOG_SUB;

希望帮助!

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论