Utiliser Remote Config côté serveur avec Cloud Functions et Agent Platform

Ce guide explique comment utiliser Cloud Functions de 2e génération avec Remote Config côté serveur pour effectuer des appels côté serveur vers l'Agent Platform Gemini API (formerly Vertex AI).

Dans ce tutoriel, vous allez ajouter Remote Config à une fonction de type chatbot qui utilise un modèle Gemini pour répondre aux questions des utilisateurs. Remote Config gérera les entrées Gemini API (y compris une requête que vous ajouterez au début des requêtes utilisateur entrantes), et vous pourrez mettre à jour ces entrées à la demande depuis la console Firebase. Vous utiliserez également Firebase Local Emulator Suite pour tester et déboguer la fonction. Ensuite, après avoir vérifié qu'elle fonctionne, vous la déploierez et la testerez sur Google Cloud.

Prérequis

Ce guide suppose que vous savez utiliser JavaScript pour développer des applications.

Configurer un projet Firebase

Si vous n'avez pas encore de projet Firebase :

  1. Connectez-vous à la consoleFirebase.

  2. Cliquez sur Créer un projet, puis utilisez l'une des options suivantes :

    • Option 1 : Créez un projet Firebase (et son projet Google Cloud sous-jacent automatiquement) en saisissant un nouveau nom de projet à la première étape du workflow "Créer un projet".
    • Option 2 : "Ajouter Firebase" à un projet Google Cloud existant en sélectionnant le nom de votre projet Google Cloud dans le menu déroulant à la première étape du workflow "Créer un projet".
  3. Lorsque vous y êtes invité, vous n'avez pas besoin de configurer Google Analytics pour utiliser cette solution.

  4. Continuez à suivre les instructions à l'écran pour créer votre projet.

Si vous avez déjà un projet Firebase :

Passez à l'étape Configurer votre environnement de développement.

Configurer votre environnement de développement

Vous aurez besoin d'un environnement Node.js pour écrire des fonctions et de la CLI Firebase pour déployer des fonctions dans l'environnement d'exécution Cloud Functions.

  1. Installez Node.js et npm.

    Pour installer Node.js et npm, nous vous recommandons d'utiliser Node Version Manager.

  2. Installez la CLI Firebase à l'aide de la méthode de votre choix. Par exemple, pour installer la CLI à l'aide de npm, exécutez la commande suivante :

    npm install -g firebase-tools@latest
    

    Cette commande installe la commande firebase disponible à l'échelle mondiale. Si cette commande échoue, vous devrez peut-être modifier les autorisations de npm.

    Pour passer à la dernière version de firebase-tools, exécutez à nouveau la même commande.

  3. Installez firebase-functions et firebase-admin, puis utilisez --save pour les enregistrer dans votre package.json :

    npm install firebase-functions@latest firebase-admin@latest --save
    

Vous êtes maintenant prêt à passer à l'implémentation de cette solution.

Implémentation

Suivez ces étapes pour créer, tester et déployer votre Cloud Functions de 2e génération avec Remote Config et Agent Platform :

  1. Activez les API recommandées pour Agent Platform dans la console Google Cloud.
  2. Initialisez votre projet et installez les dépendances Node.
  3. Configurez les autorisations IAM pour votre compte de service Admin SDK et enregistrez votre clé.
  4. Créer la fonction
  5. Créez un modèle Remote Config spécifique au serveur.
  6. Déployez votre fonction et testez-la dans Firebase Local Emulator Suite.
  7. Déployez votre fonction dans Google Cloud.

Éthought 1 : Activez les Agent Platform API recommandées dans la console Google Cloud

  1. Ouvrez la console Google Cloud et, lorsque vous y êtes invité, sélectionnez votre projet.
  2. Dans le champ Rechercher en haut de la console, saisissez Agent Platform et attendez que Agent Platform apparaisse dans les résultats.
  3. Sélectionnez Agent Platform. Le tableau de bord Agent Platform s'affiche.
  4. Cliquez sur Activer toutes les API recommandées.

    L'activation de l'API peut prendre quelques instants. Laissez la page active et ouverte jusqu'à la fin de l'activation.

  5. Si la facturation n'est pas activée, vous serez invité à ajouter ou à associer un compte Cloud Billing. Après avoir activé un compte de facturation, revenez au tableau de bord Agent Platform et vérifiez que toutes les API recommandées sont activées.

