Yeniden istemler (Dialogflow)

Dialogflow'da keşfet

Dialogflow'daki Reprompts örneğimizi içe aktarmak için Continue (Devam) seçeneğini tıklayın. Ardından örneği dağıtmak ve test etmek için aşağıdaki adımları uygulayın:

  1. Bir temsilci adı girin ve örnek için yeni bir Dialogflow aracısı oluşturun.
  2. Temsilci içe aktarma işlemini tamamladıktan sonra Temsilciye git'i tıklayın.
  3. Ana gezinme menüsünden Karşılama'ya gidin.
  4. Satır İçi Düzenleyici'yi etkinleştirin ve ardından Dağıt'ı tıklayın. Düzenleyici, örnek kodu içerir.
  5. Ana gezinme menüsünden Entegrasyonlar'a gidin ve Google Asistan'ı tıklayın.
  6. Görüntülenen kalıcı pencerede, Değişiklikleri otomatik önizleme'yi etkinleştirin ve İşlem simülatörünü açmak için Test et'i tıklayın.
  7. Örneği test etmek için simülasyon aracında Talk to my test app ifadesini girin.
Devam

Kullanıcıların İşlemlerinize giriş yapmadığı durumlarda (girme hatası hataları) aşağıdaki özellikleri kullanabilirsiniz:

  • Sistem varsayılan önerileri: Bu istemler kullanıcıya otomatik olarak, tüm durumlar için genel olan önceden hazırlanmış hazır istemlerle yeniden istem gönderir.
  • Dinamik yeniden istemler: Her giriş olmadığında yeniden isteme işlemini ve amaç (Actions SDK'sı) veya etkinlik (Dialogflow) almayı istediğinizi belirtme. Böylece bu işlemleri tek tek ele alabilirsiniz.

Sistem varsayılan istekleri

Varsayılan olarak, Asistan'a bir yanıt döndürdüğünüzde sistem, kullanıcılardan girdilerini tekrarlamalarını veya yeniden yazmalarını istemek için varsayılan yeniden istemleri kullanır.

Dialogflow

Dialogflow, en fazla üç adet eşleşmeyen ve giriş bulunmayan girişi zorunlu kılar. Bir görüşme üç toplama girişimine ulaştığında Dialogflow aracınız varsayılan bir yanıtla görüşmeyi sonlandırır. Dialogflow'da "eşleşmeyen giriş", yedek niyetlerinizden birinin tetiklenmesidir.

Dinamik istemler

İşleminiz herhangi bir giriş alamadığı her defasında bir intent veya Dialogflow etkinliği alabilirsiniz. Bu, gerekirse bazı mantığa göre farklı bir yanıt döndürmenize ve kullanıcıdan uygun şekilde yeniden istem göndermenize olanak tanır.

Dialogflow

İki tür giriş yok amacı oluşturabilirsiniz:

  • Normal intent: Bu yöntem herhangi bir bağlam uygulamaz. Bu nedenle, tetiklenecek başka bir bağlamsal amaç olmadığında tetiklenir. Bu, çoğu durumda uygulamak istediğiniz genel istemler için yararlı olur.

  • Takip intent'i: Takip intent'leri Dialogflow bağlamları aracılığıyla zorunlu kılınır. Böylece yeniden istemler yalnızca görüşmenin belirli dönüşlerinden sonra tetiklenir. Bu, belirli durumlara uygulamak istediğiniz uyarlanmış istekler için yararlı olur.

Girdi olmayan etkinlikleri işlemek için:

  1. Sol gezinme menüsünde Niyetler'i tıklayın.
  2. Normal bir niyet veya takip amacı oluşturun.
    • Normal amaçlar için: Niyet menü öğesinin yanındaki + simgesini tıklayın ve amacınıza "Reprompt" gibi bir ad verin.

    • Takip amaçları için: Fareyle, girilmemesi isteğine göre özelleştirmek istediğiniz amacın üzerine gelin ve Takip amacı ekle > özel'i tıklayın. Orijinal amacın altında yeni bir amaç oluşturulur.

  3. Amaç düzenleyiciyi açmak için yeni oluşturulan niyeti tıklayın.
  4. Etkinlikler bölümünü tıklayın ve Etkinlik ekle alanına "actions_intent_NO_INPUT" yazın.
  5. İşlemler bölümünde bir işlem adı girin veya varsayılan olarak sağlanan adı kullanın. Bu örnekte, "no.input" parametresini kullanacağız.

  6. Kaydet'i tıklayın.
  7. Sol gezinme menüsünde Integrations'ı (Entegrasyonlar) tıklayın.
  8. Değişikliklerin Actions projenize yansıtıldığından emin olmak için Google Asistan'ı seçin ve Test et'i tıklayın.

Bu intent için hiç giriş olmadığında, istek karşılama durumunuzu kullanarak uygun bir yanıt döndürebilir veya Dialogflow'da yanıt oluşturabilirsiniz. Örneğin, "Reprompt" adlı normal bir giriş yok amacını yerine getirmek için istemci kitaplığını kullanan bazı karşılama kodu aşağıda verilmiştir.

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 isteğinde bulun

Aşağıdaki JSON'un bir webhook isteğini açıkladığını unutmayın.

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

Yanıt JSON

Aşağıdaki JSON'un bir webhook yanıtını açıkladığını unutmayın.

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

Actions SDK

Giriş olmayan amaçları işlemek için:

  1. İşlem paketinizin içindeki bir conversations nesnesinde, bir kullanıcı giriş yapmadığında actions.intent.NO_INPUT amacını almak istediğinizi belirtin.
    
    {
      "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"
            }
          ]
        }
      }
    }
    
  2. Asistan, kullanıcıdan herhangi bir giriş almadığında, istek karşılamayla ilgili bir sonraki istekte "giriş yok" iznini alırsınız. Daha sonra amacı işleyip uygun bir yeniden istem yanıtı döndürebilirsiniz. Bir örnek verelim:

    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 isteğinde bulun

    Aşağıdaki JSON'un bir webhook isteğini açıkladığını unutmayın.

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

    Yanıt JSON

    Aşağıdaki JSON'un bir webhook yanıtını açıkladığını unutmayın.

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