Membuat versi template menggunakan Remote Config


Saat menggunakan template perintah server, Anda dapat memperbarui nilai dalam template tertentu tanpa merilis aplikasi versi baru. Namun, karena setiap perubahan pada template akan langsung digunakan oleh permintaan dari aplikasi Anda, Anda harus berhati-hati saat melakukan perubahan yang dapat merusak aplikasi atau menyebabkan perubahan perilaku yang tidak terduga.

Jadi, jika Anda ingin melakukan perubahan yang lebih besar atau meluncurkan perubahan secara bertahap, Anda tidak boleh mengubah template yang digunakan dalam kode produksi.

Sebagai gantinya, sebaiknya gunakan Firebase Remote Config untuk mengontrol nilai ID template yang digunakan dalam permintaan ke model.

Firebase Remote Config memungkinkan Anda memperbarui nilai parameter di aplikasi (seperti ID template) secara dinamis dan dari jarak jauh dari Firebase console, tanpa perlu merilis versi baru aplikasi Anda. Fitur ini juga memiliki kemampuan dan integrasi yang disederhanakan untuk meluncurkan perubahan serta pengujian A/B.

Panduan ini menjelaskan cara menerapkan Remote Config di aplikasi Anda, khususnya untuk mengontrol ID template yang digunakan di aplikasi Anda.

Langkah 1: Tetapkan parameter value di Firebase console

Buat template klien Remote Config dan konfigurasikan parameter template_id serta nilainya untuk diambil dan digunakan dalam aplikasi.

  1. Buka project Firebase Anda di konsol Firebase. Kemudian, dari menu navigasi, luaskan Run, lalu pilih Remote Config.

  2. Pastikan Client dipilih dari pemilih Client/Server di bagian atas halaman.

  3. Mulai template klien dengan mengklik Create Configuration (atau Add parameter jika Anda sebelumnya telah menggunakan template klien).

  4. Tentukan parameter template_id:

    Nama parameter Deskripsi Jenis Nilai default
    template_id ID template. String my-first-template-v1-0-0
  5. Setelah menambahkan parameter ini, klik Publish changes. Jika ini bukan template Remote Config baru, tinjau perubahan, lalu klik Publish changes lagi.

Langkah 2: Tambahkan dan lakukan inisialisasi Remote Config di aplikasi Anda

Tambahkan library Remote Config dan siapkan Remote Config dalam aplikasi Anda.

Swift

Sebagai bagian dari penyiapan Firebase AI Logic, Anda telah menambahkan Firebase SDK ke aplikasi, tetapi juga harus menambahkan Remote Config.

  1. Di Xcode, dengan project terbuka, buka File > Add Package Dependencies.

  2. Pilih firebase-ios-sdk, lalu klik Add package.

  3. Dari Project navigator, pilih aplikasi > Targets > aplikasi Anda.

  4. Dari tab General, scroll ke Framework, Library, dan Embedded Content.

  5. Klik + dan pilih FirebaseRemoteConfig, lalu klik Add.

  6. Tambahkan impor FirebaseRemoteConfig ke kode Anda:

    import FirebaseRemoteConfig
    
  7. Di dalam class yang sesuai untuk aplikasi Anda, lakukan inisialisasi Firebase dan tambahkan Remote Config ke logika aplikasi utama Anda.

    Di sini, Anda akan menyertakan Remote Config dan pemroses real-time Remote Config sebagai pengimporan sehingga aplikasi dapat mengambil nilai baru secara real-time, dan menambahkan interval pengambilan minimum:

    let remoteConfig = RemoteConfig.remoteConfig()
    let settings = RemoteConfigSettings()
    settings.minimumFetchInterval = 3600
    remoteConfig.configSettings = settings
    

