درخواست‌های مجدد (Dialogflow)

کاوش در Dialogflow

روی ادامه کلیک کنید تا نمونه «بازدرخواست‌های» ما را در Dialogflow وارد کنید. سپس، مراحل زیر را برای استقرار و آزمایش نمونه دنبال کنید:

  1. نام عاملی را وارد کنید و عامل Dialogflow جدیدی برای نمونه ایجاد کنید.
  2. پس‌از اینکه وارد کردن عامل تمام شد، روی رفتن به عامل کلیک کنید.
  3. از منو پیمایش اصلی، به انجام سفارش بروید.
  4. ویرایشگر درون‌خطی را فعال کنید، سپس روی استقرار کلیک کنید. ویرایشگر حاوی کد نمونه است.
  5. از منو پیمایش اصلی، به ادغام‌ها بروید، سپس روی دستیار Google کلیک کنید.
  6. در پنجره مقیدی که ظاهر می‌شود، پیش‌نمایش خودکار تغییرات را فعال کنید و روی آزمایش کلیک کنید تا شبیه‌ساز «کنش‌ها» باز شود.
  7. در شبیه‌ساز، Talk to my test app را برای آزمایش نمونه وارد کنید!
ادامه

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

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

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

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

Dialogflow

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

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

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

Dialogflow

می‌توانید دو نوع قصد بدون ورودی ایجاد کنید:

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

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

برای رسیدگی به رویدادهای بدون ورودی:

  1. در پیمایش سمت راست، روی قصدها کلیک کنید.
  2. قصد معمولی یا قصد پیگیری ایجاد کنید.
    • برای قصد‌های معمولی: روی نماد + در کنار گزینه منو قصد کلیک کنید و نامی مانند «Reprompt» (بازدرخواست) به قصد خود بدهید.

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

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

  6. روی ذخیره کلیک کنید.
  7. در پیمایش سمت راست، روی ادغام‌ها کلیک کنید
  8. دستیار Google را انتخاب کنید و روی آزمایش کلیک کنید تا مطمئن شوید تغییرات در پروژه «کنش‌ها» اعمال شده است.

هرگاه برای این قصد، ورودی‌ای وجود نداشته باشد، می‌توانید از تحقق خود برای برگرداندن پاسخ مناسب استفاده کنید یا پاسخی در 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 زیر درخواست وب‌قلاب را شرح می‌دهد.

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

برای رسیدگی به قصد بدون ورودی:

  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 زیر درخواست وب‌قلاب را شرح می‌دهد.

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