আপনার অ্যাপ থেকে Genkit ফ্লো ইনভোক করা

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

শুরু করার আগে

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

Firebase প্রোজেক্ট সেট-আপ করা

  1. Firebase কনসোল ব্যবহার করে নতুন Firebase প্রোজেক্ট তৈরি করুন অথবা আগে থেকে আছে এমন কোনও প্রোজেক্ট বেছে নিন।

  2. প্রোজেক্টটি যখন ব্যবহার করবেন তখন পেমেন্ট করুন Blaze প্রাইসিং প্ল্যানে আপগ্রেড করুন, যা Cloud Functions প্রোডাকশন ডেপ্লয়মেন্টের জন্য প্রয়োজন।

  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-এ ফ্লো র‍্যাপ করুন

আপনি Firebase প্রোজেক্ট সেট-আপ করে তাতে Cloud Functions ইনিশিয়ালাইজ করার পরে, প্রোজেক্টের 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 ক্রেডেনশিয়াল উপলভ্য করুন

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

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

Gemini (Google AI)

  1. Google AI Studio ব্যবহার করে Gemini Developer API-এর জন্য একটি API key জেনারেট করুন।

  2. Google Cloud Secret Manager-এ আপনার API key স্টোর করুন:

    firebase functions:secrets:set GOOGLE_GENAI_API_KEY

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

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

  3. 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],

এখন, আপনি এই ফাংশনটি ডিপ্লয় করলে, আপনার API key Google Cloud Secret Manager-এ স্টোর করা হবে এবং Cloud Functions এনভায়রনমেন্ট থেকে উপলভ্য হবে।

Gemini (Vertex AI)

  1. Google Cloud কনসোলে, আপনার Firebase প্রোজেক্টের জন্য Vertex AI API চালু করুন।

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

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

(ঐচ্ছিক) Firebase App Check এনফোর্সমেন্ট যোগ করুন

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,
);

Firebase-এ ফ্লো ডিপ্লয় করুন

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

cd $PROJECT_ROOT
firebase deploy --only functions