How to close mic in google assistant app - webhooks

I had submitted my app for review, but Google replied with "mic" issue. Google Replied :
During our testing, we found that your app would sometimes leave the mic open for the user without any prompt. Make sure that your app always says something before leaving the mic open for the user, so that the user knows what they can say. This is particularly important when your app is first triggered.
Some Points:
1. app.ask()---leaves the mic opens.
2. app.tell()---app leaves the conversation.
I have also enabled the "toggle" of "Set this intent as end of conversation".
Any suggestions??
My app is one to one i.e. If user ask "my address" then address is shown, If "show me direction to PLACE_NAME" then directions are shown. BUT after it mic opens. How to close it?
-----UPDATED-------
fuction someName(app)
{
//---code-----
app.ask('Alright, your address is '+ user_address);
}
I don't want to use app.tell() as it closes the app.
Some other suggestion for this one to one Q/A conversation.

If you are doing fulfillment through a webhook, then the "end conversation" toggle is ignored in favor of what you are sending from your webhook.
You don't show any code, but as noted:
If you use app.ask() or one of the variants of it, the message will be sent to the user and the microphone will be left open. In this case, you should make sure it is clear what you're expecting from the user - in other words, ask a question or prompt them.
If you use app.tell(), the message will be sent to the user and the microphone will be closed. This will end this conversation.
It sounds like, in your case, you should be using app.tell().

Related

Why doesn't the Azure Bot Service Slack connector forward Events and Interactive Messages?

Update: June 30, 2020
After more testing, I have details that might help someone recognize my problem.
The issue seems to be that Slack is sending data to Azure Bot Services, but that data isn't being forwarded to my code. Ive been able to use the Bot Emulator without any problems and the Azure Web Chat works fine.
I know that the Slack configuration for the OAuth Redirect URL is correct (I was able to add my bot to Slack) and the Request URL for Events is correct (they sent the 'challenge' and it's verified). I've subscribed to the exact Scopes and Events that are in the Microsoft documentation and I've verified that the Interactivity and Events options are enabled.
When a user types text in my bot's Slack channel, my app receives "message" activity and my code can send a response, so it looks like Microsoft can communicate end-to-end for normal messages. I do not receive any data when users first join my bot (like a ConversationUpdate) or if they click a button in a dialog. I can see Slack sending data when a button is pressed, it just never arrives.
As a test, I copied the Messaging Endpoint from my Azure bot settings and pasted it into Slack's Interactivity "Request URL" and when I click a button in Slack I can see the data that Slack is sending (sadly in a format that my code can't handle).
Original Post
I have a Bot Framework app (v4) that I've written in nodejs. It works well and I have an ActivityHandler that responds to people being added to a conversation and when they send messages. I was able to get pro-active messaging functioning and everything was great until I tried to get interactivity working.
I started off using some sample button code from Microsoft's documentation:
let reply = MessageFactory.suggestedActions(['Red', 'Yellow', 'Blue'], 'What is the best color?');
await turnContext.sendActivity(reply);
This works fine in the emulator, but in Slack it renders as a bulleted list. It looks like that's the way that "suggested actions" are handled in Slack.
I changed my code to use a "hero card":
let card = CardFactory.heroCard(
'What is the best color?',
undefined,
CardFactory.actions([
{
type: 'imBack',
title: 'Color Red',
value: 'Red Value'
}
])
);
let reply = MessageFactory.attachment(card);
await turnContext.sendActivity(reply);
This works okay in the emulator, except my app thinks the user typed "Red Value" and the button stays on-screen and is still clickable. I might be able to work around that, but the button doesn't work at all in Slack. It is rendered fine, but I don't get a notification in my app.
Clicking the button shows an HTTP request to:
https://{MY_SLACK}.slack.com/api/chat.attachmentAction?_x_id=f8d003c3-1592436018.632&_x_csid=NcWi3y50lFU&slack_route={OTHER_SLACK_STUFF}
And I can see that the request POSTs all sorts of data including:
payload: {"actions":[{"id":"1","name":"imBack","text":"Color Red","type":"button","value":"Red Value","style":"default"}],"attachment_id":"2","callback_id":"{MAGIC_NUMBER}:{TEAM_ID}","channel_id":"{CHANNEL_ID}","message_ts":"1592435983.056000","prompt_app_install":false,"team_id":"{TEAM_ID}"}
I'm not sure how to see anything useful in the Azure Portal - the analytics option for my bot doesn't seem to work and the activities option only says "Write a Bot Service". I don't see any sign of the message going from Slack to Azure.
I'm developing locally and configured ngrok so that my messaging endpoint in Azure could be set to https://69fe1382ce17.ngrok.io/api/messages On the Slack side of things, I've configured the Interactivity Request URL to be https://slack.botframework.com/api/Actions The Event Subscription Request URL is https://slack.botframework.com/api/Events/{MY_BOT_NAME}
What I would like is a set of buttons with different options and when the user clicks one, my bot gets some sort of "value" instead of message text. I'd also like for the button to go away so the user can't send repeated commands. It would be nice if the hero card collapsed with just the prompt being displayed.
Are there any interactive options that work for Slack and other channels?
Thanks!
Lee
I know linking to another site with no additional detail is frowned upon, but I don't have enough expertise to answer your question. I suspect the link here might move you in the right direction:
Choice Prompts are not translated over to Slack format #3974
Good luck!
Your question is multifaceted so I'll try to break it down into smaller pieces.
What's the deal with suggested actions in Slack?
Suggested actions are not supported in Slack, but the Bot Builder SDK thinks they are. This is a longstanding bug. I've just reported it again on the docs page you linked: https://github.com/MicrosoftDocs/bot-docs/issues/1742
This means you would encounter problems if you were trying to have the choice factory automatically generate the right kind of choices for your channel. You're not doing that, so you should be fine. Hero cards are supposed to work in Slack.
Why aren't hero cards working in Slack?
First I need to mention that hero cards only work with the Slack connector and not the Slack adapter. You seem to be using the connector so you should be fine.
I suspect your problem is related to how you've configured your bot's settings on the Slack side. There is a step in the Bot Framework doc that seems to be important if you want to get buttons to work. If you've followed the doc exactly and you still can't get buttons to work, it may be worthwhile to dig into the Slack API documentation.
How do I only allow a button to be clicked once?
You can update or delete the activity. There's no easy way to do this, but if you voice your support for my cards library then it can be done for you automatically.
The Slack connector actually puts a lot of relevant information in the incoming activity's channel data, and you can use that to figure out what activity the incoming activity came from. That would take some experimentation on your part.
There's another approach that works on more channels than just Slack. It's real complicated, but if you wanna tackle this then here are the basic steps:
You need to put an ID in the action data to help your bot identify the action.
You need to save the activity ID that gets returned when you send the action to Slack.
You need to associate the returned activity ID with the ID you put in the action data.
You need to retrieve the activity ID using the action data ID when the user clicks the button.
You need to use that activity ID to update or delete the activity.
Unfortunately there's no centralized guide to help you do this, but there are many examples explaining it scattered across Stack Overflow. Here is a good one: https://stackoverflow.com/a/55174866/2122672

