Actions on Google Node.js क्लाइंट लाइब्रेरी (Dialogflow) की मदद से फ़ुलफ़िलमेंट बनाएं

अगर JavaScript में फ़ुलफ़िलमेंट वेबहुक बनाया जा रहा है, तो Actions on Google Node.js क्लाइंट लाइब्रेरी का इस्तेमाल करके, Actions on Google प्लैटफ़ॉर्म को ऐक्सेस और उससे इंटरैक्ट किया जा सकता है.

शुरुआती जानकारी

Node.js क्लाइंट लाइब्रेरी, Actions on Google के लिए एक फ़ुलफ़िलमेंट लाइब्रेरी है. इससे ये सुविधाएं मिलती हैं:

  • Actions on Google की सभी सुविधाओं के साथ काम करता है. इनमें मैसेज और रिच मल्टीमीडिया रिस्पॉन्स, खाते में साइन-इन, डेटा सेव करना, लेन-देन वगैरह शामिल हैं.
  • JavaScript में ऐब्स्ट्रैक्टेशन की एक लेयर देती है, जिसमें बातचीत का एचटीटीपी/JSON वेबहुक एपीआई शामिल होता है.
  • ये कार्रवाइयां, ग्राहकों को आइटम भेजने और Actions on Google प्लैटफ़ॉर्म के बीच हुई बातचीत से जुड़ी छोटी-मोटी जानकारी को हैंडल करने में मदद करती हैं.
  • पैकेज को मैनेज करने के लिए जाने-पहचाने टूल, जैसे कि npm या yarn का इस्तेमाल करके इंस्टॉल किया जा सकता है.
  • इससे बिना सर्वर वाले कंप्यूटिंग प्लैटफ़ॉर्म पर, फ़ुलफ़िलमेंट वेबहुक को आसानी से डिप्लॉय किया जा सकता है. जैसे, Firebase के लिए Cloud Functions या AWS Lambda. क्लाउड सेवा देने वाली कंपनी पर या खुद से होस्ट किए जाने वाले और खुद से मैनेज किए जाने वाले एनवायरमेंट पर भी, फ़ुलफ़िलमेंट वेबहुक होस्ट किया जा सकता है.
  • यह Node.js के v6.0.0 और इसके बाद के वर्शन पर काम करता है.

क्लाइंट लाइब्रेरी का इस्तेमाल Actions on Google के लिए Dialogflow इंटिग्रेशन या Actions SDK के साथ किया जा सकता है.

क्लाइंट लाइब्रेरी का इस्तेमाल करने के लिए पूरे कोड सैंपल देखने के लिए, सैंपल पेज पर जाएं.

एपीआई रेफ़रंस देखें

एपीआई रेफ़रंस को Actions on Google Node.js क्लाइंट लाइब्रेरी GitHub पेज पर होस्ट किया गया है.

आपने जहां से क्लाइंट लाइब्रेरी कोड डाउनलोड किया था उस डायरेक्ट्री से, यहां दिया गया कमांड चलाकर, रेफ़रंस की एक लोकल कॉपी भी जनरेट की जा सकती है:

yarn docs

जनरेट किए गए दस्तावेज़, उस डायरेक्ट्री के docs फ़ोल्डर में उपलब्ध होंगे जहां से आपने क्लाइंट लाइब्रेरी कोड को डाउनलोड किया है.

जानें कि यह सुविधा कैसे काम करती है

क्लाइंट लाइब्रेरी का इस्तेमाल करने से पहले, यह समझना फ़ायदेमंद होता है कि आपका फ़ुलफ़िलमेंट वेबहुक, उपयोगकर्ता के उन अनुरोधों को प्रोसेस करने के लिए किस तरह क्लाइंट लाइब्रेरी का इस्तेमाल करता है जो Actions on Google आपके ऑर्डर को पूरा करने के लिए भेजता है.

JavaScript में फ़ुलफ़िलमेंट वेबहुक बनाने पर, आप Google के Cloud Functions for Firebase या AWS Lambda जैसे बिना सर्वर वाले कंप्यूटिंग एनवायरमेंट पर अपना कोड डिप्लॉय और होस्ट कर सकते हैं. एक्सप्रेस वेब फ़्रेमवर्क का इस्तेमाल करके, अलग से काम किए बिना भी कोड को खुद होस्ट किया जा सकता है.

रनटाइम एनवायरमेंट में, फ़ुलफ़िलमेंट वेबहुक, क्लाइंट लाइब्रेरी में मौजूद फ़ंक्शन को कॉल कर सकता है, ताकि उपयोगकर्ता के अनुरोधों को प्रोसेस किया जा सके और उपयोगकर्ता आउटपुट में रेंडर करने के लिए, जवाब को Actions on Google पर वापस भेजा जा सके.

क्लाइंट लाइब्रेरी की मदद से, आपका पूरा वेबहुक जिन मुख्य टास्क को मैनेज करता है उनके बारे में नीचे खास जानकारी दी गई है:

