ফায়ারবেসের জন্য ক্লাউড ফাংশন ব্যবহার করে প্রবাহ স্থাপন করুন

ফায়ারবেসের জন্য ক্লাউড ফাংশনগুলির একটি onCallGenkit পদ্ধতি রয়েছে যা আপনাকে দ্রুত একটি Genkit অ্যাকশন (যেমন একটি ফ্লো) সহ একটি কলযোগ্য ফাংশন তৈরি করতে দেয়। এই ফাংশনগুলিকে genkit/beta/client বা ফাংশন ক্লায়েন্ট SDK ব্যবহার করে কল করা যেতে পারে, যা স্বয়ংক্রিয়ভাবে প্রমাণীকরণ তথ্য যোগ করে।

আপনি শুরু করার আগে

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

1. একটি ফায়ারবেস প্রকল্প সেট আপ করুন৷

আপনার যদি ইতিমধ্যেই টাইপস্ক্রিপ্ট ক্লাউড ফাংশন সেট আপ সহ একটি ফায়ারবেস প্রকল্প না থাকে তবে এই পদক্ষেপগুলি অনুসরণ করুন:

  1. Firebase কনসোল ব্যবহার করে একটি নতুন Firebase প্রকল্প তৈরি করুন বা একটি বিদ্যমান একটি চয়ন করুন৷

  2. প্রকল্পটিকে ব্লেজ প্ল্যানে আপগ্রেড করুন, যা ক্লাউড ফাংশন স্থাপনের জন্য প্রয়োজন৷

  3. Firebase CLI ইনস্টল করুন।

  4. Firebase CLI দিয়ে লগ ইন করুন:

    firebase login
    firebase login --reauth # alternative, if necessary
    firebase login --no-localhost # if running in a remote shell
  5. একটি নতুন প্রকল্প ডিরেক্টরি তৈরি করুন:

    export PROJECT_ROOT=~/tmp/genkit-firebase-project1
    mkdir -p $PROJECT_ROOT
  6. ডিরেক্টরিতে একটি ফায়ারবেস প্রকল্প শুরু করুন:

    cd $PROJECT_ROOT
    firebase init genkit

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

2. onCallGenkit এ ফ্লো মোড়ানো

আপনি ক্লাউড ফাংশনগুলির সাথে একটি ফায়ারবেস প্রকল্প সেট আপ করার পরে, আপনি প্রকল্পের functions/src ডিরেক্টরিতে প্রবাহের সংজ্ঞাগুলি অনুলিপি করতে বা লিখতে পারেন এবং সেগুলি index.ts এ রপ্তানি করতে পারেন।

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

ধরুন আপনার নিম্নলিখিত প্রবাহ আছে:

const generatePoemFlow = ai.defineFlow(
  {
    name: "generatePoem",
    inputSchema: z.string(),
    outputSchema: z.string(),
  },
  async (subject: string) => {
    const { text } = await ai.generate(`Compose a poem about ${subject}.`);
    return text;
  }
);

আপনি onCallGenkit ব্যবহার করে এই প্রবাহটিকে একটি কলযোগ্য ফাংশন হিসাবে প্রকাশ করতে পারেন:

import { onCallGenkit } from 'firebase-functions/https';

export generatePoem = onCallGenkit(generatePoemFlow);

একটি অনুমোদন নীতি সংজ্ঞায়িত করুন

ফায়ারবেসে স্থাপন করা হোক বা না হোক, সমস্ত নিয়োজিত প্রবাহের একটি অনুমোদন নীতি থাকা উচিত; একটি ছাড়া, যে কেউ আপনার সম্ভাব্য-ব্যয়বহুল জেনারেটিভ AI ফ্লোকে আহ্বান করতে পারে। একটি অনুমোদন নীতি সংজ্ঞায়িত করতে, onCallGenkit এর authPolicy প্যারামিটার ব্যবহার করুন:

export const generatePoem = onCallGenkit({
  authPolicy: (auth) => auth?.token?.email_verified,
}, generatePoemFlow);

