Powtórzenia (Dialogflow)

Przeglądaj w Dialogflow

Kliknij Continue (Dalej), aby zaimportować naszą przykładową prośbę o reprompty w Dialogflow. Następnie postępuj zgodnie z poniższe czynności, aby wdrożyć i przetestować przykład:

  1. Wpisz nazwę agenta i utwórz nowego agenta Dialogflow dla przykładu.
  2. Gdy agent zakończy importowanie, kliknij Przejdź do agenta.
  3. W głównym menu nawigacyjnym kliknij Fulfillment (Realizacja).
  4. Włącz edytor wbudowany, a następnie kliknij Wdróż. Edytor zawiera próbkę w kodzie.
  5. W głównym menu nawigacyjnym kliknij Integrations (Integracje), a następnie kliknij Google (Google). .
  6. W wyświetlonym oknie modalnym włącz Automatyczny podgląd zmian i kliknij Przetestuj aby otworzyć Symulator działań.
  7. W symulatorze wpisz Talk to my test app, aby przetestować próbkę.
Dalej

Możesz skorzystać z tych funkcji, aby rozwiązać problemy, w których użytkownicy nie podają danych dane wejściowe do Akcji (błędy braku danych):

  • Domyślne żądania systemowe – automatycznie wyświetlają użytkownikowi prośbę o potwierdzenie. dzięki gotowym szablonom, które są ogólne i uniwersalne w każdym przypadku.
  • Dynamiczne ponowne prompty – deklarujesz, że chcesz obsługiwać ponowne wyświetlanie na i odbiera intencję (SDK Actions) lub zdarzenie (Dialogflow) za każdym razem, brak danych wejściowych, dzięki czemu można zająć się tym indywidualnie.
.

Domyślne żądania systemowe

Domyślnie, gdy zwracasz odpowiedź Asystentowi, system używa tych danych: domyślnie prosi użytkowników o powtórzenie lub przepisanie danych wejściowych.

Dialogflow

Dialogflow wymusza łącznie maksymalnie 3 dane wejściowe typu no-match i no-input. Gdy w rozmowie dojdzie do 3 prób zbierania danych, agent Dialogflow spowoduje zakończenie rozmowy domyślną odpowiedzią. Niezgodne dane wejściowe w W Dialogflow aktywowana jest jedna z intencji zastępczych.

Dynamiczne ponowne prompty

Możesz otrzymywać intencję lub zdarzenie Dialogflow za każdym razem, gdy akcja się nie powiedzie nie mają wpływu na żadne dane wejściowe. Pozwala to zwrócić różne odpowiedzi na podstawie niektórych w razie potrzeby i w miarę konieczności poprosić użytkownika o zgodę.

Dialogflow

Możesz tworzyć 2 typy intencji bez danych wejściowych:

  • Normalna intencja – ta metoda nie stosuje żadnych kontekstów, więc zostanie aktywowana jeśli nie istnieje żaden inny, bardziej kontekstowy zamiar. To jest przydatne w przypadku ogólnych komunikatów, które chcesz stosować w większości przypadków.

  • Zamiar dalszych działań – zamiary dalszych działań są egzekwowane przez Dialogflow w kontekście kontekstu i zapewnić, że ponowne żądania będą uruchamiane dopiero po określonych etapach rozmowy. Jest to przydatne w przypadku dostosowanych ponownie promptów, do których chcesz zastosować w konkretnych sytuacjach.

Aby obsługiwać zdarzenia braku danych wejściowych:

  1. W menu po lewej stronie kliknij Intents (Intencje).
  2. Utwórz standardową intencję lub intencję towarzyszącą.
    • W przypadku normalnych intencji: kliknij ikonę + obok menu Intent (Intencja). i nadaj intencji nazwę, np. „Powtórz prośbę”.

    • W przypadku intencji uzupełniającej: najedź kursorem na zamiar, który chcesz dostosować żądanie bez danych wejściowych i kliknąć Dodaj intencję uzupełniającą >. niestandardowy. Pod pierwotną intencją tworzona jest nowa intencja.

  3. Kliknij nowo utworzoną intencję, aby otworzyć edytor intencji.
  4. Kliknij sekcję Zdarzenia i wpisz „actions_intent_NO_INPUT”. w sekcji Add event (Dodaj zdarzenie).
  5. W sekcji Działania wpisz nazwę działania lub użyj podanej. domyślnie. W tym przykładzie użyjemy „no.input”.

  6. Kliknij Zapisz.
  7. W menu po lewej stronie kliknij Integrations (Integracje).
  8. Wybierz Asystenta Google i kliknij Przetestuj, aby sprawdź, czy zmiany zostały uwzględnione w projekcie Actions.

Gdy w przypadku tej intencji nie wystąpi brak danych wejściowych, możesz użyć funkcji swoją realizację, aby zwrócić odpowiednią odpowiedź, lub utworzyć taką odpowiedź w Dialogflow. Oto przykładowy kod realizacji, który używa biblioteki klienta do obsługuje normalną intencję no-input o nazwie „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();
  }
}

Poproś o plik JSON

Zwróć uwagę, że poniższy kod JSON opisuje żądanie webhooka.

{
  "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"
}

Plik JSON odpowiedzi

Pamiętaj, że poniższy kod JSON opisuje odpowiedź webhooka.

{
  "payload": {
    "google": {
      "expectUserResponse": false,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "Okay let's try this again later."
            }
          }
        ]
      }
    }
  }
}

Actions SDK

Aby obsługiwać intencje bez danych wejściowych:

  1. W obiekcie conversations w pakiecie działań zadeklaruj, że chcesz do otrzymywania intencji actions.intent.NO_INPUT za każdym razem, gdy użytkownik nie dostarczy dane wejściowe.
    {
      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
  2. Jeśli Asystent nie otrzyma od użytkownika żadnych danych wejściowych, otrzymasz intencję no-input w następnym żądaniu dotyczącym realizacji. Następnie możesz: musi przetworzyć intencję i zwrócić odpowiednią odpowiedź z ponownym zapytaniem. Oto przykład:

    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();
      }
    
    }

    Poproś o plik JSON

    Zwróć uwagę, że poniższy kod JSON opisuje żądanie webhooka.

    {
      "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"
            }
          ]
        }
      ]
    }

    Plik JSON odpowiedzi

    Pamiętaj, że poniższy kod JSON opisuje odpowiedź webhooka.

    {
      "expectUserResponse": false,
      "finalResponse": {
        "richResponse": {
          "items": [
            {
              "simpleResponse": {
                "textToSpeech": "Okay let's try this again later."
              }
            }
          ]
        }
      }
    }