Inclure des fichiers volumineux dans des requêtes multimodales et gérer les fichiers à l'aide de Cloud Storage for Firebase

Lorsque vous appelez Gemini API depuis votre application à l'aide d'un SDK Vertex AI in Firebase, vous pouvez demander au modèle Gemini de générer du texte en fonction d'une entrée multimodale. Les requêtes multimodales peuvent inclure plusieurs modalités (ou types d'entrées), telles que du texte, des images, des PDF, de la vidéo et de l'audio.

Pour les parties non textuelles de l'entrée (comme les fichiers multimédias), vous pouvez éventuellement utiliser Cloud Storage for Firebase pour inclure des fichiers dans la requête. Voici quelques informations générales sur cette fonctionnalité:

  • Vous pouvez utiliser Cloud Storage for Firebase avec n'importe quelle requête multimodale (comme la génération de texte et le chat). Les exemples de ce guide illustrent une entrée de texte et d'image de base.

  • Vous spécifiez le type MIME du fichier et son URL Cloud Storage for Firebase (qui commence toujours par gs://) dans l'entrée de la requête. Ces valeurs sont des métadonnées automatiquement attribuées à tout fichier importé dans un bucket Cloud Storage.

  • Vous devez utiliser un type de fichier et une URL compatibles.


Ce guide de solution explique comment configurer Cloud Storage for Firebase, importer un fichier dans un bucket Cloud Storage for Firebase à partir de votre application, puis inclure le type MIME et l'URL Cloud Storage for Firebase du fichier dans votre requête multimodale à l'Gemini API.

Voulez-vous voir les exemples de code ? Avez-vous déjà configuré Cloud Storage for Firebase et êtes-vous prêt à l'utiliser avec vos requêtes multimodales ?

Accéder aux exemples de code

Pourquoi utiliser Cloud Storage for Firebase avec votre application ?

Cloud Storage for Firebase utilise la même infrastructure rapide, sécurisée et évolutive que Google Cloud Storage pour stocker des blobs et des fichiers. Ses SDK clients sont spécifiquement conçus pour les applications mobiles et Web.

Pour les SDK Vertex AI in Firebase, la taille maximale de la requête est de 20 Mo. Vous recevez une erreur HTTP 413 si une requête est trop volumineuse. Si la taille totale d'un fichier dépasse 20 Mo, utilisez une URL Cloud Storage for Firebase pour inclure le fichier dans votre requête multimodale. Toutefois, si un fichier est de petite taille, vous pouvez souvent le transmettre directement en tant que données intégrées (notez toutefois qu'un fichier fourni en tant que données intégrées est encodé en base64 en transit, ce qui augmente la taille de la requête).

Voici quelques autres avantages de l'utilisation de Cloud Storage for Firebase :

  • Vous pouvez demander aux utilisateurs finaux d'importer des images directement depuis votre application dans un bucket Cloud Storage for Firebase, puis d'inclure ces images dans vos requêtes multimodales simplement en spécifiant le type MIME du fichier et l'URL Cloud Storage for Firebase (qui est un identifiant du fichier).

  • Vous pouvez économiser du temps et de la bande passante pour vos utilisateurs finaux s'ils doivent fournir des images, en particulier si la qualité de leur réseau est mauvaise ou instable.

    • Si une importation ou un téléchargement de fichier est interrompu, les SDK Cloud Storage for Firebase redémarrent automatiquement l'opération là où elle s'est arrêtée.
    • Le même fichier importé peut être utilisé plusieurs fois sans que l'utilisateur final ait à importer le même fichier chaque fois qu'il est nécessaire dans votre application (comme dans une nouvelle requête multimodale).
  • Vous pouvez limiter l'accès des utilisateurs finaux aux fichiers stockés dans Cloud Storage for Firebase à l'aide de Firebase Security Rules, qui ne permet qu'à un utilisateur autorisé d'importer, de télécharger ou de supprimer des fichiers.

  • Vous pouvez accéder aux fichiers de votre bucket depuis Firebase ou depuis Google Cloud. Vous pouvez ainsi effectuer des traitements côté serveur, tels que le filtrage d'images ou le transcodage de vidéos à l'aide des API Google Cloud Storage.

Quels types de fichiers et d'URL sont acceptés ?

