वेबहुक

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

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

वेबहुक ट्रिगर और हैंडलर

आपकी सेट की गई कार्रवाइयां, कॉल करने के इंटेंट या सीन में वेबहुक को ट्रिगर कर सकती हैं, जो आपके फ़ुलफ़िलमेंट एंडपॉइंट पर एक अनुरोध भेजता है. आपके फ़ुलफ़िलमेंट में वेबहुक हैंडलर शामिल हैं, जो अनुरोध में JSON पेलोड को प्रोसेस करते हैं. वेबहुक को इन स्थितियों में ट्रिगर किया जा सकता है:

  • कॉल करने के लिए इस्तेमाल किए जाने वाले इंटेंट के मिलान के बाद
  • किसी सीन के अंदर आने के दौरान
  • किसी सीन की स्थिति के स्टेज में स्थिति के सही होने के बाद
  • किसी सीन के स्लॉट-फ़िलिंग स्टेज के दौरान
  • किसी सीन के इनपुट स्टेज में इंटेंट मैच होने के बाद

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

पेलोड

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

अनुरोध का उदाहरण

{
  "handler": {
    "name": "handler_name"
  },
  "intent": {
    "name": "actions.intent.MAIN",
    "params": {},
    "query": ""
  },
  "scene": {
    "name": "SceneName",
    "slotFillingStatus": "UNSPECIFIED",
    "slots": {}
  },
  "session": {
    "id": "example_session_id",
    "params": {},
    "typeOverrides": []
  },
  "user": {
    "locale": "en-US",
    "params": {
      "verificationStatus": "VERIFIED"
    }
  },
  "home": {
    "params": {}
  },
  "device": {
    "capabilities": [
      "SPEECH",
      "RICH_RESPONSE",
      "LONG_FORM_AUDIO"
    ]
  }
}

रिस्पॉन्स का उदाहरण

{
  "session": {
    "id": "example_session_id",
    "params": {}
  },
  "prompt": {
    "override": false,
    "firstSimple": {
      "speech": "Hello World.",
      "text": ""
    }
  },
  "scene": {
    "name": "SceneName",
    "slots": {},
    "next": {
      "name": "actions.scene.END_CONVERSATION"
    }
  }
}

रनटाइम इंटरैक्शन

नीचे दिए गए सेक्शन में उन सामान्य कामों के बारे में बताया गया है जिन्हें आप अपने वेबहुक हैंडलर में कर सकते हैं.

प्रॉम्प्ट भेजें

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

Node.js

app.handle('rich_response', conv => {
  conv.add('This is a card rich response.');
  conv.add(new Card({
    title: 'Card Title',
    subtitle: 'Card Subtitle',
    text: 'Card Content',
    image: new Image({
      url: 'https://developers.google.com/assistant/assistant_96.png',
      alt: 'Google Assistant logo'
    })
  }));
});

रिस्पॉन्स JSON

{
  "session": {
    "id": "example_session_id",
    "params": {}
  },
  "prompt": {
    "override": false,
    "content": {
      "card": {
        "title": "Card Title",
        "subtitle": "Card Subtitle",
        "text": "Card Content",
        "image": {
          "alt": "Google Assistant logo",
          "height": 0,
          "url": "https://developers.google.com/assistant/assistant_96.png",
          "width": 0
        }
      }
    },
    "firstSimple": {
      "speech": "This is a card rich response.",
      "text": ""
    }
  }
}

इंटेंट पैरामीटर पढ़ें

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

Node.js

conv.intent.params['param_name'].original
conv.intent.params['param_name'].resolved

JSON के लिए अनुरोध करें

