Reprompts (Dialogflow)

در Dialogflow کاوش کنید

برای وارد کردن نمونه Reprompts ما در Dialogflow روی Continue کلیک کنید. سپس، مراحل زیر را برای استقرار و آزمایش نمونه دنبال کنید:

  1. یک نام عامل وارد کنید و یک عامل Dialogflow جدید برای نمونه ایجاد کنید.
  2. پس از وارد کردن عامل، روی Go to agent کلیک کنید.
  3. از منوی پیمایش اصلی، به Fulfillment بروید.
  4. ویرایشگر درون خطی را فعال کنید، سپس روی Deploy کلیک کنید. ویرایشگر حاوی کد نمونه است.
  5. از منوی پیمایش اصلی، به Integrations بروید، سپس روی Google Assistant کلیک کنید.
  6. در پنجره مدال که ظاهر می‌شود، پیش‌نمایش خودکار تغییرات را فعال کنید و روی Test کلیک کنید تا شبیه‌ساز Actions باز شود.
  7. در شبیه ساز برای تست نمونه وارد Talk to my test app شوید!
ادامه

می‌توانید از ویژگی‌های زیر برای رسیدگی به مواردی استفاده کنید که کاربران ورودی به Actions شما ارائه نمی‌دهند (خطاهای بدون ورودی):

  • بازپرداخت‌های پیش‌فرض سیستم - این درخواست‌ها به‌طور خودکار با بازپرداخت‌های از پیش آماده‌شده که برای همه موارد عمومی هستند، از کاربر درخواست می‌کنند.
  • بازپرداخت‌های پویا - اعلام می‌کنید که می‌خواهید درخواست مجدد را به تنهایی مدیریت کنید، و هر بار که یک ورودی وجود ندارد، یک intent (Actions SDK) یا رویداد (Dialogflow) دریافت می‌کنید، بنابراین می‌توانید آنها را به صورت موردی مدیریت کنید.

بازپرداخت های پیش فرض سیستم

به‌طور پیش‌فرض، وقتی پاسخی را به «دستیار» برمی‌گردانید، سیستم از بازپرداخت‌های پیش‌فرض استفاده می‌کند تا از کاربران بخواهد ورودی خود را تکرار یا دوباره تایپ کنند.

جریان گفتگو

Dialogflow حداکثر ترکیبی از سه ورودی بدون تطابق و بدون ورودی را اعمال می کند. هنگامی که یک مکالمه به سه تلاش برای جمع آوری رسید، نماینده Dialogflow شما مکالمه را با یک پاسخ پیش فرض پایان می دهد. ورودی بدون تطابق در Dialogflow زمانی است که یکی از مقاصد بازگشتی شما راه اندازی می شود.

بازپرداخت های پویا

هر بار که Action شما هیچ ورودی دریافت نمی کند، می توانید یک رویداد intent یا Dialogflow دریافت کنید. این به شما این امکان را می دهد که در صورت لزوم، بر اساس برخی منطق، پاسخ متفاوتی را برگردانید و به طور مناسب از کاربر درخواست کنید.

جریان گفتگو

شما می توانید دو نوع هدف بدون ورودی ایجاد کنید:

  • قصد عادی - این روش هیچ زمینه‌ای را اعمال نمی‌کند، بنابراین زمانی فعال می‌شود که هدف متنی دیگری برای راه‌اندازی وجود نداشته باشد. این برای بازپرداخت های عمومی که می خواهید در بیشتر موارد اعمال کنید مفید است.

  • هدف پیگیری - اهداف پیگیری از طریق زمینه‌های Dialogflow اعمال می‌شوند و اطمینان حاصل می‌شود که درخواست‌های مجدد تنها پس از نوبت‌های خاصی از مکالمه فعال می‌شوند. این برای درخواست‌های سفارشی که می‌خواهید در موقعیت‌های خاص اعمال کنید مفید است.

برای مدیریت رویدادهای بدون ورودی:

  1. در پیمایش سمت چپ، روی Intents کلیک کنید.
  2. یک قصد معمولی یا قصد بعدی ایجاد کنید.
    • برای مقاصد عادی : روی نماد + در مورد منوی Intent کلیک کنید و برای هدف خود یک نام مانند "Reprompt" انتخاب کنید.

    • برای اهداف بعدی : نشانگر را روی هدفی که می‌خواهید درخواست ورودی بدون ورودی را سفارشی کنید نگه دارید و روی افزودن هدف بعدی > سفارشی کلیک کنید. یک هدف جدید در زیر هدف اصلی ایجاد می شود.

  3. روی intent جدید ایجاد شده کلیک کنید تا ویرایشگر قصد باز شود.
  4. روی بخش رویدادها کلیک کنید و "actions_intent_NO_INPUT" را در قسمت افزودن رویداد وارد کنید.
  5. در بخش Actions ، یک نام اقدام وارد کنید یا از نامی که به طور پیش فرض ارائه شده است استفاده کنید. برای این مثال، از "no.input" استفاده خواهیم کرد.

  6. روی ذخیره کلیک کنید.
  7. در ناوبری سمت چپ، روی Integrations کلیک کنید
  8. Google Assistant را انتخاب کنید و روی Test کلیک کنید تا مطمئن شوید که تغییرات در پروژه Actions شما منعکس شده است.

هر زمان که یک ورودی برای این هدف رخ نمی دهد، می توانید از تکمیل خود برای بازگرداندن یک پاسخ مناسب یا ایجاد یک پاسخ در Dialogflow استفاده کنید. به عنوان مثال، در اینجا برخی از کدهای تکمیلی وجود دارد که از کتابخانه مشتری برای مدیریت یک هدف معمولی بدون ورودی به نام "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);

جاوا

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 زیر یک درخواست 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

توجه داشته باشید که JSON زیر یک پاسخ وب هوک را توضیح می دهد.

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

Actions SDK

برای مدیریت مقاصد بدون ورودی:

  1. در یک شی conversations در داخل بسته اکشن خود، اعلام کنید که می‌خواهید هر زمان که کاربر ورودی ارائه نکرد، هدف actions.intent.NO_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"
            }
          ]
        }
      }
    }
  2. هنگامی که دستیار هیچ ورودی از کاربر دریافت نمی کند، در درخواست بعدی برای انجام خود، قصد بدون ورودی را دریافت خواهید کرد. سپس می‌توانید هدف را پردازش کرده و یک پاسخ مناسب را بازگردانید. در اینجا یک مثال است:

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

    جاوا

    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 زیر یک درخواست 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

    توجه داشته باشید که JSON زیر یک پاسخ وب هوک را توضیح می دهد.

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