In Dialogflow ansehen
Klicken Sie auf Continue (Weiter), um unser Beispiel für Reprompts in Dialogflow zu importieren. Folgen Sie dann den mit den folgenden Schritten zum Bereitstellen und Testen des Beispiels:
- Geben Sie einen Agent-Namen ein und erstellen Sie einen neuen Dialogflow-Agent für das Beispiel.
- Nachdem der Agent importiert wurde, klicken Sie auf Zum Agent.
- Klicken Sie im Hauptnavigationsmenü auf Fulfillment (Auftragsausführung).
- Aktivieren Sie den Inline-Editor und klicken Sie dann auf Bereitstellen. Der Editor enthält das Beispiel Code.
- Klicken Sie im Hauptnavigationsmenü auf Integrations (Integrationen) und dann auf Google Assistant
- Aktivieren Sie im angezeigten modalen Fenster die Option Automatische Vorschau der Änderungen und klicken Sie auf Testen. um den Actions-Simulator zu öffnen.
- Geben Sie im Simulator
Talk to my test app
ein, um das Beispiel zu testen.
Mit den folgenden Funktionen können Sie Fälle vermeiden, in denen Nutzer zu deinen Aktionen eingeben (keine Eingabefehler):
- Standard-Systemaufforderungen: Nutzer werden automatisch noch einmal gefragt. mit vorgefertigten Antwortvorlagen, die für alle Fälle allgemein sind.
- Dynamische Aufforderungen: Hier geben Sie an, dass Sie auf Ihrer und den Empfang eines Intents (Actions SDK) oder Ereignisses (Dialogflow) jedes Mal, wenn ein keine Eingabe erfolgt, sodass Sie von Fall zu Fall entscheiden können.
System-Standard-Antwortaufforderungen
Wenn Sie eine Antwort an Assistant zurückgeben, verwendet das System standardmäßig werden Nutzer aufgefordert, ihre Eingaben zu wiederholen oder noch einmal einzugeben.
Dialogflow
Dialogflow erzwingt insgesamt maximal drei No-Match- und No-Input-Eingaben. Sobald eine Unterhaltung drei Erhebungsversuche erreicht, wird Ihr Dialogflow-Agent beendet die Unterhaltung mit einer Standardantwort. Eine No-Match-Eingabe in Von Dialogflow wird einer Ihrer Fallback-Intents ausgelöst.
Dynamische Aufforderungen
Sie können jedes Mal einen Intent oder Dialogflow-Ereignis empfangen, wenn Ihre Aktion fehlschlägt Etwas zu erhalten. So können Sie basierend auf bestimmten und den Nutzer entsprechend informieren.
Dialogflow
Sie können zwei Arten von Intents ohne Eingabe erstellen:
Normal Intent: Diese Methode wendet keine Kontexte an und wird daher ausgelöst. wenn kein anderer, kontextbezogener Intent ausgelöst wird. Hilfreich für allgemeine Aufforderungen, die du in den meisten Fällen anwenden möchtest.
Follow-up-Intent: Follow-up-Intents werden über Dialogflow erzwungen. um sicherzustellen, dass Aufforderungen erst nach bestimmten Abzweigungen des Gespräch. Dies ist nützlich für individuelle Antwortaufforderungen, auf die Sie sich anwenden möchten. in bestimmten Situationen.
So verarbeiten Sie Ereignisse ohne Eingabe:
- Klicken Sie in der linken Navigationsleiste auf Intents.
- Erstellen Sie einen normalen Intent oder Follow-up-Intent.
- Für normale Intents: Klicken Sie im Menü Intent auf das Symbol +. Element und geben Sie dem Intent einen Namen, z. B. „Reprompt“ (Wiederholung).
- Für Follow-up-Intents: Bewegen Sie den Mauszeiger auf den Intent, den Sie Passen Sie die Aufforderung ohne Eingabe an und klicken Sie auf Add follow-up intent > benutzerdefiniert. Unter dem ursprünglichen Intent wird ein neuer Intent erstellt.
- Klicken Sie auf den neu erstellten Intent, um den Intent-Editor zu öffnen.
- Klicken Sie auf den Abschnitt Events (Ereignisse) und geben Sie „actions_intent_NO_INPUT“ ein. in die Ereignis hinzufügen.
- Geben Sie im Abschnitt Aktionen einen Aktionsnamen ein oder verwenden Sie den angegebenen Namen. ist standardmäßig aktiviert. In diesem Beispiel verwenden wir „no.input“.
- Klicken Sie auf Speichern.
- Klicken Sie im linken Navigationsbereich auf Integrations (Integrationen).
- Wählen Sie Google Assistant aus und klicken Sie auf Testen, um überprüfen, ob die Änderungen in Ihrem Actions-Projekt widergespiegelt werden.
Wenn für diesen Intent keine Eingabe erfolgt, können Sie Folgendes verwenden: der Auftragsausführung, um eine entsprechende Antwort zurückzugeben, oder erstellen Sie eine in Dialogflow. Hier ist ein Ausführungscode, bei dem die Clientbibliothek verwendet wird, um einen normalen Intent ohne Eingabe namens „Reprompt“ zu verarbeiten.
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 anfordern
Im JSON-Format wird eine Webhook-Anfrage beschrieben.
{ "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" }
Antwort (JSON)
Im folgenden JSON-Code wird eine Webhook-Antwort beschrieben.
{ "payload": { "google": { "expectUserResponse": false, "richResponse": { "items": [ { "simpleResponse": { "textToSpeech": "Okay let's try this again later." } } ] } } } }
Actions SDK
So verarbeiten Sie Intents ohne Eingabe:
- Deklariere in einem
conversations
-Objekt in deinem Aktionspaket um den Intentactions.intent.NO_INPUT
zu empfangen, wenn ein Nutzer keine Eingabe.{ "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" } ] } } }
- Wenn Assistant keine Nutzereingabe erhält,
No-input-Intent in der nächsten Anfrage
Ihrer Auftragsausführung hinzufügen. Sie können dann
Intent verarbeiten und eine entsprechende Antwort zurückgeben. Hier ist ein
Beispiel:
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 anfordern
Im JSON-Format wird eine Webhook-Anfrage beschrieben.
{ "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" } ] } ] }
Antwort (JSON)
Im folgenden JSON-Code wird eine Webhook-Antwort beschrieben.
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "simpleResponse": { "textToSpeech": "Okay let's try this again later." } } ] } } }