Gemini Developer API

Untuk mengakses model Gemini Pro dan Flash, sebaiknya developer Android menggunakan Gemini Developer API menggunakan Firebase AI Logic. Dengan begitu, Anda dapat memulai tanpa memerlukan kartu kredit, dan mendapatkan paket gratis yang melimpah. Setelah memvalidasi integrasi dengan basis pengguna kecil, Anda dapat menskalakan dengan beralih ke paket berbayar.

Ilustrasi Aplikasi Android yang berisi Firebase Android SDK. Panah mengarah dari SDK ke Firebase dalam lingkungan Cloud. Dari Firebase, panah lain mengarah ke Gemini Developer API, yang terhubung ke Gemini Pro & Flash, juga dalam Cloud.
Gambar 1. Arsitektur integrasi Firebase AI Logic untuk mengakses Gemini Developer API.

Memulai

Sebelum berinteraksi dengan Gemini API langsung dari aplikasi, Anda harus melakukan beberapa hal terlebih dahulu, termasuk memahami perintah serta menyiapkan Firebase dan aplikasi Anda untuk menggunakan SDK.

Bereksperimen dengan perintah

Bereksperimen dengan perintah dapat membantu Anda menemukan frasa, konten, dan format terbaik untuk aplikasi Android Anda. Google AI Studio adalah IDE yang dapat Anda gunakan untuk membuat prototipe dan mendesain perintah untuk kasus penggunaan aplikasi Anda.

Membuat perintah yang tepat untuk kasus penggunaan Anda lebih membutuhkan kreativitas daripada ilmu pengetahuan, sehingga eksperimen menjadi sangat penting. Anda dapat mempelajari lebih lanjut perintah di dokumentasi Firebase.

Setelah puas dengan perintah, klik tombol "<>" untuk mendapatkan cuplikan kode yang dapat Anda tambahkan ke kode.

Menyiapkan project Firebase dan menghubungkan aplikasi ke Firebase

Setelah Anda siap memanggil API dari aplikasi, ikuti petunjuk di "Langkah 1" panduan memulai Logika AI Firebase untuk menyiapkan Firebase dan SDK di aplikasi Anda.

Menambahkan dependensi Gradle

Tambahkan dependensi Gradle berikut ke modul aplikasi Anda:

Kotlin

dependencies {
  // ... other androidx dependencies

  // Import the BoM for the Firebase platform
  implementation(platform("com.google.firebase:firebase-bom:33.13.0"))

  // Add the dependency for the Firebase AI Logic library When using the BoM,
  // you don't specify versions in Firebase library dependencies
  implementation("com.google.firebase:firebase-ai")
}

Java

dependencies {
  // Import the BoM for the Firebase platform
  implementation(platform("com.google.firebase:firebase-bom:33.13.0"))

  // Add the dependency for the Firebase AI Logic library When using the BoM,
  // you don't specify versions in Firebase library dependencies
  implementation("com.google.firebase:firebase-ai")

  // Required for one-shot operations (to use `ListenableFuture` from Guava
  // Android)
  implementation("com.google.guava:guava:31.0.1-android")

  // Required for streaming operations (to use `Publisher` from Reactive
  // Streams)
  implementation("org.reactivestreams:reactive-streams:1.0.4")
}

Melakukan inisialisasi model generatif

Mulai dengan membuat instance GenerativeModel dan menentukan nama model:

Kotlin

val model = Firebase.ai(backend = GenerativeBackend.googleAI())
                        .generativeModel("gemini-2.0-flash")

Java

GenerativeModel firebaseAI = FirebaseAI.getInstance(GenerativeBackend.googleAI())
        .generativeModel("gemini-2.0-flash");

GenerativeModelFutures model = GenerativeModelFutures.from(firebaseAI);

Pelajari lebih lanjut model yang tersedia untuk digunakan dengan Gemini Developer API. Anda juga dapat mempelajari lebih lanjut cara mengonfigurasi parameter model.

Berinteraksi dengan Gemini Developer API dari aplikasi Anda

Setelah menyiapkan Firebase dan aplikasi untuk menggunakan SDK, Anda siap untuk berinteraksi dengan Gemini Developer API dari aplikasi Anda.

Membuat teks

Untuk membuat respons teks, panggil generateContent() dengan perintah Anda.

Kotlin

scope.launch {
  val response = model.generateContent("Write a story about a magic backpack.")
}

Java

Content prompt = new Content.Builder()
    .addText("Write a story about a magic backpack.")
    .build();

