| Nur verfügbar, wenn Sie die Vertex AI Gemini API als Ihren API-Anbieter verwenden. |
Wenn Sie die Vertex AI Gemini API über ein Firebase AI Logic SDK aus Ihrer App aufrufen, können Sie ein Gemini-Modell auffordern, Text basierend auf einer multimodalen Eingabe wie Bildern, PDFs, Videos und Audio zu generieren.
Für die Nicht-Text-Teile der Eingabe (z. B. Mediendateien) können Sie optional Cloud Storage for Firebase verwenden, um Dateien in die Anfrage einzufügen. Hier sind die wichtigsten Informationen zu dieser Funktion:
Sie können Cloud Storage for Firebase mit jeder multimodalen Anfrage verwenden (z. B. sowohl für die Texterstellung als auch für den Chat), wenn Sie die Vertex AI Gemini API verwenden. In den Beispielen in diesem Leitfaden wird eine einfache Text- und Bildeingabe gezeigt.
Sie geben den MIME-Typ der Datei und die Cloud Storage for Firebase URL (die immer mit
gs://beginnt) in der Anforderungseingabe an. Diese Werte sind Metadaten, die automatisch jeder Datei zugewiesen werden, die in einen Cloud Storage Bucket hochgeladen wird.Sie müssen einen unterstützten Dateityp und eine unterstützte URL verwenden.
In diesem Lösungsleitfaden wird beschrieben, wie Sie Cloud Storage for Firebase einrichten, eine Datei aus Ihrer App in einen Cloud Storage for Firebase-Bucket hochladen und dann den MIME-Typ und die Cloud Storage for Firebase-URL der Datei in Ihre multimodale Anfrage an die Gemini API einfügen.
Möchten Sie die Codebeispiele sehen? Oder haben Sie Cloud Storage for Firebase bereits eingerichtet und sind bereit, es mit Ihren multimodalen Anfragen zu verwenden?
Zu den Codebeispielen springen
Warum Cloud Storage for Firebase mit Ihrer App verwenden?
Cloud Storage for Firebase verwendet dieselbe schnelle, sichere und skalierbare Infrastruktur wie Google Cloud Storage zum Speichern von Blobs und Dateien. Die Client-SDKs wurden speziell für mobile Apps und Webanwendungen entwickelt.
Für Firebase AI Logic SDKs beträgt die maximale Anfragengröße 20 MB. Wenn eine Anfrage zu groß ist, erhalten Sie einen HTTP 413-Fehler. Wenn die Dateigröße die Gesamtgröße der Anfrage auf über 20 MB erhöht, verwenden Sie eine Cloud Storage for Firebase URL, um die Datei in Ihre multimodale Anfrage einzufügen. Wenn eine Datei jedoch klein ist, können Sie sie oft direkt als Inline-Daten übergeben. Beachten Sie jedoch, dass eine als Inline-Daten bereitgestellte Datei während der Übertragung in base64 codiert wird, was die Größe der Anfrage erhöht.
Weitere Vorteile der Verwendung von Cloud Storage for Firebase:
Endnutzer können Bilder direkt aus Ihrer App in einen Cloud Storage for Firebase Bucket hochladen. Sie können diese Bilder dann in Ihre multimodalen Prompts einfügen, indem Sie einfach den MIME-Typ der Datei und die Cloud Storage for Firebase URL (eine Kennung für die Datei) angeben.
Sie können Ihren Endnutzern Zeit und Bandbreite sparen, wenn sie Bilder bereitstellen müssen, insbesondere wenn die Netzwerkqualität schlecht oder instabil ist.
- Wenn ein Datei-Upload oder -Download unterbrochen wird, starten die Cloud Storage for Firebase SDKs den Vorgang automatisch an der Stelle neu, an der er unterbrochen wurde.
- Dieselbe hochgeladene Datei kann mehrmals verwendet werden, ohne dass der Endnutzer sie jedes Mal hochladen muss, wenn sie in Ihrer App benötigt wird (z. B. in einer neuen multimodalen Anfrage).
Sie können den Zugriff von Endnutzern auf Dateien, die in Cloud Storage for Firebase gespeichert sind, mit Firebase Security Rules einschränken. Diese Regeln erlauben nur autorisierten Nutzern, Dateien hochzuladen, herunterzuladen oder zu löschen.
Sie können über Firebase oder über Google Cloud auf die Dateien in Ihrem Bucket zugreifen. So haben Sie die Flexibilität, serverseitige Verarbeitung wie Bild filterung oder Videotranscodierung mit den Google Cloud Storage APIs durchzuführen.
Welche Dateitypen und URLs werden unterstützt?
Hier sind die Anforderungen an Dateien und URLs, wenn Sie Cloud Storage for Firebase URLs mit den Firebase AI Logic SDKs verwenden möchten:
Die Datei muss die Anforderungen an Eingabedateien für multimodale Anfragen erfüllen. Dazu gehören Anforderungen wie MIME-Typ und Dateigröße.
Die Datei muss in einem Cloud Storage for Firebase-Bucket gespeichert sein . Das bedeutet, dass der Bucket für Firebase-Dienste wie Firebase Security Rules zugänglich ist. Wenn Sie Ihren Bucket in der Firebase Konsole sehen können, ist es ein Cloud Storage for Firebase-Bucket.
Der Cloud Storage for Firebase Bucket muss sich im selben Firebase-Projekt befinden, in dem Sie Ihre App registriert haben.
Die Cloud Storage for Firebase URL der Datei muss mit
gs://beginnen. So werden alle Google Cloud Storage URLs erstellt.Die URL der Datei darf keine „Browser-URL“ sein (z. B. die URL eines Bildes, das Sie im Internet finden).
Außerdem müssen die Firebase Security Rules für Ihren Bucket einen entsprechenden Zugriff auf die Datei ermöglichen. Beispiel:
Wenn Sie öffentliche Regeln haben, dann kann jeder Nutzer oder Client auf die Datei zugreifen.
Wenn Sie robuste Regeln (dringend empfohlen) haben, prüft Firebase, ob der angemeldete Nutzer oder Client ausreichenden Zugriff auf die Datei hat, bevor der Aufruf mit der angegebenen URL zugelassen wird.
Cloud Storage for Firebase-URLs mit Firebase AI Logic verwenden
| Nur verfügbar, wenn Sie die Vertex AI Gemini API als Ihren API-Anbieter verwenden. |
Schritt 1: Cloud Storage for Firebase einrichten
Eine detaillierte Anleitung zum Einrichten von Cloud Storage for Firebase finden Sie in den Leitfäden für die ersten Schritte: iOS+ | Android | Web | Flutter | Unity
Hier sind die wichtigsten Aufgaben, die Sie ausführen müssen:
Erstellen oder importieren Sie einen Cloud Storage for Firebase Bucket in Ihrem Firebase Projekt.
Wenden Sie Firebase Security Rules auf diesen Bucket an. Security Rules helfen Ihnen, Ihre Dateien zu schützen, indem Sie den Zugriff auf autorisierte Endnutzer beschränken.
Fügen Sie Ihrer App die Clientbibliothek für Cloud Storage for Firebase hinzu.
Sie können diese Aufgabe überspringen, müssen dann aber immer explizit die MIME-Typ- und URL-Werte in Ihre Anfragen einfügen.
Schritt 2: Datei in einen Bucket hochladen
In der Cloud Storage Dokumentation finden Sie alle Möglichkeiten, Dateien in einen Bucket hochzuladen. Sie können beispielsweise lokale Dateien vom Gerät des Endnutzers hochladen, z. B. Fotos und Videos von der Kamera. Weitere Informationen: iOS+ | Android | Web | Flutter | Unity
Wenn Sie eine Datei in einen Bucket hochladen, wendet Cloud Storage automatisch die folgenden beiden Informationen auf die Datei an. Sie müssen diese Werte in die Anfrage einfügen (wie im nächsten Schritt dieses Leitfadens gezeigt).
MIME-Typ: Dies ist der Medientyp der Datei (z. B.
image/png). Wir versuchen automatisch, den MIME-Typ während des Uploads zu erkennen und diese Metadaten auf das Objekt im Bucket anzuwenden. Sie können den MIME-Typ jedoch optional während des Uploads angeben.Cloud Storage for Firebase URL: Dies ist eine eindeutige Kennung für die Datei. Die URL muss mit
gs://beginnen.
Schritt 3: MIME-Typ und URL der Datei in eine multimodale Anfrage einfügen
Sobald Sie eine Datei in einem Bucket gespeichert haben, können Sie ihren MIME-Typ und ihre URL in eine Anfrage einfügen. In diesen Beispielen wird eine nicht streamende generateContent-Anfrage gezeigt. Sie können URLs aber auch mit Streaming und Chat verwenden.
Sie haben zwei Möglichkeiten, die Datei in die Anfrage einzufügen:
Option 1: MIME-Typ und URL mit einem Storage-Verweis einfügen
Option 2: MIME-Typ und URL explizit einfügen
Option 1: MIME-Typ und URL mit einem Storage-Verweis einfügen
| Bevor Sie dieses Beispiel ausprobieren, müssen Sie den Leitfaden für die ersten Schritte für die Firebase AI Logic SDKs durchgearbeitet haben. |
Verwenden Sie diese Option, wenn Sie die Datei gerade in den Bucket hochgeladen haben und sie sofort (über einen Storage-Verweis) in die Anfrage einfügen möchten. Für den Aufruf sind sowohl der MIME-Typ als auch die Cloud Storage for Firebase URL erforderlich.
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
In Kotlin sind die Methoden in diesem SDK Suspend-Funktionen und müssen aus einem Coroutine-Bereich aufgerufen werden.// 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
In Java geben die Methoden in diesem SDK einListenableFuture zurück.
// 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: MIME-Typ und URL explizit einfügen
| Bevor Sie dieses Beispiel ausprobieren, müssen Sie den Leitfaden für die ersten Schritte für die Firebase AI Logic SDKs durchgearbeitet haben. |
Verwenden Sie diese Option, wenn Sie die Werte für den MIME-Typ und Cloud Storage for Firebase URL kennen und sie explizit in die multimodale Anfrage einfügen möchten. Für den Aufruf sind sowohl der MIME-Typ als auch die URL erforderlich.
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
In Kotlin sind die Methoden in diesem SDK Suspend-Funktionen und müssen aus einem Coroutine-Bereich aufgerufen werden.// 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
In Java geben die Methoden in diesem SDK einListenableFuture zurück.
// 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.");