এই নমুনাটি তার প্রমাণীকরণ নীতি হিসাবে একটি ম্যানুয়াল ফাংশন ব্যবহার করে। উপরন্তু, https লাইব্রেরি signedIn() এবং hasClaim() সাহায্যকারী রপ্তানি করে। এখানে সেই সাহায্যকারীদের মধ্যে একটি ব্যবহার করে একই কোড রয়েছে:

import { hasClaim } from 'firebase-functions/https';

export const generatePoem = onCallGenkit({
  authPolicy: hasClaim('email_verified'),
}, generatePoemFlow);

এপিআই শংসাপত্রগুলি স্থাপন করা প্রবাহের জন্য উপলব্ধ করুন৷

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

এই উদাহরণের জন্য, আপনার বেছে নেওয়া মডেল প্রদানকারীর উপর নির্ভর করে নিম্নলিখিতগুলির মধ্যে একটি করুন:

মিথুন (Google AI)

  1. আপনার অঞ্চলে Google AI উপলব্ধ রয়েছে তা নিশ্চিত করুন৷

  2. Google AI স্টুডিও ব্যবহার করে Gemini API-এর জন্য একটি API কী তৈরি করুন

  3. ক্লাউড সিক্রেট ম্যানেজারে আপনার API কী সংরক্ষণ করুন:

    firebase functions:secrets:set GOOGLE_GENAI_API_KEY

    দুর্ঘটনাক্রমে আপনার API কী ফাঁস হওয়া প্রতিরোধ করার জন্য এই পদক্ষেপটি গুরুত্বপূর্ণ, যা একটি সম্ভাব্য মিটার করা পরিষেবাতে অ্যাক্সেস মঞ্জুর করে৷

    গোপনীয়তা পরিচালনার বিষয়ে আরও তথ্যের জন্য স্টোর দেখুন এবং সংবেদনশীল কনফিগারেশন তথ্য অ্যাক্সেস করুন

  4. src/index.ts সম্পাদনা করুন এবং বিদ্যমান আমদানির পরে নিম্নলিখিত যোগ করুন:

    import {defineSecret} from "firebase-functions/params";
    const googleAIapiKey = defineSecret("GOOGLE_GENAI_API_KEY");
    

    তারপর, প্রবাহের সংজ্ঞায়, ঘোষণা করুন যে ক্লাউড ফাংশনের এই গোপন মানটিতে অ্যাক্সেস প্রয়োজন:

    export const generatePoem = onCallGenkit({
      secrets: [googleAIapiKey]
    }, generatePoemFlow);
    

এখন, যখন আপনি এই ফাংশনটি স্থাপন করেন, আপনার API কী ক্লাউড সিক্রেট ম্যানেজারে সংরক্ষণ করা হয় এবং ক্লাউড ফাংশন পরিবেশ থেকে উপলব্ধ।

মিথুন (Vertex AI)

  1. ক্লাউড কনসোলে, আপনার Firebase প্রকল্পের জন্য Vertex AI API সক্ষম করুন

  2. IAM পৃষ্ঠায়, নিশ্চিত করুন যে ডিফল্ট কম্পিউট পরিষেবা অ্যাকাউন্টটিকে Vertex AI ব্যবহারকারীর ভূমিকা দেওয়া হয়েছে।

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

অ্যাপ চেক এনফোর্সমেন্ট যোগ করুন

Firebase অ্যাপ চেক একটি বিল্ট-ইন প্রত্যয়ন পদ্ধতি ব্যবহার করে যাচাই করে যে আপনার API শুধুমাত্র আপনার অ্যাপ্লিকেশন দ্বারা কল করা হচ্ছে। onCallGenkit অ্যাপ চেক এনফোর্সমেন্টকে ঘোষণামূলকভাবে সমর্থন করে।

export const generatePoem = onCallGenkit({
  enforceAppCheck: true,
  // Optional. Makes App Check tokens only usable once. This adds extra security
  // at the expense of slowing down your app to generate a token for every API
  // call
  consumeAppCheckToken: true,
}, generatePoemFlow);

