فراخوانی کردن جاری‌سازی‌های 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 برای جریان‌های مستقرشده

پس‌از استقرار، جریان‌های شما به روشی برای اصالت‌سنجی با هر سرویس ازراه‌دوری که به آن متکی هستند نیاز دارند. حداقل، اکثر جریان‌ها به اطلاعات اعتباری برای دسترسی به سرویس میانای برنامه‌سازی کاربردی مدل مورداستفاده‌شان نیاز دارند.

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

‫Gemini (هوش مصنوعی Google)

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

  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، Vertex AI API را برای پروژه Firebase خود فعال کنید.

  2. در صفحه IAM، مطمئن شوید که نقش کاربر 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 (هم‌رسانی منبع میان‌مبدئی)

از گزینه 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