1

現在、ボットと LUIS をいじっています。だから私は実行中のボットを持っています。RootDialog では、LUIS から取得したすべての意図を処理します。ここで、インテントに対してエンティティが欠落しているかどうかを確認したいと思います。

 if (result.Entities.Count == 0) {
 var ct = new CancellationToken();
 await context.Forward(new ParameterDialog(), ResumeAfterParameterDialog, message, ct);

エンティティがない場合は、新しい子ダイアログを作成しています。

public class ParameterDialog : IDialog<object> {
        public async Task StartAsync(IDialogContext context) {
            context.Wait(MessageReceivedAsync);
    }



    public async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> argument) {

        argument = new PromptDialog.PromptString("Please enter a parameter", "please try again", 2);

        var prompt = await argument;

        await context.PostAsync($"Your Parameter is: {prompt}");
        context.Done(prompt);
    }             
}

ユーザー入力を取得できたら、それを親ダイアログに戻します。

ボットを停止してユーザーの入力を待つ方法がよくわかりません。誰かが私がそれを達成する方法を説明できますか? ありがとうございました!

4

1 に答える 1

3

context.Call作成中の PromptString ダイアログの がありません。

このcontext.Callメソッドは、ダイアログと、ダイアログが完了すると (この場合は PromptString が完了すると) 呼び出される「コールバック」メソッド (ResumeAfter) を想定しています。

シナリオでは、コードは次のようになります。

public async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> argument) 
{
   var dialog = new PromptDialog.PromptString("Please enter a parameter", "please try again", 2);

   context.Call(dialog, ResumeAfterPrompt)
}

private Task ResumeAfterPrompt(IDialogContext context, IAwaitable<string> result)
{
    var parameter = await result;
    context.Done(parameter);
}
于 2016-11-18T16:09:32.063 に答える