জাভার জন্য এজেন্ট ডেভেলপমেন্ট কিট (ADK) দিয়ে এআই এজেন্ট তৈরি করুন, জাভার জন্য এজেন্ট ডেভেলপমেন্ট কিট (ADK) দিয়ে এআই এজেন্ট তৈরি করুন, জাভার জন্য এজেন্ট ডেভেলপমেন্ট কিট (ADK) দিয়ে এআই এজেন্ট তৈরি করুন

১. স্বাগতম, এআই এজেন্ট ডেভেলপারগণ!

এই কোডল্যাবে, আপনি জাভার জন্য এজেন্টস ডেভেলপমেন্ট কিট (ADK) ব্যবহার করে জাভাতে AI এজেন্ট তৈরি করতে শিখবেন। আমরা সহজ লার্জ ল্যাঙ্গুয়েজ মডেল (LLM) API কলের বাইরে গিয়ে স্বায়ত্তশাসিত AI এজেন্ট তৈরি করব যারা যুক্তি, পরিকল্পনা, সরঞ্জাম ব্যবহার এবং জটিল সমস্যা সমাধানের জন্য একসাথে কাজ করতে পারে।

আপনি গুগল ক্লাউড ক্রেডিট রিডিম করে শুরু করবেন, আপনার গুগল ক্লাউড পরিবেশ সেট আপ করবেন, তারপর আপনার প্রথম সহজ এজেন্ট তৈরি করবেন এবং ধীরে ধীরে কাস্টম টুলস, ওয়েব অনুসন্ধান এবং মাল্টি-এজেন্ট অর্কেস্ট্রেশনের মতো আরও উন্নত ক্ষমতা যুক্ত করবেন।

629b7f6b771833f4.png সম্পর্কে

তুমি কি শিখবে

  • কিভাবে একটি মৌলিক, ব্যক্তিত্ব-চালিত AI এজেন্ট তৈরি করবেন।
  • কাস্টম এবং বিল্ট-ইন টুল (যেমন গুগল সার্চ) ব্যবহার করে এজেন্টদের কীভাবে ক্ষমতায়ন করা যায়।
  • জাভাতে বাস্তবায়িত আপনার নিজস্ব সরঞ্জামগুলি কীভাবে যুক্ত করবেন।
  • একাধিক এজেন্টকে শক্তিশালী ক্রমিক, সমান্তরাল এবং লুপিং ওয়ার্কফ্লোতে কীভাবে সাজানো যায়।

তোমার যা লাগবে

  • একটি ওয়েব ব্রাউজার যা আমরা ইনকগনিটো মোডে ব্যবহার করব।
  • একটি ব্যক্তিগত জিমেইল অ্যাকাউন্ট।
  • আপনার ব্যক্তিগত জিমেইল অ্যাকাউন্টের সাথে যুক্ত একটি নতুন গুগল ক্লাউড প্রকল্প।
  • রিডিম করা গুগল ক্লাউড ক্রেডিট দিয়ে তৈরি একটি বিলিং অ্যাকাউন্ট।
  • সোর্স কোড পরীক্ষা করার জন্য git কমান্ড-লাইন টুল।
  • জাভা ১৭+ এবং অ্যাপাচি ম্যাভেন।
  • একটি টেক্সট এডিটর বা IDE, যেমন IntelliJ IDEA অথবা VS Code।

গুগল ক্লাউড কনসোলে ক্লাউড শেলের অন্তর্নির্মিত ভিএস কোড সম্পাদক ব্যবহার করা সম্ভব।

2. সেটআপ: আপনার পরিবেশ

কর্মশালার জন্য গুগল ক্লাউড ক্রেডিট দাবি করা

492905b93ced4f9d.png সম্পর্কে

প্রশিক্ষক-নেতৃত্বাধীন কর্মশালার জন্য, আপনি ওয়েবসাইটের একটি লিঙ্ক পাবেন যেখানে আপনি কর্মশালার জন্য গুগল ক্লাউড ক্রেডিট দাবি করতে পারবেন।

  • একটি ব্যক্তিগত গুগল অ্যাকাউন্ট ব্যবহার করুন : কর্পোরেট বা স্কুলের ইমেল ঠিকানা কাজ করবে না বলে একটি ব্যক্তিগত গুগল অ্যাকাউন্ট (যেমন একটি gmail.com ঠিকানা) ব্যবহার করা গুরুত্বপূর্ণ।
  • ছদ্মবেশী মোডে গুগল ক্রোম ব্যবহার করুন : একটি পরিষ্কার সেশন তৈরি করতে এবং অন্যান্য গুগল অ্যাকাউন্টের সাথে দ্বন্দ্ব রোধ করতে এটি সুপারিশ করা হয়।
  • বিশেষ ইভেন্ট লিঙ্কটি ব্যবহার করুন : ইভেন্টের জন্য একটি বিশেষ লিঙ্ক, যা দেখতে https://trygcp.dev/event/xxx এর মতো, তারপরে একটি ইভেন্ট কোড (এই উদাহরণে "xxx") ব্যবহার করা উচিত।
  • পরিষেবার শর্তাবলী গ্রহণ করুন : সাইন ইন করার পরে, আপনাকে Google ক্লাউড প্ল্যাটফর্ম পরিষেবার শর্তাবলী উপস্থাপন করা হবে, যা চালিয়ে যাওয়ার জন্য আপনাকে গ্রহণ করতে হবে।
  • একটি নতুন প্রকল্প তৈরি করুন : গুগল ক্লাউড কনসোল থেকে একটি নতুন খালি প্রকল্প তৈরি করতে হবে।
  • একটি বিলিং অ্যাকাউন্ট লিঙ্ক করুন : নতুন তৈরি প্রকল্পটি একটি বিলিং অ্যাকাউন্টের সাথে লিঙ্ক করুন।
  • ক্রেডিট নিশ্চিত করুন : নিচের ভিডিওটিতে দেখানো হয়েছে যে বিলিং পৃষ্ঠার "ক্রেডিট" বিভাগটি পরীক্ষা করে কীভাবে ক্রেডিট প্রকল্পে প্রয়োগ করা হয়েছে তা নিশ্চিত করতে হয়।