{
  "handler": {
    "name": "handler_name"
  },
  "intent": {
    "name": "intent_name",
    "params": {
      "slot_name": {
        "original": "1",
        "resolved": 1
      }
    },
    "query": ""
  },
  "scene": {
    "name": "SceneName",
    "slotFillingStatus": "UNSPECIFIED",
    "slots": {},
    "next": {
      "name": "actions.scene.END_CONVERSATION"
    }
  },
  "session": {
    "id": "session_id",
    "params": {},
    "typeOverrides": []
  },
  "user": {
    "locale": "en-US",
    "params": {
      "verificationStatus": "VERIFIED"
    }
  },
  "home": {
    "params": {}
  },
  "device": {
    "capabilities": [
      "SPEECH",
      "RICH_RESPONSE",
      "LONG_FORM_AUDIO"
    ]
  }
}

उपयोगकर्ता की स्थान-भाषा पढ़ें

यह वैल्यू, Google Assistant पर उपयोगकर्ता की स्थान-भाषा की सेटिंग से मेल खाती है.

Node.js

conv.user.locale

JSON

{
  "handler": {
    "name": "handler_name"
  },
  "intent": {
    "name": "actions.intent.MAIN",
    "params": {},
    "query": ""
  },
  "scene": {
    "name": "SceneName",
    "slotFillingStatus": "UNSPECIFIED",
    "slots": {}
  },
  "session": {
    "id": "session_id",
    "params": {},
    "typeOverrides": []
  },
  "user": {
    "locale": "en-US",
    "params": {
      "verificationStatus": "VERIFIED"
    }
  },
  "home": {
    "params": {}
  },
  "device": {
    "capabilities": [
      "SPEECH",
      "RICH_RESPONSE",
      "LONG_FORM_AUDIO"
    ]
  }
}

पढ़ने और लिखने की सुविधा का स्टोरेज

स्टोरेज की अलग-अलग सुविधाओं को इस्तेमाल करने के तरीके से जुड़ी पूरी जानकारी के लिए, स्टोरेज से जुड़ा दस्तावेज़ देखें.

Node.js

//read
conv.session.params.key
conv.user.params.key
conv.home.params.key

// write
conv.session.params.key = value
conv.user.params.key = value
conv.home.params.key = value 

JSON के लिए अनुरोध करें

{
  "handler": {
    "name": "handler_name"
  },
  "intent": {
    "name": "actions.intent.MAIN",
    "params": {},
    "query": ""
  },
  "scene": {
    "name": "SceneName",
    "slotFillingStatus": "UNSPECIFIED",
    "slots": {}
  },
  "session": {
    "id": "session_id",
    "params": {
      "key": "value"
    },
    "typeOverrides": [],
    "languageCode": ""
  },
  "user": {
    "locale": "en-US",
    "params": {
      "verificationStatus": "VERIFIED",
      "key": "value"
    }
  },
  "home": {
    "params": {
      "key": "value"
    }
  },
  "device": {
    "capabilities": [
      "SPEECH",
      "RICH_RESPONSE",
      "LONG_FORM_AUDIO"
    ]
  }
}

रिस्पॉन्स JSON

{
  "session": {
    "id": "session_id",
    "params": {
      "key": "value"
    }
  },
  "prompt": {
    "override": false,
    "firstSimple": {
      "speech": "Hello world.",
      "text": ""
    }
  },
  "user": {
    "locale": "en-US",
    "params": {
      "verificationStatus": "VERIFIED",
      "key": "value"
    }
  },
  "home": {
    "params": {
      "key": "value"
    }
  }
}

डिवाइस की सुविधाएं देखें

यह देखा जा सकता है कि डिवाइस अलग-अलग अनुभव दे सकता है या नहीं.

Node.js

const supportsRichResponse = conv.device.capabilities.includes("RICH_RESPONSE");
const supportsLongFormAudio = conv.device.capabilities.includes("LONG_FORM_AUDIO");
const supportsSpeech = conv.device.capabilities.includes("SPEECH");
const supportsInteractiveCanvas = conv.device.capabilities.includes("INTERACTIVE_CANVAS");

JSON के लिए अनुरोध करें