पहली इमेज. Node.js क्लाइंट लाइब्रेरी का हाई-लेवल आर्किटेक्चर
  1. उपयोगकर्ता के अनुरोध पाना: जब कोई उपयोगकर्ता Google Assistant से क्वेरी करता है, तो Actions on Google प्लैटफ़ॉर्म आपके फ़ुलफ़िलमेंट वेबहुक को एक एचटीटीपी अनुरोध भेजता है; इस अनुरोध में एक JSON पेलोड शामिल होता है, जिसमें इंटेंट और अन्य डेटा शामिल होता है. जैसे, उपयोगकर्ता के इनपुट का रॉ टेक्स्ट और उपयोगकर्ता के डिवाइस की क्षमता. JSON पेलोड कॉन्टेंट के ज़्यादा उदाहरणों के लिए, Dialogflow वेबहुक फ़ॉर्मैट और बातचीत के वेबहुक फ़ॉर्मैट गाइड देखें.
  2. फ़्रेमवर्क कॉल फ़ॉर्मैट की पहचान करना: इस्तेमाल किए जा सकने वाले फ़्रेमवर्क के लिए, क्लाइंट लाइब्रेरी फ़्रेमवर्क के कॉल फ़ॉर्मैट का अपने-आप पता लगा लेती है. उदाहरण के लिए, अगर अनुरोध एक्सप्रेस वेब फ़्रेमवर्क से मिला हो या AWS Lambda से. साथ ही, उसे Actions on Google प्लैटफ़ॉर्म के साथ आसानी से कम्यूनिकेशन मैनेज करने का तरीका पता हो.
  3. सर्विस हैंडलर प्रोसेसिंग: क्लाइंट लाइब्रेरी, Dialogflow और Actions SDK के लिए बातचीत के एचटीटीपी/JSON वेबहुक एपीआई को एक सेवा फ़ंक्शन के तौर पर दिखाती है. आपका फ़ुलफ़िलमेंट वेबहुक, ग्लोबल app इंस्टेंस बनाने के लिए सही सेवा का इस्तेमाल करता है. app इंस्टेंस, एचटीटीपी अनुरोधों के लिए एक हैंडलर के तौर पर काम करता है. साथ ही, यह सेवा के खास प्रोटोकॉल को समझता है.
  4. बातचीत को प्रोसेस करना: क्लाइंट लाइब्रेरी, हर बातचीत की जानकारी को एक Conversation ऑब्जेक्ट के रूप में दिखाती है, जो app इंस्टेंस से जुड़ा होता है. आपका फ़ुलफ़िलमेंट वेबहुक, Conversation ऑब्जेक्ट का इस्तेमाल क्रॉस-बातचीत से सेव किए गए डेटा या स्थिति की जानकारी पाने, उपयोगकर्ताओं को जवाब भेजने या माइक बंद करने के लिए कर सकता है.
  5. मिडलवेयर प्रोसेसिंग: क्लाइंट लाइब्रेरी से, बातचीत की सेवाओं के लिए मिडलवेयर बनाने की सुविधा मिलती है. इसमें एक या उससे ज़्यादा ऐसे फ़ंक्शन होते हैं जिनके बारे में तय किया जाता है कि इंटेंट हैंडलर को कॉल करने से पहले क्लाइंट लाइब्रेरी अपने-आप चलती है. Conversation ऑब्जेक्ट में प्रॉपर्टी या हेल्पर क्लास जोड़ने के लिए, आपका फ़ुलफ़िलमेंट वेबहुक आपके मिडलवेयर का इस्तेमाल कर सकता है.
  6. इंटेंट हैंडलर प्रोसेसिंग: क्लाइंट लाइब्रेरी की मदद से, आपको उन इंटेंट के लिए हैंडलर तय करने की सुविधा मिलती है जिन्हें आपका फ़ुलफ़िलमेंट वेबहुक समझ सकता है. Dialogflow के लिए, क्लाइंट लाइब्रेरी अनुरोध को सही इंटेंट हैंडलर पर रूट करती है. इसके लिए, वह Dialogflow कंसोल में बताए गए इंटेंट के नाम की सटीक स्ट्रिंग पर मैप करती है. Actions SDK टूल के लिए, इसे Actions on Google से भेजी गई intent प्रॉपर्टी के आधार पर रूट किया जाता है.
  7. उपयोगकर्ताओं को जवाब भेजना: जवाब बनाने के लिए, फ़ुलफ़िलमेंट वेबहुक Conversation#ask() फ़ंक्शन को कॉल करता है. ज़्यादा से ज़्यादा रिस्पॉन्स बनाने के लिए, ask() फ़ंक्शन को कई बार कॉल किया जा सकता है. क्लाइंट लाइब्रेरी, रिस्पॉन्स को JSON पेलोड का इस्तेमाल करके एचटीटीपी अनुरोध में सीरीज़ के तौर पर क्रम से लगाती है और उसे Actions on Google को भेजती है. close() फ़ंक्शन का व्यवहार ask() जैसा ही होता है, लेकिन यह बातचीत को बंद कर देता है.

अपना लोकल डेवलपमेंट एनवायरमेंट सेट अप करना

फ़ुलफ़िलमेंट वेबहुक लागू करने से पहले, पक्का करें कि आपने क्लाइंट लाइब्रेरी को इंस्टॉल किया हो.

क्लाइंट लाइब्रेरी इंस्टॉल करना

अपने लोकल डेवलपमेंट एनवायरमेंट में क्लाइंट लाइब्रेरी को इंस्टॉल करने का सबसे आसान तरीका, npm या yarn जैसे पैकेज मैनेजर का इस्तेमाल करना है.