Étape 2 : Initialisez votre projet et installez les dépendances Node

  1. Ouvrez un terminal sur votre ordinateur et accédez au répertoire dans lequel vous prévoyez de créer votre fonction.
  2. Connectez-vous à Firebase :

    firebase login
    
  3. Exécutez la commande suivante pour initialiser Cloud Functions for Firebase :

    firebase init functions
    
  4. Sélectionnez Utiliser un projet existant, puis spécifiez l'ID de votre projet.

  5. Lorsque vous êtes invité à sélectionner le langage à utiliser, choisissez JavaScript, puis appuyez sur Entrée.

  6. Pour toutes les autres options, sélectionnez les valeurs par défaut.

    Un répertoire functions est créé dans le répertoire actuel. Vous y trouverez un fichier index.js que vous utiliserez pour créer votre fonction, un répertoire node_modules contenant les dépendances de votre fonction et un fichier package.json contenant les dépendances du package.

  7. Ajoutez les packages Admin SDK et Agent Platform en exécutant les commandes suivantes, en utilisant --save pour vous assurer qu'ils sont enregistrés dans votre fichier package.json :

    cd functions
    npm install firebase-admin@latest @google-cloud/vertexai --save
    

Votre fichier functions/package.json devrait maintenant se présenter comme suit, avec les dernières versions spécifiées :

  {
    "name": "functions",
    "description": "Cloud Functions for Firebase",
    "scripts": {
      "serve": "firebase emulators:start --only functions",
      "shell": "firebase functions:shell",
      "start": "npm run shell",
      "deploy": "firebase deploy --only functions",
      "logs": "firebase functions:log"
    },
    "engines": {
      "node": "20"
    },
    "main": "index.js",
    "dependencies": {
      "@google-cloud/vertexai": "^1.1.0",
      "firebase-admin": "^12.1.0",
      "firebase-functions": "^5.0.0"
    },
    "devDependencies": {
      "firebase-functions-test": "^3.1.0"
    },
    "private": true
  }

Notez que si vous utilisez ESLint, vous verrez une section qui l'inclut. Assurez-vous également que la version du moteur de nœud correspond à la version de Node.js que vous avez installée et à celle que vous exécutez sur Google Cloud. Par exemple, si la section engines de votre fichier package.json est configurée pour la version 18 de Node et que vous utilisez Node.js 20, mettez à jour le fichier pour utiliser la version 20 :

  "engines": {
    "node": "20"
  },

Étape 3 : Configurez les autorisations IAM pour votre compte de service Admin SDK et enregistrez votre clé

Dans cette solution, vous allez utiliser le compte de service Firebase Admin SDK pour exécuter votre fonction.

  1. Dans la console Google Cloud, ouvrez la page IAM et administration, puis recherchez le compte de service Admin SDK (nommé firebase-adminsdk).
  2. Sélectionnez le compte, puis cliquez sur Modifier le compte principal. La page "Modifier l'accès" s'affiche.
  3. Cliquez sur Ajouter un autre rôle, puis sélectionnez Lecteur Remote Config.
  4. Cliquez sur Ajouter un autre rôle, puis sélectionnez Développeur de plate-forme IA.
  5. Cliquez sur Ajouter un autre rôle, puis sélectionnez Utilisateur Agent Platform.
  6. Cliquez sur Ajouter un autre rôle, puis sélectionnez Demandeur Cloud Run.
  7. Cliquez sur Enregistrer.

Ensuite, exportez les identifiants du compte de service Admin SDK et enregistrez-les dans votre variable d'environnement GOOGLE_APPLICATION_CREDENTIALS.

  1. Dans la console Google Cloud, ouvrez la page Identifiants.
  2. Cliquez sur le compte de service Admin SDK pour ouvrir la page Détails.
  3. Cliquez sur Keys (Clés).
  4. Cliquez sur Ajouter une clé > Créer une clé.
  5. Assurez-vous que JSON est sélectionné comme Type de clé, puis cliquez sur Créer.
  6. Téléchargez la clé dans un emplacement sécurisé sur votre ordinateur.
  7. Depuis votre terminal, exportez la clé en tant que variable d'environnement :

    export GOOGLE_APPLICATION_CREDENTIALS="/path/to/your/service-account-key.json"
    

Étape 4 : Créez la fonction

