Implementation tips (Dialogflow)

Review the following tips to implement good conversation design practices into your Action.

Expect variations

Handle this in the "User says" input in Dialogflow. Also, use more than one intent that can map to the same action, where each intent can be triggered with different sets of "User says" phrases.

Provide helpful reprompts and fail gracefully

Sometimes your Action can't move forward because it didn't receive an input (known as a no-input) or didn't understand a user's input (known as a no-match). When this happens, Assistant first attempts to determine whether the user wants to trigger a different Action. If Assistant doesn't match the user's input to another Action, the user continues in the context of your Action. This scenario can happen at any time, so best practice is to uniquely handle no-input and no-match situations at each turn in a conversation with a fallback. Using fallbacks, you can help users get back on track.

To do this, initialize a fallbackCount variable in your conv.data object, and set it to 0. Prepare an array of two fallback prompts (escalating in clarity), and a final fallback prompt that ends the conversation.

Then, create a fallback intent (ideally one for each actionable intent in the agent). In the intent handler, pull the fallback count from the conv.data object, increment it, and if it is less than 3, pull the prompt from the array of 3. If the count is at 4 or more, close the conversation using the final prompt. In all intents that are not fallbacks, reset the fallback count to 0. Ideally, templatize the fallbacks for specific intents to be specific to those.

Node.js

 const 
  
 GENERAL_FALLBACK 
  
 = 
  
 [ 
  
 'Sorry, what was that?' 
 , 
  
 'I didn\'t quite get that. I can help you find good local restaurants, what do you want to know about?' 
 , 
 ]; 
 const 
  
 LIST_FALLBACK 
  
 = 
  
 [ 
  
 'Sorry, what was that?' 
 , 
  
 'I didn\'t catch that. Could you tell me which one you prefer?' 
 , 
 ]; 
 const 
  
 FINAL_FALLBACK 
  
 = 
  
 'I\'m sorry I\'m having trouble here. Let\'s talk again later.' 
 ; 
 const 
  
 handleFallback 
  
 = 
  
 ( 
 conv 
 , 
  
 promptFetch 
 , 
  
 callback 
 ) 
  
 = 
>  
 { 
  
 conv 
 . 
 data 
 . 
 fallbackCount 
  
 = 
  
 parseInt 
 ( 
 conv 
 . 
 data 
 . 
 fallbackCount 
 , 
  
 10 
 ); 
  
 conv 
 . 
 data 
 . 
 fallbackCount 
 ++ 
 ; 
  
 if 
  
 ( 
 conv 
 . 
 data 
 . 
 fallbackCount 
 > 
 2 
 ) 
  
 { 
  
 conv 
 . 
 close 
 ( 
 promptFetch 
 . 
 getFinalFallbackPrompt 
 ()); 
  
 } 
  
 else 
  
 { 
  
 callback 
 (); 
  
 } 
 } 
 // Intent handlers below 
 const 
  
 generalFallback 
  
 = 
  
 ( 
 conv 
 ) 
  
 = 
>  
 { 
  
 handleFallback 
  
 = 
  
 ( 
 conv 
 , 
  
 promptFetch 
 , 
  
 () 
  
 = 
>  
 { 
  
 conv 
 . 
 ask 
 ( 
 GENERAL_FALLBACK 
 [ 
 conv 
 . 
 data 
 . 
 fallbackCount 
 ], 
  
 getGeneralNoInputPrompts 
 ()); 
  
 }); 
 } 
 const 
  
 listFallback 
  
 = 
  
 ( 
 conv 
 ) 
  
 = 
>  
 { 
  
 handleFallback 
  
 = 
  
 ( 
 conv 
 , 
  
 promptFetch 
 , 
  
 () 
  
 = 
>  
 { 
  
 conv 
 . 
 ask 
 ( 
 LIST_FALLBACK 
 [ 
 conv 
 . 
 data 
 . 
 fallbackCount 
 ], 
  
 getGeneralNoInputPrompts 
 ()); 
  
 }); 
 } 
 const 
  
 nonFallback 
  
 = 
  
 ( 
 conv 
 ) 
  
 = 
