अपने ऐप्लिकेशन से 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. प्रोजेक्ट को इस्तेमाल के हिसाब से पैसे चुकाने वाले ब्लेज़ प्लान पर अपग्रेड करें. Cloud Functions प्रोडक्शन डिप्लॉयमेंट के लिए यह ज़रूरी है.

  3. Firebase सीएलआई इंस्टॉल करें.

  4. Firebase सीएलआई में लॉग इन करें:

    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

इस पेज पर आगे दी गई जानकारी के मुताबिक, यह माना जाता है कि आपने JavaScript में फ़ंक्शन लिखने का विकल्प चुना है.

फ़्लो को 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,
);

डिप्लॉय किए गए फ़्लो के लिए, एपीआई क्रेडेंशियल उपलब्ध कराना

डिप्लॉय होने के बाद, आपके फ़्लो को उन सभी रिमोट सेवाओं के साथ पुष्टि करने का तरीका चाहिए जिन पर वे निर्भर हैं. कम से कम, ज़्यादातर फ़्लो को मॉडल एपीआई सेवा को ऐक्सेस करने के लिए क्रेडेंशियल की ज़रूरत होती है.

इस उदाहरण के लिए, चुने गए मॉडल प्रोवाइडर के हिसाब से, इनमें से कोई एक काम करें:

Gemini (Google का एआई)

  1. Google AI Studio का इस्तेमाल करके, Gemini Developer API के लिए एपीआई पासकोड जनरेट करें.

  2. Google Cloud Secret Manager में अपना एपीआई पासकोड सेव करें:

    firebase functions:secrets:set GOOGLE_GENAI_API_KEY

    यह चरण इसलिए ज़रूरी है, ताकि आपका एपीआई पासकोड गलती से लीक न हो जाए. इस पासकोड से, ऐसी सेवा को ऐक्सेस किया जा सकता है जिसके लिए शुल्क लिया जा सकता है.

    सीक्रेट मैनेज करने के बारे में ज़्यादा जानने के लिए, कॉन्फ़िगरेशन की संवेदनशील जानकारी को सेव और ऐक्सेस करना लेख पढ़ें.

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

अब इस फ़ंक्शन को डिप्लॉय करने पर, आपका एपीआई पासकोड Google Cloud Secret Manager में सेव हो जाएगा. साथ ही, यह Cloud Functions एनवायरमेंट में उपलब्ध होगा.

Gemini (Vertex AI)

  1. Google Cloud कंसोल में, अपने Firebase प्रोजेक्ट के लिए Vertex AI API को चालू करें.

  2. आईएएम पेज पर, पक्का करें कि डिफ़ॉल्ट कंप्यूट सेवा खाते को Vertex AI उपयोगकर्ता की भूमिका दी गई हो.

इस ट्यूटोरियल को सेट अप करने के लिए, आपको सिर्फ़ मॉडल प्रोवाइडर के लिए सीक्रेट सेट अप करना होगा. हालांकि, आम तौर पर आपको अपने फ़्लो में इस्तेमाल की जाने वाली हर सेवा के लिए ऐसा करना होगा.

(ज़रूरी नहीं) Firebase App Check नीति उल्लंघन ठीक करने का तरीका जोड़ना

Firebase App Check, नेटिव अटेस्टेशन का इस्तेमाल करके यह पुष्टि करता है कि हमारे एपीआई को सिर्फ़ आपका ऐप्लिकेशन कॉल कर रहा है. 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 विकल्प का इस्तेमाल करके, यह कंट्रोल करें कि कौनसे ऑरिजिन आपके फ़ंक्शन को ऐक्सेस कर सकते हैं.

डिफ़ॉल्ट रूप से, कॉल किए जा सकने वाले फ़ंक्शन में सीओआरएस को इस तरह कॉन्फ़िगर किया जाता है कि सभी ऑरिजिन से अनुरोधों को अनुमति मिले. कुछ क्रॉस-ऑरिजिन अनुरोधों को अनुमति देने के लिए, उन डोमेन या रेगुलर एक्सप्रेशन की सूची पास करें जिन्हें अनुमति दी जानी चाहिए. उदाहरण के लिए:

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