একটি CORS নীতি সেট করুন

কলযোগ্য ফাংশন ডিফল্ট যে কোনো ডোমেনকে আপনার ফাংশন কল করার অনুমতি দেয়। আপনি যদি এটি করতে পারে এমন ডোমেনগুলি কাস্টমাইজ করতে চান তবে cors বিকল্পটি ব্যবহার করুন। সঠিক প্রমাণীকরণের সাথে (বিশেষত অ্যাপ চেক), CORS প্রায়ই অপ্রয়োজনীয়।

export const generatePoem = onCallGenkit({
  cors: 'mydomain.com',
}, generatePoemFlow);

সম্পূর্ণ উদাহরণ

আপনি আগে বর্ণিত সমস্ত পরিবর্তন করার পরে, আপনার স্থাপনযোগ্য প্রবাহটি নিম্নলিখিত উদাহরণের মতো দেখায়:

import { genkit } from 'genkit';
import { onCallGenkit, hasClaim } from 'firebase-functions/https';
import { defineSecret } from 'firebase-functions/params';

const apiKey = defineSecret("GOOGLE_GENAI_API_KEY");

const generatePoemFlow = ai.defineFlow({
  name: "generatePoem",
  inputSchema: z.string(),
  outputSchema: z.string(),
}, async (subject: string) => {
  const { text } = await ai.generate(`Compose a poem about ${subject}.`);
  return text;
});

export const generateFlow = onCallGenkit({
  secrets: [apiKey],
  authPolicy: hasClaim("email_verified"),
  enforceAppCheck: true,
}, generatePoemFlow);

3. ফায়ারবেসে প্রবাহ স্থাপন করুন

আপনি onCallGenkit ব্যবহার করে প্রবাহ সংজ্ঞায়িত করার পরে, আপনি অন্যান্য ক্লাউড ফাংশনগুলিকে যেভাবে স্থাপন করবেন সেভাবে আপনি সেগুলি স্থাপন করতে পারেন:

cd $PROJECT_ROOT
firebase deploy --only functions

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

ঐচ্ছিক: স্থাপন করা প্রবাহ চেষ্টা করুন

আপনার ফ্লো এন্ডপয়েন্ট ব্যবহার করে দেখতে, আপনি নিম্নলিখিত ন্যূনতম উদাহরণ ওয়েব অ্যাপ স্থাপন করতে পারেন:

  1. Firebase কনসোলের প্রজেক্ট সেটিংস বিভাগে, হোস্টিং সেট আপ করার বিকল্পটি নির্বাচন করে একটি নতুন ওয়েব অ্যাপ যোগ করুন।

  2. Firebase কনসোলের প্রমাণীকরণ বিভাগে, এই উদাহরণে ব্যবহৃত Google প্রদানকারীকে সক্ষম করুন।

  3. আপনার প্রকল্প ডিরেক্টরিতে, Firebase হোস্টিং সেট আপ করুন, যেখানে আপনি নমুনা অ্যাপ স্থাপন করবেন:

    cd $PROJECT_ROOT
    firebase init hosting

    সমস্ত প্রম্পটের জন্য ডিফল্ট স্বীকার করুন।

  4. নিম্নলিখিত দিয়ে public/index.html প্রতিস্থাপন করুন:

    <!DOCTYPE html>
    <html>
      <head>
        <title>Genkit demo</title>
      </head>
      <body>
        <div id="signin" hidden>
          <button id="signinBtn">Sign in with Google</button>
        </div>
        <div id="callGenkit" hidden>
          Subject: <input type="text" id="subject" />
          <button id="generatePoem">Compose a poem on this subject</button>
          <p id="generatedPoem"></p>
        </div>
        <script type="module">
          import { initializeApp } from "https://www.gstatic.com/firebasejs/11.0.1/firebase-app.js";
          import {
            getAuth,
            onAuthStateChanged,
            GoogleAuthProvider,
            signInWithPopup,
          } from "https://www.gstatic.com/firebasejs/11.0.1/firebase-auth.js";
          import {
            getFunctions,
            httpsCallable,
          } from "https://www.gstatic.com/firebasejs/11.0.1/firebase-functions.js";
    
          const firebaseConfig = await fetch("/__/firebase/init.json");
          initializeApp(await firebaseConfig.json());
    
          async function generatePoem() {
            const poemFlow = httpsCallable(getFunctions(), "generatePoem");
            const subject = document.querySelector("#subject").value;
            const response = await poemFlow(subject);
            document.querySelector("#generatedPoem").innerText = response.data;
          }
    
          function signIn() {
            signInWithPopup(getAuth(), new GoogleAuthProvider());
          }
    
          document.querySelector("#signinBtn").addEventListener("click", signIn);
          document
            .querySelector("#generatePoem")
            .addEventListener("click", generatePoem);
    
          const signinEl = document.querySelector("#signin");
          const genkitEl = document.querySelector("#callGenkit");
    
          onAuthStateChanged(getAuth(), (user) => {
            if (!user) {
              signinEl.hidden = false;
              genkitEl.hidden = true;
            } else {
              signinEl.hidden = true;
              genkitEl.hidden = false;
            }
          });
        </script>
      </body>
    </html>
    
  5. ওয়েব অ্যাপ এবং ক্লাউড ফাংশন স্থাপন করুন:

    cd $PROJECT_ROOT
    firebase deploy

