طلبات إعادة الطلب (Dialogflow)

الاستكشاف في Dialogflow

انقر على متابعة لاستيراد نموذج طلبات الإزالة في Dialogflow. بعد ذلك، اتبع الخطوات أدناه لنشر النموذج واختباره:

  1. أدخِل اسم الوكيل وأنشِئ وكيل Dialogflow جديد للنموذج.
  2. بعد انتهاء عملية الاستيراد، انقر على الانتقال إلى الوكيل.
  3. من قائمة التنقّل الرئيسية، انتقِل إلى توصيل الطلبات.
  4. فعِّل المحرّر المضمّن، ثم انقر على نشر. يحتوي المحرِّر على العيّنة الرمز.
  5. من قائمة التنقل الرئيسية، انتقِل إلى عمليات الدمج، ثم انقر على Google "مساعد Google"
  6. في النافذة المشروطة التي تظهر، فعِّل تغييرات المعاينة التلقائية وانقر على اختبار. لفتح محاكي الإجراءات.
  7. في المحاكي، أدخِل Talk to my test app لاختبار العيّنة.
متابعة

يمكنك استخدام الميزات التالية لمعالجة الحالات التي لا يوفّر فيها المستخدمون ذلك مدخلات إلى الإجراءات (أخطاء عدم الإدخال):

  • إشعارات النظام التلقائية: تطلب هذه الردود من المستخدم تلقائيًا بنماذج طلبات معدّة مسبقًا تكون عامة لجميع الحالات.
  • طلبات إعادة الطلب الديناميكية: الإعلان عن رغبتك في معالجة طلب إعادة الطلب على امتلاك واستلام هدف (حزمة تطوير البرامج (SDK) الخاصة بالإجراءات) أو حدث (Dialogflow) في كل مرة لا يتم إدخال أي إدخال، لذا يمكنك التعامل معها على أساس كل حالة على حدة.

الطلبات التلقائية للنظام

عندما تردّ على "مساعد Google" بشكل تلقائي، يستخدم النظام الطلبات الافتراضية بأن تطلب من المستخدمين تكرار إدخالاتهم أو إعادة كتابتها.

Dialogflow

تفرض Dialogflow الحد الأقصى لإجمالي إدخالات ثلاثة إدخالات بدون تطابق وأخرى لا تحتوي على إدخالات. بعد أن تصل المحادثة إلى ثلاث محاولات لجمع المعلومات، سيحدّد وكيل Dialogflow سوف ينهي المحادثة برد افتراضي. إدخال غير متطابق في يحدث Dialogflow عندما يتم تشغيل إحدى الأهداف الاحتياطية.

الطلبات الديناميكية

يمكنك تلقّي حدث intent أو Dialogflow في كل مرة يتعذّر فيها الإجراء تلقي أي مدخلات. يتيح لك هذا عرض إجابة مختلفة استنادًا إلى بعض إذا لزم الأمر، وأن تتم إعادة مطالبة المستخدم بشكل مناسب.

Dialogflow

يمكنك إنشاء نوعَين من الأهداف التي لا تتطلّب إدخال إدخال:

  • النية العادية: لا تطبّق هذه الطريقة أي سياقات، لذا سيتم تشغيلها. عندما لا يكون هناك هدف سياقي آخر للاستناد إليه هذا مفيد عن الطلبات العامة التي تريد تطبيقها في معظم الحالات

  • نيّة المتابعة: يتم فرض نوايا المتابعة من خلال Dialogflow السياقات، مما يضمن ظهور الإقرارات فقط بعد تحولات معينة محادثة. يكون هذا مفيدًا في الطلبات المخصصة التي تريد تطبيقها عليها لمواقف محددة.

للتعامل مع أحداث عدم الإدخال:

  1. في شريط التنقّل الأيمن، انقر على الأهداف.
  2. أنشئ نية عادية أو نية للمتابعة.
    • بالنسبة إلى الأهداف العادية: انقر على رمز + بجانب قائمة الهدف. وإدراج اسم لهدفك، مثل "طلب إعادة النظر".

    • لأغراض المتابعة: مرِّر مؤشر الماوس فوق الهدف الذي تريد تحقيقه. تخصيص طلب عدم الإدخال والنقر على إضافة هدف متابعة > المخصّصة. يتم إنشاء هدف جديد أسفل الهدف الأصلي.

  3. انقر على رسالة intent التي تم إنشاؤها حديثًا لفتح محرِّر الأهداف.
  4. انقر على قسم الأحداث، وأدخِل "actions_intent_NO_INPUT" في حقل إضافة حدث.
  5. في قسم الإجراءات، أدخِل اسم إجراء أو استخدِم الاسم المتاح. بشكل افتراضي. في هذا المثال، سنستخدم "no.input".

  6. انقر على حفظ.
  7. في شريط التنقّل الأيمن، انقر على عمليات الدمج.
  8. اختَر مساعد Google وانقر على اختبار لإجراء التأكد من ظهور التغييرات في مشروع الإجراءات.

وفي حالة عدم إدخال أي إدخال لهذا الغرض، يمكنك استخدام تنفيذك لعرض رد مناسب أو إنشاء رد في Dialogflow. على سبيل المثال، إليك بعض رموز التنفيذ التي تستخدم مكتبة العملاء من أجل التعامل مع نية عادية لا يمكن إدخال إدخال اسمها "طلب إعادة النظر"

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

تجدر الإشارة إلى أن ملف 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."
            }
          }
        ]
      }
    }
  }
}

حزمة تطوير برامج المهام

للتعامل مع الأهداف التي لا تتطلّب إدخال:

  1. في كائن conversations داخل حزمة الإجراءات، أوضح أنّك تريد لتلقّي الغرض من actions.intent.NO_INPUT عندما لا يقدّمه المستخدم إدخال.
    {
      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. عندما لا يتلقّى "مساعد Google" أي إدخالات من المستخدم، ستتلقّى نية عدم الإدخال في الطلب التالي المتعلّق بتنفيذك. يمكنك بعد ذلك معالجة النية وعرض رد طلب مناسب. إليك مثال:

    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

    تجدر الإشارة إلى أن ملف 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."
              }
            }
          ]
        }
      }
    }