Hvordan får du til den opprinnelige meldingen teksten i et Microsoft Bot Work LuisIntent metode

stemmer
9

Jeg prøver å få tilgang til fullstendige opprinnelige teksten fra innen en metode som er merket som en LuisIntenti en LuisDialog.

Dokumentasjonen viser disse metodene som tar to argumenter:

IDialogContext context, LuisResult result

Verken som offentlig utsetter den opprinnelige teksten i meldingen. Konteksten objekt inneholder meldingen, men i en privat eiendom ( context.data.message.text) som ikke er tilgjengelig.

Er det en måte å få tilgang til denne i context, eller kan det bli vedtatt i dialogboksen konstruktør?

Publisert på 07/04/2016 klokken 16:51
kilden bruker
På andre språk...                            


4 svar

stemmer
9

Med den nye versjonen av Bot Framework (1.0.2) det LuisResult objektet har nå en spørring parameter som inneholder den opprinnelige forespørselen sendes til LUIS.

Svarte 14/04/2016 kl. 10:53
kilden bruker

stemmer
7

Du kan overstyre MessageReceived (...) funksjon av LuisDialog holde feltene i meldingen du trenger som medlem variabler og få tilgang til disse feltene i din intensjon handlers. Nedenfor endret jeg SimpleAlarmDialog å vise hvordan du kan få tilgang til 'message.Text' i en av intensjonen teleskopisk:

[LuisModel("c413b2ef-382c-45bd-8ff0-f76d60e2a821", "6d0966209c6e4f6b835ce34492f3e6d9")]
[Serializable]
public class SimpleAlarmDialog : LuisDialog<object>
{
    private readonly Dictionary<string, Alarm> alarmByWhat = new Dictionary<string, Alarm>();

    [Serializable]
    public class PartialMessage
    {
        public string Text { set; get; }
    }

    private PartialMessage message;

    protected override async Task MessageReceived(IDialogContext context, IAwaitable<Message> item)
    {
        var msg =  await item;
        this.message = new PartialMessage { Text = msg.Text };
        await base.MessageReceived(context, item);
    }

    [LuisIntent("builtin.intent.alarm.delete_alarm")]
    public async Task DeleteAlarm(IDialogContext context, LuisResult result)
    {
        await context.PostAsync($"echo: {message.Text}");
        Alarm alarm;
        if (TryFindAlarm(result, out alarm))
        {
            this.alarmByWhat.Remove(alarm.What);
            await context.PostAsync($"alarm {alarm} deleted");
        }
        else
        {
            await context.PostAsync("did not find alarm");
        }

        context.Wait(MessageReceived);
    }
}
Svarte 11/04/2016 kl. 21:00
kilden bruker

stemmer
1

Hvis du bryte inn i metoden, kan du se i rask klokke som sammenheng objekt har en ikke-offentlig eiendom gjennom å context.data.mesage.Text (legg merke til feilstaving av "mesage"). Siden eiendommen er ikke-offentlig, kan du jukse ved å bruke refleksjon for å få på det (se GetInstanceField i Hvordan få verdien av private felt i C #? )

        Microsoft.Bot.Builder.Dialogs.Internals.JObjectBotData data = GetInstanceField(typeof (Microsoft.Bot.Builder.Dialogs.Internals.DialogContext), context, "data") as Microsoft.Bot.Builder.Dialogs.Internals.JObjectBotData;            
        Microsoft.Bot.Connector.Message originalMessage = GetInstanceField(typeof(Microsoft.Bot.Builder.Dialogs.Internals.JObjectBotData), data, "mesage") as Microsoft.Bot.Connector.Message;
        string originalMessageText = originalMessage.Text;
Svarte 11/04/2016 kl. 16:46
kilden bruker

stemmer
0

Du kan gjøre det slik ved å bruke Query eiendommen av LuisResult,

[LuisIntent(intentName: "someIntentName")]
private async Task Eligibility(IDialogContext context, LuisResult result)
 {
   await context.PostAsync($"The original text is: {result.Query}");
   context.Wait(MessageReceivedAsync);
}
Svarte 04/07/2017 kl. 06:36
kilden bruker

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