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

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

Если вы обращаетесь к генеративным моделям ИИ напрямую из мобильного или веб-приложения с помощью 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 и нажмите Добавить.

  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, опубликуйте их и проверьте результат.

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