{
  "handler": {
    "name": "handler_name"
  },
  "intent": {
    "name": "actions.intent.MAIN",
    "params": {},
    "query": ""
  },
  "scene": {
    "name": "SceneName",
    "slotFillingStatus": "UNSPECIFIED",
    "slots": {}
  },
  "session": {
    "id": "session_id",
    "params": {},
    "typeOverrides": [],
    "languageCode": ""
  },
  "user": {
    "locale": "en-US",
    "params": {
      "verificationStatus": "VERIFIED"
    }
  },
  "home": {
    "params": {}
  },
  "device": {
    "capabilities": [
      "SPEECH",
      "RICH_RESPONSE",
      "LONG_FORM_AUDIO",
      "INTERACTIVE_CANVAS"
    ]
  }
}

प्लैटफ़ॉर्म की क्षमताओं की पूरी सूची के लिए, Capability रेफ़रंस देखें.

रनटाइम के टाइप में बदलाव

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

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

Node.js

conv.session.typeOverrides = [{
    name: type_name,
    mode: 'TYPE_REPLACE',
    synonym: {
      entries: [
        {
          name: 'ITEM_1',
          synonyms: ['Item 1', 'First item']
        },
        {
          name: 'ITEM_2',
          synonyms: ['Item 2', 'Second item']
       },
       {
          name: 'ITEM_3',
          synonyms: ['Item 3', 'Third item']
        },
        {
          name: 'ITEM_4',
          synonyms: ['Item 4', 'Fourth item']
        },
    ]
  }
}];

रिस्पॉन्स JSON

{
  "session": {
    "id": "session_id",
    "params": {},
    "typeOverrides": [
      {
        "name": "type_name",
        "synonym": {
          "entries": [
            {
              "name": "ITEM_1",
              "synonyms": [
                "Item 1",
                "First item"
              ]
            },
            {
              "name": "ITEM_2",
              "synonyms": [
                "Item 2",
                "Second item"
              ]
            },
            {
              "name": "ITEM_3",
              "synonyms": [
                "Item 3",
                "Third item"
              ]
            },
            {
              "name": "ITEM_4",
              "synonyms": [
                "Item 4",
                "Fourth item"
              ]
            }
          ]
        },
        "typeOverrideMode": "TYPE_REPLACE"
      }
    ]
  },
  "prompt": {
    "override": false,
    "firstSimple": {
      "speech": "This is an example prompt.",
      "text": "This is an example prompt."
    }
  }
}

स्पीच बायिंग उपलब्ध कराएं

स्पीच बायिंग, एनएलयू को हिंट देने की सुविधा देता है, ताकि इंटेंट मैचिंग को बेहतर बनाया जा सके. ज़्यादा से ज़्यादा 1,000 एंट्री जोड़ी जा सकती हैं.

Node.js

conv.expected.speech = ['value_1', 'value_2']
conv.expected.language = 'locale_string'

रिस्पॉन्स JSON

{
  "session": {
    "id": "session_id",
    "params": {}
  },
  "prompt": {
    "override": false,
    "firstSimple": {
      "speech": "This is an example prompt.",
      "text": "This is an example prompt."
    }
  },
  "expected": {
    "speech": "['value_1', 'value_2']",
    "language": "locale_string"
  }
}

ट्रांज़िशन सीन

अपने Actions प्रोजेक्ट में स्टैटिक ट्रांज़िशन तय करने के अलावा, रनटाइम के दौरान सीन ट्रांज़िशन की वजह भी बन सकती है.

Node.js

app.handle('transition_to_hidden_scene', conv => {
  // Dynamic transition
  conv.scene.next.name = "HiddenScene";
});

रिस्पॉन्स JSON

{
  "session": {
    "id": "session_id",
    "params": {}
  },
  "prompt": {
    "override": false,
    "firstSimple": {
      "speech": "This is an example prompt.",
      "text": ""
    }
  },
  "scene": {
    "name": "SceneName",
    "slots": {},
    "next": {
      "name": "HiddenScene"
    }
  }
}

