Как удаленно изменить название модели в приложении

Доступность моделей генеративного ИИ часто меняется: появляются новые, более совершенные модели, а старые, менее эффективные, отключаются.

Если вы получаете доступ к моделям генеративного ИИ напрямую из мобильного или веб-приложения с помощью Firebase AI Logic, важно настроить приложение так, чтобы оно могло адаптироваться к частым изменениям моделей. Не все пользователи обновят приложение до последней версии, чтобы начать использовать нужную вам модель.

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

Обратите внимание, что изменение названия модели – это критически важный пример использования Remote Config с Firebase AI Logic, но вы также можете использовать Remote Config для динамического и даже условного управления параметрами в приложении, такими как конфигурация генерации модели (например, максимальное количество выходных токенов), настройки безопасности, системные инструкции и данные подсказок.

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

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

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

  1. В консоли Firebase выберите DevOps & Engagement (DevOps и вовлечение) > Remote Config (Удаленная конфигурация).

  2. В верхней части страницы в меню Клиент/сервер выберите Клиент.

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

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

    Название параметра Описание Тип Значение по умолчанию
    model_name Название модели. Ознакомьтесь со списком доступных моделей. Строка gemini-3.8-flash
  5. Добавив этот параметр, нажмите Опубликовать изменения. Если это не новый шаблон Remote Config, проверьте изменения и снова нажмите Опубликовать изменения.

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

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

Swift

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

  1. Откройте проект в Xcode и выберите File (Файл) > Add Package Dependencies (Добавить зависимости пакетов).

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

  3. В навигаторе проектов выберите свое приложение, а затем нажмите Targets (Цели) и снова выберите приложение.

  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:35.0.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:35.0.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;
    

Dart

  1. В каталоге проекта Flutter установите и добавьте Remote Config с помощью следующей команды:

    flutter pub add firebase_remote_config
    
  2. Откройте файл ./lib/main.dart и добавьте импорт после других импортов, которые вы добавили для поддержки Firebase AI Logic:

    import 'package:firebase_ai/firebase_ai.dart';
    import 'package:firebase_core/firebase_core.dart';
    import 'package:firebase_remote_config/firebase_remote_config.dart';
    
  3. Добавьте переменную _modelName в приложение, чтобы использовать ее позже:

    late final String _modelName;
    late final String _systemInstructions;
    late final String _prompt;
    
  4. Получите экземпляр объекта Remote Config и задайте минимальный интервал получения, чтобы обеспечить возможность частых обновлений. Добавьте его после инициализации Firebase.

      final remoteConfig = FirebaseRemoteConfig.instance;
      await remoteConfig.setConfigSettings(RemoteConfigSettings(
        fetchTimeout: const Duration(seconds: 3600),
        minimumFetchInterval: const Duration(seconds: 3600),
      ));
    

Unity

  1. Добавьте Remote Config в проект Unity, следуя этим инструкциям.

  2. Получите экземпляр объекта Remote Config и задайте минимальный интервал получения, чтобы обеспечить возможность частых обновлений. Добавлять этот код нужно после инициализации Firebase.

    var remoteConfig = FirebaseRemoteConfig.DefaultInstance;
    const int MillisecondsPerSecond = 1000;
    await remoteConfig.SetConfigSettingsAsync(new ConfigSettings() {
      FetchTimeoutInMilliseconds = 3600 * MillisecondsPerSecond,
      MinimumFetchIntervalInMilliseconds = 3600 * MillisecondsPerSecond
    });
    

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

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

Swift

  1. В консоли Firebase перейдите на страницу DevOps & Engagement (DevOps и вовлечение) > Remote Config (Удаленная конфигурация) > Parameters (Параметры).

  2. Откройте меню и выберите Скачать значения по умолчанию.

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

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

  5. В Xcode нажмите правой кнопкой мыши на приложение и выберите Add Files (Добавить файлы).

  6. Выберите remote_config_defaults.plist и нажмите Add (Добавить).

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

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

Kotlin

  1. В консоли Firebase перейдите на страницу DevOps & Engagement (DevOps и вовлечение) > Remote Config (Удаленная конфигурация) > Parameters (Параметры).

  2. Откройте меню и выберите Скачать значения по умолчанию.

  3. В появившемся окне выберите .xml для Android и нажмите Скачать файл.

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

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

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