Dans cette étape, vous allez créer une fonction qui gère les entrées utilisateur et génère des réponses optimisées par l'IA. Vous allez combiner plusieurs extraits de code pour créer une fonction complète qui initialise Admin SDK et Agent Platform Gemini API (formerly Vertex AI), configure les paramètres par défaut à l'aide de Remote Config, récupère les derniers paramètres Remote Config, traite l'entrée utilisateur et renvoie une réponse à l'utilisateur.

  1. Dans votre codebase, ouvrez functions/index.js dans un éditeur de texte ou un IDE.
  2. Supprimez le contenu existant, puis ajoutez les SDK Admin SDK, Remote Config et Agent Platform, et initialisez l'application en collant le code suivant dans le fichier :

    const { onRequest } = require("firebase-functions/https");
    const { requiresRole, requiresAPI } = require("firebase-functions");
    const logger = require("firebase-functions/logger");
    
    const { initializeApp } = require("firebase-admin/app");
    const { VertexAI } = require('@google-cloud/vertexai');
    const { getRemoteConfig } = require("firebase-admin/remote-config");
    
    requiresRole("roles/aiplatform.user");
    requiresRole("roles/cloudconfig.viewer");
    requiresAPI("aiplatform.googleapis.com", "Needed to query Vertex AI Gemini models");
    requiresAPI("firebaseremoteconfig.googleapis.com", "Needed to fetch server-side Remote Config templates");
    
    // Set and check environment variables.
    const project = process.env.GCLOUD_PROJECT;
    
    // Initialize Firebase.
    const app = initializeApp();
    
  3. Configurez les valeurs par défaut que votre fonction utilisera si elle ne peut pas se connecter au serveur Remote Config. Cette solution configure textModel, generationConfig, safetySettings, textPrompt et location en tant que paramètres Remote Config qui correspondent aux paramètres Remote Config que vous configurerez plus loin dans ce guide. Pour en savoir plus sur ces paramètres, consultez Client Vertex AI pour Node.js.

    Vous pouvez également configurer un paramètre pour contrôler si vous accédez ou non à Agent Platform Gemini API (formerly Vertex AI) (dans cet exemple, un paramètre appelé vertex_enabled). Cette configuration peut être utile pour tester votre fonction. Dans les extraits de code suivants, cette valeur est définie sur false, ce qui permet d'ignorer l'utilisation de Agent Platform pendant que vous testez le déploiement de la fonction de base. Si vous la définissez sur true, l'Agent Platform Gemini API (formerly Vertex AI) sera appelée.

    // Define default (fallback) parameter values for Remote Config.
    const defaultConfig = {
    
      // Default values for Vertex AI.
      model_name: "gemini-1.5-flash-002",
      generation_config: [{
        "stopSequences": [], "temperature": 0.7,
        "maxOutputTokens": 64, "topP": 0.1, "topK": 20
      }],
      prompt: "I'm a developer who wants to learn about Firebase and you are a \
        helpful assistant who knows everything there is to know about Firebase!",
      safety_settings: [{
        "category":
          "HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT",
        "threshold": "HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE"
      }],
      location: 'us-central1',
    
      // Disable Vertex AI Gemini API access for testing.
      vertex_enabled: false
    };
    
  4. Créez la fonction et configurez la Remote Config côté serveur :

    // Export the function.
    exports.generateWithVertex = onRequest(async (request, response) => {
    
      try {
    
        // Set up Remote Config.
        const rc = getRemoteConfig(app);
    
        // Get the Remote Config template and assign default values.
        const template = await rc.getServerTemplate({
          defaultConfig: defaultConfig
        });
    
        // Add the template evaluation to a constant.
        const config = template.evaluate();
    
        // Obtain values from Remote Config.
        const textModel = config.getString("model_name") ||
            defaultConfig.model_name;
        const textPrompt = config.getString("prompt") || defaultConfig.prompt;
        const generationConfig = config.getString("generation_config") ||
            defaultConfig.generation_config;
        const safetySettings = config.getString("safety_settings") ||
            defaultConfig.safety_settings;
        const location = config.getString("location") ||
            defaultConfig.location;
        const vertexEnabled = config.getBoolean("is_vertex_enabled") ||
            defaultConfig.vertex_enabled;
    
  5. Configurez Agent Platform, puis ajoutez la logique de chat et de réponse :

      // Allow user input.
      const userInput = request.query.prompt || '';
    
      // Instantiate Vertex AI.
        const vertex_ai = new VertexAI({ project: project, location: location });
        const generativeModel = vertex_ai.getGenerativeModel({
          model: textModel,
          safety_settings: safetySettings,
          generation_config: generationConfig,
        });
    
        // Combine prompt from Remote Config with optional user input.
        const chatInput = textPrompt + " " + userInput;
    
        if (!chatInput) {
          return res.status(400).send('Missing text prompt');
        }
        // If vertexEnabled isn't true, do not send queries to Vertex AI.
        if (vertexEnabled !== true) {
          response.status(200).send({
            message: "Vertex AI call skipped. Vertex is not enabled."
          });
          return;
        }
    
        logger.log("\nRunning with model ", textModel, ", prompt: ", textPrompt,
          ", generationConfig: ", generationConfig, ", safetySettings: ",
          safetySettings, " in ", location, "\n");
    
        const result = await generativeModel.generateContentStream(chatInput); 
        response.writeHead(200, { 'Content-Type': 'text/plain' });
    
        for await (const item of result.stream) {
          const chunk = item.candidates[0].content.parts[0].text;
          logger.log("Received chunk:", chunk);
          response.write(chunk);
        }
    
        response.end();
    
      } catch (error) {
        logger.error(error);
        response.status(500).send('Internal server error');
      }
    });
    
  6. Enregistrez et fermez le fichier.