How to keep mic open in DialogFlow

I´m using DialogFlow to create a chatbot. I want to keep the mic open along a conversation so the user doesn´t have to press the mic button every time.
Is this possible?
Thanks!
If you are referring to Dialogflow test console ("Try it now" prompt) - it doesn't seems you can.
But I will assume that you are referring to Google Assistant integration.
First of all you will have to end each answer with additional question, eg "Can I help you with anything else?" - this will be verified when you will deploy your bot to production in Actions on Google console. For each intent that you want to keep the microphone listening, you will have to make sure that it has "Set this intent as end of conversation" option disabled.

Redirect user to the Default Welcome Intent when he says "cancel" or "exit"

I'm developing a Dialogflow application for Google Assitant. In that, if I say "Cancel" it directly calls the exit_conversation intent where I've specified actions_intent_CANCEL event. So it displays the output specified in that intent and bot exit the conversation.
Instead of exiting the Bot I need to open Default Welcome Intent. Is there any way to do that?
P.S. I'm using Python fulfillment as a backend for this bot.
In short - no, you can't do that.
You're essentially asking that, when the user tries to quit, you don't want to let them quit. From Google's and your users' point of view - that is a pretty unacceptable option.
The CANCEL event handler is fairly limited with what it can do - Google will terminate the conversation, even if you don't specify that the microphone should be closed, but you're given the opportunity to say a final message and offer a link to elsewhere.

How to answer a user in Home device and send a notification to user's phone

Is there any way to answer a user question in the Home device and at the same time, send a notification to another device?
For example, if the user ask for a direction, answer with the location (voice) and finish saying to the user:"I've sent you the location to your phone" and send him a map...
I know there is a way to switch conversation to another device (say, for example, one with screen) but I don't want to finish it in Home device.
Thanks in advance.
Not in a straightforward way, no, but there are a few options that you have that may do what you want.
You can try to use Assistant Notifications. Right now, notifications only appear on mobile devices, but even if/when they allow speaker notifications in the future, your user could still open it on a mobile device. You need to ask for permission to send a notification, and when they trigger the notification, an Intent in your Action will be triggered to actually show what you want to show.
You can also look into using a more standard notification channel such as Firebase Cloud Messaging. This does require you to have your own app on the mobile device, and it works outside of the Assistant, but may be a good choice if it meets your needs.

In a custom action for Google Home, can the assistant listen for a keyword for a long time without answering?

In a custom action for Google Home, can I create an intent where the assistant keeps listening for 10 minutes, waiting for a custom keyword without answering?
I looked into the docs and I couldn't find an answer but I guess that what I'm looking for is some kind of parameter that prevents the default answering behavior (when the user stops talking, the assistant answers back) and locks the assistant in listening mode.
Not really. The Assistant is more designed for conversational interaction, and it isn't much of a conversation if it just sits there. It also raises privacy issues - Google is very concerned at the perception of having a permanently open mic recording everything and sending it to some third party.
I understand the use case, however. One thing you might consider is to return a small, quiet, beep to indicate you're still listening, but haven't heard anything to trigger on yet. You'd do this as both a fallback event (for when people don't say the keyword, but are speaking) and as a reprompt event. I haven't tested this sort of approach, however.

Resources