>  
 { 
  
 conv 
 . 
 data 
 . 
 fallbackCount 
  
 = 
  
 0 
 ; 
  
 conv 
 . 
 ask 
 ( 
 'A non-fallback message here' 
 ); 
 } 

Java

 private 
  
 static 
  
 final 
  
 List<String> 
  
 GENERAL_FALLBACK 
  
 = 
  
 Arrays 
 . 
 asList 
 ( 
  
 "Sorry, what was that?" 
 , 
  
 "I didn\'t quite get that. I can tell you all about IO, like date or location, or about the sessions. What do you want to know about?" 
 ); 
 private 
  
 static 
  
 final 
  
 List<String> 
  
 LIST_FALLBACK 
  
 = 
  
 Arrays 
 . 
 asList 
 ( 
  
 "Sorry, what was that?" 
 , 
  
 "I didn\'t catch that. Could you tell me which one you liked?" 
 ); 
 private 
  
 static 
  
 final 
  
 List<String> 
  
 FINAL_FALLBACK 
  
 = 
  
 Arrays 
 . 
 asList 
 ( 
 "I\'m sorry I\'m having trouble here. Maybe we should try this again later." 
 ); 
 @ForIntent 
 ( 
 "General Fallback" 
 ) 
 public 
  
 ActionResponse 
  
 generalFallback 
 ( 
 ActionRequest 
  
 request 
 ) 
  
 { 
  
 ResponseBuilder 
  
 responseBuilder 
  
 = 
  
 getResponseBuilder 
 ( 
 request 
 ); 
  
 int 
  
 fallbackCount 
  
 = 
  
 ( 
 Integer 
 ) 
  
 request 
 . 
 getConversationData 
 (). 
 get 
 ( 
 "fallbackCount" 
 ); 
  
 fallbackCount 
 ++ 
 ; 
  
 request 
 . 
 getConversationData 
 (). 
 put 
 ( 
 "fallbackCount" 
 , 
  
 fallbackCount 
 ); 
  
 if 
  
 ( 
 fallbackCount 
 > 
 2 
 ) 
  
 { 
  
 responseBuilder 
 . 
 add 
 ( 
 getRandomPromptFromList 
 ( 
 FINAL_FALLBACK 
 )). 
 endConversation 
 (); 
  
 } 
  
 else 
  
 { 
  
 responseBuilder 
 . 
 add 
 ( 
 getRandomPromptFromList 
 ( 
 GENERAL_FALLBACK 
 )); 
  
 } 
  
 return 
  
 responseBuilder 
 . 
 build 
 (); 
 } 
 private 
  
 String 
  
 getRandomPromptFromList 
 ( 
 List<String> 
  
 prompts 
 ) 
  
 { 
  
 Random 
  
 rand 
  
 = 
  
 new 
  
 Random 
 (); 
  
 int 
  
 i 
  
 = 
  
 rand 
 . 
 nextInt 
 ( 
 prompts 
 . 
 size 
 ()); 
  
 return 
  
 prompts 
 . 
 get 
 ( 
 i 
 ); 
 } 
 @ForIntent 
 ( 
 "List Fallback" 
 ) 
 public 
  
 ActionResponse 
  
 listFallback 
 ( 
 ActionRequest 
  
 request 
 ) 
  
 { 
  
 ResponseBuilder 
  
 responseBuilder 
  
 = 
  
 getResponseBuilder 
 ( 
 request 
 ); 
  
 int 
  
 fallbackCount 
  
 = 
  
 ( 
 Integer 
 ) 
  
 request 
 . 
 getConversationData 
 (). 
 get 
 ( 
 "fallbackCount" 
 ); 
  
 fallbackCount 
 ++ 
 ; 
  
 request 
 . 
 getConversationData 
 (). 
 put 
 ( 
 "fallbackCount" 
 , 
  
 fallbackCount 
 ); 
  
 if 
  
 ( 
 fallbackCount 
 > 
 2 
 ) 
  
 { 
  
 responseBuilder 
 . 
 add 
 ( 
 getRandomPromptFromList 
 ( 
 FINAL_FALLBACK 
 )). 
 endConversation 
 (); 
  
 } 
  
 else 
  
 { 
  
 responseBuilder 
 . 
 add 
 ( 
 getRandomPromptFromList 
 ( 
 LIST_FALLBACK 
 )); 
  
 } 
  
 return 
  
 responseBuilder 
 . 
 build 
 (); 
 } 
 @ForIntent 
 ( 
 "Non Fallback" 
 ) 
 public 
  
 ActionResponse 
  
 nonFallback 
 ( 
 ActionRequest 
  
 request 
 ) 
  
 { 
  
 ResponseBuilder 
  
 responseBuilder 
  
 = 
  
 getResponseBuilder 
 ( 
 request 
 ); 
  
 request 
 . 
 getConversationData 
 (). 
 put 
 ( 
 "fallbackCount" 
 , 
  
 0 
 ); 
  
 responseBuilder 
 . 
 add 
 ( 
 "Non Fallback message" 
 ); 
  
 return 
  
 responseBuilder 
 . 
 build 
 (); 
 } 