इंस्टॉल करने के लिए, टर्मिनल से इनमें से कोई एक निर्देश चलाएं:

  • अगर एनपीएम का इस्तेमाल किया जा रहा है: npm install actions-on-google
  • अगर ऊन का इस्तेमाल किया जा रहा है: yarn add actions-on-google

अपने प्रोजेक्ट फ़ोल्डर सेट अप करना

आपको फ़ुलफ़िलमेंट वेबहुक (Firebase के लिए Google का Cloud Functions, AWS Lambda या खुद होस्ट किया गया एक्सप्रेस) कहां डिप्लॉय करना है, इसके आधार पर आपको अपनी फ़ाइलें सेव करने के लिए, एक खास प्रोजेक्ट फ़ोल्डर स्ट्रक्चर बनाना पड़ सकता है.

उदाहरण के लिए, अगर 'Firebase के लिए Cloud Functions' का इस्तेमाल किया जा रहा है, तो Node.js और Firebase सीएलआई को सेट अप करने और Cloud Functions के लिए Firebase शुरू करने में बताए गए तरीके का इस्तेमाल करके, ज़रूरी प्रोजेक्ट फ़ोल्डर सेट अप किए जा सकते हैं. Firebase के लिए Cloud Functions के लिए, आप आम तौर पर /functions/index.js फ़ाइल में, फ़ुलफ़िलमेंट वेबहुक लिखते हैं.

ऐप्लिकेशन इंस्टेंस बनाना

Actions on Google, मैसेज भेजने के लिए आपके वेबहुक के साथ अनुरोध और जवाब देने के लिए खास मैसेजिंग फ़ॉर्मैट का इस्तेमाल करता है. यह इस बात पर निर्भर करता है कि Dialogflow का इस्तेमाल करके, बातचीत वाली कोई कार्रवाई बनाई जा रही है, ऐक्शन SDK टूल का इस्तेमाल किया जा रहा है या स्मार्ट होम ऐक्शन बनाया जा रहा है.

इन अलग-अलग अनुरोध और रिस्पॉन्स प्रोटोकॉल को दिखाने के लिए, क्लाइंट लाइब्रेरी में तीन सेवा फ़ंक्शन उपलब्ध कराए गए हैं:

बातचीत वेबहुक प्रोटोकॉल का इस्तेमाल, बातचीत की सुविधा देने वाली सेवाओं (Dialogflow और कार्रवाई SDK टूल) दोनों में किया जाता है, लेकिन हर सेवा में मैसेज को अलग-अलग तरीके से रैप किया जाता है.

app इंस्टेंस बनाने के लिए, किसी सेवा का इस्तेमाल किया जाता है. app इंस्टेंस, आपके वेबहुक के लिए ग्लोबल स्थिति और उसे पूरा करने के लॉजिक को इकट्ठा करता है. साथ ही, खास तौर पर सेवा देने वाले प्रोटोकॉल का इस्तेमाल करके, Actions on Google और कार्रवाई के बीच कम्यूनिकेशन मैनेज करता है.

आपके पास app इंस्टेंस की प्रॉपर्टी को कॉन्फ़िगर करने और इसके तरीकों को कॉल करने का विकल्प है. इससे, फ़ुलफ़िलमेंट वेबहुक के काम करने के तरीके को डायरेक्ट किया जा सकता है. आप app इंस्टेंस को बिना सर्वर वाले कंप्यूटिंग एनवायरमेंट में भी आसानी से प्लग कर सकते हैं. उदाहरण के लिए, 'Firebase के लिए Cloud Functions', जो एचटीटीपी अनुरोधों के लिए JavaScript फ़ंक्शन को हैंडलर के तौर पर स्वीकार करता है.

फ़ुलफ़िलमेंट वेबहुक में app इंस्टेंस बनाने के लिए, यह तरीका अपनाएं:

  1. 'actions-on-google' मॉड्यूल को इंपोर्ट करने के लिए, require() फ़ंक्शन को कॉल करें और अपनी पसंद की सेवा लोड करें. उदाहरण के लिए, नीचे दिया गया स्निपेट दिखाता है कि कैसे dialogflow सेवा और रिस्पॉन्स बनाने के लिए इस्तेमाल किए गए कुछ एलिमेंट को लोड किया जा सकता है. साथ ही, इसे dialogflow नाम वाले कॉन्सटैंट को असाइन करने का तरीका भी बताया गया है:

    // Import the service function and various response classes
    const {
      dialogflow,
      actionssdk,
      Image,
      Table,
      Carousel,
    } = require('actions-on-google');

    यहां, actions-on-google एक डिपेंडेंसी के बारे में बताया गया है, जो आपके प्रोजेक्ट फ़ोल्डर की package.json फ़ाइल में मौजूद है. उदाहरण के लिए, package.json फ़ाइल के इस उदाहरण को देखा जा सकता है.

    app इंस्टेंस लेते समय, आपके पास उन क्लास के बारे में बताने का विकल्प होता है जो ज़्यादा बेहतर जवाब, हेल्पर इंटेंट, और Actions on Google की ऐसी अन्य सुविधाएं दिखाएं जिनका आपको इस्तेमाल करना है. बातचीत का जवाब और हेल्पर इंटेंट मॉड्यूल के लिए, रेफ़रंस दस्तावेज़ देखें. इससे आपको मान्य क्लास की पूरी सूची लोड करने में मदद मिलेगी.

  2. लोड की गई सेवा को कॉल करके, app इंस्टेंस बनाएं. उदाहरण के लिए:

    const app = dialogflow();

  3. app इंस्टेंस को शुरू करने के दौरान कॉन्फ़िगर करने के लिए, सेवा को कॉल करते समय पहले आर्ग्युमेंट के तौर पर, options ऑब्जेक्ट दिया जा सकता है. (ज़्यादा जानकारी के लिए, DialogflowOptions देखें.) उदाहरण के लिए, नीचे दिया गया स्निपेट, { debug: true } फ़्लैग सेट करके उपयोगकर्ता के अनुरोध या जवाब से मिलने वाले रॉ JSON पेलोड को लॉग करने का तरीका बताता है:

const app = dialogflow({
  debug: true
});

इवेंट के लिए हैंडलर सेट करना

आपकी सेट की गई कार्रवाई के साथ उपयोगकर्ता इंटरैक्शन के लाइफ़साइकल के दौरान क्लाइंट लाइब्रेरी से बनाए गए Actions on Google से जुड़े इवेंट को प्रोसेस करने के लिए, आपको उपयोगकर्ता के अनुरोधों को प्रोसेस करने और जवाब भेजने के लिए, हैंडलर बनाने के लिए क्लाइंट लाइब्रेरी का इस्तेमाल करना होगा.

इन मुख्य इवेंट के लिए हैंडलर के तौर पर काम करने वाले फ़ंक्शन बनाए जा सकते हैं जिन्हें क्लाइंट लाइब्रेरी पहचानती है:

  • इंटेंट इवेंट: इंटेंट, ऐसे यूनीक आइडेंटिफ़ायर होते हैं जिन्हें Actions on Google आपके ऑर्डर को पूरा करने के लिए तब भेजता है, जब कोई उपयोगकर्ता किसी खास फ़ंक्शन का अनुरोध करता है. अगर Dialogflow का इस्तेमाल किया जा रहा है, तो यह Dialogflow से मिलता-जुलता है, जिसका मिलान आपके Dialogflow एजेंट के इंटेंट से किया जाता है.
  • गड़बड़ी वाले इवेंट: JavaScript या क्लाइंट लाइब्रेरी से जुड़ी कोई गड़बड़ी होने पर, गड़बड़ी के अपवाद को सही तरीके से प्रोसेस करने के लिए, app इंस्टेंस के catch फ़ंक्शन का इस्तेमाल किया जा सकता है. आपको एक ही catch फ़ंक्शन लागू करना चाहिए, ताकि उन सभी गड़बड़ियों को ठीक किया जा सके जिनके लिए ज़रूरी है.
  • फ़ॉलबैक इवेंट: फ़ॉलबैक इवेंट तब होता है, जब उपयोगकर्ता ऐसी क्वेरी भेजता है जिसे Actions on Google नहीं पहचान पाता. एक सामान्य फ़ॉलबैक हैंडलर रजिस्टर करने के लिए app इंस्टेंस के fallback फ़ंक्शन का इस्तेमाल किया जा सकता है. यह हैंडलर पूरा करने के अनुरोध के लिए किसी इंटेंट हैंडलर से मैच न होने पर ट्रिगर होगा. सभी फ़ॉलबैक इवेंट को मैनेज करने के लिए, आपको एक fallback फ़ंक्शन लागू करना होगा. अगर Dialogflow का इस्तेमाल किया जा रहा है, तो किसी अन्य इंटेंट के मेल न खाने पर, Dialogflow एक खास फ़ॉलबैक इंटेंट को ट्रिगर कर सकता है. आपको उस फ़ॉलबैक इंटेंट के लिए, इससे जुड़ा इंटेंट हैंडलर बनाना चाहिए.

जब भी उपयोगकर्ता आपकी सेट की गई कार्रवाई को अनुरोध भेजता है, तो app इंस्टेंस एक Conversation ऑब्जेक्ट बनाता है, जो उस बातचीत के सेशन को दिखाता है. इस ऑब्जेक्ट को, इंटेंट हैंडलर फ़ंक्शन में पहले फ़ंक्शन के तर्क के तौर पर पास किए गए conv वैरिएबल नाम से ऐक्सेस किया जाता है. उपयोगकर्ता को जवाब भेजने के लिए, आम तौर पर आपको अपने हैंडलर में conv ऑब्जेक्ट का इस्तेमाल करना होगा.

उपयोगकर्ता की क्वेरी में ऐसे पैरामीटर भी शामिल हो सकते हैं जिन्हें आपकी सेट की गई कार्रवाई, जवाबों को बेहतर बनाने के लिए एक्सट्रैक्ट कर सकती है और उनका इस्तेमाल कर सकती है.

  • अगर आप कार्रवाई SDK टूल का इस्तेमाल कर रहे हैं, तो आप कार्रवाई पैकेज में पैरामीटर तय करते हैं. इंटेंट से पैरामीटर को एक्सट्रैक्ट करने के तरीके का उदाहरण देखने के लिए, एलिज़ा कोड सैंपल देखें.
  • अगर Dialogflow का इस्तेमाल किया जा रहा है, तो params वैरिएबल के ज़रिए पैरामीटर वैल्यू को ऐक्सेस किया जा सकता है. Dialogflow में पैरामीटर के साथ इंटेंट को हैंडल करने के उदाहरण देखने के लिए, पैरामीटर और कॉन्टेक्स्ट ऐक्सेस करना लेख पढ़ें.

