Menyertakan file besar dalam permintaan multimodal dan mengelola file menggunakan Cloud Storage for Firebase

Saat memanggil Gemini API dari aplikasi menggunakan Vertex AI in Firebase SDK, Anda dapat meminta model Gemini untuk membuat teks berdasarkan input multimodal. Perintah multimodal dapat mencakup beberapa modalitas (atau jenis input), seperti teks bersama gambar, PDF, video, dan audio.

Untuk bagian input non-teks (seperti file media), Anda dapat menggunakan Cloud Storage for Firebase secara opsional untuk menyertakan file dalam permintaan. Secara umum, berikut hal-hal yang perlu Anda ketahui tentang fitur ini:

  • Anda dapat menggunakan Cloud Storage for Firebase dengan permintaan multimodal apa pun (seperti pembuatan teks dan chat). Contoh dalam panduan ini menunjukkan input teks dan gambar dasar.

  • Anda menentukan jenis MIME file dan URL Cloud Storage for Firebase-nya (yang selalu diawali dengan gs://) di input permintaan. Nilai ini adalah metadata yang otomatis ditetapkan ke file apa pun yang diupload ke bucket Cloud Storage.

  • Anda harus menggunakan jenis file dan URL yang didukung.


Panduan solusi ini menjelaskan cara menyiapkan Cloud Storage for Firebase, mengupload file ke bucket Cloud Storage for Firebase dari aplikasi Anda, lalu menyertakan jenis MIME file dan URL Cloud Storage for Firebase dalam permintaan multimodal Anda ke Gemini API.

Ingin melihat contoh kode? Atau apakah Anda sudah menyiapkan Cloud Storage for Firebase dan siap mulai menggunakannya dengan permintaan multimodal?

Langsung ke contoh kode

Mengapa menggunakan Cloud Storage for Firebase dengan aplikasi Anda?

Cloud Storage for Firebase menggunakan infrastruktur yang cepat, aman, dan skalabel seperti Google Cloud Storage untuk menyimpan blob dan file, dan SDK kliennya dibuat khusus untuk aplikasi seluler dan web.

Untuk Vertex AI in Firebase SDK, ukuran permintaan maksimum adalah 20 MB. Anda akan mendapatkan error HTTP 413 jika permintaan terlalu besar. Jika ukuran file akan membuat total ukuran permintaan melebihi 20 MB, gunakan URL Cloud Storage for Firebase untuk menyertakan file dalam permintaan multimodal. Namun, jika file berukuran kecil, Anda sering kali dapat meneruskannya langsung sebagai data inline (perhatikan bahwa file yang disediakan sebagai data inline dienkode ke base64 dalam transit, yang akan meningkatkan ukuran permintaan).

Berikut adalah beberapa manfaat tambahan dari penggunaan Cloud Storage for Firebase:

  • Anda dapat meminta pengguna akhir untuk mengupload gambar langsung dari aplikasi ke bucket Cloud Storage for Firebase, lalu Anda dapat menyertakan gambar tersebut dalam perintah multimodal hanya dengan menentukan jenis MIME file dan URL Cloud Storage for Firebase (yang merupakan ID untuk file).

  • Anda dapat menghemat waktu dan bandwidth pengguna akhir jika mereka perlu memberikan gambar, terutama jika mereka memiliki kualitas jaringan yang buruk atau tidak stabil.

    • Jika upload atau download file terhenti, SDK Cloud Storage for Firebase akan otomatis memulai ulang operasi tepat di posisi terakhirnya.
    • File yang diupload yang sama dapat digunakan beberapa kali tanpa mengharuskan pengguna akhir mengupload file yang sama setiap kali diperlukan di aplikasi Anda (seperti dalam permintaan multimodal baru).
  • Anda dapat membatasi akses pengguna akhir ke file yang disimpan di Cloud Storage for Firebase menggunakan Firebase Security Rules, yang hanya mengizinkan pengguna yang diotorisasi untuk mengupload, mendownload, atau menghapus file.

  • Anda dapat mengakses file di bucket dari Firebase atau dari Google Cloud, sehingga Anda memiliki fleksibilitas untuk melakukan pemrosesan sisi server seperti pemfilteran gambar atau transcoding video menggunakan Google Cloud Storage API.

Jenis file dan URL apa yang didukung?

Berikut adalah persyaratan untuk file dan URL saat Anda ingin menggunakan URL Cloud Storage for Firebase dengan SDK Vertex AI in Firebase:

  • File harus memenuhi persyaratan file input untuk permintaan multimodal saat menggunakan SDK Vertex AI in Firebase. Hal ini mencakup persyaratan seperti jenis MIME dan ukuran file.

  • File harus disimpan dalam bucket Cloud Storage for Firebase (yang berarti bucket dapat diakses oleh layanan Firebase, seperti Firebase Security Rules). Jika Anda dapat melihat bucket di Firebase console, berarti bucket tersebut adalah bucket Cloud Storage for Firebase.

  • Bucket Cloud Storage for Firebase harus berada dalam project Firebase yang sama tempat Anda mendaftarkan aplikasi.

  • URL Cloud Storage for Firebase file harus diawali dengan gs://, yang merupakan cara semua URL Google Cloud Storage dibuat.

  • URL file tidak boleh berupa URL "browser" (misalnya, URL gambar yang Anda temukan di internet).

Selain itu, Firebase Security Rules untuk bucket Anda harus mengizinkan akses yang sesuai ke file. Contoh:

  • Jika Anda memiliki aturan publik, pengguna atau klien mana pun dapat mengakses file dan memberikan URL-nya dalam panggilan menggunakan SDK Vertex AI in Firebase. Jenis aturan ini hanya boleh digunakan untuk memulai dan selama pembuatan prototipe awal (kecuali jika file tersebut benar-benar dimaksudkan untuk menjadi file yang sepenuhnya dapat diakses publik).

  • Jika Anda memiliki aturan yang andal (sangat direkomendasikan), Firebase akan memeriksa apakah pengguna atau klien yang login memiliki akses yang memadai ke file tersebut sebelum mengizinkan panggilan dilakukan dengan URL yang diberikan.

Menggunakan URL Cloud Storage for Firebase dengan Vertex AI in Firebase

Langkah 1: Siapkan Cloud Storage for Firebase

Anda dapat menemukan petunjuk mendetail untuk menyiapkan dan menggunakan Cloud Storage for Firebase di panduan memulai.

Buka panduan memulai Cloud Storage for Firebase

Berikut adalah tugas tingkat tinggi yang harus Anda lakukan:

  1. Buat bucket Cloud Storage for Firebase di project Firebase Anda.

    Jika sudah memiliki bucket Cloud Storage di project Google Cloud yang ingin digunakan dengan Vertex AI in Firebase, Anda dapat membuatnya dapat diakses oleh layanan Firebase (termasuk Vertex AI in Firebase) dengan "mengimpor" bucket ke Firebase.

  2. Terapkan Firebase Security Rules ke bucket ini. Firebase Security Rules membantu Anda mengamankan file dengan membatasi akses ke pengguna akhir yang diotorisasi.

  3. Tambahkan library klien untuk Cloud Storage for Firebase ke aplikasi Anda.

    Perhatikan bahwa Anda dapat melewati tugas ini, tetapi Anda harus selalu menyertakan jenis MIME dan nilai URL Cloud Storage for Firebase secara eksplisit dalam permintaan multimodal.

Langkah 2: Upload file ke bucket

Dalam dokumentasi Cloud Storage for Firebase, Anda dapat mempelajari berbagai cara untuk mengupload file ke bucket Cloud Storage for Firebase. Misalnya, Anda dapat mengupload file lokal dari perangkat pengguna akhir, seperti foto dan video dari kamera.

Saat Anda mengupload file ke bucket, Cloud Storage otomatis menerapkan dua informasi berikut ke file tersebut. Anda harus menyertakan nilai ini dalam permintaan multimodal (seperti yang ditunjukkan pada langkah berikutnya dalam panduan ini).

  • Jenis MIME: Ini adalah jenis media file (misalnya, image/png). Cloud Storage for Firebase akan otomatis mencoba mendeteksi jenis MIME selama upload dan menerapkan metadata tersebut ke objek di bucket. Namun, Anda dapat menentukan jenis MIME secara opsional selama upload.

  • URL Cloud Storage for Firebase: Ini adalah ID unik untuk file. URL harus diawali dengan gs://.

Langkah 3: Sertakan jenis MIME dan URL file dalam permintaan multimodal

Setelah memiliki file yang disimpan di bucket Cloud Storage for Firebase, Anda dapat menyertakan jenis MIME dan URL Cloud Storage for Firebase dalam permintaan multimodal. Perhatikan bahwa contoh ini menunjukkan permintaan generateContent non-streaming, tetapi Anda juga dapat menggunakan URL Cloud Storage for Firebase dengan streaming dan chat.

Untuk menyertakan file dalam permintaan, Anda dapat menggunakan salah satu opsi berikut:

Opsi 1: Menyertakan jenis MIME dan URL menggunakan referensi Storage

Gunakan opsi ini jika Anda baru saja mengupload file ke bucket, dan ingin langsung menyertakan file (melalui referensi Storage) dalam permintaan multimodal. Panggilan memerlukan jenis MIME dan URL Cloud Storage for Firebase.

Kotlin+KTX

Untuk Kotlin, metode dalam SDK ini adalah fungsi penangguhan dan harus dipanggil dari Cakupan 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

Untuk Java, metode dalam SDK ini menampilkan 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();
});

Opsi 2: Sertakan jenis MIME dan URL secara eksplisit

Gunakan opsi ini jika Anda mengetahui nilai untuk jenis MIME dan URL Cloud Storage for Firebase, dan Anda ingin menyertakannya secara eksplisit dalam permintaan multimodal. Panggilan memerlukan jenis MIME dan URL.

Kotlin+KTX

Untuk Kotlin, metode dalam SDK ini adalah fungsi penangguhan dan perlu dipanggil dari Cakupan 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

Untuk Java, metode dalam SDK ini menampilkan 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);