deploy কমান্ড দ্বারা মুদ্রিত URL-এ গিয়ে ওয়েব অ্যাপটি খুলুন। অ্যাপটির জন্য আপনাকে একটি Google অ্যাকাউন্ট দিয়ে সাইন ইন করতে হবে, তারপরে আপনি এন্ডপয়েন্ট অনুরোধগুলি শুরু করতে পারেন।

ঐচ্ছিক: বিকাশকারী UI-তে ফ্লো চালান

আপনি ডেভেলপার UI-তে onCallGenkit ব্যবহার করে সংজ্ঞায়িত ফ্লো চালাতে পারেন, ঠিক যেভাবে আপনি defineFlow ব্যবহার করে সংজ্ঞায়িত ফ্লো চালান, তাই ডিপ্লয়মেন্ট এবং ডেভেলপমেন্টের মধ্যে দুটির মধ্যে স্যুইচ করার দরকার নেই।

cd $PROJECT_ROOT/functions
npx genkit start -- npx tsx --watch src/index.ts

বা

cd $PROJECT_ROOT/functions
npm run genkit:start

আপনি এখন অ্যাক্সেস করতে genkit start কমান্ড দ্বারা মুদ্রিত URL-এ নেভিগেট করতে পারেন।

ঐচ্ছিক: ফায়ারবেস স্থানীয় এমুলেটর স্যুট ব্যবহার করে বিকাশ করা

ফায়ারবেস স্থানীয় উন্নয়নের জন্য এমুলেটরগুলির একটি স্যুট অফার করে, যা আপনি জেনকিটের সাথে ব্যবহার করতে পারেন।

Firebase এমুলেটর স্যুটের সাথে Genkit Dev UI ব্যবহার করতে, Firebase এমুলেটরগুলি নিম্নরূপ শুরু করুন:

npx genkit start -- firebase emulators:start --inspect-functions

এই কমান্ডটি এমুলেটরে আপনার কোড চালায় এবং ডেভেলপমেন্ট মোডে জেনকিট ফ্রেমওয়ার্ক চালায়। এটি Genkit প্রতিফলন API (কিন্তু দেব UI নয়) চালু করে এবং প্রকাশ করে।

Dev UI-তে Firestore থেকে ট্রেস দেখতে, আপনি পরিদর্শন ট্যাবে নেভিগেট করতে পারেন এবং Dev/Prod সুইচ টগল করতে পারেন। প্রোড করতে টগল করা হলে এটি ফায়ারস্টোর থেকে ট্রেস লোড করে।