首页 > 解决方案 > 询问用户是否要更改 OnInterruptDialogAsync 中的技能

问题描述

目前我正在使用虚拟助手(4.x)框架。我在实施允许用户在使用特定技能时更改技能的流程时遇到困难。意思是他们是否在技能 A 中,如果他们触发了技能 BI 的意图,想问他们是否真的想去技能 B 或者他们是否想留在技能 A。我目前添加了代码,可以看到用户触发了不同技能的意图。询问用户输入以查看用户是否真的想在另一个技能中间转移到另一个技能的最佳方法是什么?

标签: c#botframeworkchatbotazure-bot-service

解决方案


我建议您将您的技能视为复杂的对话而不是实际技能。这样,如何处理这种类型的中断应该是相对清楚的。

就个人而言,我是瀑布的粉丝。

//FIRST
AddDialog(new ConfirmPrompt(nameof(ConfirmPrompt)));
AddDialog(new WaterfallDialog(nameof(STARTSKILLB), new WaterfallStep[]
{
    AskStepAsync,
    LoopStepAsync
}));

//LATER, ON CHECKING INTENTS

switch(intent)
{
    case "SkillA":
        await KEEPONSKILLA(turnContext, cancellationToken);
        break;
    case "SkillB":
        await stepContext.BeginDialogAsync(nameof(STARTSKILLB), cancellationToken);
        break;

}


//THEN THIS
private async Task<DialogTurnResult> AskStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
    var messageText = $"Would you like to go chill in Skill B?";
    var promptMessage = MessageFactory.Text(messageText, messageText, InputHints.ExpectingInput);

    return await stepContext.PromptAsync(nameof(ConfirmPrompt), new PromptOptions { Prompt = promptMessage }, cancellationToken);
    }
}

private async Task<DialogTurnResult> LoopStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
    if ((bool)stepContext.Result)
    {
        //shift on over to skill  B
    }
    //End this dialog, routing back up to where you left off in Skill A
    return await stepContext.EndDialogAsync(null, cancellationToken);
}


推荐阅读