ক্রেডিটগুলি কীভাবে রিডিম করবেন এবং প্রয়োগ করবেন তা ব্যাখ্যা করে এই ভিডিওটি দেখতে দ্বিধা করবেন না।

আপনার API কী তৈরি এবং কনফিগার করুন

এই কোডল্যাবের জন্য জেমিনি এপিআই দিয়ে আপনার ADK এআই এজেন্টদের প্রমাণীকরণ করতে, আপনাকে আপনার গুগল ক্লাউড প্রকল্পের সাথে সম্পর্কিত একটি এপিআই কী ব্যবহার করতে হবে।

  1. একটি API কী তৈরি করুন:
  • গুগল এআই স্টুডিওতে যান এবং বাম পাশের প্যানেলের নীচে "গেট এপিআই কী" লিঙ্কে ক্লিক করুন।
  • Projects নির্বাচন করুন এবং তারপর Import projects বোতামে ক্লিক করুন।
  • আপনি যে গুগল ক্লাউড প্রজেক্টটি আমদানি করতে চান তা অনুসন্ধান করুন এবং নির্বাচন করুন , তারপর আমদানি বোতামটি নির্বাচন করুন।
  • একবার প্রকল্পটি আমদানি করা হয়ে গেলে, ড্যাশবোর্ড মেনু থেকে API কী পৃষ্ঠায় যান এবং আপনার আমদানি করা প্রকল্পে একটি API কী তৈরি করুন।
  • API কীটি নোট করুন
  1. পরিবেশ পরিবর্তনশীল সেট করুন: আপনার এজেন্টকে এই কীটি অ্যাক্সেস করতে হবে। স্ট্যান্ডার্ড উপায় হল GOOGLE_API_KEY নামে একটি পরিবেশ পরিবর্তনশীল সেট করা।
  • macOS / Linux: আপনার টার্মিনাল খুলুন এবং নিম্নলিখিত কমান্ডটি চালান, "your-api-key" আপনার কপি করা কী দিয়ে প্রতিস্থাপন করুন। এটি স্থায়ী করতে, আপনার শেলের স্টার্টআপ ফাইলে এই লাইনটি যোগ করুন (যেমন, ~/.bash_profile , ~/.zshrc )।
export GOOGLE_API_KEY="your-api-key"
  • উইন্ডোজ (কমান্ড প্রম্পট): একটি নতুন কমান্ড প্রম্পট খুলুন এবং চালান:
setx GOOGLE_API_KEY "your-api-key"
  • এই পরিবর্তনটি কার্যকর করার জন্য আপনাকে আপনার কমান্ড প্রম্পট পুনরায় চালু করতে হবে।
  • উইন্ডোজ (পাওয়ারশেল): একটি পাওয়ারশেল টার্মিনাল খুলুন এবং চালান:
$env:GOOGLE_API_KEY="your-api-key"
  • PowerShell-এ এই পরিবর্তনটি স্থায়ী করতে, আপনাকে এটি আপনার প্রোফাইল স্ক্রিপ্টে যোগ করতে হবে।

৩. শুরু করা: আপনার প্রথম এজেন্ট

fa0ade01371411a1.png সম্পর্কে

নতুন প্রকল্প শুরু করার সর্বোত্তম উপায় হল জাভার জন্য ADK GitHub টেমপ্লেট ব্যবহার করা। এটি প্রকল্পের কাঠামো এবং সমস্ত প্রয়োজনীয় নির্ভরতা প্রদান করে।

যদি আপনার একটি Github অ্যাকাউন্ট থাকে, তাহলে আপনি নিম্নলিখিতগুলি করতে পারেন: Use this template > Create a new repository , তারপর git clone কমান্ড ব্যবহার করে স্থানীয়ভাবে কোডটি চেকআউট করুন।

এখানে টেমপ্লেটটি ব্যবহারের জন্য উপরের ডানদিকের মেনু দেখানো একটি স্ক্রিনশট রয়েছে।

59e72cf609c13c7c.png সম্পর্কে

অন্য পদ্ধতিটি হল সরাসরি সেই সংগ্রহস্থলটি ক্লোন করা, এর সাহায্যে:

git clone https://github.com/glaforge/adk-java-maven-template.git

তারপর adk-java-maven-templatecd

জাভাতে আপনার প্রথম এআই এজেন্ট কোডিং শুরু করার জন্য আপনি প্রস্তুত কিনা তা পরীক্ষা করার জন্য, নিশ্চিত করুন যে আপনি এই প্রকল্পের কোডটি কম্পাইল করতে পারেন:

mvn compile

কোড ধাপ: একজন বন্ধুত্বপূর্ণ বিজ্ঞান শিক্ষক এজেন্ট

ADK-এর মৌলিক ভিত্তি হল LlmAgent ক্লাস। এটিকে একটি নির্দিষ্ট ব্যক্তিত্ব এবং লক্ষ্য সহ একটি AI হিসেবে ভাবুন, যা একটি বৃহৎ ভাষা মডেল দ্বারা চালিত। আমরা পরবর্তীতে সরঞ্জামগুলির মাধ্যমে আরও ক্ষমতা যুক্ত করব এবং অন্যান্য অনুরূপ এজেন্টদের সাথে হাতে হাত মিলিয়ে সহযোগিতা করে এটিকে আরও শক্তিশালী করব।

com.example.agent প্যাকেজে একটি নতুন জাভা ক্লাস তৈরি করা যাক, এবং এটিকে ScienceTeacher বলি।

