1
votes

Les actions suggérées attendent que l'utilisateur choisisse en premier

Je suis this dans la documentation. J'utilise Botframework v4.

Mais il n'attend pas que l'utilisateur choisisse d'abord avant de passer à l'étape suivante. Comment implémentez-vous cela? Le mettez-vous dans une invite? Comment obtenir la valeur de l'action suggérée sélectionnée dans l'invite suivante?

Et quand utiliser les actions suggérées et quand utiliser l'invite de choix?

AddStep(async (stepContext, cancellationToken) =>
{
    var reply = stepContext.Context.Activity.CreateReply("What can i do for you?");
    reply.SuggestedActions = new SuggestedActions()
    {
        Actions = new List<CardAction>()
        {
            new CardAction() { Title = "Learn more!", Type = ActionTypes.ImBack, Value = "Learn more!" },
            new CardAction() { Title = "Opportunities!", Type = ActionTypes.ImBack, Value = "Opportunities!" },
            new CardAction() { Title = "Define my goals!", Type = ActionTypes.ImBack, Value = "Define my goals!" },
            new CardAction() { Title = "Finko.ph", Type = ActionTypes.OpenUrl, Value = "https://m-moreno.wixsite.com/finkoph?fbclid=IwAR1NVtlyKfzZ0mYFIWva8L-d8TUv4KFpt_m1i1ij3raT-pbWr2c3-kqzB2Q" },
        },
    };
    await stepContext.Context.SendActivityAsync(reply, cancellationToken);
});

//how to wait for user choice before moving to the next step.

p >


0 commentaires

3 Réponses :


0
votes

Sur le bot Framework v3, vous devez ajouter Context.Wait () pour que le bot attende une entrée utilisateur avant de continuer. Vous devez également vérifier si une activité Publier ou Envoyer a réussi après votre code d'action suggéré.

Et quand utiliser les actions suggérées et quand utiliser l'invite de choix?

  • Utilisez les actions suggérées si votre robot peut recevoir des entrées pouvant être incluses ou non dans vos suggestions.
  • Utilisez l'invite Choice si votre bot attend une entrée qui est et doit être incluse dans les choix que vous avez fournis. L'utilisation courante est "oui" ou "non"

3 commentaires

Oui, j'ai vu dans la documentation de Botframework v3 mais comment le faire en v4?


essayez cette solution de contournement: stackoverflow.com/questions/53334280/...


J'ai déjà essayé cette méthode mais les actions suggérées disparaissent lorsque l'invite vide apparaît.



1
votes

Au lieu de créer vous-même l ' activité et de l'envoyer à l'aide de SendActivityAsync , vous voudrez utiliser les capacités d'invite des API de dialogue. Dans ce cas, vous souhaitez utiliser un ChoicePrompt qui vous aidera à vous assurer que l'un des choix est sélectionné avant de permettre à la conversation de se poursuivre.

Tout d'abord, ajoutez une invite de choix à votre DialogSet :

AddStep(async (stepContext, cancellationToken) =>
{
    return await stepContext.PromptAsync(
        "myChoicePrompt",
        new PromptOptions 
        {
            Prompt = BuildCardChoicePromptActivity(),
            Choices = new List<Choice>
            {
                new Choice("Learn more!"),
                new Choice("Opportunities!"),
                new Choice("Define my goals!"),
            }
         },
         cancellationToken: cancellationToken);
});

// Factored this out into its own method for clarity (NOTE: you don't need to use CreateReply)
private Activity BuildCardChoicePromptActivity()
{
    return new Activity
    {
        Type = ActivityTypes.Message,
        Text = "What can I do for you?",
        SuggestedActions = new SuggestedActions()
        {
            Actions = new List<CardAction>()
            {
                new CardAction() { Title = "Learn more!", Type = ActionTypes.ImBack, Value = "Learn more!" },
                new CardAction() { Title = "Opportunities!", Type = ActionTypes.ImBack, Value = "Opportunities!" },
                new CardAction() { Title = "Define my goals!", Type = ActionTypes.ImBack, Value = "Define my goals!" },
                new CardAction() { Title = "Finko.ph", Type = ActionTypes.OpenUrl, Value = "https://m-moreno.wixsite.com/finkoph?fbclid=IwAR1NVtlyKfzZ0mYFIWva8L-d8TUv4KFpt_m1i1ij3raT-pbWr2c3-kqzB2Q" },
            },
        },
    };
}

Maintenant, le ListStyle.None est important ici pour votre scénario car vous avez une exigence supplémentaire dans votre conception qui, parallèlement avec les choix, vous présentez également un lien qui peut être ouvert. En utilisant Aucun , vous indiquez au ChoicePrompt que vous allez gérer vous-même la création de l ' activité et qu'il ne devrait pas effectuer qui fonctionnent pour vous.

Ensuite, mettez à jour votre étape de cascade pour utiliser cette invite:

// Add the prompt with the suggested action list style
myDialogSet.Add(new ChoicePrompt("myChoicePrompt") { Style = ListStyle.None });

En terminant, votre scénario est un peu plus avancé grâce à OpenUrl action que vous souhaitez inclure à côté de vos choix réels, mais la clé à retenir doit être d'utiliser le ChoicePrompt pour présenter les actions et bloquer la conversation jusqu'à ce que l'un des choix est renvoyé.


4 commentaires

Le problème avec ceci est que si l'utilisateur sélectionne "Finko.ph", il effacera les options et ne continuera pas avec la cascade, même si vous définissez DisplayText sur CardAction . Juste quelque chose à surveiller. OpenUrl ne fonctionne pas bien avec ChoicePrompt


