| Disponible uniquement lorsque vous utilisez Vertex AI Gemini API comme fournisseur d'API. |
Lorsque vous appelez l'API Vertex AI GeminiVertex AI Gemini API depuis votre application à l'aide d'un Firebase AI Logic SDK, vous pouvez demander à un modèle Gemini de générer du texte à partir d'une entrée multimodale, comme des images, des PDF, des vidéos et des données audio.
Pour les parties non textuelles de l'entrée (comme les fichiers multimédias), vous pouvez éventuellement utiliser Cloud Storage for Firebase afin d'inclure des fichiers dans la requête. Voici les informations essentielles à connaître 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) si vous utilisez l'Vertex AI Gemini API. Les exemples de ce guide présentent une entrée de base composée de texte et d'une image.
Vous spécifiez le type MIME du fichier et son Cloud Storage for Firebase URL (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 Cloud Storage bucket.Vous devez utiliser un type de fichier et une URL compatibles.
Ce guide de solutions explique comment configurer Cloud Storage for Firebase, importer un fichier dans un bucket Cloud Storage for Firebase depuis votre application, puis inclure le type MIME du fichier et l'URL Cloud Storage for Firebase dans votre requête multimodale à l'Gemini API.
Souhaitez-vous consulter les exemples de code ? Ou avez-vous déjà configuré Cloud Storage for Firebase et êtes-vous prêt à commencer à l'utiliser avec vos requêtes multimodales ?
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 les objets blob et les fichiers. Ses SDK client sont spécialement conçus pour les applications mobiles et Web.
Pour les SDK Firebase AI Logic, la taille maximale des requêtes est de 20 Mo. Si une requête est trop volumineuse, vous recevez une erreur HTTP 413. Si la taille d'un fichier dépasse la taille totale de la requête de plus de 20 Mo, utilisez une URL Cloud Storage for Firebase pour inclure le fichier dans votre requête multimodale. Toutefois, si un fichier est petit, 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 avantages supplémentaires de l'utilisation de Cloud Storage for Firebase:
Vous pouvez permettre aux utilisateurs finaux d'importer des images directement depuis votre application dans un Cloud Storage for Firebase bucket, puis inclure ces images dans vos prompts multimodaux en spécifiant simplement le type MIME du fichier et Cloud Storage for Firebase URL (qui est un identifiant du fichier).
Vous pouvez faire gagner du temps et de la bande passante à vos utilisateurs finaux s'ils doivent fournir des images, en particulier s'ils disposent d'une qualité de réseau médiocre ou instable.
- Si l'importation ou le téléchargement d'un fichier est interrompu, les 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 à l'importer 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 n'autorisent qu'un utilisateur autorisé à importer, télécharger ou supprimer des fichiers.
Vous pouvez accéder aux fichiers de votre bucket depuis Firebase ou depuis Google Cloud, ce qui vous permet d'effectuer un traitement côté serveur, tel que le filtrage d'images ou le transcodage vidéo, à l'aide des Google Cloud Storage API.
Quels types de fichiers et d'URL sont acceptés ?
Voici les exigences concernant les fichiers et les URL lorsque vous souhaitez utiliser Cloud Storage for Firebase URL avec les Firebase AI Logic SDK :
Le fichier doit répondre aux exigences des fichiers d'entrée pour les requêtes multimodales. Cela inclut des exigences telles que le type MIME et la taille du fichier.
Le fichier doit être stocké dans un Cloud Storage for Firebase bucket (ce qui signifie que le bucket est accessible aux services Firebase, tels que Firebase Security Rules). Si vous pouvez afficher votre bucket dans la Firebase console, il s'agit d'un Cloud Storage for Firebase bucket.
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://, 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 que vous trouvez sur Internet).
De plus, les Firebase Security Rules pour votre bucket doivent autoriser l'accès approprié au fichier. Exemple :
Si vous disposez de règles publiques, alors n'importe quel utilisateur ou client peut accéder au fichier.
Si vous disposez de règles robustes (fortement recommandé), 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 Firebase AI Logic
| Disponible uniquement lorsque vous utilisez Vertex AI Gemini API comme fournisseur d'API. |
Étape 1 : Configurer Cloud Storage for Firebase
Vous trouverez des instructions détaillées pour configurer Cloud Storage for Firebase dans son guide de démarrage : iOS+ | Android | Web | Flutter | Unity
Voici les tâches de haut niveau que vous devrez effectuer :
Créez ou importez un Cloud Storage for Firebase bucket dans votre projet Firebase.
Appliquez Firebase Security Rules à ce bucket. Security Rules vous aident à sécuriser vos fichiers en limitant l'accès aux utilisateurs finaux autorisés.
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 les valeurs de type MIME et d'URL dans vos requêtes.
Étape 2 : Importer un fichier dans un bucket
Dans la documentation Cloud Storage, vous pouvez découvrir toutes les différentes manières d'importer des fichiers dans un bucket. Par exemple, vous pouvez importer des fichiers locaux depuis l'appareil de l'utilisateur final, tels que des photos et des vidéos de l'appareil photo. En savoir plus : iOS+ | Android | Web | Flutter | Unity
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 (comme indiqué à l'étape suivante de ce guide).
Type MIME : il s'agit du type de média du fichier (par exemple,
image/png). Nous allons automatiquement essayer de détecter le type MIME lors de l'importation et d'appliquer ces métadonnées à l'objet dans le bucket. Toutefois, vous pouvez éventuellement spécifier le type MIME lors de l'importation.Cloud Storage for Firebase URL : il s'agit d'un identifiant unique pour le fichier. L'URL doit commencer par
gs://.
Étape 3 : Inclure le type MIME et l'URL du fichier dans une requête multimodale
Une fois qu'un fichier est stocké dans un bucket, vous pouvez inclure son type MIME et son URL dans une requête. Notez que ces exemples présentent une requête generateContent non diffusée en streaming, mais vous pouvez également utiliser des URL 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 de stockage
Option 2 : Inclure explicitement le type MIME et l'URL
Option 1 : Inclure le type MIME et l'URL à l'aide d'une référence de stockage
| Avant d'essayer cet exemple, assurez-vous d'avoir suivi le guide de démarrage des Firebase AI Logic SDK. |
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 de stockage) dans la requête. L'appel nécessite à la fois le type MIME et l'Cloud Storage for Firebase URL.
Swift
// Upload an image file using Cloud Storage for Firebase.
let storageRef = Storage.storage().reference(withPath: "images/image.jpg")
guard let imageURL = Bundle.main.url(forResource: "image", withExtension: "jpg") else {
fatalError("File 'image.jpg' not found in main bundle.")
}
let metadata = try await storageRef.putFileAsync(from: imageURL)
// Get the MIME type and Cloud Storage for Firebase URL.
guard let mimeType = metadata.contentType else {
fatalError("The MIME type of the uploaded image is nil.")
}
// Construct a URL in the required format.
let storageURL = "gs://\(storageRef.bucket)/\(storageRef.fullPath)"
let prompt = "What's in this picture?"
// Construct the imagePart with the MIME type and the URL.
let imagePart = FileDataPart(uri: storageURL, mimeType: mimeType)
// To generate text output, call generateContent with the prompt and the imagePart.
let result = try await model.generateContent(prompt, imagePart)
if let text = result.text {
print(text)
}
Kotlin
Pour Kotlin, les méthodes de ce SDK sont des fonctions de suspension et doivent être appelées à partir d'une portée 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 = model.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 unListenableFuture.
// 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();
});
Web
// Upload an image file using Cloud Storage for Firebase.
const storageRef = ref(storage, "image.jpg");
const uploadResult = await uploadBytes(storageRef, file);
// Get the MIME type and Cloud Storage for Firebase URL.
// toString() is the simplest way to construct the Cloud Storage for Firebase URL
// in the required format.
const mimeType = uploadResult.metadata.contentType;
const storageUrl = uploadResult.ref.toString();
// Construct the imagePart with the MIME type and the URL.
const imagePart = { fileData: { mimeType, fileUri: storageUrl }};
// To generate text output, call generateContent with the prompt and imagePart.
const result = await model.generateContent([prompt, imagePart]);
console.log(result.response.text());
Dart
// Upload an image file using Cloud Storage for Firebase.
final storageRef = FirebaseStorage.instance.ref();
final imageRef = storageRef.child("images/image.jpg");
await imageRef.putData(data);
// Get the MIME type and Cloud Storage for Firebase file path.
final metadata = await imageRef.getMetadata();
final mimeType = metadata.contentType;
final bucket = imageRef.bucket;
final fullPath = imageRef.fullPath;
final prompt = TextPart("What's in the picture?");
// Construct a URL in the required format.
final storageUrl = 'gs://$bucket/$fullPath';
// Construct the filePart with the MIME type and the URL.
final filePart = FileData(mimeType, storageUrl);
// To generate text output, call generateContent with the text and the filePart.
final response = await model.generateContent([
Content.multi([prompt, filePart])
]);
print(response.text);
Unity
var storageRef = FirebaseStorage.DefaultInstance.GetReference("images/image.jpg");
var metadata = await storageRef.PutFileAsync(filePathToJpg);
// Get the MIME type and Cloud Storage for Firebase URL.
var mimeType = metadata.ContentType;
// Construct a URL in the required format.
var storageURL = new Uri($"gs://{storageRef.Bucket}/{storageRef.Path}");
var prompt = ModelContent.Text("What's in this picture?");
// Construct a FileData that explicitly includes the MIME type and
// Cloud Storage for Firebase URL values.
var fileData = ModelContent.FileData(mimeType, storageURL);
// To generate text output, call GenerateContentAsync with the prompt and fileData.
var response = await model.GenerateContentAsync(new [] { prompt, fileData });
UnityEngine.Debug.Log(response.Text ?? "No text in response.");
Option 2 : Inclure explicitement le type MIME et l'URL
| Avant d'essayer cet exemple, assurez-vous d'avoir suivi le guide de démarrage des Firebase AI Logic SDK. |
Utilisez cette option si vous connaissez les valeurs du type MIME et Cloud Storage for Firebase URL, et que vous souhaitez les inclure explicitement dans la requête multimodale. L'appel nécessite à la fois le type MIME et l'URL.
Swift
let prompt = "What's in this picture?"
// Construct an imagePart that explicitly includes the MIME type and
// Cloud Storage for Firebase URL values.
let imagePart = FileDataPart(uri: "gs://bucket-name/path/image.jpg", mimeType: "image/jpeg")
// To generate text output, call generateContent with the prompt and imagePart.
let result = try await model.generateContent(prompt, imagePart)
if let text = result.text {
print(text)
}
Kotlin
Pour Kotlin, les méthodes de ce SDK sont des fonctions de suspension et doivent être appelées à partir d'une portée 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 = model.generateContent(prompt)
println(response.text)
Java
Pour Java, les méthodes de ce SDK renvoient unListenableFuture.
// 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);
Web
const prompt = "What's in this picture?";
// Construct an imagePart that explicitly includes the MIME type and Cloud Storage for Firebase URL values.
const imagePart = { fileData: { mimeType: "image/jpeg", fileUri: "gs://bucket-name/path/image.jpg" }};
// To generate text output, call generateContent with the prompt and imagePart.
const result = await model.generateContent([prompt, imagePart]);
console.log(result.response.text());
Dart
final prompt = TextPart("What's in the picture?");
// Construct a filePart that explicitly includes the MIME type and Cloud Storage for Firebase URL values.
final filePart = FileData('image/jpeg', 'gs://bucket-name/path/image.jpg'),
// To generate text output, call generateContent with the prompt and filePart.
final response = await model.generateContent([
Content.multi([prompt, filePart])
]);
print(response.text);
Unity
var prompt = ModelContent.Text("What's in this picture?");
// Construct a FileData that explicitly includes the MIME type and
// Cloud Storage for Firebase URL values.
var fileData = ModelContent.FileData(
mimeType: "image/jpeg",
uri: new Uri("gs://bucket-name/path/image.jpg")
);
// To generate text output, call GenerateContentAsync with the prompt and fileData.
var response = await model.GenerateContentAsync(new [] { prompt, fileData });
UnityEngine.Debug.Log(response.Text ?? "No text in response.");