Gemini Interactions Java SDK ব্যবহার করে মাল্টিমোডাল অ্যাপ এবং কাস্টম ম্যানেজড এজেন্ট তৈরি করুন

১. স্বাগতম, জেমিনি ডেভেলপার!

ডেভেলপার লার্নিংস স্কেচনোট

এই কোডল্যাবে, আপনি কাস্টম জেমিনি ইন্টারঅ্যাকশনস এসডিকে (Gemini Interactions SDK) ব্যবহার করে জাভাতে পরবর্তী প্রজন্মের এআই অ্যাপ্লিকেশন তৈরি করার পদ্ধতি শিখবেন।

জেমিনি ইন্টারঅ্যাকশনস এপিআই (Gemini Interactions API) বলতে কী বোঝায়?

প্রচলিত এলএলএম এপিআইগুলো স্টেটলেস এবং রিকোয়েস্ট-রেসপন্স চালিত। একটি মাল্টি-টার্ন চ্যাট অ্যাসিস্ট্যান্ট বা একটি জটিল এজেন্টিক লুপ তৈরি করতে, ডেভেলপারদের ঐতিহাসিকভাবে কথোপকথনের অবস্থা, হিস্ট্রি ট্রাঙ্কেশন, টুল কল অর্কেস্ট্রেশন এবং এক্সিকিউশন লুপ সম্পূর্ণরূপে ক্লায়েন্ট-সাইড অ্যাপ্লিকেশন কোডে পরিচালনা করতে হয়েছে।

জেমিনি ইন্টারঅ্যাকশনস এপিআই এই জটিলতা সার্ভারে স্থানান্তর করে। এটি একটি স্টেটফুল, সেশন-ভিত্তিক এপিআই, যেখানে গুগলের পরিকাঠামো কথোপকথনের গ্রাফটি হোস্ট ও পরিচালনা করে। একটি একক ইন্টারঅ্যাকশন একটি স্টেটফুল সেশনকে প্রতিনিধিত্ব করে। যখন আপনি এটির সাথে ইন্টারঅ্যাক্ট করেন, তখন এপিআইটি পলিমরফিক স্টেপস দ্বারা গঠিত একটি সমৃদ্ধ, কাঠামোগত টাইমলাইন ফেরত দেয় — যেমন:

  • ThoughtStep : মডেলের অভ্যন্তরীণ যুক্তি প্রক্রিয়া।
  • ModelOutputStep : মডেল দ্বারা তৈরি টেক্সট, অডিও বা ছবির বিষয়বস্তু।
  • ToolCallStep & ToolResultStep : সিস্টেম বা মডেল দ্বারা শুরু করা টুল আহ্বান।
  • UserInteractionStep : যে সকল পর্যায়ে সিস্টেম মানুষের মতামত বা অনুমোদনের জন্য থামে।

ম্যানেজড এজেন্ট বলতে কী বোঝায়?

স্বায়ত্তশাসিত এজেন্টদের পরিচালনা করা—যেমন লুপ, রিট্রাই লজিক, টুল এক্সিকিউশন এনভায়রনমেন্ট এবং স্টেট ম্যানেজমেন্ট সামলানো—অত্যন্ত কঠিন একটি কাজ।

ম্যানেজড এজেন্ট হলো জেমিনি ইন্টারঅ্যাকশনস এপিআই দ্বারা প্রদত্ত একটি প্ল্যাটফর্ম-স্তরের সমাধান। স্থানীয়ভাবে এজেন্ট লুপ চালানোর পরিবর্তে, আপনি সরাসরি গুগলের পরিকাঠামোতে বিশেষায়িত এজেন্ট স্থাপন করতে পারেন:

  • অন্তর্নির্মিত এজেন্ট : ব্যবহারের জন্য প্রস্তুত বিশেষায়িত এজেন্ট, যেমন ডিপ রিসার্চ এজেন্ট, যা বহু-ধাপের ওয়েব গবেষণা করে, প্রাপ্ত ফলাফল একত্রিত করে এবং বিশদ প্রতিবেদন তৈরি করে।
  • কাস্টম ম্যানেজড এজেন্ট : আপনার দ্বারা সংজ্ঞায়িত স্বায়ত্তশাসিত সত্তা। আপনি সিস্টেম নির্দেশাবলী প্রদান করেন, টুলস (যেমন গুগল সার্চ বা একটি ব্যাশ এক্সিকিউশন এনভায়রনমেন্ট) সংযুক্ত করেন এবং একটি ক্লাউড স্যান্ডবক্স কনফিগার করেন — যা একটি সুরক্ষিত, বিচ্ছিন্ন এবং কন্টেইনারাইজড রানটাইম এনভায়রনমেন্ট, যেখানে কাস্টমাইজযোগ্য নেটওয়ার্ক ইগ্রেস নিয়ম থাকে (যেমন শুধুমাত্র গিটহাবের মতো নির্দিষ্ট ডোমেইনে অ্যাক্সেসের অনুমতি দেওয়া)।

