Membangun Aplikasi Multimodal dan Agen Terkelola Kustom dengan Gemini Interactions Java SDK

1. Selamat datang, Developer Gemini!

Sketchnote Pembelajaran Developer

Dalam codelab ini, Anda akan mempelajari cara mem-build aplikasi AI generasi berikutnya di Java menggunakan Gemini Interactions SDK kustom.

Apa itu Gemini Interactions API?

LLM API tradisional bersifat tanpa status dan didorong oleh permintaan-respons. Untuk mem-build asisten chat multi-turn atau loop agen yang kompleks, developer secara historis harus mengelola status percakapan, pemotongan histori, orkestrasi panggilan alat, dan loop eksekusi sepenuhnya dalam kode aplikasi sisi klien.

Gemini Interactions API mengalihkan kompleksitas ini ke server. API ini adalah API berbasis sesi dan berstatus yang infrastruktur Google-nya menghosting dan mengelola grafik percakapan. Satu Interaksi mewakili sesi berstatus. Saat Anda berinteraksi dengannya, API akan menampilkan linimasa terstruktur yang kaya dan terdiri dari Langkah polimorfik—seperti:

  • ThoughtStep: Proses penalaran internal model.
  • ModelOutputStep: Konten teks, audio, atau gambar yang dihasilkan oleh model.
  • ToolCallStep &ToolResultStep: Pemanggilan alat yang dimulai oleh sistem atau model.
  • UserInteractionStep: Titik tempat sistem berhenti untuk meminta input atau persetujuan manusia.

Apa yang dimaksud dengan Agen Terkelola?

Mengorkestrasi agen otonom—menangani loop, logika coba lagi, lingkungan eksekusi alat, dan pengelolaan status—sangat sulit.

Agen Terkelola adalah solusi tingkat platform yang disediakan oleh Gemini Interactions API. Daripada menjalankan loop agen secara lokal, Anda dapat menyediakan agen khusus langsung di infrastruktur Google:

  • Agen Bawaan: Agen khusus siap pakai, seperti agen Deep Research, yang melakukan riset web multi-langkah, menggabungkan temuan, dan membuat laporan komprehensif.
  • Agen Terkelola Kustom: Entity otonom yang Anda tentukan. Anda memberikan petunjuk sistem, melampirkan alat (seperti Google Penelusuran atau lingkungan eksekusi Bash), dan mengonfigurasi Cloud Sandbox—lingkungan runtime yang aman, terisolasi, dan dikontainerisasi dengan aturan keluar jaringan yang dapat disesuaikan (misalnya, hanya mengizinkan akses ke domain tertentu seperti GitHub).

Dengan menggunakan Gemini Interactions Java SDK, Anda dapat dengan mudah melakukan bootstrap, mengoordinasikan, dan berkolaborasi dengan agen terkelola ini di aplikasi Java standar.

Yang akan Anda pelajari

  • Cara menjelajahi arsitektur berbasis Step polimorfik baru.
  • Cara melakukan streaming audio TTS ekspresif langsung ke speaker.
  • Cara membuat musik (MP3 + Lirik) dengan Lyria.
  • Cara membuat sketchnote visual dengan Gemini 3 Pro Image.
  • Cara mengarahkan agen Deep Research menggunakan Perencanaan Kolaboratif.
  • Cara menyediakan agen kustom dengan aturan dan alat keluar jaringan.

Yang akan Anda butuhkan

  • Java 21 atau yang lebih baru.
  • Apache Maven.
  • Editor teks atau IDE (IntelliJ IDEA, VS Code, dll.).
  • Kunci Gemini API (dari Google AI Studio).

2. Penyiapan: Project &Kunci API

Membuat Project Maven

Bootstrap project Maven baru dari terminal Anda menggunakan perintah berikut:

mvn archetype:generate \
    -DgroupId=com.example \
    -DartifactId=gemini-interactions-demo \
    -DarchetypeGroupId=org.apache.maven.archetypes \
    -DarchetypeArtifactId=maven-archetype-quickstart \
    -DarchetypeVersion=1.5 \
    -DinteractiveMode=false

Buka direktori project yang baru dibuat:

cd gemini-interactions-demo