Étape 5 : Créez un modèle Remote Config spécifique au serveur

Ensuite, créez un modèle Remote Config côté serveur, puis configurez les paramètres et les valeurs à utiliser dans votre fonction. Pour créer un modèle Remote Config spécifique au serveur :

  1. Dans la console Firebase, accédez à DevOps et engagement > Remote Config.

  2. Dans le sélecteur Client/Serveur en haut de la page, sélectionnez Serveur.

    • Si vous utilisez Remote Config ou des modèles de serveur pour la première fois, cliquez sur Créer une configuration. Le volet Créer votre premier paramètre côté serveur s'affiche.
    • Si ce n'est pas la première fois que vous utilisez des modèles de serveur Remote Config, cliquez sur Ajouter un paramètre.
  3. Définissez les paramètres Remote Config suivants :

    Nom du paramètre Description Type Valeur par défaut
    model_name Nom du modèle
    Pour obtenir la liste à jour des noms de modèles à utiliser dans votre code, consultez Versions et cycles de vie des modèles ou Noms de modèles disponibles.
    Chaîne gemini-2.0-flash
    prompt Prompt à ajouter au début de la requête de l'utilisateur. Chaîne I'm a developer who wants to learn about Firebase and you are a helpful assistant who knows everything there is to know about Firebase!
    generation_config Paramètres à envoyer au modèle JSON [{"stopSequences": ["I hope this helps"],"temperature": 0.7,"maxOutputTokens": 512, "topP": 0.1,"topK": 20}]
    safety_settings Paramètres de sécurité pour Agent Platform JSON [{"category": "HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT", "threshold": "HarmBlockThreshold.BLOCK_LOW_AND_ABOVE"}]
    location Emplacement où exécuter le service et le modèle Agent Platform Chaîne global
    is_vertex_enabled Paramètre facultatif qui contrôle si les requêtes sont envoyées à Agent Platform. Booléen true
  4. Une fois que vous avez terminé d'ajouter des paramètres, vérifiez-les et assurez-vous que leurs types de données sont corrects, puis cliquez sur Publier les modifications.

Étape 6 : Déployez votre fonction et testez-la dans Firebase Local Emulator Suite

Vous êtes maintenant prêt à déployer et à tester votre fonction localement avec Firebase Local Emulator Suite.

  1. Assurez-vous d'avoir défini GOOGLE_APPLICATION_CREDENTIALS en tant que variable d'environnement, comme décrit à l'Étape 3 : Configurer les autorisations IAM pour votre compte de service Admin SDK et enregistrer votre clé. Ensuite, à partir du répertoire parent de votre répertoire functions, déployez votre fonction sur l'émulateur Firebase :

    firebase emulators:start --project PROJECT_ID --only functions
    
  2. Ouvrez la page des journaux de l'émulateur. Cela devrait indiquer que votre fonction a été chargée.

  3. Accédez à votre fonction en exécutant la commande suivante, où PROJECT_ID est l'ID de votre projet et LOCATION est la région dans laquelle vous avez déployé la fonction (par exemple, us-central1) :

    curl http://localhost:5001/PROJECT_ID/LOCATION/generateWithVertex
    
  4. Attendez une réponse, puis revenez à la page des journaux de l'émulateur Firebase ou à votre console, et vérifiez s'il y a des erreurs ou des avertissements.

  5. Essayez d'envoyer une entrée utilisateur, en gardant à l'esprit que, puisque is_vertex_enabled est configuré dans votre modèle de serveur Remote Config, cela devrait accéder au modèle Gemini via Agent Platform Gemini API (formerly Vertex AI) et que cela peut entraîner des frais :

    curl http://localhost:5001/PROJECT_ID/LOCATION/generateWithVertex?prompt=Tell%20me%20everything%20you%20know%20about%20cats
    
  6. Modifiez votre modèle de serveur Remote Config dans la console Firebase, puis accédez à nouveau à votre fonction pour observer les modifications.

