Dialogflow-তে এক্সপ্লোর করুন
Dialogflow-এ আমাদের Reprompts স্যাম্পেল ইমপোর্ট করতে চালিয়ে যান বিকল্পে ক্লিক করুন। তারপর, স্যাম্পেল ডিপ্লয় ও পরীক্ষা করতে নিচে উল্লেখ করা ধাপগুলি অনুসরণ করুন:
- এজেন্টের নাম লিখুন এবং স্যাম্পেলের জন্য নতুন Dialogflow এজেন্ট তৈরি করুন।
- এজেন্ট ইমপোর্ট করা হয়ে গেলে, এজেন্টে যান বিকল্পে ক্লিক করুন।
- প্রধান নেভিগেশন মেনু থেকে, ফুলফিলমেন্ট বিকল্পে যান।
- ইনলাইন এডিটর চালু করে ডিপ্লয় করুন বিকল্পে ক্লিক করুন। এডিটরে স্যাম্পেল কোড আছে।
- প্রধান নেভিগেশন মেনু থেকে, ইন্টিগ্রেশন বিকল্পে যান, তারপর Google Assistant বিকল্পে ক্লিক করুন।
- যে মোডাল উইন্ডোটি দেখা যাবে, সেখানে পরিবর্তন অটো-প্রিভিউ করুন বিকল্প চালু করুন এবং অ্যাকশন সিমুলেটর খুলতে পরীক্ষা করুন বিকল্পে ক্লিক করুন।
- সিমুলেটরে, স্যাম্পেল পরীক্ষা করতে
Talk to my test appলিখুন!
ব্যবহারকারী আপনার অ্যাকশনে ইনপুট না দিলে (ইনপুট না দেওয়ার সমস্যা) সেই পরিস্থিতি সামাল দিতে আপনি নিম্নলিখিত ফিচার ব্যবহার করতে পারেন:
- সিস্টেম-ডিফল্ট রিপ্রম্পট - এগুলি ব্যবহারকারীকে অটোমেটিক রিপ্রম্পট করে আগে থেকে তৈরি রিপ্রম্পটের মাধ্যমে যা সব ক্ষেত্রে প্রযোজ্য।
- ডায়নামিক রিপ্রম্পট - আপনি যে নিজেই রিপ্রম্পট করার বিষয়টি ম্যানেজ করতে চান তা ঘোষণা করা এবং ইনপুট না পাওয়ার প্রতিটি ক্ষেত্রে ইনটেন্ট (Actions SDK) বা ইভেন্ট (Dialogflow) পাওয়া, যাতে আপনি কেস-বাই-কেস ভিত্তিতে সেগুলি ম্যানেজ করতে পারেন।
সিস্টেম-ডিফল্ট রিপ্রম্পট
ডিফল্ট হিসেবে, আপনি Assistant-এ কোনও উত্তর ফেরত দিলে, সিস্টেম ডিফল্ট রিপ্রম্পট ব্যবহার করে ব্যবহারকারীকে তার ইনপুট রিপিট করতে বা আবার টাইপ করতে বলে।
Dialogflow
Dialogflow সর্বাধিক তিনটি নো-ম্যাচ ও নো-ইনপুট ইনপুট প্রয়োগ করে। কোনও কথোপকথন তিনবার সংগ্রহ করার চেষ্টা করার পরে, আপনার Dialogflow এজেন্ট ডিফল্ট উত্তর দিয়ে কথোপকথন শেষ করবে। Dialogflow-তে কোনও ম্যাচ না করা ইনপুট হল আপনার কোনও একটি ফলব্যাক ইনটেন্ট ট্রিগার হওয়া।
ডায়নামিক রিপ্রম্পট
আপনার অ্যাকশন কোনও ইনপুট পেতে ব্যর্থ হলে প্রতিবার আপনি একটি ইনটেন্ট বা Dialogflow ইভেন্ট পেতে পারেন। প্রয়োজন হলে, এটি আপনাকে কিছু লজিকের উপর ভিত্তি করে অন্য কোনও উত্তর দিতে এবং ব্যবহারকারীকে যথাযথভাবে আবার প্রম্পট করতে দেয়।
Dialogflow
আপনি দুই ধরনের নো-ইনপুট ইনটেন্ট তৈরি করতে পারবেন:
স্বাভাবিক ইনটেন্ট - এই পদ্ধতিতে কোনও প্রসঙ্গ প্রয়োগ করা হয় না, তাই ট্রিগার করার জন্য অন্য কোনও, আরও প্রাসঙ্গিক ইনটেন্ট না থাকলে এটি ট্রিগার করা হবে। এটি সাধারণত বেশিরভাগ ক্ষেত্রে আপনি যে রিপ্রম্পট প্রয়োগ করতে চান তার জন্য উপযোগী।
ফলো-আপ ইনটেন্ট - Dialogflow কনটেক্সটের মাধ্যমে ফলো-আপ ইনটেন্ট প্রয়োগ করা হয়, যাতে কথোপকথনের নির্দিষ্ট কিছু টার্নের পরেই শুধু আবার প্রম্পট ট্রিগার করা হয়। এটি নির্দিষ্ট পরিস্থিতিতে আপনি যে কাস্টমাইজ করা রিপ্রম্পট প্রয়োগ করতে চান তার জন্য উপযোগী।
ইনপুট না থাকা ইভেন্ট ম্যানেজ করতে:
- বাঁদিকের নেভিগেশন থেকে ইনটেন্ট বিকল্পে ক্লিক করুন।
- সাধারণ ইনটেন্ট বা ফলো-আপ ইনটেন্ট তৈরি করুন।
- সাধারণ ইনটেন্টের জন্য: ইনটেন্ট মেনু আইটেমের পাশে + আইকনে ক্লিক করুন
এবং আপনার ইনটেন্টের নাম দিন, যেমন "আবার প্রম্পট করুন"।

