আপনার অ্যাপ থেকে জেনকিট ফ্লোকে আহ্বান করুন

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

শুরু করার আগে

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

একটি ফায়ারবেস প্রজেক্ট সেট আপ করুন

  1. ফায়ারবেস কনসোল ব্যবহার করে একটি নতুন ফায়ারবেস প্রজেক্ট তৈরি করুন, অথবা বিদ্যমান কোনো একটি বেছে নিন।

  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. ডিরেক্টরিতে একটি Firebase প্রজেক্ট শুরু করুন:

    cd $PROJECT_ROOT
    firebase init functions

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

onCallGenkit এর মধ্যে ফ্লোটি মুড়ে দিন।

ক্লাউড ফাংশন ব্যবহার করে একটি ফায়ারবেস প্রজেক্ট সেট আপ করার পরে, আপনি প্রজেক্টের functions ডিরেক্টরিতে ফ্লো ডেফিনিশন কপি বা রাইট করতে পারেন। এটি দেখানোর জন্য এখানে একটি উদাহরণ ফ্লো দেওয়া হলো:

const ai = genkit({
  plugins: [googleAI()],
  model: gemini15Flash,
});

const jokeTeller = ai.defineFlow({
  name: "jokeTeller",
  inputSchema: z.string().nullable(),
  outputSchema: z.string(),
  streamSchema: z.string(),
}, async (jokeType = "knock-knock", {sendChunk}) => {
  const prompt = `Tell me a ${jokeType} joke.`;

  // Call the `generateStream()` method to
  // receive the `stream` async iterable.
  const {stream, response: aiResponse} = ai.generateStream(prompt);

  // Send new words of the generative AI response
  // to the client as they are generated.
  for await (const chunk of stream) {
    sendChunk(chunk.text);
  }

  // Return the full generative AI response
  // to clients that may not support streaming.
  return (await aiResponse).text;
},
);

এই ধরনের একটি ফ্লো স্থাপন করতে, এটিকে onCallGenkit দিয়ে র‍্যাপ করুন, যা firebase-functions/https এ উপলব্ধ। এই হেল্পার মেথডটিতে কলযোগ্য ফাংশনের সমস্ত বৈশিষ্ট্য রয়েছে এবং এটি স্বয়ংক্রিয়ভাবে স্ট্রিমিং ও JSON উভয় ধরনের রেসপন্স সমর্থন করে।

const {onCallGenkit} = require("firebase-functions/https");
exports.tellJoke = onCallGenkit({
  // Bind the Gemini API key secret parameter to the function.
  secrets: [apiKey],
},
// Pass in the genkit flow.
jokeTeller,
);

ডেপ্লয় করা ফ্লো-গুলিতে API ক্রেডেনশিয়াল উপলব্ধ করুন

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

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

জেমিনি (গুগল এআই)

  1. আপনার অঞ্চলে গুগল এআই উপলব্ধ আছে কিনা তা নিশ্চিত করুন।

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

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

    firebase functions:secrets:set GOOGLE_GENAI_API_KEY

    আপনার এপিআই কী (API key) ভুলবশত ফাঁস হওয়া থেকে রক্ষা করার জন্য এই পদক্ষেপটি গুরুত্বপূর্ণ, যা একটি সম্ভাব্য মিটারযুক্ত পরিষেবাতে অ্যাক্সেস প্রদান করে।

    গোপনীয় তথ্য ব্যবস্থাপনা সম্পর্কে আরও তথ্যের জন্য ‘সংবেদনশীল কনফিগারেশন তথ্য সংরক্ষণ ও অ্যাক্সেস’ দেখুন।

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

    const {defineSecret} = require("firebase-functions/params");
    // Store the Gemini API key in Cloud Secret Manager.
    const apiKey = defineSecret("GOOGLE_GENAI_API_KEY");

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

    // Bind the Gemini API key secret parameter to the function.
    secrets: [apiKey],

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

জেমিনি (ভার্টেক্স এআই)

  1. ক্লাউড কনসোলে, আপনার ফায়ারবেস প্রজেক্টের জন্য ভার্টেক্স এআই এপিআই (Vertex AI API) সক্রিয় করুন

  2. IAM পেজে, নিশ্চিত করুন যে ডিফল্ট কম্পিউট সার্ভিস অ্যাকাউন্টকে ভার্টেক্স এআই ইউজার রোলটি প্রদান করা হয়েছে।

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

(ঐচ্ছিক) অ্যাপ চেক প্রয়োগ যোগ করুন

Firebase App Check আপনার API শুধুমাত্র আপনার অ্যাপ্লিকেশন দ্বারাই কল করা হচ্ছে কিনা তা যাচাই করতে নেটিভ অ্যাটেস্টেশন ব্যবহার করে। onCallGenkit ডিক্লারেটিভভাবে App Check এনফোর্সমেন্ট সমর্থন করে।

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 tellJoke = onCallGenkit({
  cors: 'mydomain.com',
}, jokeTeller);

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

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

const {onCallGenkit} = require("firebase-functions/https");
const {defineSecret} = require("firebase-functions/params");

// Dependencies for Genkit.
const {gemini15Flash, googleAI} = require("@genkit-ai/googleai");
const {genkit, z} = require("genkit");

// Store the Gemini API key in Cloud Secret Manager.
const apiKey = defineSecret("GOOGLE_GENAI_API_KEY");

const ai = genkit({
  plugins: [googleAI()],
  model: gemini15Flash,
});

const jokeTeller = ai.defineFlow({
  name: "jokeTeller",
  inputSchema: z.string().nullable(),
  outputSchema: z.string(),
  streamSchema: z.string(),
}, async (jokeType = "knock-knock", {sendChunk}) => {
  const prompt = `Tell me a ${jokeType} joke.`;

  // Call the `generateStream()` method to
  // receive the `stream` async iterable.
  const {stream, response: aiResponse} = ai.generateStream(prompt);

  // Send new words of the generative AI response
  // to the client as they are generated.
  for await (const chunk of stream) {
    sendChunk(chunk.text);
  }

  // Return the full generative AI response
  // to clients that may not support streaming.
  return (await aiResponse).text;
},
);

exports.tellJoke = onCallGenkit({
  // Bind the Gemini API key secret parameter to the function.
  secrets: [apiKey],
},
// Pass in the genkit flow.
jokeTeller,
);

ফায়ারবেসে ফ্লো স্থাপন করুন

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

cd $PROJECT_ROOT
firebase deploy --only functions