सीन के स्लॉट पढ़ें

स्लॉट भरने के दौरान, स्लॉट की पुष्टि करने या स्लॉट भरने की स्थिति (SlotFillingStatus) देखने के लिए, फ़ुलफ़िलमेंट का इस्तेमाल किया जा सकता है.

Node.js

conv.scene.slotFillingStatus  // FINAL means all slots are filled
conv.scene.slots  // Object that contains all the slots
conv.scene.slots['slot_name'].<property_name> // Accessing a specific slot's properties

उदाहरण के लिए, मान लें कि आपको किसी जवाब से टाइम ज़ोन एक्सट्रैक्ट करना है. इस उदाहरण में, स्लॉट का नाम datetime1 है. टाइम ज़ोन पाने के लिए, आपको इस्तेमाल करना होगा:

conv.scene.slots['datetime1'].value.time_zone.id

JSON के लिए अनुरोध करें

{
  "handler": {
    "name": "handler_name"
  },
  "intent": {
    "name": "",
    "params": {
      "slot_name": {
        "original": "1",
        "resolved": 1
      }
    },
    "query": ""
  },
  "scene": {
    "name": "SceneName",
    "slotFillingStatus": "FINAL",
    "slots": {
      "slot_name": {
        "mode": "REQUIRED",
        "status": "SLOT_UNSPECIFIED",
        "updated": true,
        "value": 1
      }
    },
    "next": {
      "name": "actions.scene.END_CONVERSATION"
    }
  },
  "session": {
    "id": "session_id",
    "params": {
      "slot_name": 1
    },
    "typeOverrides": []
  },
  "user": {
    "locale": "en-US",
    "params": {
      "verificationStatus": "VERIFIED"
    }
  },
  "home": {
    "params": {}
  },
  "device": {
    "capabilities": [
      "SPEECH",
      "RICH_RESPONSE",
      "LONG_FORM_AUDIO"
    ]
  }
}

सीन स्लॉट अमान्य करें

आपके पास स्लॉट को रद्द करने और उपयोगकर्ता से नई वैल्यू देने का विकल्प है.

Node.js

conv.scene.slots['slot_name'].status = 'INVALID'

रिस्पॉन्स JSON

{
  "session": {
    "id": "session_id",
    "params": {
      "slot_name": 1
    }
  },
  "prompt": {
    "override": false,
    "firstSimple": {
      "speech": "This is an example prompt.",
      "text": ""
    }
  },
  "scene": {
    "name": "SceneName",
    "slots": {
      "slot_name": {
        "mode": "REQUIRED",
        "status": "INVALID",
        "updated": true,
        "value": 1
      }
    },
    "next": {
      "name": "actions.scene.END_CONVERSATION"
    }
  }
}

डेवलपमेंट के विकल्प

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

इनलाइन एडिटर

Cloud Functions एडिटर की मदद से डेवलप करने के लिए:

  1. अपना ऐक्शन प्रोजेक्ट खोलें और डेवलप करें टैब > वेबहुक > ऑर्डर पूरा करने का तरीका बदलें पर जाएं. इसके बाद, ग्राहक को आइटम भेजने के तरीके वाली विंडो दिखेगी.
  2. Inline Cloud Functions चुनें और पुष्टि करें पर क्लिक करें.

बाहरी एचटीटीपीएस एंडपॉइंट

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

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