এটি হল এজেন্ট তৈরির "হ্যালো, ওয়ার্ল্ড!"। আমরা একজন বিজ্ঞান শিক্ষকের ব্যক্তিত্ব দিয়ে একটি সাধারণ এজেন্টকে সংজ্ঞায়িত করছি।

// src/main/java/com/example/agent/ScienceTeacher.java
package com.example.agent;

import com.google.adk.agents.LlmAgent;
import com.google.adk.web.AdkWebServer;

public class ScienceTeacher {
    public static void main(String[] args) {
        AdkWebServer.start(
            LlmAgent.builder()
                .name("science-teacher")
                .description("A friendly science teacher")
                .instruction("""
                    You are a science teacher for teenagers.
                    You explain science concepts in a simple, concise and direct way.
                    """)
                .model("gemini-2.5-flash")
                .build()
        );
    }
}

AI এজেন্টটি LlmAgent.builder() পদ্ধতির মাধ্যমে কনফিগার করা হয়। name() , description() , এবং model() প্যারামিটারগুলি বাধ্যতামূলক, এবং আপনার এজেন্টকে একটি নির্দিষ্ট ব্যক্তিত্ব এবং সঠিক আচরণ দেওয়ার জন্য, আপনাকে সর্বদা instruction() পদ্ধতির মাধ্যমে বিস্তারিত নির্দেশিকা প্রদান করা উচিত।

এখানে আমরা জেমিনি ২.৫ ফ্ল্যাশ মডেলটি ব্যবহার করার সিদ্ধান্ত নিয়েছি, তবে আরও জটিল কাজের জন্য জেমিনি ২.৫ প্রোও ব্যবহার করে দেখতে দ্বিধা করবেন না।

এই এজেন্টটি AdkWebServer.start() পদ্ধতির মধ্যে মোড়ানো। এটি তথাকথিত ADK Dev UI চ্যাট ইন্টারফেস। এটি আপনাকে একটি সাধারণ চ্যাট ইন্টারফেসের মাধ্যমে এজেন্টের সাথে কথোপকথন করতে দেয়। তদুপরি, আপনি যদি গোপনে কী ঘটছে তা বুঝতে চান, যেমন সিস্টেমের মধ্য দিয়ে প্রবাহিত সমস্ত ইভেন্ট, LLM-এ পাঠানো অনুরোধ এবং প্রতিক্রিয়াগুলি বুঝতে চান তবে এটি অনেক সাহায্য করে।

এই এজেন্টটি স্থানীয়ভাবে কম্পাইল এবং রান করতে, নিম্নলিখিত কমান্ডটি চালান:

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

তারপর আপনার ব্রাউজারে http://localhost:8080 এ যান। নীচের স্ক্রিনশটে দেখানো UI দেখতে পাবেন। এগিয়ে যান এবং আপনার এজেন্টকে বিজ্ঞান সম্পর্কিত প্রশ্ন জিজ্ঞাসা করুন।

6ff1cc994bf640bd.png সম্পর্কে

৪. সরঞ্জামের সাহায্যে এজেন্টদের ক্ষমতায়ন করা

94fc3dfedbfa313c.png সম্পর্কে

এজেন্টদের কেন টুলের প্রয়োজন? LLM গুলো শক্তিশালী, কিন্তু তাদের জ্ঞান সময়ের সাথে সাথে জমে যায় এবং তারা বাইরের জগতের সাথে যোগাযোগ করতে পারে না। টুল হলো সেতু। এগুলো একজন এজেন্টকে রিয়েল-টাইম তথ্য (যেমন স্টকের দাম বা খবর) অ্যাক্সেস করতে, ব্যক্তিগত API গুলি জিজ্ঞাসা করতে, অথবা জাভাতে কোড করা যেকোনো কাজ সম্পাদন করতে সাহায্য করে।

কোড ধাপ: একটি কাস্টম টুল তৈরি করা ( StockTicker )

এখানে, আমরা আমাদের এজেন্টকে স্টকের দাম দেখার জন্য একটি টুল দিই। এজেন্ট যুক্তি দেয় যে যখন কোনও ব্যবহারকারী দাম জিজ্ঞাসা করে, তখন তার উচিত আমাদের জাভা পদ্ধতিটি কল করা।

// src/main/java/com/example/agent/StockTicker.java
package com.example.agent;

import com.google.adk.agents.LlmAgent;
import com.google.adk.tools.Annotations.Schema;
import com.google.adk.tools.FunctionTool;
import com.google.adk.web.AdkWebServer;
import java.util.Map;

public class StockTicker {
    public static void main(String[] args) {
        AdkWebServer.start(
            LlmAgent.builder()
                .name("stock_agent")
                .instruction("""
                    You are a stock exchange ticker expert.
                    When asked about the stock price of a company,
                    use the `lookup_stock_ticker` tool to find the information.
                    """)
                .model("gemini-2.5-flash")
                .tools(FunctionTool.create(StockTicker.class, "lookupStockTicker"))
                .build()
        );
    }

    @Schema(
        name = "lookup_stock_ticker",
        description = "Lookup stock price for a given company or ticker"
    )
    public static Map<String, String> lookupStockTicker(
        @Schema(name = "company_name_or_stock_ticker", description = "The company name or stock ticker")
        String ticker) {
        // ... (logic to return a stock price)
    }
}

এজেন্টদের আরও স্মার্ট করে তুলতে এবং তাদের বিশ্বের সাথে (অথবা আপনার নিজস্ব কোড, API, পরিষেবা ইত্যাদির সাথে) ইন্টারঅ্যাক্ট করার ক্ষমতা দিতে, আপনি এজেন্টকে tools() পদ্ধতির মাধ্যমে টুলস, এবং বিশেষ করে কাস্টম কোড টুলস ব্যবহার করার জন্য কনফিগার করতে পারেন, এটিকে FunctionTool.create(...) পাস করে।