Kotlin

  1. Tambahkan dependensi Remote Config ke file Gradle modul (level aplikasi) (biasanya app/build.gradle.kts atau app/build.gradle):

    dependencies {
        implementation(platform("com.google.firebase:firebase-bom:34.5.0"))
        implementation("com.google.firebase:firebase-ai")
        implementation("com.google.firebase:firebase-config")
        // ... other dependencies
    }
    
  2. Tambahkan Remote Config ke logika aplikasi utama Anda. Di sini, Anda akan melakukan inisialisasi Remote Config dan menambahkan interval pengambilan minimum:

    val remoteConfig: FirebaseRemoteConfig = Firebase.remoteConfig
    val configSettings = remoteConfigSettings {
    minimumFetchIntervalInSeconds = 3600
    }
    remoteConfig.setConfigSettingsAsync(configSettings)
    

Java

  1. Tambahkan dependensi Remote Config ke file Gradle modul (level aplikasi) (biasanya app/build.gradle.kts atau app/build.gradle):

    dependencies {
        implementation(platform("com.google.firebase:firebase-bom:34.5.0"))
        implementation("com.google.firebase:firebase-ai")
        implementation("com.google.firebase:firebase-config")
        // ... other dependencies
    }
    
  2. Tambahkan Remote Config ke logika aplikasi utama Anda. Di sini, Anda akan melakukan inisialisasi Remote Config dan menambahkan interval pengambilan minimum:

    FirebaseRemoteConfig mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance();
    FirebaseRemoteConfigSettings configSettings = new FirebaseRemoteConfigSettings.Builder()
        .setMinimumFetchIntervalInSeconds(3600)
        .build();
    mFirebaseRemoteConfig.setConfigSettingsAsync(configSettings);
    

Web

  1. Buka kode Anda di editor teks dan impor Remote Config:

    import { getRemoteConfig } from 'firebase/remote-config';
    
  2. Di dalam fungsi utama dan setelah aplikasi Firebase diinisialisasi untuk Firebase AI Logic SDK, lakukan inisialisasi Remote Config:

      // Initialize Remote Config and get a reference to the service
      const remoteConfig = getRemoteConfig(app);
    
  3. Tetapkan interval pengambilan minimum:

    remoteConfig.settings.minimumFetchIntervalMillis = 3600000;
    

Langkah 3: Tetapkan parameter value dalam aplikasi

Anda harus menetapkan parameter value default dalam aplikasi di objek Remote Config. Hal ini memastikan bahwa aplikasi Anda berperilaku seperti yang diharapkan meskipun tidak dapat mengambil nilai dari layanan Remote Config.

Swift

  1. Di Firebase console, buka Remote Config.

  2. Di tab Parameters, buka Menu, lalu pilih Download default values.

  3. Jika diminta, aktifkan .plist for iOS, lalu klik Download file.

  4. Simpan file di direktori aplikasi Anda.

  5. Di Xcode, klik kanan aplikasi Anda, lalu pilih Add Files

  6. Pilih remote_config_defaults.plist, lalu klik Add.

  7. Perbarui kode aplikasi Anda untuk mereferensikan file default:

    // Set default values for Remote Config parameters.
    remoteConfig.setDefaults(fromPlist: "remote_config_defaults")
    

Kotlin

  1. Dari Firebase console, buka Remote Config.

  2. Di tab Parameters, buka Menu, lalu pilih Download default values.

  3. Jika diminta, aktifkan .xml for Android, lalu klik Download file.

  4. Simpan file di direktori resource XML aplikasi Anda.

  5. Perbarui file aktivitas utama untuk menambahkan default setelah configSettings yang Anda tambahkan sebelumnya:

    // Set default values for Remote Config parameters.
    remoteConfig.setDefaultsAsync(R.xml.remote_config_defaults)
    

Java

  1. Di Firebase console, buka Remote Config.

  2. Di tab Parameters, buka Menu, lalu pilih Download default values.

  3. Jika diminta, aktifkan .xml for Android, lalu klik Download file.

  4. Simpan file di direktori resource XML aplikasi Anda.

  5. Perbarui file aktivitas utama untuk menambahkan default setelah configSettings yang Anda tambahkan sebelumnya:

    // Set default values for Remote Config parameters.
    mFirebaseRemoteConfig.setDefaultsAsync(R.xml.remote_config_defaults);
    

