メインプロンプト内で、ユーザーに入力(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
}
私には回避策がありますが、それは醜く、コードスタイルにブレーキをかけます。私のやり方は、子ダイアログを返し、ChooseIntentDialog
メインダイアログ内の別のウォーターフォールステップから処理することです。
そのウォーターフォールステップに複数の変数を運ぶ必要があり、それは完全に不要に思えるので、これは悪いことです。ウォーターフォールステップに子ダイアログを待機させて、別のウォーターフォールステップでそれを行うことなく結果を返すことができれば。
これは可能ですか?そして、そうでない場合、私のソリューションはコード的に非常に効率的ではないように思われるので、代替手段は何ですか。
ウォーターフォールダイアログのステップの途中に戻ることはできません。あなたの場合はreturn await stepContext.BeginDialogAsync(nameof(ChooseIntentDialog)...)
、その後に選択した値のバックを渡すreturn await stepContext.endDialogAsync(topIntent)
選択がなされる必要がある場合、またはメインダイアログからは、ちょうど使用しreturn await stepContext.next(topIntent)
、それがない場合、あなたはのトップ意思へのアクセスがありますstepContext.result
あなたの次のステップでは。// DO MORE STUFF WITH VARIABLE topIntent
次のステップに進むだけです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加