Buka file pom.xml Anda dan konfigurasikan:

  1. Perbarui properti versi Java untuk menargetkan Java 21:
    <properties>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
    </properties>
    
  2. Tambahkan dependensi SDK di dalam blok :
    <dependency>
        <groupId>io.github.glaforge</groupId>
        <artifactId>gemini-interactions-api-sdk</artifactId>
        <version>0.10.1</version>
    </dependency>
    

Mengonfigurasi Kunci API

Dapatkan kunci Gemini API dari Google AI Studio.

Tetapkan kunci sebagai variabel lingkungan di terminal Anda:

macOS / Linux:

export GEMINI_API_KEY="your_actual_api_key"

Windows (Command Prompt):

set GEMINI_API_KEY="your_actual_api_key"

3. Halo Dunia: Menjelajahi Arsitektur Langkah

Interactions API memperkenalkan arsitektur linimasa berbasis langkah polimorfik. Daripada menampilkan daftar output datar, API akan menampilkan urutan objek Step yang diketik (misalnya, ModelOutputStep, ThoughtStep, FunctionCallStep).

Pada langkah ini, Anda akan menulis interaksi sederhana untuk memahami cara mengekstrak output model akhir dari struktur ini.

Membuat HelloInteractions.java

Buat file src/main/java/com/example/HelloInteractions.java dengan konten berikut:

package com.example;

import io.github.glaforge.gemini.interactions.GeminiInteractionsClient;
import io.github.glaforge.gemini.interactions.model.*;
import io.github.glaforge.gemini.interactions.model.InteractionParams.ModelInteractionParams;

public class HelloInteractions {
    public static void main(String[] args) {
        // 1. Initialize the client
        GeminiInteractionsClient client = GeminiInteractionsClient.builder()
            .apiKey(System.getenv("GEMINI_API_KEY"))
            .build();

        // 2. Build the request
        ModelInteractionParams request = ModelInteractionParams.builder()
            .model("gemini-3.5-flash")
            .input("Explain the difference between a library and a framework in one sentence.")
            .build();

        // 3. Send request
        Interaction response = client.create(request);
        
        // 4. Navigate the step-based architecture to get the output
        response.steps().stream()
            .filter(step -> step instanceof Step.ModelOutputStep)
            .map(step -> (Step.ModelOutputStep) step)
            .findFirst()
            .ifPresent(step -> System.out.println(step.content().get(0)));
    }
}

Menjalankan Kode

Kompilasi dan jalankan class:

mvn compile exec:java -Dexec.mainClass=com.example.HelloInteractions

4. Audio yang Dapat Diarahkan: Streaming TTS Ekspresif

Gemini 3.1 Flash memperkenalkan Text-to-Speech (TTS) yang dapat diarahkan. Anda dapat mengontrol kecepatan, nada, dan lingkungan suara menggunakan perintah, serta menggunakan tag emosional (seperti [excitedly] atau [whispers]) di tengah kalimat.

Pada langkah ini, Anda akan membuat audio ekspresif dan melakukan streaming langsung ke speaker.

Membuat StreamingDJ.java

Buat file src/main/java/com/example/StreamingDJ.java dengan konten berikut:

package com.example;

import io.github.glaforge.gemini.interactions.GeminiInteractionsClient;
import io.github.glaforge.gemini.interactions.model.*;
import io.github.glaforge.gemini.interactions.model.Config.SpeechConfig;
import io.github.glaforge.gemini.interactions.model.InteractionParams.ModelInteractionParams;
import javax.sound.sampled.*;
import java.util.Base64;
import java.util.stream.Stream;