FunctionTool জন্য একটি ক্লাস এবং একটি মেথডের নাম প্রয়োজন যা আপনার নিজস্ব স্ট্যাটিক মেথডের দিকে নির্দেশ করে — একটি ক্লাসের একটি ইনস্ট্যান্স এবং সেই অবজেক্টের একটি ইনস্ট্যান্স মেথডের নামও পাস করা সম্ভব।

@Schema টীকা ব্যবহার করে পদ্ধতির name এবং description এবং এর পরামিতি উভয়ই উল্লেখ করা গুরুত্বপূর্ণ, কারণ এই তথ্য অন্তর্নিহিত LLM দ্বারা কখন এবং কীভাবে একটি নির্দিষ্ট পদ্ধতি কল করা উচিত তা নির্ধারণ করতে ব্যবহার করা হবে।

সমানভাবে গুরুত্বপূর্ণ, LLM-কে টুলটি কীভাবে এবং কখন ব্যবহার করতে হবে সে সম্পর্কে স্পষ্ট নির্দেশাবলী দিয়ে সাহায্য করা ভালো। মডেলটি নিজে থেকেই এটি বের করতে সক্ষম হতে পারে, কিন্তু আপনি যদি instruction() পদ্ধতিতে স্পষ্ট ব্যাখ্যা দেন, তাহলে আপনার ফাংশনটি যথাযথভাবে কল হওয়ার সম্ভাবনা বেশি।

এই পদ্ধতিতে একটি Map ফেরত দেওয়া উচিত। সাধারণত, ধারণাটি হল একটি মানচিত্র ফেরত দেওয়া যায় যেখানে ফলাফল প্রতিনিধিত্বকারী একটি কী থাকে, যেমন stock_price , এবং এর সাথে স্টকের মূল্যের মান সংযুক্ত করা হয়। অবশেষে, আপনি অপারেশনের সাফল্যের সংকেত দেওয়ার জন্য একটি অতিরিক্ত সাফল্য / সত্য কী জোড়া যোগ করতে পারেন। এবং ত্রুটির ক্ষেত্রে, আপনার একটি মানচিত্র ফেরত দেওয়া উচিত, উদাহরণস্বরূপ, error নামক একটি কী সহ, এবং ত্রুটি বার্তাটি সংশ্লিষ্ট মানের সাথে সংযুক্ত করা উচিত। এটি LLM কে বুঝতে সাহায্য করে যে কোনও কারণে কলটি সফল হয়েছে নাকি ব্যর্থ হয়েছে।

  • সফল হলে, ফেরত দিন: {"stock_price": 123}
  • ত্রুটি হলে, ফিরে যান: {"error": "Impossible to retrieve stock price for XYZ"}

তারপর নিম্নলিখিত কমান্ড দিয়ে এই ক্লাসটি চালান:

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

৫. হালনাগাদ তথ্যের জন্য গুগল সার্চের ক্ষমতা

551964bb78b5a987.png সম্পর্কে

জাভার জন্য ADK-তে বেশ কিছু শক্তিশালী টুল রয়েছে, যার মধ্যে রয়েছে GoogleSearchTool । এই টুলের সাহায্যে, আপনার এজেন্ট তার লক্ষ্যে পৌঁছানোর জন্য প্রাসঙ্গিক তথ্য খুঁজে পেতে Google Search ব্যবহারের অনুরোধ করতে পারে।

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

আসুন এই সহজ সংবাদ অনুসন্ধান এজেন্টটি একবার দেখে নেওয়া যাক:

// src/main/java/com/example/agent/LatestNews.java
package com.example.agent;

import java.time.LocalDate;
import com.google.adk.agents.LlmAgent;
import com.google.adk.tools.GoogleSearchTool;
import com.google.adk.web.AdkWebServer;

public class LatestNews {
    public static void main(String[] args) {
        AdkWebServer.start(LlmAgent.builder()
            .name("news-search-agent")
            .description("A news search agent")
            .instruction("""
                You are a news search agent.
                Use the `google_search` tool
                when asked to search for recent events and information.
                Today is \
                """ + LocalDate.now())
            .model("gemini-2.5-flash")
            .tools(new GoogleSearchTool())
            .build());
    }
}

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

তারপর নিম্নলিখিত কমান্ড দিয়ে এই ক্লাসটি চালান:

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

প্রম্পটটি নিয়ে দ্বিধা করবেন না, স্টাইল, সংক্ষিপ্ততা, বা ফোকাস ইত্যাদির ক্ষেত্রে বিভিন্ন ফলাফলের জন্য জিজ্ঞাসা করুন।

কোড ধাপ: একটি টুল হিসেবে অনুসন্ধান এজেন্ট

GoogleSearchTool সরাসরি কোনও এজেন্টের কাছে টুল হিসেবে পাঠানোর পরিবর্তে, আপনি একটি ডেডিকেটেড সার্চ এজেন্ট তৈরি করতে পারেন যা সার্চের কার্যকারিতাকে ধারণ করে এবং সেই এজেন্টকে একটি উচ্চ-স্তরের এজেন্টের কাছে একটি টুল হিসেবে প্রকাশ করে।

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

// src/main/java/com/example/agent/SearchAgentAsTool.java
package com.example.agent;

import java.time.LocalDate;

import com.google.adk.agents.LlmAgent;
import com.google.adk.tools.AgentTool;
import com.google.adk.tools.GoogleSearchTool;
import com.google.adk.web.AdkWebServer;