Web

Anda dapat menetapkan nilai default untuk nama model langsung dalam kode:

// Set default values for Remote Config parameters.
remoteConfig.defaultConfig = {
  template_id: 'my-first-template-v1-0-0',
};

Langkah 4: Ambil dan aktifkan nilai

Setelah menetapkan nilai default untuk nama model, tambahkan kode berikut untuk mengambil dan mengaktifkan nilai.

Swift

// Fetch and activate Remote Config values
remoteConfig.fetchAndActivate { status, error in
  if let error = error {
    print("Error fetching Remote Config: \(error.localizedDescription)")
  }
}

Tindakan ini akan memperbarui objek Remote Config setiap kali template Remote Config baru dipublikasikan.

Kotlin

// Fetch and activate Remote Config values
remoteConfig.fetchAndActivate()
      .addOnCompleteListener(this) { task ->
          if (task.isSuccessful) {
              val updated = task.result
              Log.d(TAG, "Remote Config values fetched and activated: $updated")
          } else {
              Log.e(TAG, "Error fetching Remote Config", task.exception)
          }
      }

Java

  // Fetch and activate Remote Config values
  mFirebaseRemoteConfig.fetchAndActivate()
    .addOnCompleteListener(this, new OnCompleteListener<Boolean>() {
        @Override
        public void onComplete(@NonNull Task<Boolean> task) {
            if (task.isSuccessful()) {
                boolean updated = task.getResult();
                Log.d(TAG, "Config params updated: " + updated);
            } else {
                Log.e(TAG, "Error fetching Remote Config", task.exception)
            }
          }
    });

Web

  1. Tambahkan getValue dan fetchAndActivate ke impor Anda:

    import { getValue, fetchAndActivate } from 'firebase/remote-config';
    
  2. Temukan kode tempat Anda menentukan nilai default untuk nama model. Tepat setelah blok kode tersebut, tambahkan kode berikut untuk mengambil dan mengaktifkan konfigurasi serta menetapkan nilai yang diambil ke konstanta templateID.

    // Fetch and activate Remote Config.
    try {
      await fetchAndActivate(remoteConfig);
    } catch(err) {
      console.error('Remote Config fetch failed', err);
    }
    
    console.log('Remote Config fetched.');
    
    // Assign Remote Config values.
    const templateID = getValue(remoteConfig, 'template_id').asString();
    

Langkah 5: Tambahkan pemroses Remote Config real-time

Tambahkan pemroses Remote Config real-time ke aplikasi Anda untuk memastikan bahwa perubahan yang Anda buat pada template Remote Config disebarkan ke klien segera setelah diperbarui.

Kode berikut memperbarui objek Remote Config setiap kali parameter value berubah.

Swift

// Add real-time Remote Config
remoteConfig.addOnConfigUpdateListener { configUpdate, error in
  guard let configUpdate = configUpdate, error == nil else {
    print("Error listening for config updates: \(error?.localizedDescription ?? "No error available")")
    return
  }

  print("Updated keys: \(configUpdate.updatedKeys)")
  remoteConfig.activate { changed, error in
    guard error == nil else {
      print("Error activating config: \(error?.localizedDescription ?? "No error available")")
      return
    }
    print("Activated config successfully")
  }
}

Kotlin

