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

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

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

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

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

  1. با استفاده از کنسول Firebase ، یک پروژه Firebase جدید ایجاد کنید، یا یک پروژه موجود را انتخاب کنید.

  2. پروژه را به طرح قیمت‌گذاری Blaze که به صورت پرداخت در محل است ارتقا دهید، که برای استقرار تولید Cloud Functions الزامی است.

  3. رابط خط فرمان Firebase CLI) را نصب کنید.

  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

بقیه‌ی این صفحه فرض می‌کند که شما تصمیم گرفته‌اید توابع خود را با جاوا اسکریپت بنویسید.

جریان را در 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 Studio یک کلید API برای Gemini Developer API ایجاد کنید.

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

    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 شما در Google Cloud Secret Manager ذخیره می‌شود و از محیط Cloud Functions در دسترس خواهد بود.

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

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

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

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

(اختیاری) افزودن 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