Große Dateien in multimodale Anfragen einbeziehen und Dateien mit Cloud Storage for Firebase verwalten

Nur verfügbar, wenn Sie Vertex AI Gemini API als API-Anbieter verwenden.

Wenn Sie die Vertex AI Gemini API über Ihre App mit einem Firebase AI Logic-SDK 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 aufzunehmen. Hier finden Sie die wichtigsten Informationen zu dieser Funktion:

  • Sie können Cloud Storage for Firebase für jede multimodale Anfrage (z. B. sowohl Textgenerierung als auch Chat) verwenden, wenn Sie die Vertex AI Gemini API nutzen. Die Beispiele in diesem Leitfaden zeigen eine einfache Text- und Bildeingabe.

  • Sie geben den MIME-Typ der Datei und die Cloud Storage for Firebase-URL (die immer mit gs:// beginnt) in der Anfrageeingabe 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 dieser Lösungsanleitung 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 möchten es jetzt für multimodale Anfragen verwenden?

Zu den Codebeispielen springen

Warum sollten Sie Cloud Storage for Firebase in 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. Sie erhalten einen HTTP 413-Fehler, wenn eine Anfrage zu groß ist. Wenn die Größe einer Datei dazu führt, dass die Gesamtgröße der Anfrage 20 MB überschreitet, verwenden Sie eine Cloud Storage for Firebase-URL, um die Datei in Ihre multimodale Anfrage aufzunehmen. 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 bei der Übertragung in Base64 codiert wird, was die Größe der Anfrage erhöht.

Weitere Vorteile 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 Endnutzerzugriff auf Dateien, die in Cloud Storage for Firebase gespeichert sind, mit Firebase Security Rules einschränken. Dadurch können nur autorisierte Nutzer Dateien hochladen, herunterladen oder löschen.

  • Sie können über Firebase oder Google Cloud auf die Dateien in Ihrem Bucket zugreifen. So haben Sie die Möglichkeit, serverseitige Verarbeitung wie Bildfilterung oder Videotranscodierung mit den Google Cloud Storage-APIs durchzuführen.

Welche Dateitypen und URLs werden unterstützt?

Hier finden Sie 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, handelt es sich um einen 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 muss die Firebase Security Rules für Ihren Bucket den entsprechenden Zugriff auf die Datei zulassen. Beispiel:

  • Wenn Sie öffentliche Regeln haben, 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 Vertex AI Gemini API als API-Anbieter verwenden.

Schritt 1: Cloud Storage for Firebase einrichten

Eine detaillierte Anleitung zum Einrichten von Cloud Storage for Firebase finden Sie im Startleitfaden: iOS+ | Android | Web | Flutter | Unity

Hier finden Sie eine allgemeine Liste der erforderlichen Aufgaben:

  1. Erstellen oder importieren Sie einen Cloud Storage for Firebase-Bucket in Ihrem Firebase-Projekt.

  2. Wenden Sie Firebase Security Rules auf diesen Bucket an. Rules können Sie Ihre Dateien schützen, indem Sie den Zugriff auf autorisierte Endnutzer beschränken.

  3. Fügen Sie Ihrer App die Clientbibliothek für Cloud Storage for Firebase hinzu.

    Sie können diesen Schritt überspringen, müssen dann aber immer MIME-Typ und URL-Werte explizit in Ihre Anfragen aufnehmen.

Schritt 2: Datei in einen Bucket hochladen

In der Cloud Storage-Dokumentation finden Sie alle Möglichkeiten zum Hochladen von Dateien in einen Bucket. 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 dieser Anleitung beschrieben.

  • MIME-Typ: Dies ist der Medientyp der Datei, z. B. image/png. Wir versuchen, den MIME-Typ beim Hochladen automatisch zu erkennen und diese Metadaten auf das Objekt im Bucket anzuwenden. Sie können den MIME-Typ jedoch optional beim Hochladen 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-Streaming-Anfrage vom Typ generateContent gezeigt. Sie können jedoch auch URLs mit Streaming und Chat verwenden.

Sie haben folgende Möglichkeiten, die Datei in die Anfrage aufzunehmen:

Option 1: MIME-Typ und URL mit einem Speicherverweis einfügen

Bevor Sie dieses Beispiel ausprobieren, müssen Sie die Anleitung für den Einstieg in 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 eine Speicherreferenz) 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

Für 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 = 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

Bei Java geben die Methoden in diesem SDK eine ListenableFuture 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);

Einheit

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 angeben

Bevor Sie dieses Beispiel ausprobieren, müssen Sie die Anleitung für den Einstieg in die Firebase AI Logic SDKs durchgearbeitet haben.

Verwenden Sie diese Option, wenn Sie die Werte für den MIME-Typ und die Cloud Storage for Firebase-URL kennen und sie explizit in die multimodale Anfrage aufnehmen 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

Für 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 = generativeModel.generateContent(prompt)
println(response.text)

Java

Bei Java geben die Methoden in diesem SDK eine ListenableFuture 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);

Einheit

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.");