アプリでモデル名をリモートで変更する

生成 AI モデルの可用性は頻繁に変更されます。新しい高性能モデルがリリースされ、古い低性能モデルは廃止されます。

Firebase AI Logic を使用してモバイルアプリやウェブアプリから生成 AI モデルに直接アクセスする場合は、これらの頻繁なモデルの変更に対応するようにアプリを構成することが重要です。すべてのユーザーがアプリの最新バージョンに更新して、必要なモデルを使用するわけではありません。

Firebase Remote Config を使用すると、新しいバージョンのアプリをリリースしなくても、Firebase コンソールからアプリのパラメータ値(モデル名など)を動的にリモートで更新できます。

モデル名の変更は、Firebase AI LogicRemote Config を使用する際の重要なユースケースですが、Remote Config を使用して、モデル生成の構成(最大トークン数、温度など)、安全性設定、システム指示、プロンプト データなどのアプリのパラメータを動的かつ条件付きで制御することもできます。

このガイドでは、アプリで Remote Config を実装する方法について説明します。特に、アプリで使用されるモデル名を制御する方法について説明します。

ステップ 1: Firebase コンソールでパラメータ値を設定する

Remote Config クライアント テンプレートを作成し、アプリでフェッチして使用する model_name パラメータとその値を構成します。

  1. Firebase コンソールで Firebase プロジェクトを開きます。次に、ナビゲーション メニューから [実行] を開いて、Remote Config を選択します。

  2. ページの上部にある [クライアント/サーバー] セレクタで [クライアント] が選択されていることを確認します。

  3. [構成を作成](または、以前にクライアント テンプレートを使用したことがある場合は [パラメータを追加])をクリックして、クライアント テンプレートを開始します。

  4. model_name パラメータを定義します。

    パラメータ名 説明 タイプ デフォルト値
    model_name モデル名。使用可能なモデル名をご確認ください。 文字列 gemini-2.5-flash
  5. このパラメータを追加したら、[変更を公開] をクリックします。新しい Remote Config テンプレートでない場合は、変更内容を確認し、もう一度 [変更を公開] をクリックします。

ステップ 2: アプリに Remote Config を追加して初期化する

Remote Config ライブラリを追加し、アプリ内で Remote Config を設定します。

Swift

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 ConfigRemote Config リアルタイム リスナーをインポートとして追加することで、アプリが新しい値をリアルタイムでフェッチし、フェッチの最小間隔を追加できるようにします。

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

Kotlin

  1. モジュール(アプリレベル)の Gradle ファイル(通常は app/build.gradle.kts または app/build.gradle)に Remote Config 依存関係を追加します。

    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. モジュール(アプリレベル)の Gradle ファイル(通常は app/build.gradle.kts または app/build.gradle)に Remote Config 依存関係を追加します。

    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;
    

Dart

  1. Flutter プロジェクト ディレクトリで、次のコマンドを使用して Remote Config をインストールして追加します。

    flutter pub add firebase_remote_config
    
  2. ./lib/main.dart を開き、Firebase AI Logic をサポートするために追加した他のインポートの後にこのインポートを追加します。

    import 'package:firebase_vertexai/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. 手順に沿って、Unity プロジェクトに Remote Config を追加します。

  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 コンソールで 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 = {
  model_name: 'gemini-2.5-flash',
};

Dart

モデル名のデフォルト値は、コード内で直接設定できます。

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

Unity

モデル名のデフォルト値は、コード内で直接設定できます。

// Set default values for Remote Config parameters.
await remoteConfig.SetDefaultsAsync(
  new System.Collections.Generic.Dictionary<string, object>() {
    { "model_name", "gemini-2.5-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. インポートに getValuefetchAndActivate を追加します。

    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

ウェブアプリでは、リアルタイム Remote Config リスナーはサポートされていません。

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: Remote Config 値を使用するように Gemini API リクエストを更新する

Gemini API プロバイダをクリックして、このページでプロバイダ固有のコンテンツとコードを表示します。

Remote Config が完全に構成されたので、コードを更新して、ハードコードされた値を Remote Config から取得した値に置き換えます。

Swift

import FirebaseAI

// 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: アプリを実行する

アプリをビルドして実行し、動作することを確認します。Firebase コンソールの Remote Config ページで構成を変更し、変更をパブリッシュして結果を確認します。

次のステップ