Explorer dans Dialogflow
Cliquez sur Continue (Continuer) pour importer l'exemple de requête dans Dialogflow. Suivez ensuite les procédez comme suit pour déployer et tester l'exemple:
- Saisissez un nom d'agent et créez un agent Dialogflow pour l'exemple.
- Une fois l'importation de l'agent terminée, cliquez sur Accéder à l'agent.
- Dans le menu de navigation principal, accédez à Fulfillment.
- Activez l'éditeur intégré, puis cliquez sur Déployer. L'éditeur contient l'exemple du code source.
- Dans le menu de navigation principal, accédez à Integrations (Intégrations), puis cliquez sur Google l'Assistant Google.
- Dans la fenêtre modale qui s'affiche, activez Auto-preview changes (Prévisualisation automatique des modifications), puis cliquez sur Test (Tester). pour ouvrir le simulateur d'actions.
- Dans le simulateur, saisissez
Talk to my test app
pour tester l'échantillon.
Vous pouvez utiliser les fonctionnalités suivantes pour gérer les cas où les utilisateurs ne fournissent pas à vos actions (aucune erreur de saisie):
- Nouvelles invites par défaut du système : invitent automatiquement l'utilisateur. avec des repromptues prédéfinies qui sont génériques pour tous les cas.
- Nouvelle invite dynamique : indique que vous souhaitez gérer les repromptues sur votre et recevoir un intent (SDK Actions) ou un événement (Dialogflow) chaque fois qu'une aucune entrée n'est effectuée, ce qui vous permet de les gérer au cas par cas.
Nouvelles invites par défaut du système
Par défaut, lorsque vous renvoyez une réponse à l'Assistant, le système utilise des invites par défaut pour demander aux utilisateurs de répéter ou de ressaisir leur entrée.
Dialogflow
Dialogflow applique un maximum combiné de trois entrées sans correspondance et sans entrée. Lorsqu'une conversation atteint trois tentatives de collecte, votre agent Dialogflow mettra fin à la conversation avec une réponse par défaut. Une entrée sans correspondance dans Dialogflow se produit lorsque l'un de vos intents de remplacement est déclenché.
Nouvelles invites dynamiques
Vous pouvez recevoir un intent ou un événement Dialogflow chaque fois que votre action ne parvient pas à ne reçoit aucune entrée. Cela vous permet de renvoyer une réponse différente en fonction logique, si nécessaire, et redemander à l'utilisateur de manière appropriée.
Dialogflow
Vous pouvez créer deux types d'intents sans entrée:
Intent normal : cette méthode n'applique aucun contexte et est donc déclenchée. lorsqu'il n'y a pas d'autre intent plus contextuel à déclencher. C'est utile pour les repromptues générales que vous souhaitez appliquer dans la plupart des cas.
Intent de suivi : les intents de suivi sont appliqués via Dialogflow. en vous assurant que les nouvelles invites ne se déclenchent qu'après avoir tourné conversationnelle. Cela est utile pour les nouvelles invites personnalisées auxquelles vous souhaitez appliquer des situations spécifiques.
Pour gérer les événements sans entrée:
- Dans le volet de navigation de gauche, cliquez sur Intents.
- Créez un intent normal ou de suivi.
- Pour les intents normaux: cliquez sur l'icône + à côté du menu Intent.
et donnez un nom à votre intent, par exemple "Reprompt".
- Pour les intents de suivi: pointez sur l'intent que vous souhaitez
personnalisez la nouvelle invite d'absence de saisie, puis cliquez sur Add follow-up intent > (Ajouter un intent de suivi >)
personnalisé. Un intent est créé sous l'intent d'origine.
- Pour les intents normaux: cliquez sur l'icône + à côté du menu Intent.
et donnez un nom à votre intent, par exemple "Reprompt".
- Cliquez sur l'intent que vous venez de créer pour ouvrir l'éditeur d'intents.
- Cliquez sur la section Events (Événements) et saisissez "actions_intent_NO_INPUT". dans le Ajouter un événement.
- Dans la section Actions, saisissez le nom d'une action ou utilisez celui fourni.
par défaut. Pour cet exemple, nous utiliserons "no.input".
- Cliquez sur Enregistrer.
- Dans le panneau de navigation de gauche, cliquez sur Integrations (Intégrations).
- Sélectionnez Google Assistant (Assistant Google), puis cliquez sur Test (Tester) pour effectuer assurez-vous que les modifications sont reflétées dans votre projet Actions.
Chaque fois qu'aucune entrée ne se produit pour cet intent, vous pouvez utiliser votre fulfillment pour renvoyer une réponse appropriée ou en créer une dans Dialogflow. Par exemple, voici un code de fulfillment qui utilise la bibliothèque cliente pour pour gérer un intent sans saisie normal appelé "Reprompt".
Node.js
const {dialogflow} = require('actions-on-google'); const functions = require('firebase-functions'); const app = dialogflow({debug: true}); app.intent('Reprompt', (conv) => { const repromptCount = parseInt(conv.arguments.get('REPROMPT_COUNT')); if (repromptCount === 0) { conv.ask(`What was that?`); } else if (repromptCount === 1) { conv.ask(`Sorry I didn't catch that. Could you repeat yourself?`); } else if (conv.arguments.get('IS_FINAL_REPROMPT')) { conv.close(`Okay let's try this again later.`); } }); exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);
Java
package com.example; import com.google.actions.api.ActionRequest; import com.google.actions.api.ActionResponse; import com.google.actions.api.DialogflowApp; import com.google.actions.api.ForIntent; import com.google.actions.api.response.ResponseBuilder; public class MyActionsApp extends DialogflowApp { @ForIntent("Reprompt") public ActionResponse reprompt(ActionRequest request) { ResponseBuilder responseBuilder = getResponseBuilder(request); int repromptCount = request.getRepromptCount(); String response; if (repromptCount == 0) { response = "What was that?"; } else if (repromptCount == 1) { response = "Sorry, I didn't catch that. Could you repeat yourself?"; } else { responseBuilder.endConversation(); response = "Okay let's try this again later."; } return responseBuilder.add(response).build(); } }
Demander un fichier JSON
Notez que le code JSON ci-dessous décrit une requête webhook.
{ "responseId": "f26a9188-4998-42eb-ac16-d0e6e273b137-712767ed", "queryResult": { "queryText": "actions_intent_NO_INPUT", "parameters": {}, "allRequiredParamsPresent": true, "fulfillmentText": "Webhook failed for intent: Reprompt", "fulfillmentMessages": [ { "text": { "text": [ "Webhook failed for intent: Reprompt" ] } } ], "outputContexts": [ { "name": "projects/df-reprompts-kohler/agent/sessions/ABwppHFi9Dpwy6KiEtS0UIPDNVfa7mlkrPIEZRlikFkjuN_4SGPixgX8OCatpXu38ln7VG43-nk-7veZWhds3nLljA/contexts/actions_capability_media_response_audio" }, { "name": "projects/df-reprompts-kohler/agent/sessions/ABwppHFi9Dpwy6KiEtS0UIPDNVfa7mlkrPIEZRlikFkjuN_4SGPixgX8OCatpXu38ln7VG43-nk-7veZWhds3nLljA/contexts/actions_capability_account_linking" }, { "name": "projects/df-reprompts-kohler/agent/sessions/ABwppHFi9Dpwy6KiEtS0UIPDNVfa7mlkrPIEZRlikFkjuN_4SGPixgX8OCatpXu38ln7VG43-nk-7veZWhds3nLljA/contexts/actions_capability_audio_output" }, { "name": "projects/df-reprompts-kohler/agent/sessions/ABwppHFi9Dpwy6KiEtS0UIPDNVfa7mlkrPIEZRlikFkjuN_4SGPixgX8OCatpXu38ln7VG43-nk-7veZWhds3nLljA/contexts/google_assistant_input_type_voice" }, { "name": "projects/df-reprompts-kohler/agent/sessions/ABwppHFi9Dpwy6KiEtS0UIPDNVfa7mlkrPIEZRlikFkjuN_4SGPixgX8OCatpXu38ln7VG43-nk-7veZWhds3nLljA/contexts/actions_intent_no_input", "parameters": { "REPROMPT_COUNT": 2, "IS_FINAL_REPROMPT": true } } ], "intent": { "name": "projects/df-reprompts-kohler/agent/intents/75dfd97d-6368-4436-9533-70f05ae76c96", "displayName": "Reprompt" }, "intentDetectionConfidence": 1, "languageCode": "en" }, "originalDetectIntentRequest": { "source": "google", "version": "2", "payload": { "user": { "locale": "en-US", "userVerificationStatus": "VERIFIED" }, "conversation": { "conversationId": "ABwppHFi9Dpwy6KiEtS0UIPDNVfa7mlkrPIEZRlikFkjuN_4SGPixgX8OCatpXu38ln7VG43-nk-7veZWhds3nLljA", "type": "ACTIVE", "conversationToken": "[]" }, "inputs": [ { "intent": "actions.intent.NO_INPUT", "rawInputs": [ { "inputType": "VOICE" } ], "arguments": [ { "name": "REPROMPT_COUNT", "intValue": "2" }, { "name": "IS_FINAL_REPROMPT", "boolValue": true } ] } ], "surface": { "capabilities": [ { "name": "actions.capability.MEDIA_RESPONSE_AUDIO" }, { "name": "actions.capability.ACCOUNT_LINKING" }, { "name": "actions.capability.AUDIO_OUTPUT" } ] }, "availableSurfaces": [ { "capabilities": [ { "name": "actions.capability.AUDIO_OUTPUT" }, { "name": "actions.capability.SCREEN_OUTPUT" }, { "name": "actions.capability.WEB_BROWSER" } ] } ] } }, "session": "projects/df-reprompts-kohler/agent/sessions/ABwppHFi9Dpwy6KiEtS0UIPDNVfa7mlkrPIEZRlikFkjuN_4SGPixgX8OCatpXu38ln7VG43-nk-7veZWhds3nLljA" }
Réponse JSON
Notez que le code JSON ci-dessous décrit une réponse webhook.
{ "payload": { "google": { "expectUserResponse": false, "richResponse": { "items": [ { "simpleResponse": { "textToSpeech": "Okay let's try this again later." } } ] } } } }
SDK Actions
Pour gérer les intents sans entrée:
- Dans un objet
conversations
de votre package d'actions, déclarez que vous souhaitez de recevoir l'intentactions.intent.NO_INPUT
chaque fois qu'un utilisateur ne fournit pas saisie.{ a"ctions:" [ { d"escription:" D"efault Welcome Intent," n"ame:" M"AIN," f"ulfillment:" { c"onversationName:" c"onversation_1 " }, i"ntent:" { n"ame:" a"ctions.intent.MAIN " } } ], c"onversations:" { c"onversation_1:" { n"ame:" c"onversation_1," u"rl:" Y"OUR_FULFILLMENT_URL," i"nDialogIntents:" [ { n"ame:" a"ctions.intent.NO_INPUT " } ] } } }a
- Si l'Assistant ne reçoit aucune entrée de l'utilisateur, vous recevez
l'intent sans entrée dans la requête suivante envoyée à votre traitement. Vous pouvez ensuite
traiter l'intent et renvoyer une réponse appropriée. Exemple :
Node.js
const {actionssdk} = require('actions-on-google'); const functions = require('firebase-functions'); const app = actionssdk({debug: true}); app.intent('actions.intent.MAIN', (conv) => { conv.ask(`Hi! Try this sample on a speaker device, ` + `and stay silent when the mic is open. If trying ` + `on the Actions console simulator, click the no-input ` + `button next to the text input field.`); }); app.intent('actions.intent.TEXT', (conv, input) => { conv.ask(`You said ${input}`); conv.ask(`Try this sample on a speaker device, ` + `and stay silent when the mic is open. If trying ` + `on the Actions console simulator, click the no-input ` + `button next to the text input field.`); }); app.intent('actions.intent.NO_INPUT', (conv) => { const repromptCount = parseInt(conv.arguments.get('REPROMPT_COUNT')); if (repromptCount === 0) { conv.ask(`What was that?`); } else if (repromptCount === 1) { conv.ask(`Sorry I didn't catch that. Could you repeat yourself?`); } else if (conv.arguments.get('IS_FINAL_REPROMPT')) { conv.close(`Okay let's try this again later.`); } }); exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);
Java
package com.example; import com.google.actions.api.ActionRequest; import com.google.actions.api.ActionResponse; import com.google.actions.api.ActionsSdkApp; import com.google.actions.api.ConstantsKt; import com.google.actions.api.ForIntent; import com.google.actions.api.response.ResponseBuilder; import com.google.actions.api.response.helperintent.Confirmation; import com.google.actions.api.response.helperintent.DateTimePrompt; import com.google.actions.api.response.helperintent.Permission; import com.google.actions.api.response.helperintent.Place; import com.google.api.services.actions_fulfillment.v2.model.DateTime; import com.google.api.services.actions_fulfillment.v2.model.Location; public class MyActionsApp extends ActionsSdkApp { @ForIntent("actions.intent.MAIN") public ActionResponse welcome(ActionRequest request) { ResponseBuilder responseBuilder = getResponseBuilder(request); responseBuilder.add("Hi! Try this sample on a speaker device, and stay silent when the mic is open. If trying on the Actions console simulator, click the no-input button next to the text input field."); return responseBuilder.build(); } @ForIntent("actions.intent.TEXT") public ActionResponse fallback(ActionRequest request) { ResponseBuilder responseBuilder = getResponseBuilder(request); responseBuilder.add("You said " + request.getRawInput().getQuery()); responseBuilder.add("Try this sample on a speaker device, and stay silent when the mic is open. If trying on the Actions console simulator, click the no-input button next to the text input field."); return responseBuilder.build(); } @ForIntent("actions.intent.NO_INPUT") public ActionResponse reprompt(ActionRequest request) { ResponseBuilder responseBuilder = getResponseBuilder(request); int repromptCount = request.getRepromptCount(); String response; if (repromptCount == 0) { response = "What was that?"; } else if (repromptCount == 1) { response = "Sorry, I didn't catch that. Could you repeat yourself?"; } else { responseBuilder.endConversation(); response = "Okay let's try this again later."; } return responseBuilder.add(response).build(); } }
Demander un fichier JSON
Notez que le code JSON ci-dessous décrit une requête webhook.
{ "user": { "locale": "en-US", "userVerificationStatus": "VERIFIED" }, "conversation": { "conversationId": "ABwppHEVDuKUPjdZ4Ud-F2yBXN5ssRg2funUp59hSHQheAi-B5Y3EzehAKFtVwMkduqMRWscUp77ScrDjYnYxISqAM-qOXuXEuCw", "type": "ACTIVE", "conversationToken": "{\"data\":{}}" }, "inputs": [ { "intent": "actions.intent.NO_INPUT", "rawInputs": [ { "inputType": "VOICE" } ], "arguments": [ { "name": "REPROMPT_COUNT", "intValue": "2" }, { "name": "IS_FINAL_REPROMPT", "boolValue": true } ] } ], "surface": { "capabilities": [ { "name": "actions.capability.AUDIO_OUTPUT" }, { "name": "actions.capability.ACCOUNT_LINKING" }, { "name": "actions.capability.MEDIA_RESPONSE_AUDIO" } ] }, "availableSurfaces": [ { "capabilities": [ { "name": "actions.capability.SCREEN_OUTPUT" }, { "name": "actions.capability.WEB_BROWSER" }, { "name": "actions.capability.AUDIO_OUTPUT" } ] } ] }
Réponse JSON
Notez que le code JSON ci-dessous décrit une réponse webhook.
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "simpleResponse": { "textToSpeech": "Okay let's try this again later." } } ] } } }