Gemini Interactions Java SDK ব্যবহার করে, আপনি সাধারণ জাভা অ্যাপ্লিকেশনগুলিতে এই পরিচালিত এজেন্টগুলির সাথে সহজেই বুটস্ট্র্যাপ, সমন্বয় এবং সহযোগিতা করতে পারেন।

আপনি যা শিখবেন

  • নতুন পলিমরফিক Step -ভিত্তিক আর্কিটেকচারটি কীভাবে ব্যবহার করবেন।
  • কীভাবে সরাসরি স্পিকারে অভিব্যক্তিপূর্ণ টিটিএস অডিও স্ট্রিম করবেন।
  • Lyria দিয়ে কীভাবে গান (MP3 + লিরিক্স) তৈরি করবেন
  • জেমিনি ৩ প্রো ইমেজ ব্যবহার করে কীভাবে ভিজ্যুয়াল স্কেচনোট তৈরি করবেন।
  • সহযোগিতামূলক পরিকল্পনা ব্যবহার করে কীভাবে ডিপ রিসার্চ এজেন্টকে পরিচালনা করা যায়।
  • নেটওয়ার্ক বহির্গমন নিয়ম ও সরঞ্জাম ব্যবহার করে কীভাবে একটি কাস্টম এজেন্ট প্রস্তুত করবেন।

আপনার যা যা লাগবে

  • জাভা ২১ বা উচ্চতর সংস্করণ।
  • অ্যাপাচি মেভেন।
  • একটি টেক্সট এডিটর বা আইডিই (যেমন ইন্টেলিজেন্ট আইডিয়া, ভিএস কোড ইত্যাদি)।
  • একটি জেমিনি এপিআই কী (গুগল এআই স্টুডিও থেকে)।

২. সেটআপ: প্রজেক্ট ও এপিআই কী

মেভেন প্রজেক্ট তৈরি করুন

নিম্নলিখিত কমান্ডটি ব্যবহার করে আপনার টার্মিনাল থেকে একটি নতুন Maven প্রজেক্ট বুটস্ট্র্যাপ করুন:

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

আপনার নতুন তৈরি করা প্রজেক্ট ডিরেক্টরিতে প্রবেশ করুন:

cd gemini-interactions-demo

আপনার pom.xml ফাইলটি খুলুন এবং এটি কনফিগার করুন:

  1. জাভা ২১ লক্ষ্য করে জাভা সংস্করণ বৈশিষ্ট্যগুলি আপডেট করুন:
    <properties>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
    </properties>
    
  2. SDK নির্ভরতা ভিতরে যোগ করুন ব্লক:
    <dependency>
        <groupId>io.github.glaforge</groupId>
        <artifactId>gemini-interactions-api-sdk</artifactId>
        <version>0.10.1</version>
    </dependency>
    

এপিআই কী কনফিগার করুন

Google AI Studio থেকে একটি Gemini API কী সংগ্রহ করুন।

আপনার টার্মিনালে কী-টি এনভায়রনমেন্ট ভেরিয়েবল হিসেবে সেট করুন:

ম্যাকওএস / লিনাক্স:

export GEMINI_API_KEY="your_actual_api_key"

উইন্ডোজ (কমান্ড প্রম্পট):

set GEMINI_API_KEY="your_actual_api_key"

৩. হ্যালো ওয়ার্ল্ড: স্টেপ আর্কিটেকচারে পথচলা

ইন্টারঅ্যাকশনস এপিআই একটি পলিমরফিক, ধাপ-ভিত্তিক টাইমলাইন আর্কিটেকচার চালু করেছে। আউটপুটের একটি ফ্ল্যাট তালিকা ফেরত দেওয়ার পরিবর্তে, এই এপিআই টাইপ করা Step অবজেক্টের একটি ক্রম ফেরত দেয় (যেমন, ModelOutputStep , ThoughtStep , FunctionCallStep )।

এই ধাপে, এই কাঠামো থেকে কীভাবে চূড়ান্ত মডেল আউটপুট বের করতে হয় তা বোঝার জন্য আপনি একটি সহজ ইন্টারঅ্যাকশন লিখবেন।

HelloInteractions.java তৈরি করুন

src/main/java/com/example/HelloInteractions.java ফাইলটি নিম্নলিখিত বিষয়বস্তু দিয়ে তৈরি করুন:

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)));
    }
}

কোডটি চালান

ক্লাসটি কম্পাইল এবং রান করুন:

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

৪. নিয়ন্ত্রণযোগ্য অডিও: অভিব্যক্তিপূর্ণ স্ট্রিমিং টিটিএস

