0
votes

Code

 [Serializable]
    public class FAQConversation
    {
        [Prompt("What product is your concern? {||}")]
        public VASetting.SupportedProducts Products { get; set; }
        [Prompt("Okay, tell me what is your question. Enter \"back\" to go back to Products Selection.")]
        public string Inquiry { get; set; }
        public static IForm<FAQConversation> BuildForm()
        {
            return new FormBuilder<FAQConversation>()
                .AddRemainingFields()
                .Field(new FieldReflector<FAQConversation>(nameof(Inquiry)).SetValidate(AnswerInquiry))
                .Message("Hi this is Test Virtual Assistant")
                .Build();
        }

        private static async Task<ValidateResult> AnswerInquiry(FAQConversation state, object value)
        {
            var asString = value as String;
            var vaConfig = new SmartCareSetting(state.Products);
            var result = new ValidateResult() { IsValid = false, Value = value };
            if (!string.IsNullOrEmpty(asString))
            {
                var luisService = new LuisService(new LuisModelAttribute(vaConfig.AppID, vaConfig.SubscriptionKey, domain: vaConfig.HostName));
                var luisResult = await luisService.QueryAsync(asString, CancellationToken.None);
                result.Feedback = luisResult.TopScoringIntent.Intent.ToString();
            }
            return result;
        }
    }

My bot code above shows the conversation below.

Bot Conversation

I am creating a simple inquiry bot using FormFlow and Bot Framework. I am validating the Inquiry field through LUIS and returning the intent for processing. I am getting the correct intent, in this case is EXC01. Afterwards, Im wondering why am I still getting prompted the Inquiry prompt.

Questions:
1. How can I finish the FormFlow after validating the Intent of the Inquiry?
2. I want to handle the returned Intent but not show it to the user. I'll be using the Intent string for querying to a Database. Can I do this inside the BuildForm()?

1
write some code so that we can helpRonak Shethia

1 Answers

1
votes

How can I finish the FormFlow after validating the Intent of the Inquiry?

In validation function AnswerInquiry, we can find that IsValid property of ValidateResult would be always false, which cause the issue. You can set IsValid property to true after you assign the returned intent as feedback. The following code snippet works for me, you can refer to it.

private static async Task<ValidateResult> AnswerInquiry(FAQConversation state, object value)
{
    var asString = value as String;
    var vaConfig = new SmartCareSetting(state.Products);

    var result = new ValidateResult() { IsValid = false, Value = value };

    if (!string.IsNullOrEmpty(asString))
    {
        var luisService = new LuisService(new LuisModelAttribute(vaConfig.AppID, vaConfig.SubscriptionKey, domain: vaConfig.HostName));
        var luisResult = await luisService.QueryAsync(asString, CancellationToken.None);
        result.Feedback = luisResult.TopScoringIntent.Intent.ToString();

        //set IsValid to true
        result.IsValid = true;
    }
    return result;
}

I want to handle the returned Intent but not show it to the user. I'll be using the Intent string for querying to a Database. Can I do this inside the BuildForm()?

After you can get the returned intent, if you’d like to query records from your database based on the returned intent, you can do it in your validation function.

Test result:

enter image description here