public class SearchAgentAsTool {
    public static void main(String[] args) {
        // 1. Define the specialized Search Agent
        LlmAgent searchAgent = LlmAgent.builder()
            .name("news-search-agent-tool")
            .description("Searches for recent events and provides a concise summary.")
            .instruction("""
                You are a concise information retrieval specialist.
                Use the `google_search` tool to find information.
                Always provide the answer as a short,
                direct summary, without commentary.
                Today is \
                """ + LocalDate.now())
            .model("gemini-2.5-flash")
            .tools(new GoogleSearchTool()) // This agent uses the Google Search Tool
            .build();

        // 2. Wrap the Search Agent as a Tool
        AgentTool searchTool = AgentTool.create(searchAgent);

        // 3. Define the Main Agent that uses the Search Agent Tool
        AdkWebServer.start(LlmAgent.builder()
            .name("main-researcher")
            .description("Main agent for answering complex, up-to-date questions.")
            .instruction("""
                You are a sophisticated research assistant.
                When the user asks a question that requires up-to-date or external information,
                you MUST use the `news-search-agent-tool` to get the facts before answering.
                After the tool returns the result, synthesize the final answer for the user.
                """)
            .model("gemini-2.5-flash")
            .tools(searchTool) // This agent uses the Search Agent as a tool
            .build()
       );
    }
}

AgentTool.create(searchAgent) লাইনটি এখানে মূল ধারণা। এটি সম্পূর্ণ searchAgent (তার নিজস্ব অভ্যন্তরীণ লজিক, প্রম্পট এবং টুল সহ) কে mainAgent এর জন্য একটি একক কলযোগ্য টুল হিসেবে নিবন্ধিত করে। এটি মডুলারালিটি এবং পুনঃব্যবহারযোগ্যতা বৃদ্ধি করে।

নিম্নলিখিত কমান্ড দিয়ে এই ক্লাসটি চালান:

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

সাধারণ প্রশ্নের জন্য, এজেন্ট তার নিজস্ব জ্ঞানের ভিত্তি থেকে উত্তর দেবে, কিন্তু সাম্প্রতিক ঘটনা সম্পর্কে জিজ্ঞাসা করা হলে, এটি গুগল অনুসন্ধান সরঞ্জাম ব্যবহার করে বিশেষায়িত অনুসন্ধান এজেন্টের কাছে অনুসন্ধানের দায়িত্ব অর্পণ করবে।

৬. এজেন্টিক কর্মপ্রবাহ আয়ত্ত করা

জটিল সমস্যার জন্য, একটি একক এজেন্ট যথেষ্ট নয়। যখন এমন একটি লক্ষ্য দেওয়া হয় যেখানে অনেকগুলি উপ-কাজ থাকে, খুব বেশি বিশদ ব্যাখ্যা সহ একটি বিশাল প্রম্পট সহ, অথবা বিপুল সংখ্যক ফাংশনে অ্যাক্সেসের সুবিধা সহ, LLM গুলিকে লড়াই করতে হয় এবং তাদের কর্মক্ষমতা এবং নির্ভুলতা হ্রাস পায়।

একাধিক বিশেষায়িত এজেন্টদের সমন্বয়ে বিভক্ত করা এবং জয় করাই মূল চাবিকাঠি। সৌভাগ্যবশত, ADK বিভিন্ন অন্তর্নির্মিত বিশেষায়িত এজেন্ট নিয়ে আসে:

  • subAgent() সহ সাধারণ এজেন্ট, যার কাজগুলি অর্পণ করা হয়,
  • SequentialAgent , একটি ক্রমানুসারে কাজগুলি করার জন্য,
  • ParallelAgent , সমান্তরালে এজেন্ট চালানোর জন্য,
  • LoopAgent , সাধারণত যতবার প্রয়োজন ততবার পরিশোধন প্রক্রিয়ার মধ্য দিয়ে যাওয়ার জন্য।

প্রতিটি কর্মপ্রবাহের মূল ব্যবহারের ধরণগুলি এবং সুবিধা এবং অসুবিধাগুলি কী কী, দয়া করে নীচের টেবিলটি দেখুন। তবে জেনে রাখুন যে আসল শক্তি আসলে তাদের বেশ কয়েকটির সংমিশ্রণ থেকে আসবে!

কর্মপ্রবাহ

ADK ক্লাস

ব্যবহারের ধরণ

ভালো দিক

কনস

সাব-এজেন্ট

LlmAgent

ব্যবহারকারী-চালিত, নমনীয় কাজ যেখানে পরবর্তী পদক্ষেপ সবসময় জানা থাকে না।

উচ্চ নমনীয়তা, কথোপকথনমূলক, ব্যবহারকারী-মুখী বটগুলির জন্য দুর্দান্ত।

কম অনুমানযোগ্য, প্রবাহ নিয়ন্ত্রণের জন্য LLM যুক্তির উপর নির্ভর করে।

ক্রমিক

SequentialAgent

স্থির, বহু-পদক্ষেপ প্রক্রিয়া যেখানে শৃঙ্খলা অত্যন্ত গুরুত্বপূর্ণ।

অনুমানযোগ্য, নির্ভরযোগ্য, ডিবাগ করা সহজ, অর্ডারের নিশ্চয়তা দেয়।

অনমনীয়, যদি কাজগুলিকে সমান্তরাল করা যায় তবে ধীর হতে পারে।

সমান্তরাল

ParallelAgent

একাধিক উৎস থেকে তথ্য সংগ্রহ করা অথবা স্বাধীনভাবে কাজ পরিচালনা করা।

অত্যন্ত দক্ষ, I/O-বাউন্ড কাজের জন্য বিলম্ব উল্লেখযোগ্যভাবে হ্রাস করে।

সমস্ত কাজ চলে; কোনও শর্ট-সার্কিট নেই। নির্ভরতাযুক্ত কাজের জন্য কম উপযুক্ত।

লুপ

LoopAgent

