अगर आपको कार्रवाइयां बनाने में ज़्यादा आसानी हो, तो एचटीटीपीएस वेब सेवाओं को लॉजिक के तौर पर इस्तेमाल किया जा सकता है. आपकी सेट की गई कार्रवाइयां, ऐसे वेबहुक को ट्रिगर कर सकती हैं जो एचटीटीपीएस एंडपॉइंट से अनुरोध करते हैं. यहां कुछ उदाहरण दिए गए हैं जिनकी मदद से बताया गया है कि उन्हें ऑर्डर पूरा करने के लिए क्या-क्या किया जा सकता है:
- उपयोगकर्ता से मिली जानकारी के आधार पर डाइनैमिक प्रॉम्प्ट जनरेट करना.
- किसी बाहरी सिस्टम में ऑर्डर देने और सफल होने की पुष्टि करता है.
- बैकएंड डेटा से स्लॉट की पुष्टि की जा रही है.
वेबहुक ट्रिगर और हैंडलर
आपकी सेट की गई कार्रवाइयां, कॉल करने के इंटेंट या सीन में वेबहुक को ट्रिगर कर सकती हैं, जो आपके फ़ुलफ़िलमेंट एंडपॉइंट पर एक अनुरोध भेजता है. आपके फ़ुलफ़िलमेंट में वेबहुक हैंडलर शामिल हैं, जो अनुरोध में 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 एडिटर की मदद से डेवलप करने के लिए:
sdk/webhooks/ActionsOnGoogleFulfillment.yaml
फ़ाइल बनाएं. साथ ही, अपनी सेट की गई कार्रवाई के लिए हैंडलर और फ़ुलफ़िलमेंट के लिए इस्तेमाल किया जाने वाला इनलाइन क्लाउड फ़ंक्शन तय करें.handlers: - name: questionOnEnterFunc - name: fruitSlotValidationFunc inlineCloudFunction: executeFunction: ActionsOnGoogleFulfillment
- फ़ोल्डर
sdk/webhooks/ActionsOnGoogleFulfillment
बनाएं. साथ ही, एकindex.js
फ़ाइल जोड़ें जो पहले तय किए गए हैंडलर लागू करती हो. साथ ही, आपके कोड के लिए एनपीएम की ज़रूरी शर्तों के बारे में बताने वालीpackage.json
फ़ाइल जोड़ें.// index.js const {conversation} = require('@assistant/conversation'); const functions = require('firebase-functions'); const app = conversation(); app.handle('questionOnEnterFunc', conv => { conv.add('questionOnEnterFunc triggered on webhook'); }); app.handle('fruitSlotValidationFunc', conv => { conv.add('fruitSlotValidationFunc triggered on webhook'); }); exports.ActionsOnGoogleFulfillment = functions.https.onRequest(app);
// package.json { "name": "ActionsOnGoogleFulfillment", "version": "0.1.0", "description": "Actions on Google fulfillment", "main": "index.js", "dependencies": { "@assistant/conversation": "^3.0.0", "firebase-admin": "^5.4.3", "firebase-functions": "^0.7.1" } }
बाहरी एचटीटीपीएस एंडपॉइंट
इस सेक्शन में बताया गया है कि 'बातचीत की सुविधा वाली कार्रवाई' के लिए, 'Firebase के लिए Cloud Functions' को फ़ुलफ़िलमेंट सेवा के तौर पर कैसे सेट अप किया जाए. हालांकि, आपके पास अपनी पसंद की होस्टिंग सेवा पर, फ़ुलफ़िलमेंट को डिप्लॉय करने का विकल्प है.
एनवायरमेंट सेट अप करें
Firebase के लिए क्लाउड फ़ंक्शन का इस्तेमाल, फ़ुलफ़िलमेंट सेवा के तौर पर करने पर, हम आपको यह प्रोजेक्ट स्ट्रक्चर इस्तेमाल करने का सुझाव देते हैं:
ProjectFolder - Root folder for the project sdk - Actions project configuration files functions - Cloud functions for Firebase files
अपना एनवायरमेंट सेट अप करने के लिए, यह तरीका अपनाएं:
- Node.js को डाउनलोड और इंस्टॉल करें.
Firebase सीएलआई को सेट अप और शुरू करें. अगर यह निर्देश
EACCES
की गड़बड़ी की वजह से काम नहीं करता, तो आपको एनपीएम से जुड़ी अनुमतियां बदलनी पड़ सकती हैं.npm install -g firebase-tools
अपने Google खाते से Firebase टूल की पुष्टि करें:
firebase login
वह प्रोजेक्ट डायरेक्ट्री शुरू करें जहां आपने कार्रवाइयां प्रोजेक्ट सेव किए थे. आपसे Firebase सीएलआई की वह सुविधा चुनने के लिए कहा जाएगा जिसे आपको अपने Actions प्रोजेक्ट के लिए सेटअप करना है.
Functions
और ऐसी अन्य सुविधाएं चुनें जिन्हें आप इस्तेमाल करना चाहें, जैसे कि Firestore. इसके बाद, पुष्टि करने और जारी रखने के लिए, Enter दबाएं:$ cd <ACTIONS_PROJECT_DIRECTORY> $ firebase init
प्रोजेक्ट की सूची में नेविगेट करने के लिए, ऐरो बटन का इस्तेमाल करके Firebase टूल को अपने Actions प्रोजेक्ट से जोड़ें:
प्रोजेक्ट चुनने के बाद, 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
अगर आपको संभावित गड़बड़ियों का पता लगाने के लिए ESLint का इस्तेमाल करना है, तो Y या N टाइप करके, स्टाइल को लागू करें:
? Do you want to use ESLint to catch probable bugs and enforce style? (Y/n)
प्रॉम्प्ट में Y टाइप करके, प्रोजेक्ट डिपेंडेंसी पाएं:
? Do you want to install dependencies with npm now? (Y/n)
सेटअप पूरा होने के बाद, आपको इनके जैसा आउटपुट दिखेगा:
✔ Firebase initialization complete!
@assistant/conversation डिपेंडेंसी इंस्टॉल करें:
$ cd <ACTIONS_PROJECT_DIRECTORY>/functions $ npm install @assistant/conversation --save
फ़ुलफ़िलमेंट डिपेंडेंसी पाएं और फ़ुलफ़िलमेंट फ़ंक्शन डिप्लॉय करें:
$ 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>अगले सेक्शन में इस्तेमाल करने के लिए, फ़ुलफ़िलमेंट यूआरएल कॉपी करें.
वेबहुक हैंडलर रजिस्टर करें
sdk/webhooks/ActionsOnGoogleFulfillment.yaml
फ़ाइल बनाएं. इसके बाद, अपनी सेट की गई कार्रवाई के लिए हैंडलर और वेबहुक अनुरोधों का यूआरएल तय करें.httpsEndpoint: baseUrl: https://my.web.hook/ActionsOnGoogleFulfillment endpointApiVersion: 2 handlers: - name: questionOnEnterFunc - name: fruitSlotValidationFunc