Шаблоны версий с использованием Remote Config


Используя шаблоны серверных запросов, вы можете обновлять значения в заданном шаблоне без выпуска новой версии приложения. Однако, поскольку любые изменения в шаблоне будут практически сразу же использоваться запросами из вашего приложения, следует проявлять осторожность, не внося изменений, которые могут нарушить работу приложения или вызвать неожиданные изменения в его поведении.

Поэтому, если вы хотите внести более существенные изменения или внедрять изменения постепенно, вам не нужно менять шаблон, используемый в производственном коде.

Вместо этого мы рекомендуем использовать Firebase Remote Config для управления значением идентификатора шаблона, используемого в запросе к модели.

Firebase Remote Config позволяет динамически и удалённо обновлять значения параметров в вашем приложении (например, идентификатор шаблона) из консоли Firebase , без необходимости выпуска новой версии приложения. Сервис также предлагает оптимизированные возможности и интеграции для внедрения изменений и проведения A/B-тестирования.

В этом руководстве описывается, как реализовать Remote Config в вашем приложении, в частности, для управления идентификатором шаблона, используемым в вашем приложении .

Шаг 1 : Задайте значение параметра в консоли Firebase

Создайте шаблон клиента Remote Config и настройте параметр template_id и его значение для извлечения и использования в приложении.

  1. Откройте проект Firebase в консоли Firebase . Затем в меню навигации разверните пункт «Запуск» и выберите Remote Config .

  2. Убедитесь, что в селекторе Клиент/Сервер в верхней части страницы выбрано значение Клиент .

  3. Запустите клиентский шаблон, нажав «Создать конфигурацию» (или «Добавить параметр», если вы ранее использовали клиентские шаблоны).

  4. Определите параметр template_id :

    Имя параметра Описание Тип Значение по умолчанию
    template_id Идентификатор шаблона. Нить my-first-template-v1-0-0
  5. После добавления этого параметра нажмите «Опубликовать изменения» . Если это не новый шаблон Remote Config , проверьте изменения и снова нажмите «Опубликовать изменения» .

Шаг 2 : Добавьте и инициализируйте Remote Config в своем приложении.

Добавьте библиотеку Remote Config и настройте Remote Config в своем приложении.

Быстрый

В рамках настройки Firebase AI Logic вы уже добавили Firebase SDK в свое приложение, но вам также потребуется добавить Remote Config .

  1. В Xcode откройте проект, перейдите в Файл > Добавить зависимости пакета .

  2. Выберите firebase-ios-sdk и нажмите Добавить пакет .

  3. В навигаторе проектов выберите свое приложение > Цели > ваше приложение.

  4. На вкладке Общие прокрутите до раздела Фреймворки, Библиотеки и Встроенное содержимое .

  5. Нажмите + и выберите FirebaseRemoteConfig , затем нажмите Добавить .

  6. Добавьте импорт FirebaseRemoteConfig в свой код:

    import FirebaseRemoteConfig
    
  7. Внутри соответствующего класса вашего приложения инициализируйте Firebase и добавьте Remote Config в основную логику приложения.

    Здесь вы включите Remote Config и прослушиватель Remote Config в реальном времени в качестве импортов, чтобы приложение могло извлекать новые значения в реальном времени, а также добавите минимальный интервал выборки:

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

