Как добавить более 10 кнопок для ChoicePrompt Bot framework V4 c#

#c# #botframework #chatbot

#c# #ботфреймворк #чат-бот

Вопрос:

Я использую ChoicePrompt в WaterfallStep для отображения вариантов. Проблема в том, что если список выбора больше 10, я не получаю кнопки, которые отображаются в виде текста. Пожалуйста, помогите мне, как исправить эту ошибку.

  var waterfallSteps = new WaterfallStep[]
        {
            InitializeStateStepAsync,
            PromptShowChoiceStepAsync,
            DisplaySuccessStepAsync,
        };
        AddDialog(new WaterfallDialog("waterfallDialog", waterfallSteps));
        AddDialog(new ChoicePrompt("ShowChoicePrompt", ValidateShowChoice));

 private async Task<DialogTurnResult> ValidateShowChoice(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
   return await stepContext.PromptAsync("ShowChoicePrompt", new PromptOptions
            {
                Prompt = MessageFactory.Text("Please select from choices"),
                RetryPrompt = MessageFactory.Text("Sorry, Please the valid choice"),
                Choices = ChoiceFactory.ToChoices(choicesList),
            }, cancellationToken);
        }
    }
  

Если количество choicesList больше 10, я получаю кнопки, подобные этой. Что не является проблемой в Bot Framework V3.

 Please select from choices
1. Choice-1
2. Choice-2
3. Choice-3
4. Choice-4
5. Choice-5
6. Choice-6
7. Choice-7
8. Choice-8
9. Choice-9
10. Choice-10
11. Choice-11
12. Choice-12
13. Choice-13
  

Пожалуйста, помогите мне, как устранить эту ошибку.

Комментарии:

1. Какой канал вы используете?

2. Facebook и skype.

3. Вы уверены, что сможете отобразить более 11 быстрых ответов Facebook с помощью Bot Builder v3? Похоже, это ограничение канала

4. В Bot Builder V3 приглашение выбора отображается в виде кнопок, поэтому здесь нет проблем. Теперь в версии 4 запрос на выбор отображается в виде быстрых ответов.

5. Да, @KyleDelaney!! Это приемлемый ответ. Спасибо!!

Ответ №1:

Подсказки выбора в версии v3 по умолчанию использовали карты героев. Вы можете заставить свои подсказки использовать карты героев с помощью новой HeroCard опции в ListStyle перечислении. Стиль списка может быть применен непосредственно к приглашению, когда вы добавляете его в свой набор диалоговых окон:

 AddDialog(new ChoicePrompt("ShowChoicePrompt", ValidateShowChoice) { Style = ListStyle.HeroCard });
  

У вас также теперь есть возможность указать стиль списка в параметрах приглашения:

 return await stepContext.PromptAsync("ShowChoicePrompt", new PromptOptions
{
    Prompt = MessageFactory.Text("Please select from choices"),
    RetryPrompt = MessageFactory.Text("Sorry, Please the valid choice"),
    Choices = ChoiceFactory.ToChoices(choicesList),
    Style = ListStyle.HeroCard,
}, cancellationToken);
  

Хотя это правда, что включать слишком много кнопок в сообщение — плохая практика, и большинство каналов применяют это соглашение, не разрешая использовать много кнопок на карте, соединители Facebook и Skype автоматически сгенерируют несколько карт, если вы попытаетесь разместить слишком много кнопок на одной карте.

В Facebook Messenger это будет выглядеть так:

Facebook Messenger

В Skype это будет выглядеть так:

Skype

Ответ №2:

Эти варианты отображения сделаны из-за ограничений / рекомендаций по используемым каналам.

Если вы посмотрите страницу Facebook Messenger разработчика о Quick replies здесь, там говорится:

Быстрые ответы предоставляют способ представить набор из до 11 кнопок в диалоге, которые содержат заголовок и необязательное изображение и отображаются на видном месте над композитором. Вы также можете использовать быстрые ответы для запроса местоположения пользователя, адреса электронной почты и номера телефона.

Как следствие, в коде BotBuilder, доступном на Github, у вас будет способ Determine if a number of Suggested Actions are supported by a Channel здесь:

 /// <summary>
/// Determine if a number of Suggested Actions are supported by a Channel.
/// </summary>
/// <param name="channelId">The Channel to check the if Suggested Actions are supported in.</param>
/// <param name="buttonCnt">(Optional) The number of Suggested Actions to check for the Channel.</param>
/// <returns>True if the Channel supports the buttonCnt total Suggested Actions, False if the Channel does not support that number of Suggested Actions.</returns>
public static bool SupportsSuggestedActions(string channelId, int buttonCnt = 100)
{
    switch (channelId)
    {
        // https://developers.facebook.com/docs/messenger-platform/send-messages/quick-replies
        case Connector.Channels.Facebook:
        case Connector.Channels.Skype:
            return buttonCnt <= 10;

        // ...
    }
}
  

Затем в ChoiceFactory том, который вы использовали, выбирается отображение (смотрите код здесь):

 public static IMessageActivity ForChannel(string channelId, IList<Choice> list, string text = null, string speak = null, ChoiceFactoryOptions options = null)
{
    channelId = channelId ?? string.Empty;

    list = list ?? new List<Choice>();

    // Find maximum title length
    var maxTitleLength = 0;
    foreach (var choice in list)
    {
        var l = choice.Action != null amp;amp; !string.IsNullOrEmpty(choice.Action.Title) ? choice.Action.Title.Length : choice.Value.Length;
        if (l > maxTitleLength)
        {
            maxTitleLength = l;
        }
    }

    // Determine list style
    var supportsSuggestedActions = Channel.SupportsSuggestedActions(channelId, list.Count);
    var supportsCardActions = Channel.SupportsCardActions(channelId, list.Count);
    var maxActionTitleLength = Channel.MaxActionTitleLength(channelId);
    var hasMessageFeed = Channel.HasMessageFeed(channelId);
    var longTitles = maxTitleLength > maxActionTitleLength;

    if (!longTitles amp;amp; !supportsSuggestedActions amp;amp; supportsCardActions)
    {
        // SuggestedActions is the preferred approach, but for channels that don't
        // support them (e.g. Teams, Cortana) we should use a HeroCard with CardActions
        return HeroCard(list, text, speak);
    }
    else if (!longTitles amp;amp; supportsSuggestedActions)
    {
        // We always prefer showing choices using suggested actions. If the titles are too long, however,
        // we'll have to show them as a text list.
        return SuggestedAction(list, text, speak);
    }
    else if (!longTitles amp;amp; list.Count <= 3)
    {
        // If the titles are short and there are 3 or less choices we'll use an inline list.
        return Inline(list, text, speak, options);
    }
    else
    {
        // Show a numbered list.
        return List(list, text, speak, options);
    }
}
  

Вот почему вы получаете список, если вы предоставляете более 10 элементов.

Как правило, рекомендуется ограничить количество кнопок, более 10 — это огромный. Вы можете адаптировать свое поведение (группирование элементов / добавление дополнительного уровня выбора по группам, например)