Voici les exigences concernant les fichiers et les URL lorsque vous souhaitez utiliser des URL Cloud Storage for Firebase avec les SDK Vertex AI in Firebase:

  • Le fichier doit respecter les exigences des fichiers d'entrée pour les requêtes multimodales lorsque vous utilisez les SDK Vertex AI in Firebase. Cela inclut des exigences telles que le type MIME et la taille du fichier.

  • Le fichier doit être stocké dans un bucket Cloud Storage for Firebase (ce qui signifie que le bucket est accessible aux services Firebase, comme Firebase Security Rules). Si vous pouvez afficher votre bucket dans la console Firebase, il s'agit d'un bucket Cloud Storage for Firebase.

  • Le bucket Cloud Storage for Firebase doit se trouver dans le même projet Firebase dans lequel vous avez enregistré votre application.

  • L'URL Cloud Storage for Firebase du fichier doit commencer par gs://, ce qui est la façon dont toutes les URL Google Cloud Storage sont construites.

  • L'URL du fichier ne peut pas être une URL de navigateur (par exemple, l'URL d'une image trouvée sur Internet).

De plus, l'Firebase Security Rules de votre bucket doit autoriser un accès approprié au fichier. Exemple :

  • Si vous avez des règles publiques, n'importe quel utilisateur ou client peut accéder au fichier et fournir son URL dans un appel à l'aide d'un SDK Vertex AI in Firebase. Ces types de règles ne doivent être utilisés que pour démarrer et au début du prototypage (sauf si les fichiers sont en fait destinés à être entièrement accessibles au public).

  • Si vous disposez de règles robustes (recommandées), Firebase vérifie que l'utilisateur ou le client connecté dispose d'un accès suffisant au fichier avant d'autoriser l'appel à passer avec l'URL fournie.

Utiliser des URL Cloud Storage for Firebase avec Vertex AI in Firebase

Étape 1: Configurer Cloud Storage for Firebase

Pour obtenir des instructions détaillées sur la configuration et l'utilisation de Cloud Storage for Firebase, consultez le guide de démarrage.

Accéder au guide de démarrage de Cloud Storage for Firebase

Voici les principales tâches que vous devrez effectuer:

  1. Créez un bucket Cloud Storage for Firebase dans votre projet Firebase.

    Si vous disposez déjà d'un bucket Cloud Storage dans votre projet Google Cloud que vous souhaitez utiliser avec Vertex AI in Firebase, vous pouvez le rendre accessible aux services Firebase (y compris Vertex AI in Firebase) en "important" le bucket dans Firebase.

  2. Appliquez Firebase Security Rules à ce bucket. Firebase Security Rules vous aide à sécuriser vos fichiers en limitant l'accès aux utilisateurs finaux autorisés.

  3. Ajoutez la bibliothèque cliente pour Cloud Storage for Firebase à votre application.

    Notez que vous pouvez ignorer cette tâche, mais vous devez alors toujours inclure explicitement le type MIME et les valeurs d'URL Cloud Storage for Firebase dans vos requêtes multimodales.

Étape 2 : Importez un fichier dans un bucket

La documentation Cloud Storage for Firebase présente les différentes façons d'importer des fichiers dans un bucket Cloud Storage for Firebase. Par exemple, vous pouvez importer des fichiers locaux à partir de l'appareil de l'utilisateur final, tels que des photos et des vidéos de l'appareil photo.