Kotlin

  1. Добавьте зависимость Remote Config в файл Gradle вашего модуля (уровня приложения) (обычно app/build.gradle.kts или 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. Добавьте Remote Config в основную логику приложения. Здесь вы инициализируете Remote Config и добавите минимальный интервал выборки:

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

Java

  1. Добавьте зависимость Remote Config в файл Gradle вашего модуля (уровня приложения) (обычно app/build.gradle.kts или 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. Добавьте Remote Config в основную логику приложения. Здесь вы инициализируете Remote Config и добавите минимальный интервал выборки:

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

Web

  1. Откройте свой код в текстовом редакторе и импортируйте Remote Config :

    import { getRemoteConfig } from 'firebase/remote-config';
    
  2. Внутри вашей основной функции и после инициализации приложения Firebase для Firebase AI Logic SDK инициализируйте Remote Config :

      // Initialize Remote Config and get a reference to the service
      const remoteConfig = getRemoteConfig(app);
    
  3. Установите минимальный интервал выборки:

    remoteConfig.settings.minimumFetchIntervalMillis = 3600000;
    

Шаг 3 : Задайте значение параметра в приложении

Вам следует задать значения параметров приложения по умолчанию в объекте Remote Config . Это гарантирует, что ваше приложение будет вести себя ожидаемым образом, даже если оно не сможет получить значения из службы Remote Config .

Быстрый

  1. В консоли Firebase откройте Remote Config .

  2. На вкладке «Параметры» откройте « Меню» и выберите «Загрузить значения по умолчанию» .

  3. При появлении запроса включите .plist для iOS , затем нажмите Загрузить файл .

  4. Сохраните файл в каталоге вашего приложения.

  5. В Xcode щелкните правой кнопкой мыши по приложению и выберите «Добавить файлы».

  6. Выберите remote_config_defaults.plist , затем нажмите Добавить .

  7. Обновите код приложения, указав ссылку на файл по умолчанию:

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

Kotlin

  1. В консоли Firebase откройте Remote Config .

  2. На вкладке «Параметры» откройте « Меню» и выберите «Загрузить значения по умолчанию» .

  3. При появлении запроса включите .xml для Android , затем нажмите Загрузить файл .

  4. Сохраните файл в каталоге XML-ресурсов вашего приложения.

  5. Обновите ваш основной файл активности, чтобы добавить значения по умолчанию после configSettings который вы добавили ранее:

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

Java

  1. В консоли Firebase откройте Remote Config .

  2. На вкладке «Параметры» откройте « Меню» и выберите «Загрузить значения по умолчанию» .

  3. При появлении запроса включите .xml для Android , затем нажмите Загрузить файл .

  4. Сохраните файл в каталоге XML-ресурсов вашего приложения.

  5. Обновите ваш основной файл активности, чтобы добавить значения по умолчанию после configSettings который вы добавили ранее:

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

Web

Вы можете задать значение по умолчанию для имени модели непосредственно в своем коде:

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

Шаг 4 : Получите и активируйте значение

После установки значения по умолчанию для имени модели добавьте следующее для извлечения и активации значений.

Быстрый

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

Это должно обновлять объект Remote Config каждый раз при публикации нового шаблона Remote Config .

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. Добавьте getValue и fetchAndActivate к вашим импортам:

    import { getValue, fetchAndActivate } from 'firebase/remote-config';
    
  2. Найдите код, в котором указывается значение по умолчанию для имени модели. Сразу после этого блока кода добавьте следующий код для извлечения и активации конфигурации, а также присвоения полученного значения константе 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();
    

Шаг 5 : Добавьте прослушиватель Remote Config в реальном времени

Добавьте в свое приложение прослушиватель Remote Config в режиме реального времени , чтобы гарантировать, что изменения, вносимые в шаблон Remote Config будут переданы клиенту сразу после их обновления.

Следующий код обновляет объект Remote Config при каждом изменении значения параметра.

Быстрый

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

При желании вы также можете настроить действие внутри активации 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

При желании вы также можете настроить действие внутри активации 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

Прослушиватели Remote Config в реальном времени не поддерживаются для веб-приложений.

Шаг 6 : Обновите запросы API Gemini , чтобы использовать значение Remote Config

Щелкните своего поставщика API Gemini , чтобы просмотреть специфичный для этого поставщика контент и код на этой странице.

Теперь, когда Remote Config полностью настроен, обновите свой код, заменив жестко заданные значения значениями, полученными из Remote Config .

Быстрый

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,
  }
);

// ...

Шаг 7 : Запустите приложение.

Соберите и запустите приложение, чтобы убедиться в его работоспособности. Внесите изменения в конфигурацию на странице Remote Config в консоли Firebase , опубликуйте изменения и проверьте результат.

Следующие шаги