अपना एनवायरमेंट सेट अप करने के लिए, यह तरीका अपनाएं:

  1. Node.js को डाउनलोड और इंस्टॉल करें.
  2. Firebase सीएलआई को सेट अप और शुरू करें. अगर यह निर्देश EACCES की गड़बड़ी की वजह से काम नहीं करता, तो आपको एनपीएम से जुड़ी अनुमतियां बदलनी पड़ सकती हैं.

    npm install -g firebase-tools
    
  3. अपने Google खाते से Firebase टूल की पुष्टि करें:

    firebase login
    
  4. वह प्रोजेक्ट डायरेक्ट्री शुरू करें जहां आपने कार्रवाइयां प्रोजेक्ट सेव किए थे. आपसे Firebase सीएलआई की वह सुविधा चुनने के लिए कहा जाएगा जिसे आपको अपने Actions प्रोजेक्ट के लिए सेटअप करना है. Functions और ऐसी अन्य सुविधाएं चुनें जिन्हें आप इस्तेमाल करना चाहें, जैसे कि Firestore. इसके बाद, पुष्टि करने और जारी रखने के लिए, Enter दबाएं:

    $ cd <ACTIONS_PROJECT_DIRECTORY>
    $ firebase init
    
  5. प्रोजेक्ट की सूची में नेविगेट करने के लिए, ऐरो बटन का इस्तेमाल करके Firebase टूल को अपने Actions प्रोजेक्ट से जोड़ें:

  6. प्रोजेक्ट चुनने के बाद, Firebase टूल फ़ंक्शन सेटअप शुरू करता है और आपसे पूछता है कि आपको कौनसी भाषा इस्तेमाल करनी है. ऐरो बटन का इस्तेमाल चुनें और जारी रखने के लिए Enter दबाएं.

    === Functions Setup
    A functions directory will be created in your project with a Node.js
    package pre-configured. Functions can be deployed with firebase deploy.
    
    ? What language would you like to use to write Cloud Functions? (Use arrow keys)
    > JavaScript
    TypeScript
    
  7. अगर आपको संभावित गड़बड़ियों का पता लगाने के लिए ESLint का इस्तेमाल करना है, तो Y या N टाइप करके, स्टाइल को लागू करें:

    ? Do you want to use ESLint to catch probable bugs and enforce style? (Y/n)
  8. प्रॉम्प्ट में Y टाइप करके, प्रोजेक्ट डिपेंडेंसी पाएं:

    ? Do you want to install dependencies with npm now? (Y/n)

    सेटअप पूरा होने के बाद, आपको इनके जैसा आउटपुट दिखेगा:

    ✔  Firebase initialization complete!
    
  9. @assistant/conversation डिपेंडेंसी इंस्टॉल करें:

    $ cd <ACTIONS_PROJECT_DIRECTORY>/functions
    $ npm install @assistant/conversation --save
    
  10. फ़ुलफ़िलमेंट डिपेंडेंसी पाएं और फ़ुलफ़िलमेंट फ़ंक्शन डिप्लॉय करें:

    $ npm install
    $ firebase deploy --only functions
    

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

    ✔  Deploy complete!
    Project Console: https://console.firebase.google.com/project/<PROJECT_ID>/overview Function URL (<FUNCTION_NAME>): https://us-central1-<PROJECT_ID>.cloudfunctions.net/<FUNCTION_NAME>
  11. अगले सेक्शन में इस्तेमाल करने के लिए, फ़ुलफ़िलमेंट यूआरएल कॉपी करें.

वेबहुक हैंडलर रजिस्टर करें

अपने Cloud फ़ंक्शन एंडपॉइंट को वेबहुक हैंडलर के तौर पर रजिस्टर करने के लिए:

  1. Actions कंसोल में, डेवलप करें > वेबहुक पर क्लिक करें.
  2. ग्राहकों को सामान भेजने का तरीका बदलें पर क्लिक करें. इसके बाद, ग्राहक को आइटम भेजने के तरीके विंडो दिखेगी.
  3. वेबहुक चुनें और पुष्टि करें पर क्लिक करें.
  4. वेबहुक फ़ील्ड में अपने वेब सेवा का यूआरएल चिपकाएं.
  5. सेव करें पर क्लिक करें.