জেমিনি ৩.১ ফ্ল্যাশ-এ নিয়ন্ত্রণযোগ্য টেক্সট-টু-স্পিচ (টিটিএস) চালু করা হয়েছে। আপনি প্রম্পট ব্যবহার করে কণ্ঠস্বরের গতি, সুর এবং পরিবেশ নিয়ন্ত্রণ করতে পারেন, এবং বাক্যের মাঝখানে আবেগসূচক ট্যাগ (যেমন [excitedly] বা [whispers] ) ব্যবহার করতে পারেন।

এই ধাপে, আপনি অভিব্যক্তিপূর্ণ অডিও তৈরি করবেন এবং তা সরাসরি আপনার স্পিকারগুলিতে স্ট্রিম করবেন।

StreamingDJ.java তৈরি করুন

src/main/java/com/example/StreamingDJ.java ফাইলটি নিম্নলিখিত বিষয়বস্তু দিয়ে তৈরি করুন:

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();
            }
        }
    }
}

কোডটি চালান

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

আউটপুটটি শুনুন

কোডটি রান করলে আপনি যা শুনবেন তার একটি অডিও উদাহরণ এখানে দেওয়া হলো (আবেগপূর্ণ ট্যাগসহ Algenib ভয়েস ব্যবহার করে):

তৈরি হওয়া TTS আউটপুট (tts_output.wav) শুনুন।

৫. লিরিয়া ৩-এর সাথে সঙ্গীত সৃষ্টি

DeepMind Lyria 3 মডেল ব্যবহার করে আপনি মিউজিক এবং জিঙ্গেল তৈরি করতে পারেন। দুটি রেসপন্স মোড ( AUDIO এবং TEXT ) অনুরোধ করার মাধ্যমে, আপনি তৈরি করা অডিও (MP3) এবং গানের লিরিক্স উভয়ই পেতে পারেন।

MusicGenerator.java তৈরি করুন

src/main/java/com/example/MusicGenerator.java ফাইলটি নিম্নলিখিত বিষয়বস্তু দিয়ে তৈরি করুন:

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();
                }
            });
    }
}

কোডটি চালান

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

তৈরি করা গানটি শুনুন

এখানে তৈরি হওয়া MP3 ফাইলটি ( coding_song.mp3 ) রয়েছে, যাতে গান ও কথা দুটোই আছে:

তৈরি করা সঙ্গীতটি (coding_song.mp3) শুনুন।

৬. স্কেচনোটস (ন্যানো ব্যানানা প্রো) দিয়ে দৃশ্যায়ন

জেমিনি ৩ প্রো ইমেজ (যা ন্যানো ব্যানানা প্রো নামেও পরিচিত) দিয়ে ছবি তৈরি করা যায়। IMAGE মোডালিটির অনুরোধ করে, আপনি টেক্সট ইনপুটের উপর ভিত্তি করে ইনফোগ্রাফিক, ডায়াগ্রাম বা স্কেচনোট তৈরি করতে পারেন।

এই ধাপে, আপনি ম্যানেজড এজেন্ট সম্পর্কিত একটি আর্টিকেলের স্কেচনোট সারাংশ তৈরি করবেন এবং এটিকে একটি PNG ফাইল হিসেবে সংরক্ষণ করবেন।

ImageGenerator.java তৈরি করুন

src/main/java/com/example/ImageGenerator.java ফাইলটি নিম্নলিখিত বিষয়বস্তু দিয়ে তৈরি করুন:

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();
                }
            });
    }
}

কোডটি চালান

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

তৈরি করা স্কেচনোট

এখানে মডেলের তৈরি করা স্কেচনোটটি ( sketchnote.png ) দেওয়া হলো:

তৈরি করা স্কেচনোট

৭. স্টিয়ারিং এজেন্ট: সহযোগিতামূলক গভীর গবেষণা

ডিপ রিসার্চ একটি শক্তিশালী এজেন্ট যা একাধিক ধাপের গবেষণামূলক কাজ সম্পাদন করতে পারে। তবে, এজেন্টটি ডেটা সংগ্রহ শুরু করার আগে, এটিকে তাৎক্ষণিকভাবে চালানোর পরিবর্তে আপনি কোলাবোরেটিভ প্ল্যানিং ব্যবহার করে গবেষণা পরিকল্পনাটি পর্যালোচনা, পরিবর্তন এবং পরিচালনা করতে পারেন।

আপনি এমন একটি মাল্টি-টার্ন কথোপকথন বাস্তবায়ন করবেন যা একটি পরিকল্পনাকে পরিমার্জন করার জন্য একই সার্ভার-সাইড স্টেট ( previousInteractionId ) ব্যবহার করে।

