ওয়েবহুক

অ্যাকশন তৈরিতে আপনাকে আরও বেশি নমনীয়তা দিতে, আপনি HTTPS ওয়েব সার্ভিসে (ফুলফিলমেন্ট) লজিক অর্পণ করতে পারেন। আপনার অ্যাকশনগুলো ওয়েবহুক ট্রিগার করতে পারে, যা একটি HTTPS এন্ডপয়েন্টে রিকোয়েস্ট পাঠায়। ফুলফিলমেন্টে আপনি যা যা করতে পারেন তার কিছু উদাহরণ হলো:

  • ব্যবহারকারীর দেওয়া তথ্যের ভিত্তিতে একটি গতিশীল প্রম্পট তৈরি করা।
  • বাহ্যিক সিস্টেমে অর্ডার দেওয়া এবং তার সাফল্য নিশ্চিত করা।
  • ব্যাকএন্ড ডেটা দিয়ে স্লটগুলো যাচাই করা হচ্ছে।
চিত্র ১. ইনভোকেশন ইনটেন্ট এবং সিন ওয়েবহুক ট্রিগার করতে পারে।

ওয়েবহুক ট্রিগার এবং হ্যান্ডলার

আপনার অ্যাকশনগুলো ইনভোকেশন ইন্টেন্ট বা সিন-এর মধ্যে একটি ওয়েবহুক ট্রিগার করতে পারে, যা আপনার ফুলফিলমেন্ট এন্ডপয়েন্টে একটি রিকোয়েস্ট পাঠায়। আপনার ফুলফিলমেন্টে ওয়েবহুক হ্যান্ডলার থাকে, যা রিকোয়েস্টের JSON পেলোড প্রসেস করে। আপনি নিম্নলিখিত পরিস্থিতিতে ওয়েবহুক ট্রিগার করতে পারেন:

  • একটি ইনভোকেশন ইনটেন্ট ম্যাচ হওয়ার পরে
  • একটি দৃশ্যের সময় মঞ্চে প্রবেশ করুন
  • একটি দৃশ্যের শর্ত পর্যায়ে কোনো শর্ত সত্য বলে প্রমাণিত হওয়ার পর
  • During a scene's slot-filling stage
  • একটি দৃশ্যের ইনপুট পর্যায়ে ইনটেন্ট ম্যাচ ঘটার পরে

যখন আপনি আপনার অ্যাকশন-এ একটি ওয়েবহুক ট্রিগার করেন, তখন গুগল অ্যাসিস্ট্যান্ট আপনার ফুলফিলমেন্ট-এ একটি 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"
    }
  }
}

রানটাইম মিথস্ক্রিয়া

নিম্নলিখিত বিভাগগুলিতে এমন সাধারণ কাজগুলি বর্ণনা করা হয়েছে যা আপনি আপনার ওয়েবহুক হ্যান্ডলারগুলিতে সম্পাদন করতে পারেন।

প্রম্পট পাঠান

ইন্টারেক্টিভ ক্যানভাস ব্যবহার করে আপনি সাধারণ টেক্সট, রিচ টেক্সট, কার্ড, এমনকি একটি ওয়েব অ্যাপ দ্বারা সমর্থিত পূর্ণাঙ্গ এইচটিএমএল প্রম্পটও তৈরি করতে পারেন। একটি ওয়েবহুক ইভেন্ট হ্যান্ডেল করার সময় কীভাবে প্রম্পট তৈরি করতে হয়, সে সম্পর্কে প্রম্পট ডকুমেন্টেশনে সম্পূর্ণ তথ্য রয়েছে। নিম্নলিখিত কোড স্নিপেটগুলো একটি কার্ড প্রম্পট দেখাচ্ছে:

নোড.জেএস

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": ""
    }
  }
}

অভিপ্রায় পরামিতি পড়ুন

যখন অ্যাসিস্ট্যান্ট রানটাইম কোনো ইন্টেন্টের সাথে মেলে, তখন এটি সংজ্ঞায়িত প্যারামিটারগুলো বের করে নেয়। 'অরিজিনাল' প্রপার্টিটি হলো ব্যবহারকারীর দেওয়া ইনপুট এবং 'রিজলভড' প্রপার্টিটি হলো টাইপ স্পেসিফিকেশনের উপর ভিত্তি করে NLU দ্বারা ইনপুটটিকে যে রূপে রূপান্তর করা হয়েছে।

নোড.জেএস

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"
    ]
  }
}

ব্যবহারকারীর অবস্থান পড়ুন

এই মানটি গুগল অ্যাসিস্ট্যান্টের জন্য ব্যবহারকারীর লোকেল সেটিংয়ের সাথে সম্পর্কিত।

নোড.জেএস

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"
    ]
  }
}

পঠন এবং লেখার স্টোরেজ