ListenableFuture<GenerateContentResponse> response = model.generateContent(prompt);
Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() {
    @Override
    public void onSuccess(GenerateContentResponse result) {
        String resultText = result.getText();
        [...]
    }

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

Membuat teks dari gambar dan media lainnya

Anda juga dapat membuat teks dari perintah yang menyertakan teks plus gambar atau media lainnya. Saat memanggil generateContent(), Anda dapat meneruskan media sebagai data inline.

Misalnya, untuk menggunakan bitmap, gunakan jenis konten image:

Kotlin

scope.launch {
  val response = model.generateContent(
    content {
      image(bitmap)
      text("what is the object in the picture?")
    }
  )
}

Java

Content content = new Content.Builder()
        .addImage(bitmap)
        .addText("what is the object in the picture?")
        .build();

ListenableFuture<GenerateContentResponse> response = model.generateContent(content);
Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() {
    @Override
    public void onSuccess(GenerateContentResponse result) {
        String resultText = result.getText();
        [...]
    }

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

Untuk meneruskan file audio, gunakan jenis konten inlineData:

Kotlin

val contentResolver = applicationContext.contentResolver
val inputStream = contentResolver.openInputStream(audioUri).use { stream ->
    stream?.let {
        val bytes = stream.readBytes()

        val prompt = content {
            inlineData(bytes, "audio/mpeg")  // Specify the appropriate audio MIME type
            text("Transcribe this audio recording.")
        }

        val response = model.generateContent(prompt)
    }
}

Java

ContentResolver resolver = getApplicationContext().getContentResolver();

try (InputStream stream = resolver.openInputStream(audioUri)) {
    File audioFile = new File(new URI(audioUri.toString()));
    int audioSize = (int) audioFile.length();
    byte audioBytes = new byte[audioSize];
    if (stream != null) {
        stream.read(audioBytes, 0, audioBytes.length);
        stream.close();

        // Provide a prompt that includes audio specified earlier and text
        Content prompt = new Content.Builder()
              .addInlineData(audioBytes, "audio/mpeg")  // Specify the appropriate audio MIME type
              .addText("Transcribe what's said in this audio recording.")
              .build();

        // To generate text output, call `generateContent` with the prompt
        ListenableFuture<GenerateContentResponse> response = model.generateContent(prompt);
        Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() {
            @Override
            public void onSuccess(GenerateContentResponse result) {
                String text = result.getText();
                Log.d(TAG, (text == null) ? "" : text);
            }
            @Override
            public void onFailure(Throwable t) {
                Log.e(TAG, "Failed to generate a response", t);
            }
        }, executor);
    } else {
        Log.e(TAG, "Error getting input stream for file.");
        // Handle the error appropriately
    }
} catch (IOException e) {
    Log.e(TAG, "Failed to read the audio file", e);
} catch (URISyntaxException e) {
    Log.e(TAG, "Invalid audio file", e);
}

Dan untuk memberikan file video, lanjutkan menggunakan jenis konten inlineData:

Kotlin

val contentResolver = applicationContext.contentResolver
contentResolver.openInputStream(videoUri).use { stream ->
  stream?.let {
    val bytes = stream.readBytes()

    val prompt = content {
        inlineData(bytes, "video/mp4")  // Specify the appropriate video MIME type
        text("Describe the content of this video")
    }

    val response = model.generateContent(prompt)
  }
}

Java

ContentResolver resolver = getApplicationContext().getContentResolver();

try (InputStream stream = resolver.openInputStream(videoUri)) {
    File videoFile = new File(new URI(videoUri.toString()));
    int videoSize = (int) videoFile.length();
    byte[] videoBytes = new byte[videoSize];
    if (stream != null) {
        stream.read(videoBytes, 0, videoBytes.length);
        stream.close();

        // Provide a prompt that includes video specified earlier and text
        Content prompt = new Content.Builder()
                .addInlineData(videoBytes, "video/mp4")
                .addText("Describe the content of this video")
                .build();

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

            @Override
            public void onFailure(Throwable t) {
                t.printStackTrace();
            }
        }, executor);
    }
} catch (IOException e) {
    e.printStackTrace();
} catch (URISyntaxException e) {
    e.printStackTrace();
}

Demikian pula, Anda juga dapat meneruskan dokumen PDF (application/pdf) dan teks biasa (text/plain) yang meneruskan Jenis MIME masing-masing sebagai parameter.

Multi-turn chat

Anda juga dapat mendukung percakapan multi-giliran. Lakukan inisialisasi chat dengan fungsi startChat(). Anda dapat memberikan histori pesan ke model secara opsional. Kemudian, panggil fungsi sendMessage() untuk mengirim pesan chat.

Kotlin

val chat = model.startChat(
    history = listOf(
        content(role = "user") { text("Hello, I have 2 dogs in my house.") },
        content(role = "model") { text("Great to meet you. What would you like to know?")   }
    )
)

scope.launch {
   val response = chat.sendMessage("How many paws are in my house?")
}

Java

Content.Builder userContentBuilder = new Content.Builder();
userContentBuilder.setRole("user");
userContentBuilder.addText("Hello, I have 2 dogs in my house.");
Content userContent = userContentBuilder.build();

Content.Builder modelContentBuilder = new Content.Builder();
modelContentBuilder.setRole("model");
modelContentBuilder.addText("Great to meet you. What would you like to know?");
Content modelContent = userContentBuilder.build();

List<Content> history = Arrays.asList(userContent, modelContent);

// Initialize the chat
ChatFutures chat = model.startChat(history);

// Create a new user message
Content.Builder messageBuilder = new Content.Builder();
messageBuilder.setRole("user");
messageBuilder.addText("How many paws are in my house?");

Content message = messageBuilder.build();

// Send the message
ListenableFuture<GenerateContentResponse> response = chat.sendMessage(message);
Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() {
    @Override
    public void onSuccess(GenerateContentResponse result) {
        String resultText = result.getText();
        System.out.println(resultText);
    }

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

Lihat dokumentasi Firebase untuk mengetahui detail selengkapnya.

Langkah berikutnya