public class StreamingDJ {
    public static void main(String[] args) throws Exception {
        GeminiInteractionsClient client = GeminiInteractionsClient.builder()
            .apiKey(System.getenv("GEMINI_API_KEY"))
            .build();

        // Prompt defining the voice profile and emotional tags
        String prompt = """
            # AUDIO PROFILE: Jaz R.
            ## THE SCENE: London Studio
            ### DIRECTOR'S NOTES
            Accent: Jaz is a DJ from Brixton, London.
            Style: Bouncy, energetic, high-speed delivery.
            
            #### TRANSCRIPT
            [excitedly] Yes, massive vibes in the studio! 
            [whispers] But keep it down, the boss is coming... 
            [shouting] Turn this up! Let's go!
            """;

        ModelInteractionParams request = ModelInteractionParams.builder()
            .model("gemini-3.1-flash-tts-preview")
            .input(prompt)
            .responseModalities(Interaction.Modality.AUDIO)
            .speechConfig(new SpeechConfig("Algenib", "en-GB"))
            .stream(true) // Enable streaming
            .build();

        System.out.println("Streaming audio from Gemini...");

        try (Stream<Events> eventStream = client.stream(request)) {
            // Configure the Java Audio System for 24kHz Mono 16-bit PCM
            AudioFormat format = new AudioFormat(24000, 16, 1, true, false);
            DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);

            try (SourceDataLine line = (SourceDataLine) AudioSystem.getLine(info)) {
                line.open(format);
                line.start();

                // Process the stream and play audio chunks as they arrive
                eventStream.forEach(event -> {
                    if (event instanceof Events.StepDelta cd && cd.delta() instanceof Events.AudioDelta audioDelta) {
                        byte[] audioData = Base64.getDecoder().decode(audioDelta.data());
                        line.write(audioData, 0, audioData.length);
                    }
                });
                line.drain();
            }
        }
    }
}

Menjalankan Kode

mvn compile exec:java -Dexec.mainClass=com.example.StreamingDJ

Mendengarkan Output

Berikut adalah contoh audio dari apa yang akan Anda dengar saat menjalankan kode (menggunakan suara Algenib dengan tag emosional):

Dengarkan output TTS yang dihasilkan (tts_output.wav)

5. Pembuatan Musik dengan Lyria 3

Dengan menggunakan model DeepMind Lyria 3, Anda dapat membuat musik dan jingle. Dengan meminta modalitas respons ganda (AUDIO dan TEXT), Anda dapat mengambil audio yang dihasilkan (MP3) dan lirik lagu.

Membuat MusicGenerator.java

Buat file src/main/java/com/example/MusicGenerator.java dengan konten berikut:

package com.example;

import io.github.glaforge.gemini.interactions.GeminiInteractionsClient;
import io.github.glaforge.gemini.interactions.model.*;
import io.github.glaforge.gemini.interactions.model.InteractionParams.ModelInteractionParams;
import io.github.glaforge.gemini.interactions.model.Content.AudioContent;
import java.nio.file.Files;
import java.nio.file.Paths;

