ל-Cloud Functions for Firebase יש method onCallGenkit שמאפשרת ליצור פונקציה שאפשר להפעיל עם פעולה Genkit (תהליך).
אפשר להפעיל את הפונקציות האלה באמצעות genkit/beta/client או Cloud Functions for Firebase Client SDK, שמוסיפים באופן אוטומטי את פרטי האימות.
לפני שמתחילים
- חשוב להכיר את המושג Genkit תהליכי עבודה ואיך לכתוב אותם. ההנחיות בדף הזה מניחות שכבר הגדרתם כמה תהליכים שאתם רוצים לפרוס.
- זה יעזור, אבל לא חובה, אם השתמשתם ב-Cloud Functions for Firebase בעבר.
הגדרת פרויקט Firebase
יוצרים פרויקט חדש ב-Firebase באמצעות מסוף Firebase או בוחרים פרויקט קיים.
משדרגים את הפרויקט לתוכנית התמחור Blaze בתשלום לפי שימוש, שנדרשת לCloud Functions פריסה בסביבת ייצור.
מתקינים את Firebase CLI.
מתחברים אל CLI של Firebase:
firebase loginfirebase login --reauth # alternative, if necessaryfirebase login --no-localhost # if running in a remote shellיוצרים ספריית פרויקט חדשה:
export PROJECT_ROOT=~/tmp/genkit-firebase-project1mkdir -p $PROJECT_ROOTמאתחלים פרויקט Firebase בספרייה:
cd $PROJECT_ROOTfirebase 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/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)
יצירת מפתח API עבור Gemini Developer API באמצעות Google AI Studio.
מאחסנים את מפתח ה-API ב-Google 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 מאוחסן ב-Google Cloud Secret Manager וזמין מהסביבה Cloud Functions.
Gemini (Vertex AI)
במסוף Google Cloud, מפעילים את Vertex AI API בפרויקט Firebase.
בדף IAM, מוודאים שלחשבון השירות שמוגדר כברירת מחדל ל-Compute יש את התפקיד 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_ROOTfirebase deploy --only functions