Be prepared to help at any time

Create an intent that listens for help phrases like "what can I do?", "what can you tell me", or "help". In this intent, offer some (rotating) response that offers an overview of what the agent can do and directs users to a possible action. Ideally, also use follow-up help intents in Dialogflow to create different help scenarios for different actionable intents.

Node.js

 const 
  
 HELP_PROMPTS 
  
 = 
  
 [ 
  
 'There\'s a lot you might want to know about the local restaurants, and I can tell you all about it, like where it is and what kind of food they have. What do you want to know?' 
 , 
  
 'I\'m here to help, so let me know if you need any help figuring out where or what to eat. What do you want to know?' 
 , 
 ]; 
 // Intent handler 
 const 
  
 help 
  
 = 
  
 ( 
 conv 
 ) 
  
 = 
>  
 { 
  
 reply 
 ( 
 conv 
 , 
  
 promptFetch 
 . 
 getHelpPrompt 
 (), 
  
 // fetches random entry from HELP_PROMPTS 
  
 promptFetch 
 . 
 getGeneralNoInputPrompts 
 ()); 
 } 

Java

 private 
  
 static 
  
 final 
  
 List<String> 
  
 HELP_PROMPTS 
  
 = 
  
 Arrays 
 . 
 asList 
 ( 
  
 "There's a lot you might want to know about IO, and I can tell you all about it, like where it is and what the sessions are. What do you want to know?" 
 , 
  
 "IO can be a little overwhelming, so I\'m here to help. Let me know if you need any help figuring out the event, like when it is, or what the sessions are. What do you want to know?" 
 ); 
 @ForIntent 
 ( 
 "Help" 
 ) 
 public 
  
 ActionResponse 
  
 help 
 ( 
 ActionRequest 
  
 request 
 ) 
  
 { 
  
 return 
  
 getResponseBuilder 
 ( 
 request 
 ). 
 add 
 ( 
 getRandomPromptFromList 
 ( 
 HELP_PROMPTS 
 )). 
 build 
 (); 
 } 

Let users replay information

Wrap all your app.ask(output) methods with a proxy function that adds the output to conv.data.lastPrompt . Create a repeat intent that listens for prompts to repeat from the user like "what?", "say that again", or "can you repeat that?". Create an array of repeat prefixes that can be used to acknowledge that the user asked for something to be repeated. In the repeat intent handler, call ask() with a concatenated string of the repeat prefix and the value of conv.data.lastPrompt . Keep in mind that you'll have to shift any SSML opening tags if used in the last prompt.

