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ı kullanılarak sunucu tarafında 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 üzerindeki kapsayıcılı hizmetler buna dahildir.

Firebase istemci SDK'larının Remote Config şablonundan türetilen istemciye özel bir yapılandırma getirmesinin aksine, sunucu tarafı Remote Config SDK'sı Firebase'den tam bir Remote Config şablonu indirir veya getirir. Sunucunuz daha sonra şablonu her gelen istekle birlikte değerlendirebilir ve çok düşük gecikme süresiyle özelleştirilmiş bir yanıt sunmak için kendi mantığını kullanabilir. Koşulları kullanarak yanıtları rastgele yüzdelere ve özel sinyallerde tanımlanan müşteri özelliklerine göre kontrol edip özelleştirebilirsiniz.

Sunucu tarafı Remote Config ile şunları yapabilirsiniz:

  • Sunucunuzda çalışan veya sunucunuz üzerinden erişilen uygulamalar için yapılandırma parametrelerini tanımlayarak API anahtarlarınızın güvenliğini sağlamak amacıyla uzaktan yapay zeka modeli parametrelerini ve istemlerini yapılandırma gibi kullanım alanlarına ve diğer entegrasyonlara olanak tanıyı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 bir şekilde ayarlayın.
  • 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 Cloud Functions for Firebase içinde hak doğrulama sisteminin bir parçası olarak kullanın.

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

Başlamadan önce

Firebase projesi oluşturmak, hizmet hesabı ayarlamak 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 Yönetici SDK'sının desteklenen bir sürümünü kullandığınızdan emin olun:

  • Node.js: Firebase Admin Node.js SDK'sı v12.1.0+
  • Python: Firebase Admin Python SDK v6.7.0 veya sonraki sürümler
  • Java: Firebase Admin Java SDK'sı v9.7.0 veya sonraki sürümler
  • Go: Firebase Admin Go SDK v4.17.0+

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

Admin SDK'yı parametre olmadan başlattığınızda SDK, Google Uygulama Varsayılan Kimlik Bilgileri'ı kullanır ve GOOGLE_APPLICATION_CREDENTIALS ortam değişkeninden seçenekleri okur. SDK'yı başlatın ve Remote Config platformunuz için 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 (eşzamansız şablon yükleme ve JSON ayrıştırma için asyncio ve json ile birlikte) öğesini içe aktarın, ardından uygulamayı başlatın:

import firebase_admin
import asyncio
import json

firebase_admin.initialize_app()

Java