इंटेंट के लिए हैंडलर सेट करें

अगर आपको किसी इंटेंट के लिए हैंडलर सेट करना है, तो अपने app इंस्टेंस के intent() फ़ंक्शन को कॉल करें. उदाहरण के लिए, अगर Dialogflow का इस्तेमाल किया जा रहा है, तो यह DialogflowApp#intent() फ़ंक्शन है. आर्ग्युमेंट में, इंटेंट का नाम बताएं और हैंडलर फ़ंक्शन दें.

अगर Dialogflow का इस्तेमाल किया जा रहा है, तो आपको एजेंट में हर इंटेंट के लिए हैंडलर सेट करने की ज़रूरत नहीं है. इसके बजाय, Dialogflow के पहले से मौजूद रिस्पॉन्स हैंडलर का इस्तेमाल किया जा सकता है. इससे इंटेंट को अपने-आप हैंडल किया जा सकता है. इसके लिए, अपने हैंडलर फ़ंक्शन को लागू नहीं किया जाता. उदाहरण के लिए, डिफ़ॉल्ट वेलकम इंटेंट को इस तरह Dialogflow को असाइन किया जा सकता है.

नीचे दिए गए उदाहरण में 'ग्रीटिंग' और 'अलविदा' इंटेंट के लिए इंटेंट हैंडलर दिखाए गए हैं. पहचान छिपाने वाले उनके हैंडलर फ़ंक्शन एक conv आर्ग्युमेंट लेते हैं और conv.ask()फ़ंक्शन के ज़रिए उपयोगकर्ता को आसान स्ट्रिंग रिस्पॉन्स भेजते हैं:

app.intent('Default Welcome Intent', (conv) => {
  conv.ask('How are you?');
});

app.intent('bye', (conv) => {
  conv.close('See you later!');
});

ध्यान दें कि close() फ़ंक्शन, ask() की तरह ही होता है. अंतर सिर्फ़ इतना है कि यह माइक को बंद कर देता है और बातचीत खत्म हो जाती है.

इंटेंट के लिए हैंडलर बनाने के तरीके के बारे में ज़्यादा जानने के लिए, अपना इंटेंट हैंडलर बनाएं वाला लेख पढ़ें.

गड़बड़ी वाले इवेंट के लिए हैंडलर सेट करना