পুনরাবৃত্তিমূলক পরিমার্জন, স্ব-সংশোধন, অথবা এমন প্রক্রিয়া যা একটি শর্ত পূরণ না হওয়া পর্যন্ত পুনরাবৃত্তি হয়।

জটিল সমস্যা সমাধানের জন্য শক্তিশালী, এজেন্টদের তাদের নিজস্ব কাজ উন্নত করতে সক্ষম করে।

সাবধানে ডিজাইন না করলে অসীম লুপ তৈরি হতে পারে (সর্বদা maxIterations ব্যবহার করুন!)।

৭. এজেন্টিক কর্মপ্রবাহ — সাব-এজেন্টদের সাথে প্রতিনিধিদল

90497ab15401bfc8.png সম্পর্কে

একজন সুপারভাইজার এজেন্ট সাব-এজেন্টদের কাছে নির্দিষ্ট কাজ অর্পণ করতে পারেন। উদাহরণস্বরূপ, কল্পনা করুন যে একটি ই-কমার্স ওয়েবসাইটের এজেন্ট একজন এজেন্টকে অর্ডার সম্পর্কিত প্রশ্নগুলি অর্পণ করবে ("আমার অর্ডারের অবস্থা কী?") এবং বিক্রয়োত্তর পরিষেবার প্রশ্নগুলি অন্য এজেন্টকে ("আমি জানি না এটি কীভাবে চালু করব!")। এটি হল সেই ব্যবহারের উদাহরণ যা আমরা আলোচনা করতে যাচ্ছি।

// src/main/java/com/example/agent/SupportAgent.java
package com.example.agent;

import com.google.adk.agents.LlmAgent;
import com.google.adk.web.AdkWebServer;

public class SupportAgent {
    public static void main(String[] args) {
        LlmAgent orderAgent = LlmAgent.builder()
            .name("order-agent")
            .description("Order agent")
            .instruction("""
                Your role is to help our customers
                with all the questions they may have about their orders.
                Always respond that the order has been received, prepared,
                and is now out for delivery.
                """)
            .model("gemini-2.5-flash")
            .build();

        LlmAgent afterSaleAgent = LlmAgent.builder()
            .name("after-sale-agent")
            .description("After sale agent")
            .instruction("""
                You are an after sale agent,
                helping customers with the product they received.
                When a customer has a problem,
                suggest the person to switch the product off and on again.
                """)
            .model("gemini-2.5-flash")
            .build();

        AdkWebServer.start(LlmAgent.builder()
            .name("support-agent")
            .description("Customer support agent")
            .instruction("""
                Your role is to help our customers.
                Call the `order-agent` for all questions related to order status.
                Call the `after-sale-agent` for inquiries about the received product.
                """)
            .model("gemini-2.5-flash")
            .subAgents(afterSaleAgent, orderAgent)
            .build()
        );
    }
}

এখানে মূল লাইনটি হল যেখানে subAgents() পদ্ধতিটি ডাকা হয়, দুটি সাব-এজেন্টকে অন্তর্ভুক্ত করে যাদের নির্দিষ্ট ভূমিকা একে অপরের দ্বারা পৃথকভাবে পরিচালিত হবে।

উপরের উদাহরণটি নিম্নলিখিত কমান্ড দিয়ে চালান:

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

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

৮. এজেন্টিক ওয়ার্কফ্লো — অ্যাসেম্বলি লাইন

9075ee47f70e0d51.png সম্পর্কে

যখন অপারেশনের ক্রম গুরুত্বপূর্ণ, তখন একটি SequentialAgent ব্যবহার করুন। এটি একটি অ্যাসেম্বলি লাইনের মতো, একটি নির্দিষ্ট ক্রমে সাব-এজেন্টগুলি সম্পাদন করে যেখানে প্রতিটি ধাপ পূর্ববর্তীটির উপর নির্ভর করতে পারে।

কল্পনা করা যাক একজন ইংরেজ কবি একজন ইংরেজী-ফরাসি অনুবাদকের সাথে সহযোগিতা করে প্রথমে ইংরেজিতে কবিতা রচনা করেন এবং তারপর ফরাসি ভাষায় অনুবাদ করেন:

// src/main/java/com/example/agent/PoetAndTranslator.java
package com.example.agent;

import com.google.adk.agents.LlmAgent;
import com.google.adk.agents.SequentialAgent;
import com.google.adk.web.AdkWebServer;

public class PoetAndTranslator {
    public static void main(String[] args) {
        LlmAgent poet = LlmAgent.builder()
            .name("poet-agent")
            .description("Poet writing poems")
            .model("gemini-2.5-flash")
            .instruction("""
                You are a talented poet,
                who writes short and beautiful poems.
                """)
            .outputKey("poem")
            .build();

        LlmAgent translator = LlmAgent.builder()
            .name("translator-agent")
            .description("English to French translator")
            .model("gemini-2.5-flash")
            .instruction("""
                As an expert English-French translator,
                your role is to translate the following poem into French,
                ensuring the poem still rhymes even after translation:

                {poem}
                """)
            .outputKey("translated-poem")
            .build();

        AdkWebServer.start(SequentialAgent.builder()
            .name("poet-and-translator")
            .subAgents(poet, translator)
            .build());
    }
}

ইংরেজিতে একটি কবিতা পেতে উদাহরণটি চালান, তারপর ফরাসি ভাষায় অনুবাদ করুন, নিম্নলিখিত কমান্ড ব্যবহার করে:

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

জটিল কাজগুলিকে ছোট, সুবিন্যস্ত উপ-কাজে রূপান্তরিত করার এই পদ্ধতিগত বিভাজন একটি আরও নির্ধারক এবং নির্ভরযোগ্য প্রক্রিয়া নিশ্চিত করে, যা একটি একক, বিস্তৃত উদ্দেশ্যপ্রণোদিত এজেন্টের উপর নির্ভর করার তুলনায় সফল ফলাফলের সম্ভাবনা উল্লেখযোগ্যভাবে বৃদ্ধি করে।