বিভিন্ন স্টোরেজ ফিচার কীভাবে ব্যবহার করতে হয়, সে সম্পর্কে সম্পূর্ণ তথ্যের জন্য স্টোরেজ ডকুমেন্টেশন দেখুন।

নোড.জেএস

//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"
    }
  }
}

ডিভাইসের সক্ষমতা যাচাই করুন

আপনি একটি ডিভাইসের বিভিন্ন অভিজ্ঞতা বা কথোপকথনের ধারা প্রদানের সক্ষমতা যাচাই করতে পারেন।

নোড.জেএস

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 নির্দেশিকা দেখুন।

Runtime type overrides

রানটাইম টাইপ আপনাকে রানটাইমে টাইপ স্পেসিফিকেশন পরিবর্তন করার সুযোগ দেয়। কোনো টাইপের বৈধ মানগুলো পূরণ করার জন্য আপনি অন্য উৎস থেকে ডেটা লোড করতে এই বৈশিষ্ট্যটি ব্যবহার করতে পারেন। উদাহরণস্বরূপ, আপনি একটি জরিপের প্রশ্নে ডাইনামিক অপশন যোগ করতে বা একটি মেনুতে দৈনিক আইটেম যোগ করতে রানটাইম টাইপ ওভাররাইড ব্যবহার করতে পারেন।

রানটাইম টাইপ ব্যবহার করতে, আপনাকে আপনার অ্যাকশন থেকে একটি ওয়েবহুক ট্রিগার করতে হবে যা আপনার ফুলফিলমেন্টের একটি হ্যান্ডলারকে কল করে। সেখান থেকে, আপনি আপনার অ্যাকশনে ফেরত পাঠানো একটি রেসপন্সে session.typeOverrides প্যারামিটারটি পূরণ করতে পারেন। উপলব্ধ মোডগুলোর মধ্যে রয়েছে TYPE_MERGE যা বিদ্যমান টাইপ এন্ট্রিগুলো সংরক্ষণ করে, অথবা TYPE_REPLACE যা বিদ্যমান এন্ট্রিগুলোকে ওভাররাইড দিয়ে প্রতিস্থাপন করে।

নোড.জেএস

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."
    }
  }
}

বক্তৃতা পক্ষপাত প্রদান করুন

স্পিচ বায়াসিং আপনাকে ইনটেন্ট ম্যাচিং উন্নত করার জন্য NLU-কে ইঙ্গিত নির্দিষ্ট করার সুযোগ দেয়। আপনি সর্বোচ্চ ১০০০টি এন্ট্রি নির্দিষ্ট করতে পারেন।

নোড.জেএস

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"
  }
}

রূপান্তরের দৃশ্য

আপনার অ্যাকশনস প্রজেক্টে স্ট্যাটিক ট্রানজিশন সংজ্ঞায়িত করার পাশাপাশি, আপনি রানটাইমেও সিন ট্রানজিশন ঘটাতে পারেন।

নোড.জেএস

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 ) পরীক্ষা করতে পারেন।

নোড.জেএস

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"
    ]
  }
}

দৃশ্য স্লট বাতিল করুন

আপনি স্লটগুলো বাতিল করে ব্যবহারকারীকে একটি নতুন মান প্রদান করতে বলতে পারেন।

নোড.জেএস

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"
    }
  }
}

উন্নয়নের বিকল্পগুলি

অ্যাকশনস বিল্ডার ক্লাউড ফাংশনস এডিটর নামে একটি ইনলাইন এডিটর প্রদান করে, যা আপনাকে সরাসরি কনসোলে ফায়ারবেসের জন্য একটি ক্লাউড ফাংশন বিল্ড এবং ডিপ্লয় করতে দেয়। এছাড়াও আপনি আপনার পছন্দের হোস্টিং-এ ফুলফিলমেন্ট বিল্ড ও ডিপ্লয় করতে পারেন এবং আপনার HTTPS ফুলফিলমেন্ট এন্ডপয়েন্টকে আপনার ওয়েবহুক হ্যান্ডলার হিসেবে রেজিস্টার করতে পারেন।

ইনলাইন সম্পাদক

To develop with the Cloud Functions editor:

  1. sdk/webhooks/ActionsOnGoogleFulfillment.yaml ফাইলটি তৈরি করুন এবং আপনার অ্যাকশনের জন্য হ্যান্ডলার ও ফুলফিলমেন্টের জন্য ব্যবহৃত ইনলাইন ক্লাউড ফাংশনটি সংজ্ঞায়িত করুন।
    handlers:
    - name: questionOnEnterFunc
    - name: fruitSlotValidationFunc
    inlineCloudFunction:
      executeFunction: ActionsOnGoogleFulfillment
        
  2. sdk/webhooks/ActionsOnGoogleFulfillment ফোল্ডারটি তৈরি করুন এবং পূর্বে সংজ্ঞায়িত হ্যান্ডলারগুলো বাস্তবায়নকারী একটি index.js ফাইল ও আপনার কোডের জন্য npm প্রয়োজনীয়তাগুলো নির্ধারণকারী একটি 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"
      }
    }
        

