Bot 框架 v4 如何在对话框中等待用户响应提示
Bot framework v4 how to wait within a dialog for user to respond to a prompt
在主提示中,我想调用提示用户输入的子对话框 (ChoicePrompt
),将结果保存到变量并使用该结果。
在示例代码中,实际最终发生的是子对话框被触发,但主对话框中的代码在子对话框完成之前(在用户输入之前)继续。
我想要实现的示例代码:
private async Task<DialogTurnResult> IntentCheckStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
LuisResult = await InDocRecognizer.RecognizeAsync<InDocChatbotService>(stepContext.Context, cancellationToken);
var topIntent = LuisResult.TopIntent().intent;
if (LuisResult.TopIntent().score < 0.30)
{
topIntent = InDocChatbotService.Intent.None;
}
// if first and second option is close in score prompt user choice between them
else if (LuisResult.Intents.ElementAt(0).Value.Score - LuisResult.Intents.ElementAt(1).Value.Score < 0.20)
{
var topIntent = await stepContext.BeginDialogAsync(nameof(ChooseIntentDialog), LuisResult, cancellationToken);
// Code in this dialog continues before user gives input to child dialog "ChooseIntentDialog"
}
// DO MORE STUFF WITH VARIABLE topIntent
}
我确实有一个解决方法,但它很丑陋并且破坏了代码风格。我这样做的方法是 return 子对话框,然后在主对话框的另一个瀑布步骤中处理 ChooseIntentDialog
中的内容。
这很糟糕,因为我需要将多个变量带到那个瀑布步骤,这似乎完全没有必要。如果我可以让瀑布步骤等待子对话框,并且 return 它的结果不需要另一个瀑布步骤。
这可能吗?如果不是,还有什么替代方案,因为我的解决方案在代码方面似乎不是很有效。
您不能 return 到瀑布对话框中某个步骤的中间。如果您 return await stepContext.BeginDialogAsync(nameof(ChooseIntentDialog)...)
然后在 return await stepContext.endDialogAsync(topIntent)
中返回所选值(如果需要做出选择),或者从主对话框中使用 return await stepContext.next(topIntent)
如果不需要,您将可以访问下一步 stepContext.result
中的最高意图。您只需将 // DO MORE STUFF WITH VARIABLE topIntent
移至下一步即可。
在主提示中,我想调用提示用户输入的子对话框 (ChoicePrompt
),将结果保存到变量并使用该结果。
在示例代码中,实际最终发生的是子对话框被触发,但主对话框中的代码在子对话框完成之前(在用户输入之前)继续。
我想要实现的示例代码:
private async Task<DialogTurnResult> IntentCheckStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
LuisResult = await InDocRecognizer.RecognizeAsync<InDocChatbotService>(stepContext.Context, cancellationToken);
var topIntent = LuisResult.TopIntent().intent;
if (LuisResult.TopIntent().score < 0.30)
{
topIntent = InDocChatbotService.Intent.None;
}
// if first and second option is close in score prompt user choice between them
else if (LuisResult.Intents.ElementAt(0).Value.Score - LuisResult.Intents.ElementAt(1).Value.Score < 0.20)
{
var topIntent = await stepContext.BeginDialogAsync(nameof(ChooseIntentDialog), LuisResult, cancellationToken);
// Code in this dialog continues before user gives input to child dialog "ChooseIntentDialog"
}
// DO MORE STUFF WITH VARIABLE topIntent
}
我确实有一个解决方法,但它很丑陋并且破坏了代码风格。我这样做的方法是 return 子对话框,然后在主对话框的另一个瀑布步骤中处理 ChooseIntentDialog
中的内容。
这很糟糕,因为我需要将多个变量带到那个瀑布步骤,这似乎完全没有必要。如果我可以让瀑布步骤等待子对话框,并且 return 它的结果不需要另一个瀑布步骤。
这可能吗?如果不是,还有什么替代方案,因为我的解决方案在代码方面似乎不是很有效。
您不能 return 到瀑布对话框中某个步骤的中间。如果您 return await stepContext.BeginDialogAsync(nameof(ChooseIntentDialog)...)
然后在 return await stepContext.endDialogAsync(topIntent)
中返回所选值(如果需要做出选择),或者从主对话框中使用 return await stepContext.next(topIntent)
如果不需要,您将可以访问下一步 stepContext.result
中的最高意图。您只需将 // DO MORE STUFF WITH VARIABLE topIntent
移至下一步即可。