Bot Framework - Display User's intent - botframework

Trying to figure out how I can take the intent from LUIS and insert it into the response from the bot. I cannot seem to find the variable/path to this value. I've tried:
#intentName
turn.recognized.intents.intentName
luisResult.intents[0]
The docs are not helping since it just shows java classes, doesn't directly translate to the Composer app afaik.

You can pull the first intent via the following adaptive expression:
${foreach(turn.recognized.intents, x, x.key)[0]}

Related

Is there a way to clear chat history in Webchat which uses DirectlineJS and not React

As per the below github issues link for Chatbot and BotFramework.
https://github.com/microsoft/BotFramework-WebChat/issues/1846
We can clear chat history by assigning a new instance to store variable, which triggers a DIRECT_LINE/DISCONNECT action. Now this works in React Webchat. But, I have tried in Web-chat Java script version and the issue seems to still persist, i.e., when the store variable is replaced the previous chats are not removed.
Any confirmation from the community will be relieving as there are many open issues in Botframework github that its confusing. I'm sharing a few that I found out.
https://github.com/microsoft/BotFramework-WebChat/issues/1293
https://github.com/Microsoft/BotFramework-DirectLineJS/issues/124
If No, can this be achieved in some other way? any suggestions will be helpful.
I was able to resolve it. So, just replacing the variable will not work. You need to render the store variable to update/replace it in webchat.js code.
await window.WebChat.renderWebChat(
{
store: widgetStore
},
document.getElementById('webchat')
);
The BotFramework-WebChat repo provides a sample that demonstrates precisely how to do this. The sample is 04.api/h.clear-after-idle. The readme also includes some caveats to be aware of.

How to implement regex function in Microsoft bot composer

How to implement regex in Bot composer ?
Below I have a scenario where user can enter any thing like: Qna-1234, Qna-{1234} etc.
From above I want to display only 1234 in the response. How can I achieve this it will
be very helpful if provided some solution.
Yes, there is a workaround to achieve this requirement without regex. You can update the expected user responses section. You can define an entity to extract just an Id from user expressions. Refer below screenshots for details.
You can see here that adaptive expressions only have one regular expression function, and it returns a Boolean value. If you would like the Bot Framework team to create a new prebuilt function for you, you can make a feature request here: https://github.com/microsoft/botframework-sdk/issues/new/choose
In the meantime, you can create your own custom actions by following these instructions: https://learn.microsoft.com/composer/how-to-add-custom-action

Can aws-lex be used to build a conversation flow bot to reply with different answers based on user's input?

Can aws-lex be used to build a conversation flow bot?
For example:
Thank you very much!
Reason for all this: So we have our own "dialogue builder" and "bot-service".
Our own "Dialogue Builder": is maybe similar to Amazon Connect dialogue builder, and our own "Bot-service" is similar to Microsoft bot framework. Before we were using microsoft-luis to get "intention" of a sentence while using our own dialogue builder and our own bot-service to build a conversation/dialogues flow like if a user says "yes" then go to another flow and if a user says "no" then go to different flow (can this be done in slots?) === Binary tree :)
So now we are switching from luis to aws-lex and trying to think if it is possible to just use aws-lex UI and not our (dialogue builder/bot-service) anymore. But what I am understanding is that to use aws-lex without some kind of dialogue builder we would need to write alot of if/case statements if it contains large data, right? what is your suggestion? One way would be to just use "Amazon Connect" to utilize their dialogue builder so we don't have to write alot of if statements but then if we are using dialogue builder we can just use our own (old one) dialogue builder? what do you think?
Questions:
1)Is there a way to do something like this in aws-lex or not? I tried using slots/prompts/lambda but I am not able to go to 2nd or 3rd level depth in diagram. can be done somehow?
2) Do I have to use lambda and use "switch/if conditions each time it has to change the flow (ex: if answer is yes then reply this, and if no then reply this)?
3) If #2 is true, then is it possible for it to be used by non-developer. Even if I write if/conditions ~1k - 2k if conditions, then if a person (non-developer) tries to edit a dialogue/or-something through UI won't able to do it, right? (So does this mean that we are't really using UI of aws-lex, we are just writing "if conditions" in programming + using aws-lex "intention" to get intention, right?
4) Would it be possible to give example and show how making a flow is possible? So far using slots replies/responses don't change based on user's input. It doesn't matter if users says "no" or says "yes" it is going to reply with same path/answer. Is there a way to change reply based on user's input.
5) If #3 is not possible (non-developer) can't use aws-lex UI to make something like this, should we use custom dialogue builder which does this?
Thank you very very much!
It sounds like you're switching from the Microsoft Bot Framework to find a simpler solution to structured flows without entity recognition.
You may want research Microsoft's QnAMaker multi-turn ability. It's supported in the QnA Maker online editor, but not in the bot framework SDK (yet). They do have an example bot that uses it through the Web API.
https://learn.microsoft.com/en-us/azure/cognitive-services/qnamaker/how-to/multiturn-conversation
I realize this doesn't answer you Lex question, but might address your concern.

invoking Luis by replaceDialog or any other way

Bot builder comes with LuisRecognizer and other inbuilt classes that does the work of posting the message and getting back the intents and entities.
like replaceDialog helps to start a new waterfall/closure, is there a way to use in built botbuilder classes to post to Luis and based on the match invoke the respective waterfall sequence?
I tried the following.
session.replaceDialog('/'). This does not seem to invoke the luis recognizer again and therefore dialog.matches are not even invoked.
bot.receive(message). this does not do the luis call nor match the intent for the message well. plus, it also seems to go into a wrong sequence ( parent sequence which invokes bot.receive ) again, by default.
IntentDialog.recognize and intentDialog.invokeAction. recognize fails to recognise the message.
What am I doing wrong? is there a way to reuse botbuilder classes?
I can think of writing a simple rest client to invoke Luis api. but that is the last resort, as the purpose of botbuilder's recognizer and intentdialog classes are exactly the same.
flag setting does the trick. Now the modeller gets invoked on every beginDialog.
dialog = new builder.IntentDialog({
recognizeMode : builder.RecognizeMode.onBegin,
});

Is it possible to chain commands via FormFlow?

Dialog can do almost everything according to the bot framework documentation, but it will take a lot more time to investigate than FormFlow. I failed to find a place that have lots of samples of bot framework yet. At the moment, before I spend a lot of time to try dialog, anyone know if it's possible to chain commands using FormFlow.
The work I am trying to do is to code a chain of commands:
query records
select a record from the results
actions/operations on the record
etc...
Really appreciate if anyone familiar with Bot Framework can help me on this.
Use the IDialogStack.Call method in your FormFlow handlers to call another dialog and push it on the stack.
Then use the IDialogStack.Done method to pop it off the stack. Both described here.

Resources