Firebase Remote Config תומך בהגדרה בצד השרת באמצעות Firebase Admin SDK ל-Node.js (גרסה 12.1.0 ואילך), ל-Python (גרסה 6.7.0 ואילך), ל-Java (גרסה 9.7.0 ואילך) ול-Go (גרסה 4.17.0 ואילך).
היכולת הזו מאפשרת לכם לנהל באופן דינמי את ההתנהגות וההגדרה של אפליקציות בצד השרת באמצעות Remote Config. זה כולל הטמעות בלי שרת (serverless) כמו Cloud Functions for Firebase ושירותים בקונטיינרים ב-Cloud Run.
בניגוד ל-SDK של Firebase בצד הלקוח, שמאחזר תצורה ספציפית ללקוח שנגזרת מתבנית Remote Config, ה-SDK בצד השרת Remote Configמוריד או מאחזר תבנית מלאה Remote Config מ-Firebase. לאחר מכן, השרת יכול להעריך את התבנית בכל בקשה נכנסת ולהשתמש בלוגיקה משלו כדי להציג תגובה מותאמת אישית עם זמן אחזור נמוך מאוד. אתם יכולים להשתמש בתנאים כדי לשלוט בתשובות ולהתאים אותן אישית על סמך אחוזים אקראיים ומאפייני לקוח שמוגדרים באותות בהתאמה אישית.
בעזרת Remote Config בצד השרת, אפשר:
- הגדרת פרמטרים של אפליקציות שפועלות בשרת או שיש אליהן גישה דרך השרת, כדי לאפשר תרחישי שימוש כמו הגדרה מרחוק של פרמטרים והנחיות של מודלים של AI ושילובים אחרים, כדי להבטיח שמפתחות ה-API יישארו מאובטחים.
- התאמה דינמית של פרמטרים בתגובה לשינויים בסביבה או לשינויים אחרים באפליקציה, כמו עדכון של פרמטרים של LLM ונקודות קצה של מודלים.
- שליטה בעלויות על ידי עדכון מרחוק של ממשקי ה-API שהשרת קורא להם.
- יצירת הגדרות מותאמות אישית תוך כדי תנועה ללקוחות שניגשים לשרת.
- לרשום אילו לקוחות קיבלו ערך פרמטר ולהשתמש בערך הזה ב-Cloud Functions for Firebase כחלק ממערכת לאימות זכאות.
אפשר לפרוס תיוג בצד השרת Remote Config ב-Cloud Run, Cloud Functions for Firebase או בסביבות שרתים באירוח עצמי.
לפני שמתחילים
פועלים לפי ההוראות במאמר בנושא הוספת SDK של Firebase לאדמינים לשרת כדי ליצור פרויקט Firebase, להגדיר חשבון שירות ולהוסיף את SDK של Firebase לאדמינים לשרת. חשוב לוודא שאתם משתמשים בגרסה נתמכת של Admin SDK לפלטפורמה שלכם:
- Node.js: Firebase Admin Node.js SDK גרסה 12.1.0 ואילך
- Python: Firebase Admin Python SDK גרסה 6.7.0 ואילך
- Java: Firebase Admin Java SDK גרסה 9.7.0 ואילך
- Go: Firebase Admin Go SDK גרסה 4.17.0 ואילך
שלב 1: מאתחלים את SDK של Firebase לאדמינים ומאשרים בקשות API
כשמפעילים את SDK לאדמינים בלי פרמטרים, ה-SDK משתמש בApplication Default Credentials וקורא את האפשרויות ממשתנה הסביבה GOOGLE_APPLICATION_CREDENTIALS. מאתחלים את ה-SDK ומגדירים את Remote Config לפלטפורמה שלכם:
Node.js
מייבאים את initializeApp ואת getRemoteConfig, ואז מאתחלים את מופע האפליקציה של Firebase:
import { initializeApp } from "firebase-admin/app";
import { getRemoteConfig } from "firebase-admin/remote-config";
// Initialize Firebase
const firebaseApp = initializeApp();
Python
מייבאים את firebase_admin (יחד עם asyncio ו-json לטעינה אסינכרונית של תבניות ולניתוח של JSON), ואז מאתחלים את האפליקציה:
import firebase_admin
import asyncio
import json
firebase_admin.initialize_app()
Java
מפעילים את SDK של Firebase לאדמינים באמצעות FirebaseOptions ופרטי הכניסה של חשבון השירות:
// Initialize the Firebase Admin SDK
FirebaseOptions options = new FirebaseOptions.Builder()
.setCredentials(GoogleCredentials.fromStream(serviceAccount))
.build();
FirebaseApp.initializeApp(options);
המשך
מפעילים את אפליקציית Firebase ויוצרים מופע של RemoteConfigלקוח:
ctx := context.Background()
// Initialize Firebase
app, err := firebase.NewApp(ctx, nil)
if err != nil {
log.Fatalln("Error initializing app:", err)
}
remoteConfig, err := app.RemoteConfig(ctx)
if err != nil {
log.Fatalln("Error initializing remote config client:", err)
}
שלב 2: מזהים את ערכי ברירת המחדל של הפרמטרים באפליקציית השרת
מזהים את המשתנים באפליקציה שרוצים לעדכן באופן דינמי באמצעות Remote Config. לאחר מכן, צריך לחשוב אילו משתנים צריך להגדיר כברירת מחדל באפליקציה ומה צריכים להיות ערכי ברירת המחדל שלהם. כך מוודאים שהאפליקציה תפעל בהצלחה גם אם החיבור שלה לשרת הקצה העורפי Remote Config ייקטע.
לדוגמה, אם אתם כותבים אפליקציית שרת שמנהלת פונקציית AI גנרטיבי, אתם יכולים להגדיר שם מודל שמוגדר כברירת מחדל, פתיח להנחיה והגדרת AI גנרטיבי, כמו בדוגמה הבאה:
| שם הפרמטר | תיאור | סוג | ערך ברירת המחדל |
|---|---|---|---|
model_name |
שם ה-API של המודל | מחרוזת | gemini-2.0-flash |
preamble_prompt |
הנחיה להוספה לפני השאילתה של המשתמש | מחרוזת | I'm a developer who wants to learn about Firebase and you are a
helpful assistant who knows everything there is to know about
Firebase! |
generation_config |
פרמטרים לשליחה למודל | JSON | {"stopSequences": ["I hope this helps"], "temperature": 0.7,
"maxOutputTokens": 512, "topP": 0.1, "topK": 20} |
שלב 3: הגדרת אפליקציית השרת
אחרי שמחליטים באילו פרמטרים רוצים להשתמש עם Remote Config, צריך להגדיר את האפליקציה כך שתגדיר ערכי ברירת מחדל, תאחזר את תבנית Remote Config הספציפית לשרת ותעריך את הערכים שלה.
ניגשים לתבנית השרת Remote Config וטוענים אותה.
Node.js
מפעילים את תבנית השרת באמצעות
initServerTemplate()וקוראים ל-load()כדי לאחזר את התבנית מהקצה העורפי:// Initialize server-side Remote Config const rc = getRemoteConfig(firebaseApp); const template = rc.initServerTemplate(); // Load Remote Config await template.load();אם אתם משתמשים ב-Node.js בתוך Cloud Functions for Firebase, אתם יכולים להשתמש בפונקציה האסינכרונית
getServerTemplate()כדי לאתחל ולטעון את התבנית בשלב אחד:// Initialize server-side Remote Config const rc = getRemoteConfig(firebaseApp); const template = await rc.getServerTemplate();Python
מפעילים את תבנית השרת באמצעות
init_server_template()וקוראים ל-load()כדי לאחזר את התבנית מהקצה העורפי:from firebase_admin import remote_config # Initialize server-side Remote Config template = remote_config.init_server_template() # Load the template from the backend asyncio.run(template.load())לחלופין, אם אתם משתמשים ב-Python עם Cloud Functions for Firebase, אתם יכולים להשתמש בפונקציה האסינכרונית
get_server_template()כדי לאתחל ולטעון את התבנית בשלב אחד:# Initialize server-side Remote Config template = await remote_config.get_server_template()Java
מפעילים את הלקוח Remote Config בצד השרת באמצעות
FirebaseRemoteConfig.getInstance():// Initialize server-side Remote Config client FirebaseRemoteConfig rc = FirebaseRemoteConfig.getInstance();לחלופין, אם אתם משתמשים ב-Java עם Cloud Functions for Firebase, אתם יכולים להשתמש ב-
getServerTemplate()כדי לאתחל ולטעון את התבנית בפעולה אחת:ServerTemplate template = rc.getServerTemplate();המשך
מפעילים את תבנית השרת באמצעות
InitServerTemplate()וקוראים ל-Load()כדי לאחזר את התבנית מהקצה העורפי:// Initialize server-side Remote Config defaultConfig := make(map[string]any) templateDataJSON := "" template, err := remoteConfig.InitServerTemplate(defaultConfig, templateDataJSON) if err != nil { log.Fatalln("Error initializing server template:", err) } // Load Remote Config err = template.Load(ctx) if err != nil { log.Fatalln("Error fetching server template:", err) }דרך נוספת לאתחל את התבנית היא באמצעות הפונקציה
GetServerTemplateכדי לאחזר את תבנית השרת הנדרשת. אפשר להמיר את התבנית הזו לפורמט JSON שאפשר לשמור באופן מקומי, ואז לאתחל את תבנית ה-JSON הזו באמצעות הפונקציהInitServerTemplate.כדי לוודא שהאפליקציה פועלת בצורה תקינה גם אם החיבור שלה לשרת הקצה העורפי Remote Config מופרע, צריך להוסיף ערכי ברירת מחדל לכל פרמטר באפליקציה.
Node.js
מוסיפים אובייקט
defaultConfigבתוך פונקציית התבניתinitServerTemplateאוgetServerTemplate:const template = rc.initServerTemplate({ defaultConfig: { model_name: "gemini-pro", generation_config: '{"stopSequences": [], "temperature": 0.7, "maxOutputTokens": 512, "topP": 0.1, "topK": 20}', preamble_prompt: "I'm a developer who wants to learn about Firebase and you are a helpful assistant who knows everything there is to know about Firebase!" }, }); // Load Remote Config await template.load();Python
מוסיפים מילון
default_configבתוך פונקציית התבניתinit_server_templateאוget_server_template:template = remote_config.init_server_template({ 'default_config': { 'model_name': "gemini-pro", 'generation_config': '{"stopSequences": [], "temperature": 0.7, "maxOutputTokens": 512, "topP": 0.1, "topK": 20}', 'preamble_prompt': "I'm a developer who wants to learn about Firebase and you are a helpful assistant who knows everything there is to know about Firebase!" }, }) # Load Remote Config asyncio.run(template.load())דרך נוספת לאתחל תבנית היא באמצעות הפונקציה
get_server_templateכדי לאחזר את תבנית השרת הנדרשת. אפשר להמיר את התבנית הזו לפורמט JSON באמצעות הפונקציהtemplate.to_json. אפשר לשמור את תבנית ה-JSON הזו באופן מקומי, ואחר כך להפעיל אותה באמצעות הפונקציהinit_server_template.Java
מוסיפים אובייקט
defaultConfigבאמצעותKeysAndValuesבתוך הפונקציהgetServerTemplate:// Initialize default config using KeysAndValues KeysAndValues defaultConfig = new KeysAndValues.Builder() .put("rc_param_1", "default value 1") .put("rc_param_2", "default value 2") .build(); ServerTemplate template = rc.getServerTemplate(defaultConfig);לחלופין, אפשר להעביר תבנית ברירת מחדל ששמורה במטמון בזמן האתחול של Remote Config, שאפשר להשתמש בה גם אם החיבור לשרת Remote Config מופרע:
String templateDataJSON = "{}"; // add your default template as JSON ServerTemplate template = rc.serverTemplateBuilder() .defaultConfig(defaultConfig) .cachedTemplate(templateDataJSON) .build();המשך
מוסיפים
defaultConfigמפה בתוךInitServerTemplateאו פונקציית התבניתGetServerTemplate:// Initialize server-side Remote Config defaultConfig := make(map[string]any) defaultConfig["model_name"] = "gemini-2.0-flash" // Assume the type generationConfig has been defined defaultConfig["generation_config"] = &generationConfig{ StopSequences: []string{"I hope this helps"}, Temperature: 0.7, MaxOutputTokens: 512, TopP: 0.9, TopK: 30, } defaultConfig["preamble_prompt"] = "I'm a developer who wants to learn about Firebase and you are a helpful assistant who knows everything there is to know about Firebase!" templateDataJSON := "" template, err := remoteConfig.InitServerTemplate(defaultConfig, templateDataJSON) if err != nil { log.Fatalln("Error initializing server template:", err) } // Load Remote Config err = template.Load(ctx) if err != nil { log.Fatalln("Error fetching server template:", err) }אחרי שהתבנית נטענת, מעריכים את התבנית כדי לייבא פרמטרים וערכים מהתבנית:
Node.js
שימוש ב-
template.evaluate():// Add template parameters to config const config = template.evaluate();Python
שימוש ב-
template.evaluate():# Add template parameters to config config = template.evaluate()Java
שימוש ב-
template.evaluate():// Add template parameters to config ServerConfig config = template.evaluate();המשך
שימוש במשתנה
template.Evaluate()עם הקשר הערכה ריק כשלא מוחלים תנאים:// An empty evaluation context means no conditions are applied. evaluationContext := make(map[string]any) config, err := template.Evaluate(evaluationContext) if err != nil { log.Fatalln("Error evaluating template:", err) }אופציונלי: אם הגדרתם תנאים בתבנית Remote Config, צריך להגדיר ולספק את ערכי ההקשר שרוצים:
- אם משתמשים בתנאי אחוזים, צריך להוסיף את מזהה ההקצאה האקראית (
randomizationId,randomization_idאוrandomizationID) שרוצים להשתמש בו כדי להעריך את התנאים בפונקציית ההערכה של התבנית. - אם משתמשים באותות בהתאמה אישית, צריך להגדיר את המאפיינים והערכים שלהם. האותות המותאמים אישית זמינים ב-Firebase Admin Node.js SDK בגרסה 12.5.0 ואילך, ב-Python SDK בגרסה 6.7.0 ואילך, ב-Java SDK בגרסה 9.7.0 ואילך וב-Go SDK בגרסה 4.17.0 ואילך.
לדוגמה, אפשר להגדיר מזהה התקנה של Firebase או מזהה משתמש כמזהה האקראי כדי לוודא שכל משתמש שיוצר קשר עם השרת שלכם יתווסף לקבוצה האקראית המתאימה,
versionכאות מותאם אישית לטירגוט גרסאות ספציפיות של לקוחות, ו-platformכאות מותאם אישית לטירגוט פלטפורמות לקוח.מידע נוסף על תנאים מופיע במאמר סוגי כללי תנאים.
Node.js
מעבירים אובייקט של הקשר הערכה שמכיל את
randomizationIdואותות מותאמים אישית אלtemplate.evaluate():// Add template parameters to `config`. Evaluates the // template and returns the parameter value assigned to // the group assigned to the {randomizationId} and version. const config = template.evaluate({ randomizationId: "2ac93c28-c459-4760-963d-a3974ec26c04", version: "1.0", platform: "Android" });Python
מעבירים מילון שמכיל את
randomization_idואותות מותאמים אישית אלtemplate.evaluate():# Add template parameters to `config`. Evaluates the # template and returns the parameter value assigned to # the group assigned to the {randomization_id} and version. config = template.evaluate({ 'randomization_id': "2ac93c28-c459-4760-963d-a3974ec26c04", 'version': "1.0", 'platform': "Android" })Java
יוצרים הקשר
KeysAndValuesשמכיל אתrandomizationIdואותות מותאמים אישית, ומעבירים אותו אלtemplate.evaluate():// Add custom signals and randomizationId KeysAndValues context = new KeysAndValues.Builder() .put("custom_signal_key", "99") .put("randomizationId", "2ac93c28") .build(); // Evaluate the template with signals ServerConfig config = template.evaluate(context);המשך
מעבירים מפת הקשר של ההערכה שמכילה את
randomizationIDואותות מותאמים אישית אלtemplate.Evaluate():// Add template parameters to `config`. Evaluates the // template and returns the parameter value assigned to // the group assigned to the {randomizationID}, version, and platform. evaluationContext := make(map[string]any) evaluationContext["randomizationID"] = "2ac93c28-c459-4760-963d-a3974ec26c04" evaluationContext["version"] = "1.0" evaluationContext["platform"] = "Android" config, err := template.Evaluate(evaluationContext) if err != nil { log.Fatalln("Error evaluating template:", err) }- אם משתמשים בתנאי אחוזים, צריך להוסיף את מזהה ההקצאה האקראית (
לאחר מכן, מחלצים את ערכי הפרמטרים שרוצים מאובייקט ההגדרה המוערך. משתמשים בשיטות getter כדי להמיר ערכים מ-Remote Config לפורמט הצפוי.
לדוגמה, אם מטמיעים את Agent Platform בשרת ורוצים לשנות את המודל ואת הפרמטרים שלו, אפשר להגדיר פרמטרים ל-
model_nameול-generation_config. אלה שיטות ה-getter הנתמכות ודוגמה לאופן הגישה לערכים של Remote Config בכל פלטפורמה:Node.js
getter methods נתמכים:
- ערך בוליאני:
getBoolean - אובייקט:
getValue - מספר:
getNumber - מחרוזת:
getString
// Replace defaults with values from Remote Config. const generationConfig = JSON.parse( config.getString('generation_config')); const is_ai_enabled = config.getBoolean('is_ai_enabled'); const model = config.getString('model_name'); // Generates a prompt comprised of the Remote Config // parameter and prepends it to the user prompt const prompt = `${config.getString('preamble_prompt')} ${req.query.prompt}`;Python
getter methods נתמכים:
- ערך בוליאני:
get_bool - מספר שלם:
get_int - חופש תנועה:
get_float - מחרוזת:
get_string - מקור הערך:
get_value_source
# Replace defaults with values from Remote Config. generation_config = json.loads(config.get_string('generation_config')) is_ai_enabled = config.get_bool('is_ai_enabled') model = config.get_string('model_name') # Generates a prompt comprised of the Remote Config # parameter and prepends it to the user prompt. prompt = f"{config.get_string('preamble_prompt')}{req.args.get('prompt')}"Java
getter methods נתמכים:
- ערך בוליאני:
getBoolean - מחרוזת:
getString - Double:
getDouble - תאריך בפורמט ארוך:
getLong - מקור הערך:
getValueSource
// Get the model name String modelName = config.getString("model_name"); // Get the origin of value assigned to param ValueSource modelNameSource = config.getValueSource("model_name");השיטה
getValueSourceמחזירהValueSourceשמציין אם מקור הערך של הפרמטר הואSTATIC,REMOTEאוDEFAULT.המשך
getter methods נתמכים:
- ערך בוליאני:
GetBoolean - מספר שלם:
GetInt - חופש תנועה:
GetFloat - מחרוזת:
GetString - מקור הערך:
GetValueSource
// Replace defaults with values from Remote Config. // Assume the type generationConfig has been defined var genConfig generationConfig err = json.Unmarshal([]byte(config.GetString("generation_config")), &genConfig) if err != nil { log.Fatalln("Error unmarshaling generation config:", err) } model := config.GetString("model_name") // Parameter created on the console isAIEnabled := config.GetBoolean("is_ai_enabled") // Generates a prompt comprised of the Remote Config // parameter and prepends it to the user prompt (assume it is extracted from the request body) userPrompt := "What is Remote Config?" prompt := fmt.Sprintf("%s %s", config.GetString("preamble_prompt"), userPrompt)- ערך בוליאני:
אם השרת שלכם פועל לאורך זמן, בניגוד לסביבה ללא שרתים, צריך לטעון מחדש את התבנית באופן תקופתי (למשל, באמצעות
setIntervalב-Node.js אוjava.util.Timerב-Java) כדי לוודא שאתם מאחזרים את התבנית העדכנית ביותר משרת Remote Config.
שלב 4: הגדרת ערכי פרמטרים ספציפיים לשרת ב-Remote Config
לאחר מכן, יוצרים תבנית של Remote Configשרת ומגדירים פרמטרים וערכים לשימוש באפליקציה.
כך יוצרים תבנית Remote Config ספציפית לשרת:
במסוף Firebase, עוברים אל DevOps & Engagement (פיתוח אפליקציות ואינטראקציה עם משתמשים) > הגדרת תצורה מרחוק > הדף Parameters (פרמטרים).
בתפריט הבחירה לקוח/שרת בחלק העליון של הדף, בוחרים באפשרות שרת.
מגדירים Remote Config פרמטרים עם אותם שמות וסוגי נתונים כמו הפרמטרים שהגדרתם באפליקציה, ומספקים ערכים. הערכים האלה יבטלו את הגדרת ברירת המחדל (
defaultConfigאוdefault_config) שהגדרתם בהגדרת אפליקציית השרת כשאתם מאחזרים ומעריכים את התבנית ומקצים את הערכים האלה למשתנים.אפשר להגדיר תנאים להחלת ערכים באופן קבוע על מדגם אקראי של מופעים או על אותות מותאמים אישית שהגדרתם. מידע נוסף על תנאים מופיע במאמר סוגי כללי תנאים.
כשמסיימים להוסיף פרמטרים, לוחצים על פרסום השינויים.
בודקים את השינויים ולוחצים שוב על פרסום השינויים.
שלב 5: פריסה באמצעות Cloud Functions for Firebase או Cloud Run
אם אפליקציית השרת שלכם קלה ומופעלת על ידי אירועים, כדאי לפרוס את הקוד באמצעות Cloud Functions for Firebase. לדוגמה, נניח שיש לכם אפליקציה שכוללת דיאלוג של דמויות שמבוסס על API של AI גנרטיבי (למשל Google AI או Agent Platform). במקרה כזה, תוכלו לארח את הלוגיקה של שירות ה-LLM בפונקציה שהאפליקציה שלכם קוראת לה לפי דרישה.
כדי לפתור בעיה באמצעות Cloud Functions for Firebase מהדור השני עם Remote Config בצד השרת, אפשר לעיין במאמר שימוש ב-Remote Config בצד השרת עם Cloud Functions for Firebase ו-Agent Platform.
מידע נוסף על פריסת האפליקציה באמצעות Cloud Functions for Firebase זמין במאמר תחילת העבודה: כתיבה, בדיקה ופריסה של הפונקציות הראשונות.
אפשר לנסות פונקציה לדוגמה שאפשר להפעיל עם Remote Config בצד השרת ועם App Check בכתובת Call the Agent Platform Gemini API (formerly Vertex AI) with Remote Config and App Check.
אם אתם בונים אפליקציית אינטרנט עם עיבוד בצד השרת, App Hosting תומך במסגרות אינטרנט פופולריות.
אחרת, כדאי Cloud Run. כדי לפרוס את אפליקציית השרת באמצעות Cloud Run, פועלים לפי המדריך למתחילים בשפה הרלוונטית:
- מדריך למתחילים: פריסת שירות Node.js ב-Cloud Run
- מדריך למתחילים: פריסת שירות Python ב-Cloud Run
- מדריך למתחילים: פריסת שירות Java ב-Cloud Run
- מדריך למתחילים: פריסת שירות Go ב-Cloud Run
מידע נוסף על תרחישי השימוש המומלצים ל-Cloud Run ול-Cloud Functions for Firebase זמין במאמר Cloud Functions for Firebase לעומת Cloud Run: מתי כדאי להשתמש באחד מהם.
השלבים הבאים
- מידע נוסף על פרמטרים ותנאים בצד השרת זמין במאמר פרמטרים ותנאים (בצד השרת).
- שימוש בפתרון מלא: שימוש ב-Remote Config בצד השרת עם Cloud Functions for Firebase ו-Agent Platform.
- איך מנהלים גרסאות של תבניות Remote Config