public class MusicGenerator {
    public static void main(String[] args) throws Exception {
        GeminiInteractionsClient client = GeminiInteractionsClient.builder()
            .apiKey(System.getenv("GEMINI_API_KEY"))
            .build();

        ModelInteractionParams request = ModelInteractionParams.builder()
            .model("models/lyria-3-clip-preview") // 30-second clip
            .input("An uplifting rock song with acoustic guitars about coding in Java.")
            .responseModalities(
                Interaction.Modality.AUDIO,
                Interaction.Modality.TEXT) // Request both MP3 and Lyrics
            .build();

        System.out.println("Generating music (this might take a moment)...");
        Interaction response = client.create(request);

        // 1. Print the lyrics (TEXT output)
        System.out.println("\n--- Generated Lyrics ---");
        response.steps().stream()
            .filter(step -> step instanceof Step.ModelOutputStep)
            .flatMap(step -> ((Step.ModelOutputStep) step).content().stream())
            .filter(content -> content instanceof Content.TextContent)
            .forEach(content -> System.out.println(((Content.TextContent) content).text()));

        // 2. Save the MP3 (AUDIO output)
        response.steps().stream()
            .filter(step -> step instanceof Step.ModelOutputStep)
            .flatMap(step -> ((Step.ModelOutputStep) step).content().stream())
            .filter(content -> content instanceof AudioContent)
            .map(content -> (AudioContent) content)
            .findFirst()
            .ifPresent(audio -> {
                try {
                    Files.write(Paths.get("coding_song.mp3"), audio.data());
                    System.out.println("\nSuccess: Song saved to coding_song.mp3");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
    }
}

Menjalankan Kode

mvn compile exec:java -Dexec.mainClass=com.example.MusicGenerator

Mendengarkan Lagu yang Dihasilkan

Berikut adalah file MP3 yang dihasilkan (coding_song.mp3) yang berisi musik dan lirik:

Dengarkan lagu musik yang dihasilkan (coding_song.mp3)

6. Memvisualisasikan dengan Sketchnote (Nano Banana Pro)

Gemini 3 Pro Image (juga dikenal sebagai Nano Banana Pro) dapat membuat gambar. Dengan meminta modalitas IMAGE, Anda dapat membuat infografis, diagram, atau sketchnote berdasarkan input teks.

Pada langkah ini, Anda akan membuat ringkasan sketchnote dari artikel tentang Agen Terkelola dan menyimpannya sebagai file PNG.

Membuat ImageGenerator.java

Buat file src/main/java/com/example/ImageGenerator.java dengan konten berikut:

package com.example;

import io.github.glaforge.gemini.interactions.GeminiInteractionsClient;
import io.github.glaforge.gemini.interactions.model.*;
import io.github.glaforge.gemini.interactions.model.InteractionParams.ModelInteractionParams;
import io.github.glaforge.gemini.interactions.model.Content.ImageContent;
import java.nio.file.Files;
import java.nio.file.Paths;

public class ImageGenerator {
    public static void main(String[] args) throws Exception {
        GeminiInteractionsClient client = GeminiInteractionsClient.builder()
            .apiKey(System.getenv("GEMINI_API_KEY"))
            .build();

        String articleSummary = """
            Managed Agents in the Gemini API allow developers to run autonomous agents
            that reason, plan, use tools, and execute code inside isolated cloud sandboxes.
            The Gemini API handles the infrastructure (containers, network, runtime).
            It is powered by the Antigravity agent running on Gemini 3.5 Flash.
            The Java Interactions SDK supports these capabilities, utilizing a Step-based
            architecture to model the execution timeline.
            """;

        ModelInteractionParams request = ModelInteractionParams.builder()
            .model("gemini-3-pro-image-preview")
            .input(String.format("""
                Create a hand-drawn and hand-written sketchnote
                style summary infographic, with a pure white background,
                about the following information:
                
                %s
                """, articleSummary))
            .responseModalities(Interaction.Modality.IMAGE) // Request IMAGE modality
            .build();

        System.out.println("Generating sketchnote (this might take a moment)...");
        Interaction response = client.create(request);

        // Save the generated image
        response.steps().stream()
            .filter(step -> step instanceof Step.ModelOutputStep)
            .flatMap(step -> ((Step.ModelOutputStep) step).content().stream())
            .filter(content -> content instanceof ImageContent)
            .map(content -> (ImageContent) content)
            .findFirst()
            .ifPresent(image -> {
                try {
                    Files.write(Paths.get("sketchnote.png"), image.data());
                    System.out.println("Success: Sketchnote saved to sketchnote.png");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
    }
}

Menjalankan Kode

mvn compile exec:java -Dexec.mainClass=com.example.ImageGenerator

Sketchnote yang Dihasilkan

Berikut adalah sketchnote yang dihasilkan (sketchnote.png) yang dibuat oleh model:

Sketchnote yang Dibuat

7. Mengarahkan Agen: Riset Mendalam Kolaboratif

Deep Research adalah agen yang canggih dan dapat menjalankan tugas riset multi-langkah. Namun, alih-alih langsung menjalankan, Anda dapat menggunakan Perencanaan Kolaboratif untuk meninjau, mengubah, dan mengarahkan rencana riset sebelum agen mulai mengumpulkan data.

Anda akan menerapkan percakapan multi-turn yang menggunakan status sisi server yang sama (previousInteractionId) untuk menyempurnakan rencana.

Membuat CollaborativeResearch.java

Buat file src/main/java/com/example/CollaborativeResearch.java dengan konten berikut:

package com.example;

import io.github.glaforge.gemini.interactions.GeminiInteractionsClient;
import io.github.glaforge.gemini.interactions.model.*;
import io.github.glaforge.gemini.interactions.model.InteractionParams.AgentInteractionParams;
import io.github.glaforge.gemini.interactions.model.Config.DeepResearchAgentConfig;
import io.github.glaforge.gemini.interactions.model.Config.ThinkingSummaries;
import io.github.glaforge.gemini.interactions.model.Config.Visualization;

public class CollaborativeResearch {
    public static void main(String[] args) throws Exception {
        GeminiInteractionsClient client = GeminiInteractionsClient.builder()
            .apiKey(System.getenv("GEMINI_API_KEY"))
            .build();

        String agentModel = "deep-research-preview-04-2026";

        // --- Phase 1: Request a Plan ---
        System.out.println("Phase 1: Requesting research plan...");
        AgentInteractionParams planParams = AgentInteractionParams.builder()
            .agent(agentModel)
            .input("Research the latest generations of Google Cloud TPUs (TPU7x and the 8th generation TPU 8t and TPU 8i).")
            .agentConfig(new DeepResearchAgentConfig(
                "deep-research", 
                ThinkingSummaries.AUTO, 
                Visualization.AUTO, 
                true // TRUE enables collaborative planning
            ))
            .background(true)
            .store(true)
            .build();

        Interaction planInteraction = client.create(planParams);
        planInteraction = waitForCompletion(client, planInteraction.id());
        
        System.out.println("\n--- Proposed Plan ---");
        printOutputText(planInteraction);

        // --- Phase 2: Refine the Plan ---
        System.out.println("\nPhase 2: Refining research plan...");
        AgentInteractionParams refineParams = AgentInteractionParams.builder()
            .agent(agentModel)
            .input("Focus on comparing the architectural, performance, and scaling differences between the TPU7x generation and the two flavors of the eighth generation: TPU 8t (optimized for training at scale) and TPU 8i (optimized for low-latency reasoning and inference).")
            .agentConfig(new DeepResearchAgentConfig(
                "deep-research", 
                ThinkingSummaries.AUTO, 
                Visualization.AUTO, 
                true // Keep collaborative planning TRUE to iterate
            ))
            .previousInteractionId(planInteraction.id()) // Resume session
            .background(true)
            .store(true)
            .build();

        Interaction refinedInteraction = client.create(refineParams);
        refinedInteraction = waitForCompletion(client, refinedInteraction.id());

        System.out.println("\n--- Refined Plan ---");
        printOutputText(refinedInteraction);

        // --- Phase 3: Approve and Execute ---
        System.out.println("\nPhase 3: Approving plan and starting deep research (this will take a few minutes)...");
        AgentInteractionParams executeParams = AgentInteractionParams.builder()
            .agent(agentModel)
            .input("Plan looks good, execute!")
            .agentConfig(new DeepResearchAgentConfig(
                "deep-research", 
                ThinkingSummaries.AUTO, 
                Visualization.AUTO, 
                false // FALSE approves the plan and executes the research
            ))
            .previousInteractionId(refinedInteraction.id()) // Resume session
            .background(true)
            .store(true)
            .build();

        Interaction finalReport = client.create(executeParams);
        finalReport = waitForCompletion(client, finalReport.id());

        System.out.println("\n--- Final Research Report ---");
        printOutputText(finalReport);
    }

    private static Interaction waitForCompletion(GeminiInteractionsClient client, String id) throws Exception {
        Interaction interaction = client.get(id);
        while (interaction.status() != Interaction.Status.COMPLETED && interaction.status() != Interaction.Status.FAILED) {
            Thread.sleep(5000);
            interaction = client.get(id);
        }
        if (interaction.status() == Interaction.Status.FAILED) {
            throw new RuntimeException("Interaction failed. Status: " + interaction.status());
        }
        return interaction;
    }

    private static void printOutputText(Interaction interaction) {
        interaction.steps().stream()
            .filter(step -> step instanceof Step.ModelOutputStep)
            .flatMap(step -> ((Step.ModelOutputStep) step).content().stream())
            .filter(content -> content instanceof Content.TextContent)
            .forEach(content -> System.out.println(((Content.TextContent) content).text()));
    }
}

Menjalankan Kode

mvn compile exec:java -Dexec.mainClass=com.example.CollaborativeResearch

Output Laporan yang Dihasilkan

Agen Deep Research akan menghasilkan laporan terstruktur yang komprehensif. Anda dapat melihat laporan lengkap yang dihasilkan oleh contoh yang dijalankan di sini:

Lihat Laporan Deep Research yang Dihasilkan (tpu_history_report.md)

8. Agen Kustom &Sandbox Cloud

Untuk tugas developer yang kompleks, Anda dapat menyediakan Agen Kustom. Anda menentukan petunjuk sistemnya, melengkapinya dengan alat (seperti Eksekusi Kode/Bash), dan mengonfigurasi lingkungan jarak jauhnya (seperti aturan keluar jaringan).

Pada langkah ini, Anda akan menyediakan agen yang memiliki akses internet yang aman ke github.com dan menginstruksikannya untuk meng-clone repositori dan menganalisis file konfigurasinya di dalam sandbox cloud.

Membuat GitHubAnalyzer.java

Buat file src/main/java/com/example/GitHubAnalyzer.java dengan konten berikut:

package com.example;

import io.github.glaforge.gemini.interactions.GeminiInteractionsClient;
import io.github.glaforge.gemini.interactions.model.*;
import io.github.glaforge.gemini.interactions.model.InteractionParams.AgentInteractionParams;
import java.util.List;

public class GitHubAnalyzer {
    public static void main(String[] args) throws Exception {
        GeminiInteractionsClient client = GeminiInteractionsClient.builder()
            .apiKey(System.getenv("GEMINI_API_KEY"))
            .build();

        String agentId = "github-analyzer-codelab";

        // 1. Define the Custom Agent with Network Egress and Tools
        Agent customAgent = Agent.builder()
            .id(agentId)
            .description("Clones and analyzes GitHub repos.")
            .baseAgent("antigravity-preview-05-2026")
            .baseEnvironment(new EnvironmentConfig(
                new EnvironmentNetworkEgressAllowlist(List.of(
                    new AllowlistEntry("github.com") // Allow git clone over HTTPS
                )),
                List.of()
            ))
            .systemInstruction("You are an architect. Clone the repo, inspect files, and write a summary.")
            .tools(List.of(
                new AgentTool.CodeExecution(), // Enables terminal bash execution in sandbox
                new AgentTool.GoogleSearch()
            ))
            .build();

        // 2. Provision the Agent
        System.out.println("Provisioning custom agent in the cloud...");
        client.createAgent(customAgent);

        try {
            // 3. Start the Interaction
            AgentInteractionParams params = AgentInteractionParams.builder()
                .agent(agentId)
                .input("Clone https://github.com/glaforge/gemini-interactions-api-sdk and explain its pom.xml structure.")
                .environment("remote") // Crucial: Run in cloud sandbox
                .build();

            System.out.println("Starting clone and analysis (polling status)...");
            Interaction interaction = client.create(params);

            // 4. Poll for completion
            while (interaction.status() != Interaction.Status.COMPLETED) {
                System.out.println("Agent working... Status: " + interaction.status());
                Thread.sleep(5000);
                interaction = client.get(interaction.id());
            }

            // 5. Output the results
            System.out.println("\n--- Architectural Analysis ---");
            interaction.steps().stream()
                .filter(step -> step instanceof Step.ModelOutputStep)
                .flatMap(step -> ((Step.ModelOutputStep) step).content().stream())
                .filter(content -> content instanceof Content.TextContent)
                .forEach(content -> System.out.println(((Content.TextContent) content).text()));

        } finally {
            // 6. Clean up resources
            client.deleteAgent(agentId);
            System.out.println("\nCustom agent resource deleted from cloud.");
        }
    }
}

Menjalankan Kode

mvn compile exec:java -Dexec.mainClass=com.example.GitHubAnalyzer

Output Analisis yang Dihasilkan

Anda dapat melihat laporan analisis arsitektur lengkap yang dihasilkan oleh agen kustom setelah meng-clone repositori di sini:

Lihat Output GitHub Analyzer (github_analysis_report.md)

9. Selamat!

Anda telah menyelesaikan codelab dan mempelajari cara mem-build alur kerja yang kompleks, multi-modal, dan agen di Java menggunakan Gemini Interactions SDK.

Yang telah Anda capai:

  1. Menjelajahi Arsitektur Langkah: Menggunakan arsitektur langkah polimorfik baru untuk membuat kueri model standar.
  2. Streaming TTS Ekspresif: Menggunakan Catatan Sutradara dan tag emosional inline untuk melakukan streaming audio secara real time.
  3. Membuat Musik: Membuat lagu dan lirik MP3 dengan Lyria 3.
  4. Membuat Sketchnote: Membuat ringkasan visual menggunakan Gemini 3 Pro Image (Nano Banana Pro).
  5. Mengarahkan Deep Research: Menggunakan Perencanaan Kolaboratif untuk menyempurnakan rencana riset.
  6. Menyediakan Agen Kustom: Membuat lingkungan sandbox dengan kontrol keluar jaringan kustom untuk menjalankan kode dengan aman.

Pelajari Lebih Lanjut: