Esplora in Dialogflow
Fai clic su Continua per importare l'esempio di repository in Dialogflow. Quindi, segui questi passaggi per eseguire il deployment e testare l'esempio:
- Inserisci un nome dell'agente e crea un nuovo agente Dialogflow per l'esempio.
- Al termine dell'importazione, fai clic su Vai all'agente.
- Nel menu di navigazione principale, vai a Fulfillment.
- Attiva l'editor in linea, quindi fai clic su Esegui il deployment. L'editor contiene il codice campione.
- Nel menu di navigazione principale, vai a Integrazioni e fai clic su Google Assistant.
- Nella finestra modale che viene visualizzata, abilita Modifiche dell'anteprima automatica e fai clic su Test per aprire il simulatore di Actions.
- Nel simulatore, inserisci
Talk to my test app
per testare l'esempio.
Puoi utilizzare le seguenti funzionalità per gestire i casi in cui gli utenti non forniscono input per le tue azioni (errori di immissione):
- Richieste predefinite del sistema: vengono richieste automaticamente all'utente con richieste preimpostate generiche per tutti i casi.
- Report dinamici: dichiarazione che vuoi gestire il repository di tua proprietà e ricevi un intent (SDK Actions) o un evento (Dialogflow) ogni volta che non si verifica un input, in modo da poterli gestire caso per caso.
Requisiti predefiniti di sistema
Per impostazione predefinita, quando restituisci una risposta all'assistente, il sistema utilizza i suggerimenti predefiniti per chiedere agli utenti di ripetere o digitare nuovamente il proprio input.
Dialogflow
Dialogflow applica un massimo di tre input senza corrispondenza e senza input. Quando una conversazione raggiunge tre tentativi di raccolta, l'agente Dialogflow termina la conversazione con una risposta predefinita. Un input senza corrispondenza in Dialogflow è quando viene attivato uno dei tuoi intent di riserva.
Richieste dinamiche
Puoi ricevere un intent o un evento Dialogflow ogni volta che l'azione non riceve alcun input. Questo ti consente di restituire una risposta diversa in base a una logica, se necessario, e di inviare nuovamente l'utente alla richiesta appropriata.
Dialogflow
Puoi creare due tipi di intent senza inserimento:
Intent normale: questo metodo non applica alcun contesto, quindi viene attivato quando non esiste un altro intent più contestuale da attivare. Si tratta di un'opzione utile per i suggerimenti generali che vuoi applicare nella maggior parte dei casi.
Intenzione di follow-up: gli intent di follow-up vengono applicati tramite i contesti Dialogflow, assicurando che i contatti vengano attivati solo dopo determinati turni di conversazione. Ciò è utile per i rappresentanti personalizzati che vuoi applicare a situazioni specifiche.
Per gestire gli eventi senza input:
- Nel menu di navigazione a sinistra, fai clic su Intent.
- Crea un intent normale o un approfondimento.
- Per gli intent normali: fai clic sull'icona + accanto alla voce di menu Intent e assegna un nome all'intent, ad esempio "Reprompt".
- Per intenti di follow-up: passa il mouse sopra l'intent per cui vuoi personalizzare il consenso senza input e fai clic su Aggiungi intent di follow-up > personalizzato. Viene creato un nuovo intent sotto l'intent originale.
- Per gli intent normali: fai clic sull'icona + accanto alla voce di menu Intent e assegna un nome all'intent, ad esempio "Reprompt".
- Fai clic sull'intent appena creato per aprire l'editor.
- Fai clic sulla sezione Eventi e inserisci "actions_intent_NO_INPUT" nel campo Aggiungi evento.
- Nella sezione Azioni, inserisci un nome per l'azione o utilizza quello fornito per impostazione predefinita. Per questo esempio utilizzeremo "no.input".
- Fai clic su Salva.
- Nel menu di navigazione a sinistra, fai clic su Integrazioni.
- Scegli Assistente Google e fai clic su Test per assicurarti che le modifiche vengano applicate nel progetto Actions.
Ogni volta che si verifica un input senza intervento per questo intent, puoi utilizzare il fulfillment per restituire una risposta appropriata o crearne una in Dialogflow. Ad esempio, ecco un codice di evasione degli ordini che utilizza la libreria client per gestire un normale intent senza input denominato "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(); } }
JSON JSON
Tieni presente che il codice JSON che segue descrive una richiesta di 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" }
JSON risposta
Tieni presente che il codice JSON seguente descrive una risposta webhook.
{ "payload": { "google": { "expectUserResponse": false, "richResponse": { "items": [ { "simpleResponse": { "textToSpeech": "Okay let's try this again later." } } ] } } } }
SDK Actions
Per gestire gli intent senza input:
- In un oggetto
conversations
all'interno del pacchetto di azioni, dichiara di voler ricevere l'intentactions.intent.NO_INPUT
ogni volta che un utente non fornisce input.{ "actions": [ { "description": "Default Welcome Intent", "name": "MAIN", "fulfillment": { "conversationName": "conversation_1" }, "intent": { "name": "actions.intent.MAIN" } } ], "conversations": { "conversation_1": { "name": "conversation_1", "url": "YOUR_FULFILLMENT_URL", "inDialogIntents": [ { "name": "actions.intent.NO_INPUT" } ] } } }
- Quando l'assistente non riceve input dall'utente, riceverai l'intent no-input nella richiesta successiva al fulfillment. Puoi quindi elaborare l'intent e restituire una risposta appropriata. Ad esempio:
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(); } }
JSON JSON
Tieni presente che il codice JSON che segue descrive una richiesta di 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" } ] } ] }
JSON risposta
Tieni presente che il codice JSON seguente descrive una risposta webhook.
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "simpleResponse": { "textToSpeech": "Okay let's try this again later." } } ] } } }