ל-Cloud Functions for Firebase יש שיטה onCallGenkit
שמאפשרת ליצור פונקציה שאפשר להפעיל באמצעות פעולה של Genkit (Flow). אפשר לקרוא לפונקציות האלה באמצעות genkit/beta/client
או ערכות ה-SDK של לקוח Cloud Functions, שמוסיפות באופן אוטומטי פרטי אימות.
לפני שמתחילים
- חשוב להכיר את המושג flows ב-Genkit ואת אופן הכתיבה שלהם. ההוראות בדף הזה מניחות שכבר הגדרתם כמה תהליכים שאתם רוצים לפרוס.
- הידע הזה מועיל, אבל לא חובה, אם השתמשתם בעבר ב-Cloud Functions for Firebase.
הגדרת פרויקט Firebase
יוצרים פרויקט חדש ב-Firebase באמצעות מסוף Firebase או בוחרים פרויקט קיים.
משדרגים את הפרויקט לתוכנית Blaze, שנדרשת לפריסת ייצור של Cloud Functions.
מתקינים את Firebase CLI.
מתחברים באמצעות Firebase CLI:
firebase login
firebase login --reauth # alternative, if necessary
firebase login --no-localhost # if running in a remote shell
יוצרים ספריית פרויקט חדשה:
export PROJECT_ROOT=~/tmp/genkit-firebase-project1
mkdir -p $PROJECT_ROOT
מאתחלים פרויקט 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/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 של המודל שבו משתמשים.
בדוגמה הזו, מבצעים אחת מהפעולות הבאות, בהתאם לספק המודל שבחרתם:
Gemini (AI מבית Google)
מוודאים ש-Google AI זמין באזור שלכם.
איך יוצרים מפתח API ל-Gemini API באמצעות Google AI Studio
אחסון מפתח ה-API ב-Cloud Secret Manager:
firebase functions:secrets:set GOOGLE_GENAI_API_KEY
השלב הזה חשוב כדי למנוע חשיפה לא מכוונת של מפתח ה-API, שמעניק גישה לשירות שעשוי להיות בתשלום.
מידע נוסף על ניהול סודות זמין במאמר אחסון וגישה למידע רגיש על הגדרות.
עורכים את
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)
במסוף Cloud, מפעילים את Vertex AI API בפרויקט Firebase.
בדף IAM, מוודאים שלחשבון השירות שמשמש כברירת מחדל ל-Compute יש את התפקיד Vertex AI User.
הסוד היחיד שצריך להגדיר במדריך הזה הוא של ספק המודל, אבל באופן כללי, צריך לעשות משהו דומה לכל שירות שמשמש את התהליך.
(אופציונלי) הוספת אכיפה של App Check
בדיקת אפליקציות ב-Firebase משתמשת באימות מקורי כדי לוודא שה-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