Secara opsional, Anda juga dapat mengonfigurasi tindakan di dalam aktivasi addOnCompleteListener:

      // Add a real-time Remote Config listener
      remoteConfig.addOnConfigUpdateListener(object : ConfigUpdateListener {
          override fun onUpdate(configUpdate : ConfigUpdate) {
              Log.d(ContentValues.TAG, "Updated keys: " + configUpdate.updatedKeys);
              remoteConfig.activate().addOnCompleteListener {
                  // Optionally, add an action to perform on update here.
              }
          }

          override fun onError(error : FirebaseRemoteConfigException) {
              Log.w(ContentValues.TAG, "Config update error with code: " + error.code, error)
          }
      }

Java

Secara opsional, Anda juga dapat mengonfigurasi tindakan di dalam aktivasi addOnCompleteListener:

  // Add a real-time Remote Config listener
  remoteConfig.addOnConfigUpdateListener(new ConfigUpdateListener() {
      @Override
      public void onUpdate(ConfigUpdate configUpdate) {
          Log.d(ContentValues.TAG, "Updated keys: " + configUpdate.getUpdatedKeys());
                remoteConfig.activate().addOnCompleteListener(new OnCompleteListener<Boolean>() {
                  @Override
                  public void onComplete(@NonNull Task<Boolean> task) {
                      // Optionally, add an action to perform on update here.
                  }
              });
          }

      @Override
      public void onError(FirebaseRemoteConfigException error) {
          Log.w(ContentValues.TAG, "Config update error with code: " + error.getCode(), error);
      }
  });

Web

Pemroses Remote Config real-time tidak didukung untuk aplikasi Web.

Langkah 6: Perbarui permintaan Gemini API untuk menggunakan nilai Remote Config

Klik penyedia Gemini API untuk melihat konten dan kode khusus penyedia di halaman ini.

Setelah Remote Config dikonfigurasi sepenuhnya, perbarui kode Anda untuk mengganti nilai hard code dengan nilai yang bersumber dari Remote Config.

Swift

import FirebaseAI

let templateID = remoteConfig.configValue(forKey: "template_id").stringValue
let model = FirebaseAI.firebaseAI(backend: .googleAI()).templateGenerativeModel()
let customerName = "Jane"

// When making the `generateContent` call, source the template ID value from Remote Config
let response = try await model.generateContent(
  templateID: templateID,
  // Provide the values for any input variables required by your template.
  inputs: [
    "customerName": customerName
  ]
)

// ...

Kotlin

// ...

val model = Firebase.ai().templateGenerativeModel()
val customerName = "Jane"

// When making the `generateContent` call, source the template ID value from Remote Config
val response = model.generateContent(
  remoteConfig.getString("template_id"),
  // Provide the values for any input variables required by your template.
  mapOf(
    "customerName" to customerName
  )
)

val text = response.text
println(text)

Java

// ...

TemplateGenerativeModel ai = FirebaseAI.getInstance()
    .templateGenerativeModel(null /* Request Options */);

TemplateGenerativeModelFutures model = TemplateGenerativeModelFutures.from(ai);
String customerName = "Jane";

// When making the `generateContent` call, source the template ID value from Remote Config
Future<GenerateContentResponse> response = model.generateContent(
    remoteConfig.getString("template_id"),
    // Provide the values for any input variables required by your template.
    mapOf("customerName", customerName)

);
addCallback(response,
      new FutureCallback<GenerateContentResponse>() {
          public void onSuccess(GenerateContentResponse result) {
            System.out.println(result.getText());
          }
          public void onFailure(Throwable t) {
            reportError(t);
          }
    }
executor);

// ...

Web

// ...

const ai = getAI(firebaseApp, { backend: new GoogleAIBackend() });

const model = getTemplateGenerativeModel(ai);
const templateID = getValue(remoteConfig, 'template_id').asString();
const customerName = 'Jane';

// When making the `generateContent` call, source the template ID value from Remote Config
const result = await model.generateContent(
  templateID,
  // Provide the values for any input variables required by your template
  {
    customerName: customerName,
  }
);

// ...

Langkah 7: Jalankan aplikasi

Bangun, jalankan, dan pastikan aplikasi berfungsi. Lakukan perubahan pada konfigurasi Anda dari halaman Remote Config di Firebase console, publikasikan perubahan, dan verifikasi hasilnya.

Langkah berikutnya