Sunucu ortamlarında Remote Config'i kullanın

Firebase Remote Config; Node.js (v12.1.0+), Python (v6.7.0+), Java (v9.7.0+) ve Go (v4.17.0+) için Firebase Admin SDK'larını kullanarak sunucu tarafı yapılandırmayı destekler.

Bu özellik, Remote Config kullanarak sunucu tarafı uygulamalarının davranışını ve yapılandırmasını dinamik olarak yönetmenize olanak tanır. Cloud Functions for Firebase gibi sunucusuz uygulamalar ve Cloud Run'teki container mimarisine alınmış hizmetler de buna dahildir.

Remote Config şablonundan türetilen istemciye özel bir yapılandırmayı getiren Firebase istemci SDK'larının aksine, sunucu tarafı Remote Config SDK'sı Firebase'den eksiksiz bir Remote Config şablonu indirir veya getirir. Sunucunuz daha sonra gelen her istekle şablonu değerlendirebilir ve çok düşük gecikmeyle özelleştirilmiş bir yanıt sunmak için kendi mantığını kullanabilir. Yanıtları, rastgele yüzdelere ve özel sinyallerde tanımlanan istemci özelliklerine göre kontrol etmek ve özelleştirmek için koşulları kullanabilirsiniz.

Sunucu tarafı Remote Config ile şunları yapabilirsiniz:

  • Sunucunuzda çalışan veya sunucunuz üzerinden erişilen uygulamalar için yapılandırma parametreleri tanımlayarak yapay zeka modeli parametrelerini, istemleri ve diğer entegrasyonları uzaktan yapılandırma gibi kullanım alanlarına olanak tanıyın ve API anahtarlarınızın güvende kalmasını sağlayın.
  • Ortamınızdaki değişikliklere veya diğer uygulama değişikliklerine (ör. LLM parametrelerini ve model uç noktalarını güncelleme) yanıt olarak parametreleri dinamik olarak ayarlama
  • Sunucunuzun çağırdığı API'leri uzaktan güncelleyerek maliyetleri kontrol edin.
  • Sunucunuza erişen istemciler için anında özel yapılandırmalar oluşturun.
  • Hangi istemcilerin parametre değeri aldığını kaydedin ve bunu yararlanma hakkı doğrulama sisteminin bir parçası olarak Cloud Functions for Firebase içinde kullanın.

Sunucu tarafı Remote Config'ı Cloud Run, Cloud Functions for Firebase veya barındırılan sunucu ortamlarında dağıtabilirsiniz.

Başlamadan önce

Firebase projesi oluşturmak, hizmet hesabı oluşturmak ve Firebase Admin SDK'sını sunucunuza eklemek için Firebase Admin SDK'sını sunucunuza ekleme bölümündeki talimatları uygulayın. Platformunuz için Admin SDK'nın desteklenen bir sürümünü kullandığınızdan emin olun:

  • Node.js: Firebase Admin Node.js SDK'sı 12.1.0 ve sonraki sürümler
  • Python: Firebase Admin Python SDK'sı 6.7.0 veya sonraki sürümler
  • Java: Firebase Admin Java SDK'sı 9.7.0 veya sonraki sürümler
  • Go: Firebase Admin Go SDK 4.17.0 veya sonraki sürümler

1. adım: Firebase Admin SDK'yı başlatın ve API isteklerini yetkilendirin

Admin SDK'yı parametre olmadan başlattığınızda SDK, Google Uygulama Varsayılan Kimlik Bilgileri'ni kullanır ve seçenekleri GOOGLE_APPLICATION_CREDENTIALS ortam değişkeninden okur. SDK'yı başlatın ve platformunuz için Remote Config yapılandırın:

Node.js

initializeApp ve getRemoteConfig öğelerini içe aktarın, ardından Firebase uygulama örneğinizi başlatın:

import { initializeApp } from "firebase-admin/app";
import { getRemoteConfig } from "firebase-admin/remote-config";

// Initialize Firebase
const firebaseApp = initializeApp();

Python

firebase_admin'yi (eşzamansız şablon yükleme ve JSON ayrıştırma için asyncio ve json ile birlikte) içe aktarın, ardından uygulamayı ilk kullanıma hazırlayın:

import firebase_admin
import asyncio
import json

firebase_admin.initialize_app()

Java