একটি কাজকে কার্যকরভাবে উপ-কাজের ক্রমানুসারে বিভক্ত করা (যখন সম্ভব এবং যখন এটি অর্থবহ হয়) আরও নির্ধারক এবং সফল ফলাফল অর্জনের জন্য অত্যন্ত গুরুত্বপূর্ণ, কারণ এটি ধাপগুলির মধ্যে কাঠামোগত অগ্রগতি এবং নির্ভরতা ব্যবস্থাপনার সুযোগ করে দেয়।

৯. এজেন্টিক কর্মপ্রবাহ — সমান্তরালে কাজ করা

8971b81128aee9fc.png সম্পর্কে

যখন কাজগুলি স্বাধীন হয়, তখন একটি ParallelAgent একই সাথে চালানোর মাধ্যমে একটি বিশাল দক্ষতা বৃদ্ধি করে। নিম্নলিখিত উদাহরণে, আমরা এমনকি একটি SequentialAgent এবং একটি ParallelAgent একত্রিত করব: সমান্তরাল কাজগুলি প্রথমে সঞ্চালিত হয়, এবং তারপরে একটি চূড়ান্ত এজেন্ট সমান্তরাল কাজের ফলাফলের সারসংক্ষেপ করে।

আসুন আমরা এমন একটি কোম্পানি গোয়েন্দা তৈরি করি যার কাজ হবে নিম্নলিখিত বিষয়গুলির তথ্য অনুসন্ধান করা:

  • কোম্পানির প্রোফাইল (সিইও, সদর দপ্তর, নীতিবাক্য, ইত্যাদি)
  • কোম্পানি সম্পর্কে সর্বশেষ খবর।
  • কোম্পানির আর্থিক অবস্থা সম্পর্কে বিস্তারিত তথ্য।
// src/main/java/com/example/agent/CompanyDetective.java 
package com.example.agent;

import com.google.adk.agents.LlmAgent;
import com.google.adk.agents.ParallelAgent;
import com.google.adk.agents.SequentialAgent;
import com.google.adk.tools.GoogleSearchTool;
import com.google.adk.web.AdkWebServer;

public class CompanyDetective {
    public static void main(String[] args) {
        var companyProfiler = LlmAgent.builder()
            .name("company-profiler")
            .description("Provides a general overview of a company.")
            .instruction("""
                Your role is to provide a brief overview of the given company.
                Include its mission, headquarters, and current CEO.
                Use the Google Search Tool to find this information.
                """)
            .model("gemini-2.5-flash")
            .tools(new GoogleSearchTool())
            .outputKey("profile")
            .build();

        var newsFinder = LlmAgent.builder()
            .name("news-finder")
            .description("Finds the latest news about a company.")
            .instruction("""
                Your role is to find the top 3-4 recent news headlines for the given company.
                Use the Google Search Tool.
                Present the results as a simple bulleted list.
                """)
            .model("gemini-2.5-flash")
            .tools(new GoogleSearchTool())
            .outputKey("news")
            .build();

        var financialAnalyst = LlmAgent.builder()
            .name("financial-analyst")
            .description("Analyzes the financial performance of a company.")
            .instruction("""
                Your role is to provide a snapshot of the given company's recent financial performance.
                Focus on stock trends or recent earnings reports.
                Use the Google Search Tool.
                """)
            .model("gemini-2.5-flash")
            .tools(new GoogleSearchTool())
            .outputKey("financials")
            .build();

        var marketResearcher = ParallelAgent.builder()
            .name("market-researcher")
            .description("Performs comprehensive market research on a company.")
            .subAgents(
                companyProfiler,
                newsFinder,
                financialAnalyst
            )
            .build();

        var reportCompiler = LlmAgent.builder()
            .name("report-compiler")
            .description("Compiles a final market research report.")
            .instruction("""
                Your role is to synthesize the provided information into a coherent market research report.
                Combine the company profile, latest news, and financial analysis into a single, well-formatted report.

                ## Company Profile
                {profile}

                ## Latest News
                {news}

                ## Financial Snapshot
                {financials}
                """)
            .model("gemini-2.5-flash")
            .build();

        AdkWebServer.start(SequentialAgent.builder()
            .name("company-detective")
            .description("Collects various information about a company.")
            .subAgents(
                marketResearcher,
                reportCompiler
            ).build());
    }
}

যথারীতি, আপনি নিম্নলিখিত কমান্ড দিয়ে এজেন্টটি চালাতে পারেন:

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

এই এজেন্টটি তথ্য গবেষণা এবং সংশ্লেষণের সমান্তরালকরণের মাধ্যমে কার্যকরভাবে সমান্তরাল এবং ক্রমিক উভয় এজেন্টের মাধ্যমে কার্যকরভাবে কর্মপ্রবাহের একটি শক্তিশালী সমন্বয় প্রদর্শন করে।

১০. এজেন্টিক ওয়ার্কফ্লো — পুনরাবৃত্তিমূলক পরিশোধন

1e5b5df3fd45f698.png সম্পর্কে

"জেনারেট → রিভিউ → রিফাইন" চক্রের প্রয়োজন এমন কাজের জন্য, LoopAgent ব্যবহার করুন। এটি লক্ষ্য পূরণ না হওয়া পর্যন্ত পুনরাবৃত্ত উন্নতি স্বয়ংক্রিয় করে। SequentialAgent এর মতোই, LoopAgent ধারাবাহিকভাবে সাব-এজেন্টকে কল করবে, কিন্তু এটি শুরুতেই লুপ ব্যাক করবে। এজেন্ট দ্বারা অভ্যন্তরীণভাবে ব্যবহৃত LLMই সিদ্ধান্ত নেবে যে লুপের এক্সিকিউশন বন্ধ করার জন্য একটি বিশেষ টুল, exit_loop বিল্ট-ইন টুল, এ কলের অনুরোধ করা হবে কিনা।

