Hvordan å ringe LUIS Dialog inne LUIS Dialog?

stemmer
7

Min bot har dialog med et par hensikter LUIS. Jeg kaller dialog LUIS fra min MessageController. Hvis hensikten er oppdaget, jeg starter en dialog barn. Når dialogboksen barnet er gjort, jeg kaller context.Done(response from user).Etter at ChlildDialogDoneoppgaven er kalt.

Inne ChildDialogDoneoppgaven jeg vil kalle LUIS dialogen igjen for å oppdage hensikten med brukerens melding (som kommer til ChildDialogDone). Nå inne ChildDialogDonehar jeg context.Wait(MessageReceived).Når denne linjen med kode kjøres, ingenting skjer, er min bot venter på neste melding fra brukeren.

Her er koden:

    [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);
            }
      }

Så inne EmailDialogDone jeg har noen melding fra brukeren, og jeg ønsker å kjøre dialog DefiningIntent med denne meldingen igjen. Hvordan kan jeg gjøre det?

Publisert på 29/09/2016 klokken 23:24
kilden bruker
På andre språk...                            


2 svar

stemmer
4

Du kan gjenta logikken som er på MessegaReceived av LUIS dialog, for å oppnå det du ønsker å gjøre. I utgangspunktet bør denne koden være ganske på linje med det du trenger:

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);
}

Bitene i koden som henviser til ting med "dette" er en del av LUIS Dialog du arvet fra.

  • tjenester, er innsamling av LuisServices startes basert på dine LuisModel attributter.
  • IntentActivityHandler er behandleren at LuisIntent dekorert metoden er "å implementere" med metoden signatur.
  • handlerbyIntent er en ordbok med nøkkelen for hensikten navnene på dialogen din og behandleren er den metoden som trenger å bli kalt for den hensikt.

Sjekk denne for mer informasjon og sørg for at du bruker den nyeste versjonen av BotBuilder SDK (i øyeblikket for dette innlegget: v3.2.1)

Svarte 30/09/2016 kl. 17:14
kilden bruker

stemmer
1

Det er ikke nødvendig å kopiere logikken fra MessegaReceived. Du kan bare ringe MessegaReceived:

private async Task EmailDialogDone(IDialogContext context, IAwaitable<string> argument)
{
   await MessageReceived(context, new AwaitableFromItem<IMessageActivity>((IMessageActivity)context.Activity));
}
Svarte 26/07/2017 kl. 23:19
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more