Node.js

 const 
  
 REPEAT_PREFIX 
  
 = 
  
 [ 
  
 'Sorry, I said ' 
 , 
  
 'Let me repeat that. ' 
 , 
 ]; 
 const 
  
 reply 
  
 = 
  
 ( 
 conv 
 , 
  
 inputPrompt 
 , 
  
 noInputPrompts 
 ) 
  
 = 
>  
 { 
  
 conv 
 . 
 data 
 . 
 lastPrompt 
  
 = 
  
 inputPrompt 
 ; 
  
 conv 
 . 
 data 
 . 
 lastNoInputPrompts 
  
 = 
  
 noInputPrompts 
 ; 
  
 conv 
 . 
 ask 
 ( 
 inputPrompt 
 , 
  
 noInputPrompts 
 ); 
 } 
 // Intent handlers 
 const 
  
 normalIntent 
  
 = 
  
 ( 
 conv 
 ) 
  
 = 
>  
 { 
  
 reply 
 ( 
 conv 
 , 
  
 'Hey this is a question' 
 , 
  
 SOME_NO_INPUT_PROMPTS 
 ); 
 } 
 const 
  
 repeat 
  
 = 
  
 ( 
 conv 
 ) 
  
 = 
>  
 { 
  
 let 
  
 repeatPrefix 
  
 = 
  
 promptFetch 
 . 
 getRepeatPrefix 
 (); 
  
 // randomly chooses from REPEAT_PREFIX 
  
 // Move SSML start tags over 
  
 if 
  
 ( 
 conv 
 . 
 data 
 . 
 lastPrompt 
 . 
 startsWith 
 ( 
 promptFetch 
 . 
 getSSMLPrefix 
 ())) 
  
 { 
  
 conv 
 . 
 data 
 . 
 lastPrompt 
  
 = 
  
 conv 
 . 
 data 
 . 
 lastPrompt 
 . 
 slice 
 ( 
 promptFetch 
 . 
 getSSMLPrefix 
 (). 
 length 
 ); 
  
 repeatPrefix 
  
 = 
  
 promptFetch 
 . 
 getSSMLPrefix 
 () 
  
 + 
  
 repeatPrefix 
 ; 
  
 } 
  
 conv 
 . 
 ask 
 ( 
 repeatPrefix 
  
 + 
  
 conv 
 . 
 data 
 . 
 lastPrompt 
 , 
  
 conv 
 . 
 data 
 . 
 lastNoInputPrompts 
 ); 
 } 

Java

 private 
  
 final 
  
 List<String> 
  
 REPEAT_PREFIX 
  
 = 
  
 Arrays 
 . 
 asList 
 ( 
 "Sorry, I said " 
 , 
  
 "Let me repeat that." 
 ); 
 private 
  
 final 
  
 String 
  
 SsmlPrefix 
  
 = 
  
 "<speak>" 
 ; 
 @ForIntent 
 ( 
 "Normal Intent" 
 ) 
 public 
  
 ActionResponse 
  
 normalIntent 
 ( 
 ActionRequest 
  
 request 
 ) 
  
 { 
  
 ResponseBuilder 
  
 responseBuilder 
  
 = 
  
 getResponseBuilder 
 ( 
 request 
 ); 
  
 responseBuilder 
 . 
 getConversationData 
 (). 
 put 
 ( 
 "lastPrompt" 
 , 
  
 "Hey this is a question" 
 ); 
  
 return 
  
 responseBuilder 
 . 
 build 
 (); 
 } 
 @ForIntent 
 ( 
 "repeat" 
 ) 
 public 
  
 ActionResponse 
  
 repeat 
 ( 
 ActionRequest 
  
 request 
 ) 
  
 { 
  
 ResponseBuilder 
  
 responseBuilder 
  
 = 
  
 getResponseBuilder 
 ( 
 request 
 ); 
  
 String 
  
 repeatPrefix 
  
 = 
  
 getRandomPromptFromList 
 ( 
 REPEAT_PREFIX 
 ); 
  
 // Move SSML start tags over 
  
 String 
  
 lastPrompt 
  
 = 
  
 ( 
 String 
 ) 
  
 responseBuilder 
 . 
 getConversationData 
 (). 
 get 
 ( 
 "lastPrompt" 
 ); 
  
 if 
  
 ( 
 lastPrompt 
 . 
 startsWith 
 ( 
 SsmlPrefix 
 )) 
  
 { 
  
 String 
  
 newLastPrompt 
  
 = 
  
 lastPrompt 
 . 
 substring 
 ( 
 SsmlPrefix 
 . 
 length 
 ()); 
  
 responseBuilder 
 . 
 getConversationData 
 (). 
 put 
 ( 
 "lastPrompt" 
 , 
  
 newLastPrompt 
 ); 
  
 repeatPrefix 
  
 = 
  
 SsmlPrefix 
  
 + 
  
 repeatPrefix 
 ; 
  
 } 
  
 responseBuilder 
 . 
 add 
 ( 
 repeatPrefix 
  
 + 
  
 lastPrompt 
 ); 
  
 return 
  
 responseBuilder 
 . 
 build 
 (); 
 } 