Étape 7 : Déployez votre fonction sur Google Cloud

Après avoir testé et vérifié votre fonction, vous pouvez la déployer sur Google Cloud et tester la fonction active.

Déployer la fonction

Déployez votre fonction à l'aide de la CLI Firebase :

firebase deploy --only functions

Bloquer l'accès non authentifié à la fonction

Lorsque des fonctions sont déployées à l'aide de Firebase, les appels non authentifiés sont autorisés par défaut si la règle de votre organisation ne les limite pas. Pendant les tests et avant de sécuriser l'accès avec App Check, nous vous recommandons de bloquer l'accès non authentifié.

Pour bloquer l'accès non authentifié à la fonction :

  1. Dans la console Google Cloud, ouvrez Cloud Run.

  2. Cliquez sur generateWithVertex, puis sur l'onglet Sécurité.

  3. Activez l'option Exiger l'authentification, puis cliquez sur Enregistrer.

Configurez votre compte utilisateur pour qu'il utilise les identifiants du compte de service Admin SDK.

Étant donné que le compte de service Admin SDK dispose de tous les rôles et autorisations nécessaires pour exécuter la fonction et interagir avec Remote Config et Agent Platform Gemini API (formerly Vertex AI), vous l'utiliserez pour exécuter votre fonction. Pour ce faire, vous devez pouvoir créer des jetons pour le compte à partir de votre compte utilisateur.

Les étapes suivantes décrivent comment configurer votre compte utilisateur et la fonction pour qu'ils s'exécutent avec les droits du compte de service Admin SDK.

  1. Dans la console Google Cloud, activez l'API Service Account Credentials IAM.
  2. Attribuez le rôle Créateur de jetons du compte de service à votre compte utilisateur : dans la console Google Cloud, ouvrez IAM et administration > IAM, sélectionnez votre compte utilisateur, puis cliquez sur Modifier le compte principal > Ajouter un autre rôle.
  3. Sélectionnez Créateur de jetons du compte de service, puis cliquez sur Enregistrer.

    Pour en savoir plus sur l'emprunt d'identité d'un compte de service, consultez Emprunt d'identité d'un compte de service dans la documentation Google Cloud.

  4. Ouvrez la page de la console Google CloudCloud Functions, puis cliquez sur la fonction generateWithVertex dans la liste Fonctions.

  5. Sélectionnez Déclencheur > Modifier, puis développez Paramètres d'exécution, de compilation, de connexion et de sécurité.

  6. Dans l'onglet Environnement d'exécution, remplacez le compte de service d'exécution par le compte SDK Admin.

  7. Cliquez sur Suivant, puis sur Déployer.

Configurer gcloud CLI

Pour exécuter et tester votre fonction de manière sécurisée à partir de la ligne de commande, vous devez vous authentifier auprès du service Cloud Functions et obtenir un jeton d'authentification valide.

Pour activer la génération de jetons, installez et configurez la gcloud CLI :

  1. Si elle n'est pas déjà installée sur votre ordinateur, installez la gcloud CLI comme décrit dans Installer la gcloud CLI.

  2. Obtenez les identifiants d'accès pour votre compte Google Cloud :

    gcloud auth login
    
  3. Définissez l'ID de votre projet dans gcloud :

    gcloud config set project PROJECT_ID
    

Tester votre fonction

Vous êtes maintenant prêt à tester votre fonction dans Google Cloud. Pour tester la fonction, exécutez la commande suivante :

curl -X POST https://LOCATION-PROJECT_ID.cloudfunctions.net/generateWithVertex \
  -H "Authorization: bearer $(gcloud auth print-identity-token)" \
  -H "Content-Type: application/json"

Réessayez avec des données fournies par l'utilisateur :

curl -X POST https://LOCATION-PROJECT_ID.cloudfunctions.net/generateWithVertex?prompt=Tell%20me%20everything%20you%20know%20about%20dogs \
 -H "Authorization: bearer $(gcloud auth print-identity-token)" \
 -H "Content-Type: application/json"

Vous pouvez maintenant modifier votre modèle de serveur Remote Config, publier ces modifications et tester différentes options.

Étapes suivantes