Lorsque vous importez un fichier dans un bucket, Cloud Storage applique automatiquement les deux informations suivantes au fichier. Vous devrez inclure ces valeurs dans la requête multimodale (comme indiqué à l'étape suivante de ce guide).

  • Type MIME: il s'agit du type de contenu multimédia du fichier (par exemple, image/png). Cloud Storage for Firebase tente automatiquement de détecter le type MIME lors de l'importation et d'appliquer ces métadonnées à l'objet du bucket. Toutefois, vous pouvez éventuellement spécifier le type MIME lors de l'importation.

  • URL Cloud Storage for Firebase: identifiant unique du fichier. L'URL doit commencer par gs://.

Étape 3: Incluez le type MIME et l'URL du fichier dans une requête multimodale

Une fois un fichier stocké dans un bucket Cloud Storage for Firebase, vous pouvez inclure son type MIME et son URL Cloud Storage for Firebase dans une requête multimodale. Notez que ces exemples montrent une requête generateContent non en streaming, mais vous pouvez également utiliser des URL Cloud Storage for Firebase avec le streaming et le chat.

Pour inclure le fichier dans la requête, vous pouvez utiliser l'une des options suivantes :

Option 1 : Inclure le type MIME et l'URL à l'aide d'une référence Storage

Utilisez cette option si vous venez d'importer le fichier dans le bucket et que vous souhaitez l'inclure immédiatement (via une référence Storage) dans la requête multimodale. L'appel nécessite à la fois le type MIME et l'URL Cloud Storage for Firebase.

Kotlin+KTX

Pour Kotlin, les méthodes de ce SDK sont des fonctions de suspension et doivent être appelées à partir d'un champ d'application de coroutine.
// Upload an image file using Cloud Storage for Firebase.
val storageRef = Firebase.storage.reference.child("images/image.jpg")
val fileUri = Uri.fromFile(File("image.jpg"))
try {
    val taskSnapshot = storageRef.putFile(fileUri).await()
    // Get the MIME type and Cloud Storage for Firebase file path.
    val mimeType = taskSnapshot.metadata?.contentType
    val bucket = taskSnapshot.metadata?.bucket
    val filePath = taskSnapshot.metadata?.path

    if (mimeType != null && bucket != null) {
        // Construct a URL in the required format.
        val storageUrl = "gs://$bucket/$filePath"
        // Construct a prompt that includes text, the MIME type, and the URL.
        val prompt = content {
            fileData(mimeType = mimeType, uri = storageUrl)
            text("What's in this picture?")
        }
        // To generate text output, call generateContent with the prompt.
        val response = generativeModel.generateContent(prompt)
        println(response.text)
    }
} catch (e: StorageException) {
    // An error occurred while uploading the file.
} catch (e: GoogleGenerativeAIException) {
    // An error occurred while generating text.
}

Java

Pour Java, les méthodes de ce SDK renvoient un ListenableFuture.
// Upload an image file using Cloud Storage for Firebase.
StorageReference storage = FirebaseStorage.getInstance().getReference("images/image.jpg");
Uri fileUri = Uri.fromFile(new File("images/image.jpg"));

storage.putFile(fileUri).addOnSuccessListener(taskSnapshot -> {
    // Get the MIME type and Cloud Storage for Firebase file path.
    String mimeType = taskSnapshot.getMetadata().getContentType();
    String bucket = taskSnapshot.getMetadata().getBucket();
    String filePath = taskSnapshot.getMetadata().getPath();

    if (mimeType != null && bucket != null) {
        // Construct a URL in the required format.
        String storageUrl = "gs://" + bucket + "/" + filePath;
        // Create a prompt that includes text, the MIME type, and the URL.
        Content prompt = new Content.Builder()
                .addFileData(storageUrl, mimeType)
                .addText("What's in this picture?")
                .build();

        // To generate text output, call generateContent with the prompt.
        GenerativeModelFutures modelFutures = GenerativeModelFutures.from(model);
        ListenableFuture<GenerateContentResponse> response = modelFutures.generateContent(prompt);
        Futures.addCallback(response, new FutureCallback<>() {
            @Override
            public void onSuccess(GenerateContentResponse result) {
                String resultText = result.getText();
                System.out.println(resultText);
            }

            @Override
            public void onFailure(@NonNull Throwable t) {
                t.printStackTrace();
            }
        }, executor);
    }
}).addOnFailureListener(e -> {
    // An error occurred while uploading the file.
    e.printStackTrace();
});

Option 2: Inclure explicitement le type MIME et l'URL

Utilisez cette option si vous connaissez les valeurs du type MIME et de l'URL Cloud Storage for Firebase, et si vous souhaitez les inclure explicitement dans la requête multimodale. L'appel nécessite à la fois le type MIME et l'URL.

Kotlin+KTX

Pour Kotlin, les méthodes de ce SDK sont des fonctions de suspension et doivent être appelées à partir d'un champ d'application de coroutine.
// Construct a prompt that explicitly includes the MIME type and Cloud Storage for Firebase URL values.
val prompt = content {
    fileData(mimeType = "image/jpeg", uri = "gs://bucket-name/path/image.jpg")
    text("What's in this picture?")
}
// To generate text output, call generateContent with the prompt.
val response = generativeModel.generateContent(prompt)
println(response.text)

Java

Pour Java, les méthodes de ce SDK renvoient un ListenableFuture.
// Construct a prompt that explicitly includes the MIME type and Cloud Storage for Firebase URL values.
Content prompt = new Content.Builder()
        .addFilePart("gs://bucket-name/path/image.jpg", "image/jpeg")
        .addText("What's in this picture?")
        .build();

// To generate text output, call generateContent with the prompt
GenerativeModelFutures modelFutures = GenerativeModelFutures.from(model);
ListenableFuture<GenerateContentResponse> response = modelFutures.generateContent(prompt);
Futures.addCallback(response, new FutureCallback<>() {
    @Override
    public void onSuccess(GenerateContentResponse result) {
        String resultText = result.getText();
        System.out.println(resultText);
    }

    @Override
    public void onFailure(@NonNull Throwable t) {
        t.printStackTrace();
    }
}, executor);