جریان های Genkit را از برنامه خود فراخوانی کنید

توابع ابری برای فایربیس یک متد onCallGenkit دارد که به شما امکان می‌دهد یک تابع قابل فراخوانی با یک اکشن Genkit (یک Flow) ایجاد کنید. این توابع را می‌توان با genkit/beta/client یا SDK های کلاینت توابع ابری فراخوانی کرد که به طور خودکار اطلاعات احراز هویت را اضافه می‌کنند.

قبل از اینکه شروع کنی

  • شما باید با مفهوم جریان‌ها در Genkit و نحوه نوشتن آنها آشنا باشید. دستورالعمل‌های این صفحه فرض می‌کنند که شما از قبل برخی از جریان‌هایی را که می‌خواهید مستقر کنید، تعریف کرده‌اید.
  • اگر قبلاً از توابع ابری برای فایربیس استفاده کرده‌اید، مفید است، اما الزامی نیست.

راه‌اندازی یک پروژه فایربیس

  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 مدل مورد استفاده خود به اعتبارنامه نیاز دارند.

برای این مثال، بسته به ارائه‌دهنده مدلی که انتخاب کرده‌اید، یکی از موارد زیر را انجام دهید:

جمینی (هوش مصنوعی گوگل)

  1. مطمئن شوید که Google AI در منطقه شما در دسترس است.

  2. با استفاده از Google AI Studio یک کلید API برای API مربوط به Gemini ایجاد کنید .

  3. کلید API خود را در Cloud Secret Manager ذخیره کنید:

    firebase functions:secrets:set GOOGLE_GENAI_API_KEY

    این مرحله برای جلوگیری از افشای تصادفی کلید API شما، که دسترسی به یک سرویس احتمالاً محدود را فراهم می‌کند، مهم است.

    برای اطلاعات بیشتر در مورد مدیریت اطلاعات محرمانه، به بخش «ذخیره و دسترسی به اطلاعات پیکربندی حساس» مراجعه کنید.

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

اکنون، وقتی این تابع را مستقر می‌کنید، کلید API شما در Cloud Secret Manager ذخیره می‌شود و از محیط Cloud Functions در دسترس خواهد بود.

جمینی (هوش مصنوعی ورتکس)

  1. در کنسول Cloud، API Vertex AI را برای پروژه Firebase خود فعال کنید .

  2. در صفحه IAM ، مطمئن شوید که به حساب کاربری سرویس محاسبه پیش‌فرض ، نقش Vertex AI User اعطا شده است.

تنها رازی که برای این آموزش باید تنظیم کنید، مربوط به ارائه‌دهنده مدل است، اما به طور کلی، باید برای هر سرویسی که جریان شما استفاده می‌کند، کار مشابهی انجام دهید.

(اختیاری) افزودن بررسی برنامه

بررسی برنامه 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 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