CollaborativeResearch.java তৈরি করুন

src/main/java/com/example/CollaborativeResearch.java ফাইলটি নিম্নলিখিত বিষয়বস্তু দিয়ে তৈরি করুন:

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()));
    }
}

কোডটি চালান

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

তৈরি করা রিপোর্ট আউটপুট

ডিপ রিসার্চ এজেন্ট একটি বিশদ ও সুসংগঠিত প্রতিবেদন তৈরি করবে। উদাহরণ রান দ্বারা তৈরি সম্পূর্ণ প্রতিবেদনটি আপনি এখানে দেখতে পারেন:

তৈরি করা গভীর গবেষণা প্রতিবেদনটি (tpu_history_report.md) দেখুন।

৮. কাস্টম এজেন্ট এবং ক্লাউড স্যান্ডবক্স

জটিল ডেভেলপার টাস্কের জন্য, আপনি কাস্টম এজেন্ট প্রোভিশন করতে পারেন। আপনি তাদের সিস্টেম নির্দেশাবলী নির্ধারণ করেন, তাদের বিভিন্ন টুলস (যেমন কোড এক্সিকিউশন/ব্যাশ) দিয়ে সজ্জিত করেন এবং তাদের রিমোট এনভায়রনমেন্ট (যেমন নেটওয়ার্ক ইগ্রেস রুলস) কনফিগার করেন।

এই ধাপে, আপনি এমন একটি এজেন্ট প্রস্তুত করবেন যার github.com এ সুরক্ষিত ইন্টারনেট সংযোগ থাকবে এবং তাকে তার ক্লাউড স্যান্ডবক্সের ভেতরে একটি রিপোজিটরি ক্লোন করে সেটির কনফিগারেশন ফাইলগুলো বিশ্লেষণ করার নির্দেশ দেবেন।

GitHubAnalyzer.java তৈরি করুন

src/main/java/com/example/GitHubAnalyzer.java ফাইলটি নিম্নলিখিত বিষয়বস্তু দিয়ে তৈরি করুন:

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

কোডটি চালান

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

উৎপন্ন বিশ্লেষণ আউটপুট

রিপোজিটরিটি ক্লোন করার পর কাস্টম এজেন্ট দ্বারা তৈরি সম্পূর্ণ আর্কিটেকচারাল অ্যানালাইসিস রিপোর্টটি আপনি এখানে দেখতে পারেন:

গিটহাব অ্যানালাইজার আউটপুট দেখুন (github_analysis_report.md)

৯. অভিনন্দন!

আপনি কোডল্যাবটি সম্পন্ন করেছেন এবং জেমিনি ইন্টারঅ্যাকশনস এসডিকে (Gemini Interactions SDK) ব্যবহার করে জাভাতে জটিল, মাল্টি-মোডাল এবং এজেন্টিক ওয়ার্কফ্লো তৈরি করার পদ্ধতি শিখেছেন।

আপনি যা অর্জন করেছেন:

  1. স্টেপ আর্কিটেকচারের ব্যবহার : স্ট্যান্ডার্ড মডেলগুলো কোয়েরি করার জন্য নতুন পলিমরফিক স্টেপ আর্কিটেকচার ব্যবহার করা হয়েছে।
  2. স্ট্রিমড এক্সপ্রেসিভ টিটিএস : রিয়েল-টাইমে অডিও স্ট্রিম করার জন্য ডিরেক্টর'স নোট এবং ইনলাইন ইমোশনাল ট্যাগ ব্যবহার করা হয়েছে।
  3. জেনারেটেড মিউজিক : লিরিয়া ৩ দিয়ে তৈরি এমপি৩ ট্র্যাক ও লিরিক্স।
  4. তৈরিকৃত স্কেচনোট : জেমিনি ৩ প্রো ইমেজ (ন্যানো ব্যানানা প্রো) ব্যবহার করে ভিজ্যুয়াল সারাংশ তৈরি করা হয়েছে।
  5. পরিচালিত গভীর গবেষণা : গবেষণা পরিকল্পনা পরিমার্জনের জন্য সহযোগিতামূলক পরিকল্পনা ব্যবহার করা হয়েছে।
  6. প্রোভিশনড কাস্টম এজেন্ট : কোড নিরাপদে চালানোর জন্য কাস্টম নেটওয়ার্ক বহির্গমন নিয়ন্ত্রণসহ স্যান্ডবক্সড পরিবেশ তৈরি করা হয়েছে।

আরও জানুন:

  • GitHub-এ SDK সোর্স কোড এবং আরও টেস্ট কেস দেখুন: glaforge/gemini-interactions-api-sdk
  • গিয়োমের ব্লগে এজেন্টিক ডিজাইন প্যাটার্ন সম্পর্কে আরও পড়ুন: glaforge.dev