C'est un bon point @mdrichardson, ce n'est probablement pas l'UX que vous voudriez. Vous aurez peut-être besoin d'une interface utilisateur plus complexe utilisant des cartes ou quelque chose.


Merci monsieur dessiné pour l'option supplémentaire!


Question supplémentaire monsieur. Une action suggérée de type openUrl peut-elle également faire comme l'action suggérée «imBack»? Comme il ouvrira l'url mais il enverra également un texte comme le type d'action 'imBack'.



4
votes

Actions suggérées par rapport aux invites de choix

Les actions suggérées, de par leur conception, disparaissent dès qu'un autre message est envoyé ( voir le paragraphe d'ouverture ). Ils sont conçus pour être polyvalents et utilisés lorsque vous invitez un utilisateur à entrer, mais permettent également à l'utilisateur de taper tout ce qui est en dehors des actions suggérées que vous les présentez. Par exemple, vous pouvez demander à un utilisateur sa couleur préférée et suggérer Rouge , Vert , Bleu , mais autorisez l'utilisateur à saisir la couleur de son choix . Cet exemple de bot a > fait quelque chose de similaire. Actions suggérées, si elles sont envoyées dans un message, n'attendront pas l'entrée de l'utilisateur. Cependant, si vous les utilisez dans une invite de texte, ils le feront. Plus d'informations à ce sujet ci-dessous.

Les invites de choix limitent les utilisateurs à cliquer sur les boutons que vous les présentez ou à saisir exactement ce qui se trouve sur les boutons (ou Synonymes a >). S'ils entrent autre chose, ils sont à nouveau invités à entrer l'un des choix. Les invites de choix, car ce sont des invites, attendent automatiquement l'entrée de l'utilisateur.

En bref:

  • Les actions suggérées peuvent collecter n'importe quelle entrée utilisateur et peuvent être envoyées dans un message ou dans le cadre d'une invite de texte.
  • Les invites de choix restreignent l'entrée d'un utilisateur et attendent toujours cette entrée.

Envoi d'actions suggérées dans une invite de texte

J'ai modifié votre code afin que vous puissiez envoyer vos suggestions d'actions dans le cadre d'une invite de texte. Cela attendra l'entrée de l'utilisateur avant de passer à l'étape suivante de la cascade. Cependant, tout texte saisi par l'utilisateur sera considéré comme valide. Si vous souhaitez restreindre l'utilisateur à seulement quelques choix, utilisez une invite de choix (plus loin ci-dessous)

Invite de texte des actions suggérées:

// In constructor
AddDialog(new ChoicePrompt("choicePrompt"));

...

// In waterfall step
var opts = new PromptOptions()
{
    Prompt = MessageFactory.Text("What can i do for you?"),
    RetryPrompt = MessageFactory.Text("Sorry, please choose an option from the list."),
    Choices = new List<Choice>(),
};

opts.Choices.Add(new Choice() { Value = "Learn more!" });
opts.Choices.Add(new Choice() { Value = "Opportunities!" });
opts.Choices.Add(new Choice() { Value = "Define my goals!" });

// Display a Choice Prompt and wait for input
return await stepContext.PromptAsync("choicePrompt", opts);

Obtenir le Valeur d'une invite d'action suggérée

Puisque l'action suggérée est utilisée dans une invite de texte, la valeur apparaît dans stepContext.Result

entrer l'image description here

Restreindre les choix de l'utilisateur à l'aide d'une invite de choix

J'ai adapté votre code pour utiliser une invite de choix, qui attendra l'entrée de l'utilisateur. Notez que les invites de choix n'autorisent pas OpenUrl ; lorsque l'utilisateur clique sur une option avec l'action OpenUrl , il efface les choix et ne continue pas, même si vous utilisez DisplayText . Au lieu de cela, dans la prochaine cascade étape, vous pouvez présenter l'URL à l'utilisateur s'il clique sur l'option "Finko.ph" (après l'avoir ajoutée avec opts.Choices.Add (new Choice () {Value = "Finko.ph"}); ).

var opts = new PromptOptions
{
    Prompt = new Activity
    {
        Type = ActivityTypes.Message,
        Text = "What can i do for you?",
        SuggestedActions = new SuggestedActions()
        {
            Actions = new List<CardAction>()
            {
                new CardAction() { Title = "Learn more!", Type = ActionTypes.ImBack, Value = "Learn more!" },
                new CardAction() { Title = "Opportunities!", Type = ActionTypes.ImBack, Value = "Opportunities!" },
                new CardAction() { Title = "Define my goals!", Type = ActionTypes.ImBack, Value = "Define my goals!" },
                new CardAction() { Title = "Finko.ph", Type = ActionTypes.OpenUrl, Value = "https://m-moreno.wixsite.com/finkoph?fbclid=IwAR1NVtlyKfzZ0mYFIWva8L-d8TUv4KFpt_m1i1ij3raT-pbWr2c3-kqzB2Q" },
            },
        },
    }
};

// Display a Text Prompt with suggested actions and wait for input
return await stepContext.PromptAsync("textPrompt", opts);

Obtention de la valeur à partir d'une invite de choix

La valeur d'une invite de choix apparaît dans stepContext.Result. Valeur

 entrez la description de l'image ici


3 commentaires

Merci monsieur, je comprends mieux maintenant.


Question supplémentaire monsieur. Une action suggérée de type openUrl peut-elle également faire comme l'action suggérée «imBack»? Comme il ouvrira l'url mais il enverra également un texte comme le type d'action 'imBack'.


Malheureusement, vous ne pouvez définir qu'un seul ActionType à la fois, donc non.