Firebase Admin SDK'sını FirebaseOptions ve hizmet hesabı kimlik bilgilerinizi kullanarak 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 RemoteConfigistemci ö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 hangi değişkenlerin varsayılan olarak ayarlanması gerektiğini ve varsayılan değerlerinin ne olması gerektiğini düşünün. Bu, uygulamanızın Remote Config arka uç sunucuyla bağlantısı kesilse bile başarılı bir şekilde çalışmasını sağlar.

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

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 sorgusuna 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 bu şablonu yükleyin.

    Node.js

    initServerTemplate() kullanarak sunucu şablonunu başlatın ve şablonu arka uçtan getirmek için load() işlevini ç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 başlatmak 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 getirmek için load() işlevini ç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, Python'ı Cloud Functions for Firebase ile kullanıyorsanız şablonu tek bir adımda başlatmak 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 başlatmak ve yüklemek için getServerTemplate() kullanabilirsiniz:

    ServerTemplate template = rc.getServerTemplate();
    

    Go

    InitServerTemplate() kullanarak sunucu şablonunu başlatın ve şablonu arka uçtan getirmek için Load() işlevini ç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ç sunucusuna bağlantısı kesilse bile sorunsuz çalışmasını sağlamak için uygulamanızdaki her parametreye varsayılan değerler ekleyin.

    Node.js

    defaultConfig nesnesi ekleyin. initServerTemplate veya getServerTemplate şablon işleviniz:

    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 sözlüğü init_server_template veya get_server_template şablon işlevinize 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. Bu şablonu template.to_json işlevini kullanarak 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şlevinizde KeysAndValues kullanarak 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 da iletebilirsiniz. Bu şablon, Remote Config sunucusuna 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

    defaultConfig veya InitServerTemplate şablon işlevinize GetServerTemplate harita 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() kullanma:

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

    Python

    template.evaluate() kullanma:

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

    Java

    template.evaluate() kullanma:

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

    Go

    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 ayarlarsanız istediğiniz bağlam değerlerini tanımlayıp sağlayın:

    • Yüzde koşulları kullanıyorsanız koşullarınızı değerlendirmek için kullanmak istediğiniz rastgeleleştirme kimliğini (randomizationId, randomization_id veya randomizationID) şablon değerlendirme işlevine ekleyin.
    • Özel sinyaller kullanıyorsanız özellikleri ve değerlerini tanımlayın. Özel sinyaller, Firebase Admin Node.js SDK v12.5.0+, Python SDK v6.7.0+, Java SDK v9.7.0+ ve Go SDK v4.17.0+ sürümlerinde kullanılabilir.

    Örneğin, sunucunuza ulaşan her kullanıcının uygun rastgele gruba eklenmesini sağlamak için rastgeleleştirme kimliği olarak bir Firebase yükleme kimliği veya kullanıcı kimliği ayarlayabilirsiniz. Ayrıca, belirli istemci sürümlerini hedeflemek için özel bir sinyal olarak version ve istemci platformlarını hedeflemek için özel bir sinyal olarak platform kullanabilirsiniz.

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

    Node.js

    randomizationId ve özel sinyaller içeren bir değerlendirme bağlamı nesnesini template.evaluate()'ye 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 sinyaller içeren bir sözlüğü template.evaluate()'ye 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 sinyaller 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 sinyaller içeren bir değerlendirme bağlamı haritasını template.Evaluate()'ye 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 ayıklayın. Remote Config değerlerini beklenen biçime dönüştürmek için alıcı yöntemleri kullanın.

    Örneğin, sunucunuzda Agent Platform uyguluyorsanız ve modeli ve model parametrelerini değiştirmek istiyorsanız model_name ve generation_config için parametreleri yapılandırabilirsiniz. Desteklenen getter yöntemleri ve her platform için Remote Config değerlerine nasıl erişileceğine dair bir örnek aşağıda verilmiştir:

    Node.js

    Desteklenen getter 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 getter yöntemleri:

    • Boole: get_bool
    • Tamsayı: 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 getter 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ı belirten bir ValueSource döndürür.

    Go

    Desteklenen getter yöntemleri:

    • Boole: GetBoolean
    • Tamsayı: 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. Sunucusuz bir ortamın aksine, sunucunuz uzun süredir çalışıyorsa Remote Config sunucusundan en güncel şablonu getirdiğinizi doğrulamak için şablonu düzenli olarak yeniden yükleyin (örneğin, 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 (DevOps ve Etkileşim) > Remote Config > Parameters (Parametreler) sayfasına gidin.

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

  3. Uygulamanızda tanımladığınız parametrelerle aynı adlara ve veri türlerine sahip Remote Config parametreler 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ırın 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 rastgele bir örnekleme veya tanımladığınız özel sinyallere 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 hafif ve etkinliğe dayalıysa kodunuzu Cloud Functions for Firebase kullanarak dağıtmayı düşünebilirsiniz. Ö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, uygulamanızın isteğe bağlı olarak çağırdığı bir işlevde LLM hizmeti sunma mantığınızı barındırabilirsiniz.

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

Aksi takdirde, Cloud Run. Sunucu uygulamanızı Cloud Run ile dağıtmak için dilinizdeki hızlı başlangıç kılavuzunu inceleyin:

Cloud Run ve Cloud Functions for Firebase için en iyi kullanım alanları hakkında daha fazla bilgi edinmek istiyorsanız Cloud Functions for Firebase ve Cloud Run: Hangisi ne zaman kullanılmalı? başlıklı makaleyi inceleyin.

Sonraki adımlar