নিচের কোড রিফাইনার উদাহরণটি, LoopAgent ব্যবহার করে, কোড রিফাইনিং স্বয়ংক্রিয় করে: generate, review, correct। এটি মানব বিকাশের অনুকরণ করে। একটি কোড জেনারেটর প্রথমে অনুরোধ করা কোড তৈরি করে, generated_code কী-এর অধীনে এজেন্ট অবস্থায় সংরক্ষণ করে। তারপর একজন কোড রিভিউয়ার জেনারেট করা কোডটি পর্যালোচনা করে, এবং হয় প্রতিক্রিয়া প্রদান করে ( feedback কী-এর অধীনে), অথবা পুনরাবৃত্তিটি তাড়াতাড়ি শেষ করার জন্য একটি এক্সিট লুপ টুল কল করে।

আসুন কোডটি একবার দেখে নেওয়া যাক:

// src/main/java/com/example/agent/CodeRefiner.java
package com.example.agent;

import com.google.adk.agents.LlmAgent;
import com.google.adk.agents.LoopAgent;
import com.google.adk.agents.SequentialAgent;
import com.google.adk.tools.ExitLoopTool;
import com.google.adk.web.AdkWebServer;

public class CodeRefiner {
    public static void main(String[] args) {
        var codeGenerator = LlmAgent.builder()
            .name("code-generator")
            .description("Writes and refines code based on a request and feedback.")
            .instruction("""
                Your role is to write a Python function based on the user's request.
                In the first turn, write the initial version of the code.
                In subsequent turns, you will receive feedback on your code.
                Your task is to refine the code based on this feedback.

                Previous feedback (if any):
                {feedback?}
                """)
            .model("gemini-2.5-flash")
            .outputKey("generated_code")
            .build();

        var codeReviewer = LlmAgent.builder()
            .name("code-reviewer")
            .description("Reviews code and decides if it's complete or needs more work.")
            .instruction("""
                Your role is to act as a senior code reviewer.
                Analyze the provided Python code for correctness, style, and potential bugs.

                Code to review:
                {generated_code}

                If the code is perfect and meets the user's request,
                you MUST call the `exit_loop` tool.

                Otherwise, provide constructive feedback for the `code-generator to improve the code.
                """)
            .model("gemini-2.5-flash")
            .outputKey("feedback")
            .tools(ExitLoopTool.INSTANCE)
            .build();

        var codeRefinerLoop = LoopAgent.builder()
            .name("code-refiner-loop")
            .description("Iteratively generates and reviews code until it is correct.")
            .subAgents(
                codeGenerator,
                codeReviewer
            )
            .maxIterations(3) // Safety net to prevent infinite loops
            .build();

        var finalPresenter = LlmAgent.builder()
            .name("final-presenter")
            .description("Presents the final, accepted code to the user.")
            .instruction("""
                The code has been successfully generated and reviewed.
                Present the final version of the code to the user in a clear format.

                Final Code:
                {generated_code}
                """)
            .model("gemini-2.5-flash")
            .build();

        AdkWebServer.start(SequentialAgent.builder()
            .name("code-refiner-assistant")
            .description("Manages the full code generation and refinement process.")
            .subAgents(
                codeRefinerLoop,
                finalPresenter)
            .build());
    }
}

নিম্নলিখিত কমান্ড দিয়ে এই এজেন্টটি চালান:

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

LoopAgent ব্যবহার করে বাস্তবায়িত প্রতিক্রিয়া/পরিমার্জন লুপগুলি পুনরাবৃত্তিমূলক উন্নতি এবং স্ব-সংশোধনের প্রয়োজন এমন সমস্যা সমাধানের জন্য অপরিহার্য, যা মানুষের জ্ঞানীয় প্রক্রিয়াগুলিকে ঘনিষ্ঠভাবে অনুকরণ করে। এই নকশা প্যাটার্নটি বিশেষ করে এমন কাজের জন্য কার্যকর যেখানে প্রাথমিক আউটপুট খুব কমই নিখুঁত হয়, যেমন কোড জেনারেশন, সৃজনশীল লেখা, নকশা পুনরাবৃত্তি, বা জটিল ডেটা বিশ্লেষণ। কাঠামোগত প্রতিক্রিয়া প্রদানকারী একটি বিশেষায়িত পর্যালোচক এজেন্টের মাধ্যমে আউটপুট সাইকেল চালিয়ে, জেনারেটিং এজেন্ট একটি পূর্বনির্ধারিত সমাপ্তির মানদণ্ড পূরণ না হওয়া পর্যন্ত তার কাজকে ক্রমাগত পরিমার্জন করতে পারে, যার ফলে একক-পাস পদ্ধতির তুলনায় উচ্চমানের এবং আরও নির্ভরযোগ্য চূড়ান্ত ফলাফল পাওয়া যায়।

১১. অভিনন্দন!

আপনি সহজ কথোপকথনকারী থেকে শুরু করে জটিল, বহু-এজেন্ট সিস্টেম পর্যন্ত বিভিন্ন ধরণের AI এজেন্ট সফলভাবে তৈরি এবং অন্বেষণ করেছেন। আপনি জাভার জন্য ADK-এর মূল ধারণাগুলি শিখেছেন: নির্দেশাবলীর মাধ্যমে এজেন্টদের সংজ্ঞায়িত করা, সরঞ্জামগুলির মাধ্যমে তাদের ক্ষমতায়ন করা এবং শক্তিশালী কর্মপ্রবাহে তাদের পরিচালনা করা।

এরপর কী?

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