বাহ্যিক HTTPS এন্ডপয়েন্ট

এই বিভাগে আপনার কনভারসেশনাল অ্যাকশনের জন্য একটি ফুলফিলমেন্ট পরিষেবা হিসেবে ক্লাউড ফাংশনস ফর ফায়ারবেস কীভাবে সেট আপ করতে হয় তা বর্ণনা করা হয়েছে। তবে, আপনি আপনার পছন্দের যেকোনো হোস্টিং পরিষেবাতেও ফুলফিলমেন্ট স্থাপন করতে পারেন।

পরিবেশ তৈরি করুন

যখন আপনি একটি ফুলফিলমেন্ট পরিষেবা হিসাবে ক্লাউড ফাংশনস ফর ফায়ারবেস ব্যবহার করেন, তখন আমরা নিম্নলিখিত প্রজেক্ট কাঠামোটি সুপারিশ করি:

ProjectFolder        - Root folder for the project
  sdk                - Actions project configuration files
  functions          - Cloud functions for Firebase files

আপনার পরিবেশ সেট আপ করতে, এই ধাপগুলো অনুসরণ করুন:

  1. Node.js ডাউনলোড ও ইনস্টল করুন
  2. Firebase CLI সেট আপ এবং ইনিশিয়ালাইজ করুন। যদি নিম্নলিখিত কমান্ডটি EACCES ত্রুটির কারণে ব্যর্থ হয়, তাহলে আপনাকে npm পারমিশন পরিবর্তন করতে হতে পারে।

    npm install -g firebase-tools
    
  3. আপনার গুগল অ্যাকাউন্ট দিয়ে ফায়ারবেস টুলটি প্রমাণীকরণ করুন:

    firebase login
    
  4. আপনার অ্যাকশনস প্রজেক্টটি যেখানে সেভ করেছেন, সেই প্রজেক্ট ডিরেক্টরিটি চালু করুন। আপনার অ্যাকশনস প্রজেক্টের জন্য কোন কোন ফায়ারবেস সিএলআই ফিচার সেটআপ করতে চান, তা আপনাকে বেছে নিতে বলা হবে। Functions এবং ফায়ারস্টোরের মতো অন্যান্য ফিচার, যা আপনি ব্যবহার করতে চাইতে পারেন, সেগুলো বেছে নিন, তারপর নিশ্চিত করতে এবং চালিয়ে যেতে এন্টার চাপুন।

    $ cd <ACTIONS_PROJECT_DIRECTORY>
    $ firebase init
    
  5. প্রজেক্ট তালিকায় নেভিগেট করতে অ্যারো কী ব্যবহার করে ফায়ারবেস টুলটি নির্বাচন করে আপনার অ্যাকশনস প্রজেক্টের সাথে এটিকে যুক্ত করুন:

  6. প্রজেক্টটি বেছে নেওয়ার পর, ফায়ারবেস টুলটি ফাংশন সেটআপ শুরু করে এবং আপনাকে জিজ্ঞাসা করে যে আপনি কোন ভাষা ব্যবহার করতে চান। অ্যারো কী ব্যবহার করে নির্বাচন করুন এবং চালিয়ে যাওয়ার জন্য এন্টার চাপুন।

    === 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. Install the @assistant/conversation dependency:

    $ cd <ACTIONS_PROJECT_DIRECTORY>/functions
    $ npm install @assistant/conversation --save
    
  10. ফুলফিলমেন্ট ডিপেন্ডেন্সিগুলো সংগ্রহ করুন এবং ফুলফিলমেন্ট ফাংশনটি ডিপ্লয় করুন:

    $ npm install
    $ firebase deploy --only functions
    

    ডেপ্লয়মেন্ট হতে কয়েক মিনিট সময় লাগে। সম্পন্ন হলে, আপনি নিচের মতো একটি আউটপুট দেখতে পাবেন। Dialogflow-তে প্রবেশ করানোর জন্য আপনার Function URL-টি প্রয়োজন হবে।

    ✔  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. পরবর্তী বিভাগে ব্যবহারের জন্য ফুলফিলমেন্ট ইউআরএলটি কপি করুন।

ওয়েবহুক হ্যান্ডলার নিবন্ধন করুন

  1. sdk/webhooks/ActionsOnGoogleFulfillment.yaml ফাইলটি তৈরি করুন এবং আপনার অ্যাকশনের জন্য হ্যান্ডলার ও ওয়েবহুক অনুরোধের জন্য URL নির্ধারণ করুন।
    httpsEndpoint:
      baseUrl: https://my.web.hook/ActionsOnGoogleFulfillment
      endpointApiVersion: 2
    handlers:
    - name: questionOnEnterFunc
    - name: fruitSlotValidationFunc