FirebaseOptions ve hizmet hesabı kimlik bilgilerinizi kullanarak Firebase Admin SDK'yı başlatın:

// Initialize the Firebase Admin SDK
FirebaseOptions options = new FirebaseOptions.Builder()
    .setCredentials(GoogleCredentials.fromStream(serviceAccount))
    .build();
FirebaseApp.initializeApp(options);

Go

Firebase uygulamasını başlatın ve bir RemoteConfig istemci örneği oluşturun:

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. adım: Sunucu uygulamanız için varsayılan parametre değerlerini belirleyin

Uygulamanızda Remote Config ile dinamik olarak güncellemek istediğiniz değişkenleri belirleyin. Ardından, uygulamanızda varsayılan olarak hangi değişkenlerin ayarlanması gerektiğini ve bunların varsayılan değerlerinin ne olması gerektiğini düşünün. Bu sayede, uygulamanızın Remote Config arka uç sunucusuyla bağlantısı kesilse bile uygulamanız başarıyla çalışır.

Örneğin, üretken yapay zeka işlevini yöneten bir sunucu uygulaması yazıyorsanız varsayılan bir model adı, istem ön talimatları ve üretken yapay zeka yapılandırması belirleyebilirsiniz. Örneğin:

Parametre adı Açıklama Tür Varsayılan değer
model_name Model API adı Dize gemini-2.0-flash
preamble_prompt Kullanıcının sorgusunun başına eklenecek istem Dize 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 Modele gönderilecek parametreler JSON {"stopSequences": ["I hope this helps"], "temperature": 0.7, "maxOutputTokens": 512, "topP": 0.1, "topK": 20}

3. adım: Sunucu uygulamanızı yapılandırın