Java

  1. В консоли Firebase выберите DevOps & Engagement (DevOps и взаимодействие) > Remote Config (Удаленная настройка) > Parameters (Параметры).

  2. Откройте меню и выберите Скачать значения по умолчанию.

  3. В появившемся окне выберите .xml для Android и нажмите Скачать файл.

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

  5. Обновите основной файл activity, добавив значения по умолчанию после строки 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 = {
  model_name: 'gemini-3.8-flash',
};

Dart

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

// Set default values for Remote Config parameters.
remoteConfig.setDefaults(const {
  "model_name": "gemini-3.8-flash"
});

Unity

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

// Set default values for Remote Config parameters.
await remoteConfig.SetDefaultsAsync(
  new System.Collections.Generic.Dictionary<string, object>() {
    { "model_name", "gemini-3.8-flash" }
  }
);

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

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

Swift

// 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. Найдите код, в котором вы указываете значение по умолчанию для названия модели. Сразу после этого блока кода добавьте следующий код, чтобы получить и активировать конфигурацию и назначить полученное значение константе modelName.

    // 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 modelName = getValue(remoteConfig, 'model_name').asString();
    

Dart

// Fetch and activate Remote Config.
remoteConfig.fetchAndActivate();

// Assign Remote Config values.
String? _modelName = remoteConfig.getString("model_name");

Unity

// Fetch and activate Remote Config values.
await remoteConfig.FetchAndActivateAsync();

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

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

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

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

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

 // Add a real-time Remote Config listener
 onConfigUpdate(remoteConfig, {
   next: (configUpdate) => {
      console.log("Updated keys:", configUpdate.getUpdatedKeys());
      if (configUpdate.getUpdatedKeys().has("welcome_message")) {
         activate(remoteConfig).then(() => {
         showWelcomeMessage();
         });
      }
   },
   error: (error) => {
      console.log("Config update error:", error);
   },
   complete: () => {
      console.log("Listening stopped.");
   }
});

Dart

// Add a real-time Remote Config listener
remoteConfig.onConfigUpdated.listen((event) async {
  await remoteConfig.activate();
});

Unity

// Add a real-time Remote Config listener to automatically update whenever
// a new template is published.
// Note: the parameters can be anonymous as they are unused.

remoteConfig.OnConfigUpdateListener += (_, _) => {
  remoteConfig.ActivateAsync();
};

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

Нажмите на поставщика Gemini API, чтобы посмотреть контент и код, относящиеся к нему.

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

Swift

import FirebaseAILogic

// When creating a `GenerativeModel` instance, source the model name value from Remote Config
let modelName = remoteConfig.configValue(forKey: "model_name").stringValue
let model = FirebaseAI.firebaseAI(backend: .googleAI()).generativeModel(
  modelName: modelName
)

// ...

Kotlin

// When creating a `GenerativeModel` instance, source the model name value from Remote Config
val model = Firebase.ai(backend = GenerativeBackend.googleAI()).generativeModel(
  modelName = remoteConfig.getString("model_name")
)

// ...

Java

// When creating a `GenerativeModel` instance, source the model name value from Remote Config
GenerativeModel ai = FirebaseAI.getInstance(GenerativeBackend.googleAI())
    .generativeModel(
      /* modelName */ remoteConfig.getString("model_name"),
      /* generationConfig (optional) */ null,
      /* safetySettings (optional) */ null,
      /* requestOptions (optional) */ new RequestOptions(),
      /* tools (optional) */ null,
      /* toolsConfig (optional) */ null,
      /* systemInstruction (optional) */ null,
    );

GenerativeModelFutures model = GenerativeModelFutures.from(ai);

// ...

Web

// ...

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

// When creating a `GenerativeModel` instance, source the model name value from Remote Config
const model = getGenerativeModel(ai, {
  model: modelName
});

// ...

Dart

// ...

// When creating a `GenerativeModel` instance, source the model name value from Remote Config
final model = FirebaseAI.googleAI().generativeModel(
  model: _modelName,
);

// ...

Unity

// ...

var ai = FirebaseAI.GetInstance(FirebaseAI.Backend.GoogleAI());

// When creating a `GenerativeModel` instance, source the model name value from Remote Config
var modelName = remoteConfig.GetValue("model_name").StringValue;
var model = ai.GetGenerativeModel(
  modelName: modelName
);

// ...

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

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

Дальнейшие действия