- ফলো-আপ ইনটেন্টের জন্য: যে ইনটেন্টের জন্য আপনি নো-ইনপুট রিপ্রম্পট কাস্টমাইজ করতে চান,
সেটির উপর মাউস নিয়ে যান এবং ফলো-আপ ইনটেন্ট যোগ করুন >
কাস্টম বিকল্পে ক্লিক করুন। আসল ইনটেন্টের নিচে নতুন ইনটেন্ট তৈরি করা হয়।

- সাধারণ ইনটেন্টের জন্য: ইনটেন্ট মেনু আইটেমের পাশে + আইকনে ক্লিক করুন
এবং আপনার ইনটেন্টের নাম দিন, যেমন "আবার প্রম্পট করুন"।
- ইনটেন্ট এডিটর খুলতে নতুন তৈরি করা ইনটেন্টে ক্লিক করুন।
- ইভেন্ট বিভাগে ক্লিক করুন এবং ইভেন্ট যোগ করুন ফিল্ডে "actions_intent_NO_INPUT" লিখুন।
- অ্যাকশন বিভাগে, অ্যাকশনের নাম লিখুন অথবা ডিফল্ট হিসেবে যেটি দেওয়া আছে
সেটি ব্যবহার করুন। এই উদাহরণের জন্য, আমরা "no.input" ব্যবহার করব।

- সেভ করুন বিকল্পে ক্লিক করুন।
- বাঁদিকের নেভিগেশনে, ইন্টিগ্রেশন বিকল্পে ক্লিক করুন
- Google Assistant বেছে নিন এবং আপনার অ্যাকশন প্রোজেক্টে পরিবর্তনগুলি প্রতিফলিত হয়েছে কিনা তা নিশ্চিত করতে পরীক্ষা করুন বিকল্পে ক্লিক করুন।
এই ইনটেন্টের জন্য কোনও ইনপুট না থাকলে, আপনি আপনার ফুলফিলমেন্ট ব্যবহার করে উপযুক্ত উত্তর দিতে পারেন অথবা 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);
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" }
Response JSON
মনে রাখবেন, নিচের JSON-এ ওয়েবহুক রেসপন্স বর্ণনা করা হয়েছে।
{ "payload": { "google": { "expectUserResponse": false, "richResponse": { "items": [ { "simpleResponse": { "textToSpeech": "Okay let's try this again later." } } ] } } } }
Actions SDK
ইনপুট না থাকা ইনটেন্ট ম্যানেজ করতে:
- আপনার অ্যাকশন প্যাকেজের মধ্যে
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" } ] } } } - Assistant ব্যবহারকারীর থেকে কোনও ইনপুট না পেলে, আপনার ফুলফিলমেন্টের পরবর্তী অনুরোধে
আপনি নো-ইনপুট ইনটেন্ট পাবেন। তারপর আপনি
ইনটেন্ট প্রসেস করে উপযুক্ত রিপ্রম্পট উত্তর দিতে পারবেন। এখানে একটি
উদাহরণ দেওয়া হল:
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" } ] } ] }
Response JSON
মনে রাখবেন, নিচের JSON-এ ওয়েবহুক রেসপন্স বর্ণনা করা হয়েছে।
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "simpleResponse": { "textToSpeech": "Okay let's try this again later." } } ] } } }