Remote Config ile kullanmak istediğiniz parametreleri belirledikten sonra uygulamanızı varsayılan değerleri ayarlayacak, sunucuya özel Remote Config şablonunu getirecek ve değerlerini değerlendirecek şekilde yapılandırın.

  1. Remote Config sunucu şablonuna erişip şablonu yükleyin.

    Node.js

    initServerTemplate() kullanarak sunucu şablonunu başlatın ve şablonu arka uçtan almak için load() yöntemini çağırın:

    // Initialize server-side Remote Config
    const rc = getRemoteConfig(firebaseApp);
    const template = rc.initServerTemplate();
    
    // Load Remote Config
    await template.load();
    

    Cloud Functions for Firebase içinde Node.js kullanıyorsanız şablonu tek bir adımda ilk kullanıma hazırlamak ve yüklemek için eşzamansız getServerTemplate() işlevini kullanabilirsiniz:

    // Initialize server-side Remote Config
    const rc = getRemoteConfig(firebaseApp);
    const template = await rc.getServerTemplate();
    

    Python

    init_server_template() kullanarak sunucu şablonunu başlatın ve şablonu arka uçtan almak için load() yöntemini çağırın:

    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())
    

    Alternatif olarak, Cloud Functions for Firebase ile Python kullanıyorsanız şablonu tek bir adımda ilk kullanıma hazırlamak ve yüklemek için eşzamansız get_server_template() işlevini kullanabilirsiniz:

    # Initialize server-side Remote Config
    template = await remote_config.get_server_template()
    

    Java

    Sunucu tarafı Remote Config istemcisini FirebaseRemoteConfig.getInstance() kullanarak başlatın:

    // Initialize server-side Remote Config client
    FirebaseRemoteConfig rc = FirebaseRemoteConfig.getInstance();
    

    Alternatif olarak, Java'yı Cloud Functions for Firebase ile kullanıyorsanız şablonu tek bir adımda ilk kullanıma hazırlamak ve yüklemek için getServerTemplate() kullanabilirsiniz:

    ServerTemplate template = rc.getServerTemplate();
    

    Go

    InitServerTemplate() kullanarak sunucu şablonunu başlatın ve şablonu arka uçtan almak için Load() yöntemini çağırın:

    // 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)
    }
    

    Şablonu başlatmanın bir diğer yolu da gerekli sunucu şablonunu almak için GetServerTemplate işlevini kullanmaktır. Bu şablonu yerel olarak depolanabilen bir JSON biçimine dönüştürebilir ve ardından InitServerTemplate işlevini kullanarak bu JSON şablonunu başlatabilirsiniz.

  2. Uygulamanızın, Remote Config arka uç sunucusuyla bağlantısı kesilse bile başarıyla çalışmasını sağlamak için uygulamanızdaki her parametreye varsayılan değerler ekleyin.

    Node.js

    initServerTemplate veya getServerTemplate şablon işlevinizin içine bir defaultConfig nesnesi ekleyin:

    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

    init_server_template veya get_server_template şablon işlevinizin içine bir default_config sözlüğü ekleyin:

    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())
    

    Şablonu başlatmanın bir diğer yolu da gerekli sunucu şablonunu almak için get_server_template işlevini kullanmaktır. template.to_json işlevini kullanarak bu şablonu JSON biçimine dönüştürebilirsiniz. Bu JSON şablonu yerel olarak depolanabilir ve daha sonra init_server_template işlevini kullanarak bu JSON şablonunu başlatabilirsiniz.

    Java

    getServerTemplate işlevinizin içinde KeysAndValues kullanarak bir defaultConfig nesnesi ekleyin:

    // 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);
    

    Alternatif olarak, Remote Config başlatılırken varsayılan bir önbelleğe alınmış şablon iletebilirsiniz. Bu şablon, Remote Config sunucusuyla bağlantı kesildiğinde bile kullanılabilir:

    String templateDataJSON = "{}"; // add your default template as JSON
    ServerTemplate template = rc.serverTemplateBuilder()
                        .defaultConfig(defaultConfig)
                        .cachedTemplate(templateDataJSON)
                        .build();
    

    Go

    InitServerTemplate veya GetServerTemplate şablon işlevinizin içine bir defaultConfig haritası ekleyin:

    // 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)
    }
    
  3. Şablon yüklendikten sonra, şablondaki parametreleri ve değerleri içe aktarmak için şablonu değerlendirin:

    Node.js

    template.evaluate() kullanın:

    // Add template parameters to config
    const config = template.evaluate();
    

    Python

    template.evaluate() kullanın:

    # Add template parameters to config
    config = template.evaluate()
    

    Java

    template.evaluate() kullanın:

    // Add template parameters to config
    ServerConfig config = template.evaluate();
    

    Go

    Hiçbir koşul uygulanmadığında boş bir değerlendirme bağlamıyla template.Evaluate() kullanın:

    // 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)
    }
    
  4. İsteğe bağlı olarak, Remote Config şablonunuzda koşullar belirlediyseniz istediğiniz bağlam değerlerini tanımlayın ve sağlayın:

    • Yüzde koşulları kullanıyorsanız şablon değerlendirme işlevinde koşullarınızı değerlendirmek için kullanmak istediğiniz rastgele seçim kimliğini (randomizationId, randomization_id veya randomizationID) ekleyin.
    • Özel sinyaller kullanıyorsanız özellikleri ve değerlerini tanımlayın. Özel sinyaller Firebase Admin Node.js SDK 12.5.0 ve sonraki sürümleri, Python SDK 6.7.0 ve sonraki sürümleri, Java SDK 9.7.0 ve sonraki sürümleri ile Go SDK 4.17.0 ve sonraki sürümlerinde kullanılabilir.

    Örneğin, sunucunuzla iletişime geçen her kullanıcının doğru rastgele gruba eklendiğinden emin olmak için rastgele hale getirme kimliği olarak bir Firebase yükleme kimliği veya kullanıcı kimliği, belirli istemci sürümlerini hedeflemek için özel sinyal olarak version ve istemci platformlarını hedeflemek için özel sinyal olarak platform ayarlayabilirsiniz.

    Koşullar hakkında daha fazla bilgi için Koşul kuralı türleri başlıklı makaleyi inceleyin.

    Node.js

    template.evaluate() işlevine randomizationId ve özel sinyalleri içeren bir değerlendirme bağlamı nesnesi iletin:

    // 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 ve özel sinyalleri içeren bir sözlüğü template.evaluate() yöntemine iletin:

    # 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

    randomizationId ve özel sinyalleri içeren bir KeysAndValues bağlamı oluşturun ve bunu template.evaluate()'ye iletin:

    // 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);
    

    Go

    randomizationID ve özel sinyalleri içeren bir değerlendirme bağlamı eşlemesini template.Evaluate() yöntemine iletin:

    // 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)
    }
    
  5. Ardından, değerlendirilen yapılandırma nesnesinden ihtiyacınız olan parametre değerlerini çıkarın. Remote Config değerlerini beklenen biçime dönüştürmek için alıcı yöntemlerini kullanın.

    Örneğin, Agent Platform modelini sunucunuzda uyguluyorsanız ve modeli ve model parametrelerini değiştirmek istiyorsanız model_name ve generation_config için parametreleri yapılandırabilirsiniz. Aşağıda, desteklenen alıcı yöntemleri ve her platform için Remote Config değerlerine nasıl erişileceğini gösteren bir örnek verilmiştir:

    Node.js

    Desteklenen alıcı yöntemleri:

    • Boole: getBoolean
    • Nesne: getValue
    • Numara: getNumber
    • Dize: 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

    Desteklenen alıcı yöntemleri:

    • Boole: get_bool
    • Tam sayı: get_int
    • Yanal dönüş: get_float
    • Dize: get_string
    • Değer kaynağı: 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

    Desteklenen alıcı yöntemleri:

    • Boole: getBoolean
    • Dize: getString
    • Çift: getDouble
    • Uzun: getLong
    • Değer kaynağı: 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 yöntemi, parametrenin değer kaynağının STATIC, REMOTE veya DEFAULT olup olmadığını gösteren bir ValueSource döndürür.

    Go

    Desteklenen alıcı yöntemleri:

    • Boole: GetBoolean
    • Tam sayı: GetInt
    • Yanal dönüş: GetFloat
    • Dize: GetString
    • Değer kaynağı: 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)
    
  6. Sunucunuz sunucusuz bir ortam değil de uzun süredir çalışıyorsa Remote Config sunucusundan en güncel şablonu aldığınızı doğrulamak için şablonu düzenli olarak yeniden yükleyin (ör. Node.js'de setInterval veya Java'da java.util.Timer kullanarak).

