Очень длинное сообщение для диалога LUIS сбрасывает состояние диалога - PullRequest
0 голосов
/ 30 мая 2018

При использовании эмулятора Bot Framework v.3.5.36, если пользователь отправляет длинный текст (около 1 КБ символов), эмулятор автоматически сбрасывает стек диалога обратно в корневой диалог без каких-либо ошибок или предупреждений.(см. скриншот ниже.)

Существует ли объявленный лимит сообщений для платформы ботов?

Есть ли способ для бота справиться с такими ситуациями и предупредить пользователя вместо этого тихого чего-то?

enter image description here

На самом деле ничего не существуетКонкретно про код вообще:

[LuisModel("{GUID}", "{CODE}", LuisApiVersion.V2, domain: "westeurope.api.cognitive.microsoft.com", threshold: 0.5)]
[Serializable]
public class LuisSearchDialog2 : LuisDialog<object>
{
    [LuisIntent("")]
    [LuisIntent("None")]
    public async Task None(IDialogContext context, LuisResult result)
    {
        await context.PostAsync(JsonConvert.SerializeObject(result));
        context.Wait(this.MessageReceived);
    } 
}

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Причина в том, что base LuisDialog не обрабатывает неудачные запросы API (в случае, если запрос слишком длинный, он возвращает код 414).Поэтому самый простой способ обработки таких ошибок - переопределить MessageReceived следующим образом:

[Serializable]
public class LuisSearchDialog2 : LuisDialog<object>
{
    protected override async Task MessageReceived(IDialogContext context, IAwaitable<IMessageActivity> activity)
    {
        try
        {
            await base.MessageReceived(context, activity);
        }
        catch(HttpRequestException e)
        {
            // Handle error here
            //await context.PostAsync("Error: " + e.ToString());
            context.Wait(this.MessageReceived);
        }
    }
}
0 голосов
/ 31 мая 2018

Простым подходом было бы проверить длину вашего сообщения в MessageController и решить, хотите вы его обработать или нет.

 public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
 {
    if (activity.Type == ActivityTypes.Message)
    {
        MicrosoftAppCredentials.TrustServiceUrl(activity.ServiceUrl);
        var connector = new ConnectorClient(new Uri(activity.ServiceUrl));

        if (activity.Text != null && activity.Text.Length > 200)
        {
                var errorReply = activity.CreateReply();
                errorReply.Text = "Well well, that is too much of data. How about keeping it simple? How can I help you?";
                await connector.Conversations.ReplyToActivityAsync(errorReply);
        }
        else
        {

               await Conversation.SendAsync(activity, () => new Dialogs.RootDialog());
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...