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

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

قبل از شروع

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

یک پروژه Firebase راه اندازی کنید

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

  2. پروژه را به طرح Blaze ارتقا دهید، که برای استقرار تولید توابع ابری لازم است.

  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 پروژه کپی یا بنویسید. در اینجا یک جریان مثال برای نشان دادن این وجود دارد:

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/v2/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 برای Gemini API ایجاد کنید .

  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 در دسترس است.

Gemini (Vertex AI)

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

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

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

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

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/v2/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