4. adım: Remote Config içinde sunucuya özel parametre değerlerini ayarlayın

Ardından bir sunucu Remote Config şablonu oluşturun ve uygulamanızda kullanılacak parametreleri ve değerleri yapılandırın.

Sunucuya özel Remote Config şablonu oluşturmak için:

  1. Firebase konsolunda DevOps & Engagement > Remote Config > Parameters sayfasına gidin.

  2. Sayfanın üst kısmındaki İstemci/Sunucu seçiciden Sunucu'yu seçin.

  3. Uygulamanızda tanımladığınız parametrelerle aynı adlara ve veri türlerine sahip Remote Config parametre tanımlayın ve değerler sağlayın. Bu değerler, şablonu getirip değerlendirdiğinizde ve bu değerleri değişkenlerinize atadığınızda Sunucu uygulamanızı yapılandırma bölümünde ayarladığınız varsayılan yapılandırmayı (defaultConfig veya default_config) geçersiz kılar.

  4. İsteğe bağlı olarak, değerleri tanımladığınız örneklerin veya özel sinyallerin rastgele bir örneğine kalıcı olarak uygulamak için koşullar belirleyin. Koşullar hakkında daha fazla bilgi için Koşul kuralı türleri başlıklı makaleyi inceleyin.

  5. Parametre eklemeyi tamamladığınızda Değişiklikleri yayınla'yı tıklayın.

  6. Değişiklikleri inceleyin ve tekrar Değişiklikleri yayınla'yı tıklayın.

5. adım: Cloud Functions for Firebase veya Cloud Run ile dağıtın

Sunucu uygulamanız basit ve etkinliğe dayalıysa kodunuzu Cloud Functions for Firebase kullanarak dağıtabilirsiniz. Örneğin, üretken yapay zeka API'si (ör. Google AI veya Agent Platform) tarafından desteklenen karakter diyalogları içeren bir uygulamanız olduğunu varsayalım. Bu durumda, LLM sunma mantığınızı uygulamanızın seç-izle olarak çağırdığı bir işlevde barındırabilirsiniz.

Sunucu tarafından oluşturulan bir web uygulaması geliştiriyorsanız App Hosting popüler web çerçevelerini destekler.

Aksi takdirde Cloud Run seçeneğini değerlendirebilirsiniz. Sunucu uygulamanızı Cloud Run ile dağıtmak için dilinizle ilgili hızlı başlangıç kılavuzunu inceleyin:

Sonraki adımlar