Как получить значения из действия отправки адаптивных карт в LUIS | C # - PullRequest
0 голосов
/ 24 августа 2018

В настоящее время я работаю над ботом LUIS, который создает проекты в VSTS.Прямо сейчас вы просто пишете имя боту, например «Create Projekt abcd», и он создает проект для вас.Я хотел, чтобы это выглядело лучше, добавив адаптивные карты для ввода, но когда я нажимаю кнопку отправки, он просто говорит, что в бот-коде есть ошибка.Я провел некоторое исследование, и проблема, похоже, в том, что бот LUIS не знает, как обрабатывать объект, возвращаемый в виде сообщения.

Адаптивная карта: `

using Microsoft.Bot.Builder.Dialogs;
using Microsoft.Bot.Connector;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using AdaptiveCards;
using AdaptiveCards.Rendering;
using AdaptiveCards.Rendering.Html;
using Microsoft.Bot.Builder.FormFlow;

namespace LuisBot.Dialogs
{
public class ProjektInputCard
{


    public static Attachment GetCard(String pName)
    {
        String projektname = pName;
        if (projektname.Equals("(Name not found)"))
        {
            projektname = "";
        }

        AdaptiveCard Card = new AdaptiveCard() 
        {
            Body = new List<AdaptiveElement>()
            {
                new AdaptiveContainer()
                {
                    Items = new List<AdaptiveElement>()
                    {
                        new AdaptiveTextBlock()
                        {
                            Text = "Projekterstellung",
                            Weight = AdaptiveTextWeight.Bolder,
                            Size = AdaptiveTextSize.Large
                        },
                        new AdaptiveTextBlock()
                        {
                            Text = "Projektname:",
                            Weight = AdaptiveTextWeight.Bolder,
                            Size = AdaptiveTextSize.Default
                        },
                        new AdaptiveTextInput()
                        {
                            Type = "Input.Text",
                            Id = "ID_projekt",
                            Value = projektname
                        },
                        new AdaptiveTextBlock()
                        {
                            Text = "Beschreibung:",
                            Weight = AdaptiveTextWeight.Bolder,
                            Size = AdaptiveTextSize.Default
                        },

                        new AdaptiveTextInput()
                        {
                            Type = "Input.Text",
                            Id = "ID_description",
                            Value = "",
                            IsMultiline = true
                        }
                    }


                }



            }


        };

        Card.Actions = new List<AdaptiveAction>()
        {
            new AdaptiveSubmitAction()
            {
                Type = "Action.Submit",
                Title = "Erstellen"
            }
        };

        Attachment Attach = new Attachment() 
        {
            ContentType = AdaptiveCard.ContentType,
            Content = Card
        };

        return Attach;
    }
}
}`

Метод, который вызываетКарточка: `

private async Task Test(IDialogContext context)
     {

        var createprompt = context.MakeMessage();
    createprompt.Attachments.Add(ProjektInputCard.GetCard(GetProjectName()));
        await context.PostAsync(createprompt);

        context.Wait(MessageReceivedAsync);
    }`

Метод получения сообщения:

public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
    {
        var message = await result;
        InputValues data;
        if (message.Value != null)
        {
            // Got an Action Submit
            dynamic value = message.Value;
            string submitType = value.Type.ToString();
            if (value != null)
            {
                data = Newtonsoft.Json.JsonConvert.DeserializeObject<InputValues>(submitType);
                _projectname = data.Name;
                _description = data.Description;
                await this.ShowLuisResult(context);

            }

        }
    }

1 Ответ

0 голосов
/ 24 августа 2018

Ceepert, Вместо того, чтобы пытаться делать все это в одном классе (я думаю, это то, что я вижу в вашем коде), вам нужно разделить части адаптивной карты и части luis на отдельные диалоги. Ваш начальный диалог будет обычной реализацией IDialog <>.

Соберите данные из вашего ввода, создайте новое сообщение с данными из адаптивной карты в качестве свойства Text сообщения и выполните вызов context.Forward, чтобы отправить новое сообщение в ваш диалог luis. Из вашего кода не ясно, какой ввод с AdaptiveCard будет использоваться Луисом для определения намерений пользователя, поэтому для моего примера я предположил «_projectname»

Если помимо текста есть дополнительные данные, вы можете передать их в качестве параметров конструктору диалогов Luis.

public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
{
    var message = await result;

    if (message.Value != null)
    {
        //reroute the user back to your card with an additional message to 
        //put response in the provided fields.
        return;
    }

    InputValues data;
    if (message.Value != null)
    {
        // Got an Action Submit
        dynamic value = message.Value;
        string submitType = value.Type.ToString();
        if (value != null)
        {
            data = Newtonsoft.Json.JsonConvert.DeserializeObject<InputValues>(submitType);
            _projectname = data.Name;
            _description = data.Description;

            IMessageActivity msg = Activity.CreateMessageActivity();
            msg.TextFormat = "text";
            msg.Text = _projectname;

            await context.Forward(new MyLuisDialog(), ResumeAfterLuisDialog, msg, CancellationToken.None);

        }

    }
}
...