Personalize the conversation with user preferences

Your Action can ask users for their preferences and remember them for later use, letting you personalize future conversations with that user.

This example Action gives users a weather report for a zip code. The following example code asks the user whether they'd like the Action to remember their zip code for later conversations.

Node.js

 app 
 . 
 intent 
 ( 
 'weather_report' 
 , 
  
 ( 
 conv 
 ) 
  
 = 
>  
 { 
  
 let 
  
 zip 
  
 = 
  
 conv 
 . 
 arguments 
 . 
 get 
 ( 
 'zipcode' 
 ); 
  
 conv 
 . 
 data 
 . 
 zip 
  
 = 
  
 zip 
 ; 
  
 conv 
 . 
 ask 
 ( 
 getWeatherReport 
 ( 
 zip 
 )); 
  
 conv 
 . 
 ask 
 ( 
 new 
  
 Confirmation 
 ( 
 `Should I remember 
 ${ 
 zip 
 } 
 for next time?` 
 )); 
 }); 
 app 
 . 
 intent 
 ( 
 'remember_zip' 
 , 
  
 ( 
 conv 
 , 
  
 params 
 , 
  
 confirmation 
 ) 
  
 = 
>  
 { 
  
 if 
  
 ( 
 confirmation 
 ) 
  
 { 
  
 conv 
 . 
 user 
 . 
 storage 
 . 
 zip 
  
 = 
  
 conv 
 . 
 data 
 . 
 zip 
 ; 
  
 conv 
 . 
 close 
 ( 
 'Great! See you next time.' 
 ); 
  
 } 
  
 else 
  
 conv 
 . 
 close 
 ( 
 'Ok, no problem.' 
 ); 
 }); 

