7

私のボットには、いくつかの意図を持つ LUIS ダイアログがあります。MessageController から LUIS ダイアログを呼び出します。インテントが検出された場合は、子ダイアログを開始します。子ダイアログが完了したら、そのタスクが呼び出された context.Done("response from user").後に呼び出します。ChlildDialogDone

タスク内ChildDialogDoneで、LUIS ダイアログを再度呼び出して、ユーザーのメッセージの意図を検出したいと考えています (これは に来ます ChildDialogDone)。このコード行が実行されると、何も起こらず、ボットはユーザーからの次のメッセージを待っていChildDialogDoneます。context.Wait(MessageReceived).

コードは次のとおりです。

    [Serializable]
        public partial class DefiningIntentDialog : LuisDialog<object>
        {

            [LuisIntent("")]
            public async Task NoIntent(IDialogContext context, LuisResult result)
            {        
                var dialog = new GreetingsDialog();
                dialog.InitialMessage = result.Query;
                context.Call(dialog, GreetingDialogDone);      
            }

            [LuisIntent("Email")]
            public virtual async Task ConfirmationEmail(IDialogContext context, LuisResult result)
            {
                await context.Forward(new EmailDialog, EmailDialogDone, "message", CancellationToken.None);
            }

            private async Task EmailDialogDone(IDialogContext context, IAwaitable<string> argument)
            {
                var messageHandled = await argument;

                context.Wait(MessageReceived);
            }
      }

そのため、EmailDialogDone 内にはユーザーからのメッセージがあり、このメッセージで DefiningIntent ダイアログを再度実行したいと考えています。どうすればいいですか?

4

2 に答える 2

4

LUIS ダイアログの MessegaReceived にあるロジックを繰り返して、目的を達成することができます。基本的に、このコードは必要なものとかなり一致している必要があります。

var tasks = this.services.Select(s => s.QueryAsync(messageHandled, CancellationToken.None)).ToArray();
var winner = this.BestResultFrom(await Task.WhenAll(tasks));

IntentActivityHandler handler = null;
if (winner == null || !this.handlerByIntent.TryGetValue(winner.BestIntent.Intent, out handler))
{
    handler = this.handlerByIntent[string.Empty];
}

if (handler != null)
{
    await handler(context, null, winner?.Result);
}

"this" を使用して参照しているコードの部分は、継承元の LUIS ダイアログの一部です。

  • services は、LuisModel 属性に基づいてインスタンス化された LuisServices のコレクションです。
  • IntentActivityHandler は、LuisIntent で装飾されたメソッドがメソッド シグネチャで「実装」しているハンドラーです。
  • handlerbyIntent は、キーがダイアログのインテント名であり、ハンドラがそのインテントに対して呼び出す必要があるメソッドであるディクショナリです。

詳細についてはこちらを確認し、最新バージョンの BotBuilder SDK を使用していることを確認してください (この投稿の時点で: v3.2.1)。

于 2016-09-30T17:14:57.773 に答える