अगर गड़बड़ियों के लिए हैंडलर सेट करना है, तो अपने app इंस्टेंस के catch() फ़ंक्शन को कॉल करें. (उदाहरण के लिए, अगर Dialogflow का इस्तेमाल किया जा रहा है, तो यह DialogflowApp#catch() फ़ंक्शन है.)

इस उदाहरण में एक आसान कैच एरर हैंडलर दिखाया गया है, जो कंसोल आउटपुट को गड़बड़ी भेजता है. साथ ही, यह conv.ask()फ़ंक्शन के ज़रिए उपयोगकर्ता को संकेत देने के लिए, एक आसान स्ट्रिंग रिस्पॉन्स भेजता है:

app.catch((conv, error) => {
  console.error(error);
  conv.ask('I encountered a glitch. Can you say that again?');
});

फ़ॉलबैक इवेंट के लिए हैंडलर सेट करना

अगर फ़ुलफ़िलमेंट के लिए आने वाले अनुरोध के लिए कोई इंटेंट मैच नहीं होता है, तो सामान्य फ़ॉलबैक हैंडलर सेट करने के लिए अपने app इंस्टेंस के fallback() फ़ंक्शन को कॉल करें. (उदाहरण के लिए, अगर Dialogflow का इस्तेमाल किया जा रहा है, तो यह DialogflowApp#fallback() फ़ंक्शन है.)

इस उदाहरण में, एक आसान फ़ॉलबैक हैंडलर दिखाया गया है, जो conv.ask()फ़ंक्शन के ज़रिए उपयोगकर्ता को प्रॉम्प्ट देने के लिए, एक आसान स्ट्रिंग रिस्पॉन्स भेजता है:

app.fallback((conv) => {
  conv.ask(`I couldn't understand. Can you say that again?`);
});

अपना इंटेंट हैंडलर बनाएं

जब क्लाइंट लाइब्रेरी के साथ इंटेंट हैंडलर लागू किए जाते हैं, तब इस सेक्शन में इस्तेमाल के कुछ सामान्य उदाहरणों के बारे में बताया गया है. क्लाइंट लाइब्रेरी, इंटेंट से कैसे मेल खाती है, यह जानने के लिए जानें कि यह कैसे काम करता है सेक्शन में 'इंटेंट हैंडलर प्रोसेसिंग' सेक्शन देखें.

पैरामीटर और कॉन्टेक्स्ट ऐक्सेस करें

अगर Dialogflow का इस्तेमाल किया जा रहा है, तो स्थिति की जानकारी बनाए रखने और बातचीत के फ़्लो को कंट्रोल करने के लिए, Dialogflow एजेंट में पैरामीटर और कॉन्टेक्स्ट तय किए जा सकते हैं.

पैरामीटर, उपयोगकर्ता की क्वेरी में अहम शब्दों, वाक्यांशों या वैल्यू को कैप्चर करने में काम आते हैं. Dialogflow, रनटाइम के समय उपयोगकर्ता की क्वेरी से जुड़े पैरामीटर एक्सट्रैक्ट करता है. साथ ही, आप अपने फ़ुलफ़िलमेंट वेबहुक में इन पैरामीटर वैल्यू को प्रोसेस करके, यह तय कर सकते हैं कि उपयोगकर्ताओं को कैसे जवाब देना है.

जब भी उपयोगकर्ता आपकी सेट की गई कार्रवाई को अनुरोध भेजता है, तो DialogflowApp इंस्टेंस एक parameters ऑब्जेक्ट बनाता है. यह ऑब्जेक्ट, उन पैरामीटर वैल्यू को दिखाता है जिन्हें Dialogflow उस अनुरोध से एक्सट्रैक्ट करता है. इस ऑब्जेक्ट को params वैरिएबल नाम से ऐक्सेस किया गया है.

इस स्निपेट में दिखाया गया है कि जब उपयोगकर्ता अनुरोध भेजता है, तब params ऑब्जेक्ट से name प्रॉपर्टी को कैसे ऐक्सेस किया जा सकता है:

app.intent('Default Welcome Intent', (conv, params) => {
  conv.ask(`How are you, ${params.name}?`);
});

यही काम करने वाला वैकल्पिक स्निपेट यहां दिया गया है. कर्ली ब्रेसेस ({}), parameters ऑब्जेक्ट से name प्रॉपर्टी लेने और उसे लोकल वैरिएबल के तौर पर इस्तेमाल करने के लिए, JavaScript को डिस्ट्रक्चर करते हैं:

app.intent('Default Welcome Intent', (conv, {name}) => {
  conv.ask(`How are you, ${name}?`);
});

नीचे दिए गए स्निपेट में, पैरामीटर का नाम full-name है, लेकिन इसे फिर से व्यवस्थित किया गया है. साथ ही, इसे name नाम के लोकल वैरिएबल को असाइन किया गया है:

app.intent('Default Welcome Intent', (conv, {'full-name': name}) => {
  conv.ask(`How are you, ${name}?`);
});

कॉन्टेक्स्ट, Dialogflow की एक बेहतर सुविधा है. आप बातचीत की स्थिति, फ़्लो, और ब्रांच को मैनेज करने के लिए कॉन्टेक्स्ट का इस्तेमाल कर सकते हैं. क्लाइंट लाइब्रेरी, DialogflowConversation#contexts ऑब्जेक्ट की मदद से कॉन्टेक्स्ट का ऐक्सेस देती है. इस स्निपेट में बताया गया है कि फ़ुलफ़िलमेंट वेबहुक में, संदर्भ ऑब्जेक्ट को प्रोग्राम के हिसाब से कैसे सेट किया जा सकता है. साथ ही, संदर्भ ऑब्जेक्ट को वापस पाने का तरीका भी बताया गया है:

app.intent('intent1', (conv) => {
  const lifespan = 5;
  const contextParameters = {
    color: 'red',
  };
  conv.contexts.set('context1', lifespan, contextParameters);
  // ...
  conv.ask('...');
});

app.intent('intent2', (conv) => {
  const context1 = conv.contexts.get('context1');
  const contextParameters = context1.parameters;
  // ...
  conv.ask('...');
});

app.intent('intent3', (conv) => {
  conv.contexts.delete('context1');
  // ...
  conv.ask('...');
});

हेल्पर इंटेंट के नतीजे ऐक्सेस करें

सुविधा के लिए, क्लाइंट लाइब्रेरी में हेल्पर इंटेंट क्लास की सुविधा है. इसमें, उपयोगकर्ता के ऐसे सामान्य डेटा को रैप किया जाता है जिसका अक्सर अनुरोध किया जाता है. इनमें कई Actions on Google हेल्पर इंटेंट के नतीजे दिखाने वाली क्लास शामिल हैं. हेल्पर इंटेंट का इस्तेमाल तब किया जाता है, जब Google Assistant से बातचीत के कुछ हिस्सों को हैंडल करना हो. ऐसे में, उपयोगकर्ता को बातचीत जारी रखने के लिए इनपुट देने होते हैं.

उदाहरण: पुष्टि करने वाले हेल्पर के नतीजे

पुष्टि करने में मदद करने वाले हेल्पर इंटेंट की मदद से, उपयोगकर्ता से हां या नहीं में पुष्टि करने का अनुरोध किया जा सकता है और उसका जवाब पाया जा सकता है. इस स्निपेट से पता चलता है कि पुष्टि करने वाले हेल्पर इंटेंट से मिले नतीजों के आधार पर, आपका वेबहुक किस तरह अपने रिस्पॉन्स को पसंद के मुताबिक बना सकता है. बेहतर उदाहरण के लिए, Confirmation क्लास के रेफ़रंस दस्तावेज़ देखें.

// Create Dialogflow intent with `actions_intent_CONFIRMATION` event
app.intent('get_confirmation', (conv, input, confirmation) => {
  if (confirmation) {
    conv.close(`Great! I'm glad you want to do it!`);
  } else {
    conv.close(`That's okay. Let's not do it now.`);
  }
});

यह स्निपेट दिखाता है कि कैरसेल के लिए उपयोगकर्ता के इनपुट के आधार पर, कार्रवाई पूरा करने वाला वेबहुक किस तरह अपने रिस्पॉन्स को पसंद के मुताबिक बना सकता है. कैरसेल कॉम्पोनेंट की मदद से, आपकी सेट की गई कार्रवाई में ऐसे विकल्प दिखाए जाते हैं जिन्हें उपयोगकर्ता चुन सकते हैं. बेहतर उदाहरण के लिए, Carousel क्लास का रेफ़रंस दस्तावेज़ देखें.

app.intent('carousel', (conv) => {
  conv.ask('Which of these looks good?');
  conv.ask(new Carousel({
    items: {
      car: {
        title: 'Car',
        description: 'A four wheel vehicle',
        synonyms: ['automobile', 'vehicle'],
      },
      plane: {
        title: 'Plane',
        description: 'A flying machine',
        synonyms: ['aeroplane', 'jet'],
      }
    }
  }));
});

// Create Dialogflow intent with `actions_intent_OPTION` event
app.intent('get_carousel_option', (conv, input, option) => {
  if (option === 'one') {
    conv.close(`Number one is a great choice!`);
  } else {
    conv.close(`Number ${option} is a great choice!`);
  }
});

बातचीत के जवाब वाले ऑब्जेक्ट कॉन्फ़िगर करें

क्लाइंट लाइब्रेरी में बातचीत का जवाब देने की क्लास उपलब्ध कराई जाती हैं. इनमें ऐसे रिच रिस्पॉन्स या मल्टीमीडिया एलिमेंट शामिल होते हैं जिन्हें आपकी सेट की गई कार्रवाई में भेजा जा सकता है. आम तौर पर, ये जवाब या एलिमेंट तब भेजे जाते हैं, जब उपयोगकर्ताओं को बातचीत जारी रखने के लिए कोई इनपुट देने की ज़रूरत नहीं होती.

उदाहरण: इमेज

यह स्निपेट दिखाता है कि फ़ुलफ़िलमेंट वेबहुक, रिस्पॉन्स में कैसे Image भेज सकता है. यह लाइब्रेरी, BasicCard रिस्पॉन्स के साथ अपने-आप अटैच हो जाएगी:

app.intent('Default Welcome Intent', (conv) => {
  conv.ask('Hi, how is it going?');
  conv.ask(`Here's a picture of a cat`);
  conv.ask(new Image({
    url: '/web/fundamentals/accessibility/semantics-builtin/imgs/160204193356-01-cat-500.jpg',
    alt: 'A cat',
  }));
});

एसिंक्रोनस फ़ंक्शन कॉल करें

Actions on Google Node.js क्लाइंट लाइब्रेरी को एसिंक्रोनस प्रोग्रामिंग के लिए डिज़ाइन किया गया है. आपका इंटेंट हैंडलर एक ऐसा प्रॉमिस दिखा सकता है जो तब पूरा होता है, जब आपका फ़ुलफ़िलमेंट वेबहुक रिस्पॉन्स जनरेट करता है.

इस स्निपेट में दिखाया गया है कि किस तरह से प्रॉमिस ऑब्जेक्ट को रिटर्न करने के लिए, एसिंक्रोनस फ़ंक्शन कॉल करने का तरीका बताया गया है. इसके बाद, अगर फ़ुलफ़िलमेंट वेबहुक को 'ग्रीटिंग' इंटेंट मिलता है, तो मैसेज के साथ जवाब दें. इस स्निपेट में, प्रॉमिस यह पक्का करता है कि ग्राहक को पूरा करने के लिए वेबहुक से बातचीत का जवाब सिर्फ़ तब मिले, जब बाहरी एपीआई कॉल का प्रॉमिस पूरा हो गया हो.

इस उदाहरण में, हम मौसम का डेटा पाने के लिए नकली एपीआई का इस्तेमाल कर रहे हैं.

/**
 * Make an external API call to get weather data.
 * @return {Promise<string>}
 */
const forecast = () => {
  // ...
};

app.intent('Default Welcome Intent', (conv) => {
  return forecast().then((weather) => {
    conv.ask('How are you?');
    conv.ask(`Today's weather is ${weather}.`);
  });
});

नीचे दिए गए व्यवस्थित कोड स्निपेट का असर भी यही होता है. हालांकि, इसके लिए ECMA 2017 (Node.js वर्शन 8) में पेश की गई async await सुविधा का इस्तेमाल किया गया है. 'Firebase के लिए Cloud Functions' के साथ इस कोड का इस्तेमाल करने के लिए, पक्का करें कि आप Firebase टूल के सही वर्शन का इस्तेमाल कर रहे हैं और आपके पास सही कॉन्फ़िगरेशन है.

app.intent('Default Welcome Intent', async (conv) => {
  const weather = await forecast();
  conv.ask('How are you?');
  conv.ask(`Today's weather is ${weather}.`);
});

बातचीत का डेटा सेव करें

क्लाइंट लाइब्रेरी, फ़ुलफ़िलमेंट वेबहुक की मदद से आने वाले समय में, बातचीत में डेटा सेव करने की सुविधा देती है. डेटा स्टोरेज के लिए, मुख्य चीज़ों का इस्तेमाल किया जा सकता है:

  • DialogflowConversation#data या ActionsSdkConversation#data: उपयोगकर्ता और आपकी सेट की गई कार्रवाई के बीच बातचीत वाले एक सेशन के दौरान, डेटा को JSON फ़ॉर्मैट में सेव करता है.
  • Conversation#user.storage: यह डेटा को JSON फ़ॉर्मैट में, बातचीत के एक से ज़्यादा सेशन के डेटा को सेव करता है.

इस स्निपेट में दिखाया गया है कि फ़ुलफ़िलमेंट वेबहुक, आपकी तय की गई प्रॉपर्टी (someProperty) में डेटा को कैसे सेव कर सकता है और उसे Conversation#user.storage ऑब्जेक्ट से कैसे अटैच कर सकता है. ज़्यादा जानकारी के लिए, Conversation#user.storage क्लास के लिए रेफ़रंस दस्तावेज़ देखें.

app.intent('Default Welcome Intent', (conv) => {
  conv.user.storage.someProperty = 'someValue';
  conv.ask('...');
});

Conversation#user ऑब्जेक्ट का इस्तेमाल, उपयोगकर्ता के बारे में जानकारी पाने के लिए किया जा सकता है. इसमें स्ट्रिंग आइडेंटिफ़ायर और निजी जानकारी भी शामिल होती है. conv.user.name.display और conv.user.email जैसे कुछ फ़ील्ड के लिए NAME के लिए conv.ask(new Permission) और 'Google साइन इन' के लिए conv.ask(new SignIn) का अनुरोध करना ज़रूरी होता है.

const {Permission} = require('actions-on-google');
app.intent('Default Welcome Intent', (conv) => {
  if (conv.user.last.seen) {
    conv.ask('Welcome back! How are you?');
  } else {
    conv.ask('Nice to meet you! How are you doing?');
  }
});

app.intent('permission', (conv) => {
  conv.ask(new Permission({
    context: 'To greet you personally',
    permissions: 'NAME',
  }));
});

// Create Dialogflow intent with `actions_intent_PERMISSION` event
app.intent('get_permission', (conv, input, granted) => {
  if (granted) {
    conv.close(`Hi ${conv.user.name.display}!`);
  } else {
    // User did not grant permission
    conv.close(`Hello!`);
  }
});

मिडलवेयर से स्केलिंग

मिडलवेयर की मदद से क्लाइंट लाइब्रेरी को बढ़ाया जा सकता है.

मिडलवेयर लेयर में आपके तय किए गए एक या उससे ज़्यादा फ़ंक्शन होते हैं. इंटेंट हैंडलर को कॉल करने से पहले क्लाइंट लाइब्रेरी अपने-आप चलती है. मिडलवेयर लेयर का इस्तेमाल करके, Conversation इंस्टेंस में बदलाव किया जा सकता है और अतिरिक्त फ़ंक्शन जोड़े जा सकते हैं.

Dialogflow और Actions SDK टूल की सेवाएं, एक app.middleware() फ़ंक्शन दिखाती हैं. इससे, Conversation इंस्टेंस में प्रॉपर्टी या हेल्पर क्लास जोड़ी जा सकती हैं.

यहां दिए गए स्निपेट में एक उदाहरण दिया गया है कि मिडलवेयर का इस्तेमाल कैसे किया जा सकता है:

class Helper {
  constructor(conv) {
    this.conv = conv;
  }

  func1() {
    this.conv.ask(`What's up?`);
  }
}

app.middleware((conv) => {
  conv.helper = new Helper(conv);
});

app.intent('Default Welcome Intent', (conv) => {
  conv.helper.func1();
});

अपना ऐप्लिकेशन एक्सपोर्ट करना

किसी वेब फ़्रेमवर्क या बिना सर्वर वाले कंप्यूटिंग प्लैटफ़ॉर्म के लिए, फ़ुलफ़िलमेंट वेबहुक दिखाने के लिए, आपको app ऑब्जेक्ट को सार्वजनिक तौर पर ऐक्सेस किए जा सकने वाले वेबहुक के तौर पर एक्सपोर्ट करना होगा. क्लाइंट लाइब्रेरी की मदद से, कई एनवायरमेंट को आसानी से डिप्लॉय किया जा सकता है.

यहां दिए गए स्निपेट से पता चलता है कि अलग-अलग रनटाइम में, app को कैसे एक्सपोर्ट किया जा सकता है:

उदाहरण: Firebase के लिए Cloud Functions

const functions = require('firebase-functions');
// ... app code here
exports.fulfillment = functions.https.onRequest(app);

उदाहरण: Dialogflow इनलाइन एडिटर

const functions = require('firebase-functions');

// ... app code here

// Exported function name must be 'dialogflowFirebaseFulfillment'
exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);

उदाहरण: सेल्फ़-होस्ट किया गया एक्सप्रेस सर्वर (आसान)

const express = require('express');
const bodyParser = require('body-parser');  

// ... app code here

express().use(bodyParser.json(), app).listen(3000);

उदाहरण: खुद से होस्ट किया गया एक्सप्रेस सर्वर (एक से ज़्यादा रूट)

const express = require('express');
const bodyParser = require('body-parser');

// ... app code here

const expressApp = express().use(bodyParser.json());

expressApp.post('/fulfillment', app);

expressApp.listen(3000);

उदाहरण: AWS Lambda API गेटवे

// ... app code here

exports.fulfillment = app;