Java

 @ForIntent 
 ( 
 "weather_report" 
 ) 
 public 
  
 ActionResponse 
  
 weatherReport 
 ( 
 ActionRequest 
  
 request 
 ) 
  
 { 
  
 ResponseBuilder 
  
 responseBuilder 
  
 = 
  
 getResponseBuilder 
 ( 
 request 
 ); 
  
 String 
  
 zip 
  
 = 
  
 ( 
 String 
 ) 
  
 request 
 . 
 getArgument 
 ( 
 "location" 
 ). 
 getStructuredValue 
 (). 
 get 
 ( 
 "zipCode" 
 ); 
  
 responseBuilder 
 . 
 getConversationData 
 (). 
 put 
 ( 
 "zip" 
 , 
  
 zip 
 ); 
  
 responseBuilder 
 . 
 add 
 ( 
 getWeatherReport 
 ( 
 zip 
 )); 
  
 responseBuilder 
 . 
 add 
 ( 
  
 new 
  
 Confirmation 
 (). 
 setConfirmationText 
 ( 
 "Should I remember " 
  
 + 
  
 zip 
  
 + 
  
 " for next time?" 
 )); 
  
 return 
  
 responseBuilder 
 . 
 build 
 (); 
 } 
 @ForIntent 
 ( 
 "remember_zip" 
 ) 
 public 
  
 ActionResponse 
  
 rememberZip 
 ( 
 ActionRequest 
  
 request 
 ) 
  
 { 
  
 ResponseBuilder 
  
 responseBuilder 
  
 = 
  
 getResponseBuilder 
 ( 
 request 
 ); 
  
 if 
  
 ( 
 request 
 . 
 getUserConfirmation 
 ()) 
  
 { 
  
 responseBuilder 
 . 
 getUserStorage 
 (). 
 put 
 ( 
 "zip" 
 , 
  
 responseBuilder 
 . 
 getConversationData 
 (). 
 get 
 ( 
 "zip" 
 )); 
  
 responseBuilder 
 . 
 add 
 ( 
 "Great! See you next time." 
 ). 
 endConversation 
 (); 
  
 } 
  
 else 
  
 { 
  
 responseBuilder 
 . 
 add 
 ( 
 "Ok, no problem." 
 ). 
 endConversation 
 (); 
  
 } 
  
 return 
  
 responseBuilder 
 . 
 build 
 (); 
 } 

After asking the user which zip code they're in during their first dialog, you can skip that prompt during their next invocation and use the same zip code. You should still provide an escape route (like a suggestion chip allowing them to pick a different zip code) but by reducing a turn of conversation in the common case, you create a much more seamless experience.

Node.js

 app 
 . 
 intent 
 ( 
 'weather_report' 
 , 
  
 ( 
 conv 
 ) 
  
 = 
>  
 { 
  
 let 
  
 zip 
  
 = 
  
 conv 
 . 
 arguments 
 . 
 get 
 ( 
 'zipcode' 
 ); 
  
 if 
  
 ( 
 zip 
 ) 
  
 { 
  
 conv 
 . 
 close 
 ( 
 getWeatherReport 
 ( 
 zip 
 )); 
  
 } 
  
 else 
  
 if 
  
 ( 
 conv 
 . 
 user 
 . 
 storage 
 . 
 zip 
 ) 
  
 { 
  
 conv 
 . 
 ask 
 ( 
 new 
  
 SimpleResponse 
 ( 
 getWeatherReport 
 ( 
 conv 
 . 
 user 
 . 
 storage 
 . 
 zip 
 ))); 
  
 conv 
 . 
 ask 
 ( 
 new 
  
 Suggestions 
 ( 
 'Try another zipcode' 
 )); 
  
 } 
  
 else 
  
 { 
  
 conv 
 . 
 ask 
 ( 
 'What\'s your zip code?' 
 ); 
  
 } 
 }); 
 app 
 . 
 intent 
 ( 
 'provide_zip_df' 
 , 
  
 ( 
 conv 
 ) 
  
 = 
>  
 { 
  
 conv 
 . 
 user 
 . 
 storage 
 . 
 zip 
  
 = 
  
 conv 
 . 
 arguments 
 . 
 get 
 ( 
 'zipcode' 
 ); 
  
 conv 
 . 
 close 
 ( 
 getWeatherReport 
 ( 
 conv 
 . 
 user 
 . 
 storage 
 . 
 zip 
 )); 
 }); 

Java

 public 
  
 ActionResponse 
  
 weatherReport2 
 ( 
 ActionRequest 
  
 request 
 ) 
  
 { 
  
 ResponseBuilder 
  
 responseBuilder 
  
 = 
  
 getResponseBuilder 
 ( 
 request 
 ); 
  
 String 
  
 zip 
  
 = 
  
 ( 
 String 
 ) 
  
 request 
 . 
 getArgument 
 ( 
 "location" 
 ). 
 getStructuredValue 
 (). 
 get 
 ( 
 "zipCode" 
 ); 
  
 if 
  
 ( 
 zip 
  
 != 
  
 null 
 ) 
  
 { 
  
 responseBuilder 
 . 
 add 
 ( 
 getWeatherReport 
 ( 
 zip 
 )). 
 endConversation 
 (); 
  
 } 
  
 else 
  
 if 
  
 (( 
 zip 
  
 = 
  
 ( 
 String 
 ) 
  
 responseBuilder 
 . 
 getUserStorage 
 (). 
 get 
 ( 
 "zip" 
 )) 
  
 != 
  
 null 
 ) 
  
 { 
  
 responseBuilder 
 . 
 add 
 ( 
 new 
  
 SimpleResponse 
 (). 
 setTextToSpeech 
 ( 
 getWeatherReport 
 ( 
 zip 
 ))); 
  
 responseBuilder 
 . 
 add 
 ( 
 new 
  
 Suggestion 
 (). 
 setTitle 
 ( 
 "Try another zipcode" 
 )); 
  
 } 
  
 else 
  
 { 
  
 responseBuilder 
 . 
 add 
 ( 
 "What's your zip code?" 
 ); 
  
 } 
  
 return 
  
 responseBuilder 
 . 
 build 
 (); 
 } 

Customize for returning users

Maintaining some state between conversations ensures a far more natural experience for return users. The first step in crafting this experience is to greet return users differently. For instance, you can taper the greeting or surface useful information based on past conversations. To do this, use the incoming AppRequest.User lastSeen property to determine whether the user has interacted with your Action before. If the lastSeen property is included in the request payload, you can use a different greeting than normal.

The code below uses the Node.js client library to fetch the value of last.seen .

Node.js

 // This function is used to handle the welcome intent 
 // In Dialogflow, the Default Welcome Intent ('input.welcome' action) 
 // In Actions SDK, the 'actions.intent.MAIN' intent 
 const 
  
 welcome 
  
 = 
  
 ( 
 conv 
 ) 
  
 = 
>  
 { 
  
 if 
  
 ( 
 conv 
 . 
 user 
 . 
 last 
 . 
 seen 
 ) 
  
 { 
  
 conv 
 . 
 ask 
 ( 
 `Hey you're back...` 
 ); 
  
 } 
  
 else 
  
 { 
  
 conv 
 . 
 ask 
 ( 
 'Welcome to World Cities Trivia!...' 
 ); 
  
 } 
 } 

Java

 // This function is used to handle the welcome intent 
 // In Dialogflow, the Default Welcome Intent ('input.welcome' action) 
 // In Actions SDK, the 'actions.intent.MAIN' intent 
 public 
  
 ActionResponse 
  
 welcome 
 ( 
 ActionRequest 
  
 request 
 ) 
  
 { 
  
 ResponseBuilder 
  
 responseBuilder 
  
 = 
  
 getResponseBuilder 
 ( 
 request 
 ); 
  
 if 
  
 ( 
 request 
 . 
 getUser 
 (). 
 getLastSeen 
 () 
  
 != 
  
 null 
 ) 
  
 { 
  
 responseBuilder 
 . 
 add 
 ( 
 "Hey you're back..." 
 ); 
  
 } 
  
 else 
  
 { 
  
 responseBuilder 
 . 
 add 
 ( 
 "Welcome to Number Genie!..." 
 ); 
  
 } 
  
 return 
  
 responseBuilder 
 . 
 build 
 (); 
 } 

You can further enhance this greeting by tailoring the response to the actual value of lastSeen . For instance, users whose last interaction occurred many months before the current interaction might receive a different greeting than those who used the Action the day before.

In-conversation volume control

On supported devices, the Assistant lets users control device volume within your conversational Action by saying things like "turn the volume up" or "set the volume to 50 percent" . If you have intents that handle similar training phrases, your intents take precedence. We recommend letting the Assistant handle these user requests unless your Action has a specific reason to.

Create a Mobile Website
View Site in Mobile | Classic
Share by: