ADK-এর মাধ্যমে AI এজেন্ট তৈরি করা: এজেন্ট ওয়ার্কফ্লো অর্কেস্ট্রেট করা

১. এক নজরে

একাধিক শর্ত সহ ভ্রমণের অনুরোধ (যেমন, $১০০-এর মধ্যে ঐতিহাসিক মন্দির এবং স্থানীয় খাবারের উপর ফোকাস করে কিয়োটোর সারাদিনের ভ্রমণসূচী ডিজাইন করা, যেখানে কোনও আধুনিক আর্ট গ্যালারি থাকবে না) পূরণ করার জন্য শর্তগুলি বের করা, একই সাথে আকর্ষণ এবং ডাইনিং নিয়ে রিসার্চ করা, একটি আইটেমাইজড শিডিউল তৈরি করা এবং চূড়ান্ত প্ল্যান অডিট করা প্রয়োজন। অনেক টুল সহ একটি মাত্র মনোলিথিক এজেন্টের উপর নির্ভর করলে যাচাইকরণের ধাপগুলি এড়িয়ে যেতে পারে বা এক্সক্লুশন লঙ্ঘন করতে পারে, তাই অর্কেস্ট্রেশন নির্ধারক ওয়ার্কফ্লো কন্ট্রোলারের মাধ্যমে বিশেষ সাব-এজেন্টদের কোঅর্ডিনেট করে।

ADK-এর মাধ্যমে AI এজেন্ট তৈরি করা সিরিজের এই তৃতীয় ভাগে, আপনি Agent Development Kit (ADK) 2 ওয়ার্কফ্লো কন্ট্রোলার (SequentialAgent, ParallelAgent এবং LoopAgent) ব্যবহার করে Agent Platform-এ একটি স্বয়ংসম্পূর্ণ মাল্টি-এজেন্ট ট্রাভেল প্ল্যানার তৈরি করবেন। তিনটি প্রগ্রেসিভ স্টেজে (পার্ট ১ বা পার্ট ২ ওয়ার্কস্পেস সেট-আপের প্রয়োজন নেই), আপনি শেয়ার করা সেশন স্টেট (output_key), একই সাথে google_search এক্সিকিউশন এবং একটি ইটারেটিভ মেকার-চেকার রিফাইনমেন্ট লুপের মাধ্যমে gemini-3.8-flash দ্বারা পরিচালিত ছয়টি স্পেশালিস্ট এজেন্টকে কোঅর্ডিনেট করবেন।

পূর্বশর্ত

আপনি কী শিখবেন

  • কীভাবে একদম শুরু থেকে মাল্টি-এজেন্ট ADK 2 প্রোজেক্ট স্ক্যাফোল্ড করা যায়
  • output_key ব্যবহার করে সেশন স্টেট শেয়ার করে এমন বিশেষ এজেন্টের টিম কীভাবে ডিজাইন করবেন
  • একটি নির্ধারক, ধাপে ধাপে পাইপলাইনে সাব-এজেন্টদের কার্যকর করতে কীভাবে SequentialAgent ব্যবহার করবেন
  • কম লেটেন্সির জন্য একই সাথে ইন্ডিপেন্ডেন্ট রিসার্চ এজেন্ট চালাতে কীভাবে ParallelAgent ব্যবহার করবেন
  • একটি পুনরাবৃত্তিমূলক মেকার-চেকার রিফাইনমেন্ট লুপ বাস্তবায়নের জন্য কীভাবে LoopAgent এবং ToolContext এসকেলেশন ব্যবহার করবেন
  • কীভাবে সিকোয়েন্সিয়াল, প্যারালাল ও লুপ প্যাটার্নকে একটি হায়ারার্কিকাল মাল্টি-এজেন্ট ওয়ার্কফ্লোতে একত্রিত করা যায়

আপনার যা প্রয়োজন

  • Google অ্যাকাউন্ট (ওয়ার্কশপ ক্রেডিট দাবি করলে ব্যক্তিগত @gmail.com অ্যাকাউন্ট ব্যবহার করুন)
  • আপনার ইনস্ট্রাক্টরের থেকে পাওয়া ওয়ার্কশপ ক্রেডিট লিঙ্ক (সাথে QR কোড স্ক্যান করার জন্য ফোনের ক্যামেরা) অথবা একটি অ্যাক্টিভ Cloud Billing অ্যাকাউন্ট
  • Google Chrome (ব্যক্তিগত ও অফিসের অ্যাকাউন্ট যাতে মিশে না যায়, তার জন্য ছদ্মবেশী উইন্ডো ব্যবহার করার সাজেশন দেওয়া হয়)

২. Google Cloud ক্রেডিট দাবি করুন (ঐচ্ছিক)

আপনি যদি ইভেন্ট ক্রেডিট লিঙ্ক সহ কোনও ওয়ার্কশপে যোগ দেন, তাহলে ক্রেডিট কার্ড ছাড়াই বিলিং অ্যাকাউন্ট প্রোভিশন করতে আপনার Google Developer Program ক্রেডিট দাবি করুন।

আপনার ইভেন্ট ক্রেডিট দাবি করুন

  1. ছদ্মবেশী উইন্ডোতে ওয়ার্কশপ ক্রেডিট লিঙ্ক খুলুন এবং আপনার @gmail.com অ্যাকাউন্ট দিয়ে সাইন-ইন করুন।
  2. আপনার সুবিধা দাবি করুন বিকল্পে গিয়ে ক্রেডিট দাবি করুন বিকল্পে ক্লিক করুন:

Google Builders Hub-এর 'আপনার সুবিধা দাবি করুন' কার্ডে 'ক্রেডিট দাবি করুন' বোতাম দেখানো হচ্ছে

  1. Google Developer Program প্রোফাইল তৈরি করার জন্য প্রম্পট করা হলে, ফর্মটি পূরণ করুন।
  2. আপনি যে মানুষ তা যাচাই করতে স্ক্যান করুন বিকল্পটি দেখা গেলে, আপনার ফোন দিয়ে QR কোড স্ক্যান করুন এবং যাচাইকরণ সম্পূর্ণ করুন (QR কোড দেখা না গেলে, রিফ্রেশ করে আবার ক্রেডিট দাবি করুন বিকল্পে ক্লিক করুন):

Google Developer Program-এ আপনি যে মানুষ (বট নন) তা যাচাই করাতে QR কোড স্ক্যান করার ডায়ালগ

  1. আপনার ইভেন্ট ক্রেডিট দাবি করা হয়েছে! মেসেজটি দেখতে পাবেন, তারপর বিলিং অ্যাকাউন্ট খুলুন বিকল্পে ক্লিক করুন:

Google Builders Hub-এ 'আপনার ইভেন্ট ক্রেডিট দাবি করা হয়েছে' এবং 'বিলিং অ্যাকাউন্ট খুলুন' বোতাম দেখানো হচ্ছে

🔍 আপনার কাজ চেক করুন

বিলিং অ্যাকাউন্ট সেট-আপ করতে সর্বাধিক ৩ মিনিট সময় লাগে:

  1. Google Cloud Billing খুলুন (অথবা URL কপি করে আপনার ছদ্মবেশী উইন্ডোতে পেস্ট করুন) এবং আপনার বিলিং অ্যাকাউন্ট বেছে নিন:
https://console.cloud.google.com/billing
  1. আপনার GDP Credit অ্যাকাউন্টে স্ট্যাটাস অ্যাক্টিভ না দেখানো পর্যন্ত রিফ্রেশ করুন:

Google Cloud বিলিং অ্যাকাউন্ট ম্যানেজমেন্টে একটি অ্যাক্টিভ GDP ক্রেডিট বিলিং অ্যাকাউন্ট দেখানো হচ্ছে

৩. Google Cloud প্রোজেক্ট তৈরি করা (ঐচ্ছিক)

একটি ডেডিকেটেড Google Cloud প্রোজেক্ট তৈরি করুন যাতে এই কোডল্যাবের সব রিসোর্স আলাদা থাকে এবং সহজেই মুছে ফেলা যায়।

  1. প্রোজেক্ট তৈরি করুন বিকল্প খুলুন (অথবা আপনার ছদ্মবেশী উইন্ডোতে URL কপি করুন):
https://console.cloud.google.com/projectcreate
  1. আপনার প্রোজেক্টের বিবরণ লিখুন:
    • প্রোজেক্টের নাম: যেমন, google-cloud-workshop
    • বিলিং অ্যাকাউন্ট (যদি দেখানো হয়): GDP Credit (অথবা আপনার অ্যাক্টিভ বিলিং অ্যাকাউন্ট) বেছে নিন
    • পেরেন্ট রিসোর্স: কোনও সংস্থা নেই (অথবা প্রয়োজন হলে আপনার সংস্থা)
  2. প্রোজেক্টের নামের নিচে জেনারেট করা প্রোজেক্ট আইডি নোট করুন, তারপর তৈরি করুন বিকল্পে ক্লিক করুন:

Google Cloud প্রোজেক্ট তৈরি করার স্ক্রিন যেখানে প্রোজেক্টের নাম, প্রোজেক্ট আইডি, পেরেন্ট রিসোর্স এবং 'তৈরি করুন' বোতাম দেখানো হচ্ছে

🔍 আপনার কাজ চেক করুন

প্রজেক্ট তৈরি করা হয়ে গেলে, উপরে ডানদিকের টুলবারে বিজ্ঞপ্তি বিকল্পে ক্লিক করুন এবং প্রজেক্ট বেছে নিন বিকল্পে ক্লিক করুন:

Google Cloud Console-এর বিজ্ঞপ্তি মেনুতে 'প্রোজেক্ট তৈরি করুন' এবং 'প্রোজেক্ট বেছে নিন' লিঙ্ক দেখানো হচ্ছে

৪. আপনার পরিবেশ সেট-আপ করুন

Google Cloud Shell কনফিগার করুন, Agent Platform API চালু করুন এবং uv-এর মাধ্যমে একটি আইসোলেটেড Python 3.12 ভার্চুয়াল এনভায়রনমেন্ট তৈরি করুন।

Cloud Shell কনফিগার করুন

  1. Google Cloud কনসোল টুলবারে Cloud Shell চালু করুন (>_) বিকল্পে ক্লিক করুন অথবা সরাসরি Google Cloud Shell খুলুন (অথবা আপনার ছদ্মবেশী উইন্ডোতে URL কপি করুন):
https://shell.cloud.google.com/?show=ide,terminal

Google Cloud Console টুলবারে Cloud Shell চালু করার বোতাম

  1. প্রম্পট করা হলে অনুমোদন করুন বিকল্পে ক্লিক করুন:

Cloud Shell ডায়ালগ অনুমোদন করুন

  1. আপনার টার্মিনালের সংখ্যাযুক্ত মেনু থেকে আপনার অ্যাক্টিভ Google Cloud প্রোজেক্ট আইডি বেছে নিন:
unset CLOUDSDK_CORE_PROJECT
PS3="Select your project (e.g. 1): "
select PROJECT_ID in $(gcloud projects list --format="value(projectId)"); do
  [ -n "$PROJECT_ID" ] && gcloud config set project "$PROJECT_ID" && break
done

আপনি এই ধরনের আউটপুট দেখতে পাবেন (ট্যাগ না করা প্রোজেক্টের ক্ষেত্রেও তথ্যমূলক [environment: untagged] লাইন প্রিন্ট করা হয়):

1) google-cloud-workshop-4210
2) my-cloud-project-8812
Select your project (e.g. 1): 1
Updated property [core/project].

আপনার বেছে নেওয়া প্রোজেক্ট আইডি Cloud Shell প্রম্পটে হলুদ রঙে হাইলাইট করা আছে কিনা তা যাচাই করুন:

Cloud Shell টার্মিনালে বেছে নেওয়া প্রোজেক্ট আইডি হলুদ রঙে হাইলাইট করে দেখানো হচ্ছে

প্রয়োজনীয় API চালু করুন

Agent Platform API চালু করুন যাতে আপনার ADK এজেন্ট Gemini মডেলকে ইনভোক করতে পারে:

gcloud services enable aiplatform.googleapis.com

আপনি এই ধরনের আউটপুট দেখতে পাবেন:

Operation "operations/acat.p2-..." finished successfully.

Python ভার্চুয়াল এনভায়রনমেন্ট তৈরি করে ADK ইনস্টল করা

~/adk-agents ওয়ার্কস্পেস তৈরি করুন এবং Python 3.12 ভার্চুয়াল এনভায়রনমেন্ট অ্যাক্টিভেট করুন:

cd ~
mkdir -p adk-agents && cd ~/adk-agents

which uv >/dev/null 2>&1 || curl -LsSf https://astral.sh/uv/install.sh | sh
export PATH="$HOME/.local/bin:$PATH"

uv venv .venv --python 3.12
source .venv/bin/activate

আপনার টার্মিনাল প্রম্পটের শুরুতে (.venv) প্রিফিক্স দেখা যাচ্ছে কিনা তা কনফার্ম করুন:

Cloud Shell টার্মিনাল অ্যাক্টিভ Python ভার্চুয়াল এনভায়রনমেন্টে .venv প্রিফিক্স দেখাচ্ছে

অ্যাক্টিভ ভার্চুয়াল এনভায়রনমেন্টের মধ্যে ADK 2 ইনস্টল করুন:

uv pip install --no-cache "google-adk==2.14.0"

🔍 আপনার কাজ চেক করুন

ইনস্টল করা adk CLI ভার্সন যাচাই করুন:

adk --version

আপনি এই ধরনের আউটপুট দেখতে পাবেন:

adk, version 2.14.0

৫. ট্রাভেল প্ল্যানার এজেন্ট স্ক্যাফোল্ড করুন

আপনার এনভায়রনমেন্ট রেডি হয়ে গেলে, আপনার travel_planner এজেন্ট প্যাকেজের জন্য স্টার্টার ফাইল তৈরি করতে ADK-এর বিল্ট-ইন adk create কমান্ড ব্যবহার করুন।

স্টার্টার প্যাকেজ তৈরি করুন

আপনার ~/adk-agents ডিরেক্টরি থেকে adk create রান করুন:

cd ~/adk-agents
adk create travel_planner

টার্মিনালে প্রম্পট করা হলে, নিম্নলিখিত কনফিগারেশন বিকল্প বেছে নিন (প্রথমবার চালানোর সময় Enable telemetry? [Y/n]: প্রম্পট করা হলে, Enter প্রেস করুন অথবা n টাইপ করে Enter প্রেস করুন):

  1. রুট এজেন্টের জন্য একটি মডেল বেছে নিন: gemini-3.8-flash বেছে নিতে 2 টাইপ করুন (1 বিকল্প gemini-3.5-flash বেছে নেয়) এবং Enter প্রেস করুন।
  2. ব্যাকএন্ড বেছে নিন: Google Cloud এজেন্ট প্ল্যাটফর্ম ব্যাকএন্ড (নিচের CLI মেনুতে 2 বিকল্প) বেছে নিতে 2 টাইপ করুন এবং Enter প্রেস করুন।
  3. Google Cloud প্রোজেক্ট আইডি লিখুন: Enter প্রেস করে ব্র্যাকেটে দেখানো আপনার প্রোজেক্ট আইডি কনফার্ম করুন।
  4. Google Cloud অঞ্চল লিখুন: global টাইপ করে Enter প্রেস করুন।

adk create, GOOGLE_GENAI_USE_ENTERPRISE=1, আপনার প্রোজেক্ট আইডি এবং GOOGLE_CLOUD_LOCATION=global, travel_planner/.env-এ লিখে রাখে, যাতে আপনি পরে agent.py আপডেট করার সময় আপনার ক্রেডেনশিয়াল কনফিগার করা থাকে।

🔍 আপনার কাজ চেক করুন

আপনি এই ধরনের আউটপুট দেখতে পাবেন:

Choose a model for the root agent:
1. gemini-3.5-flash
2. gemini-3.8-flash
3. Other models (fill later)
Choose model (1, 2, 3): 2
1. Google AI
2. Vertex AI
3. Login with Google
Choose a backend (1, 2, 3): 2

You need an existing Google Cloud account and project, check out this link for details:
https://google.github.io/adk-docs/get-started/quickstart/#gemini---google-cloud-vertex-ai

Enter Google Cloud project ID [google-cloud-workshop-4210]:
Enter Google Cloud region [us-central1]: global

Agent created in /home/your_username/adk-agents/travel_planner:
- .env
- .gitignore
- __init__.py
- agent.py

⚠️  WARNING: Secrets (like GOOGLE_API_KEY) are stored in .env.

Next steps:
- Chat with your agent in the terminal: adk run travel_planner
- Or in the browser: adk web .
- Have your coding agent evaluate and deploy it: uvx google-agents-cli setup
  (other install options: https://adk.dev/get-started/agents-cli/)

Cloud Shell কোড এডিটরে বর্তমান ফোল্ডার খুলুন যাতে আপনি টার্মিনালের পাশাপাশি ফাইলগুলি পরীক্ষা এবং এডিট করতে পারেন:

which cloudshell >/dev/null 2>&1 && cloudshell workspace ~/adk-agents || true
cd ~/adk-agents
source .venv/bin/activate

ডিফল্ট সিঙ্গেল এজেন্ট টেস্ট করুন

মাল্টি-এজেন্ট ওয়ার্কফ্লো তৈরি করার আগে, ডিফল্ট সিঙ্গেল এজেন্ট কীভাবে ভ্রমণ পরিকল্পনা সংক্রান্ত বিস্তৃত কোয়েরির উত্তর দেয় তা দেখার জন্য ADK ডেভেলপমেন্ট UI চালু করুন:

cd ~/adk-agents
adk web --allow_origins "*"

Cloud Shell ওয়েব প্রিভিউ ব্যবহার করে আপনার ব্রাউজারে ডেভেলপমেন্ট UI খুলুন:

  1. Cloud Shell-এর উপরে ডানদিকের টুলবারে ওয়েব প্রিভিউ আইকনে ক্লিক করুন।
  2. পোর্ট পরিবর্তন করুন বিকল্প বেছে নিয়ে 8000 লিখুন এবং পরিবর্তন ও প্রিভিউ করুন বিকল্পে ক্লিক করুন।

Cloud Shell ওয়েব প্রিভিউ পোর্ট কনফিগারেশন ডায়ালগ ৮০০০-এ সেট করা হয়েছে

ADK Web UI লোড হয়ে গেলে, "hello, what can you do?" বা "Help me plan a trip to Japan"-এর মতো কোনও অভিবাদন পাঠান:

ADK ডেভেলপমেন্ট ওয়েব UI-তে একটি প্রাথমিক সিঙ্গেল-এজেন্ট কথোপকথন দেখানো হচ্ছে

লক্ষ্য করুন যে, সিঙ্গেল root_agent স্ট্রাকচার্ড প্রেফারেন্স এক্সট্র্যাকশন, লাইভ ওয়েব রিসার্চ বা বাজেট যাচাইকরণ ছাড়াই সরাসরি একবারে উত্তর দেয়।

পরীক্ষা করা হয়ে গেলে, adk web সার্ভার বন্ধ করতে এবং কমান্ড প্রম্পটে ফিরে যেতে আপনার Cloud Shell টার্মিনালে Ctrl + C প্রেস করুন।

৬. SequentialAgent ওয়ার্কফ্লো তৈরি করুন

এখন আপনি নিজের প্রথম অর্কেস্ট্রেশন প্যাটার্ন তৈরি করবেন: SequentialAgent দ্বারা পরিচালিত একটি লিনিয়ার ওয়ার্কফ্লো। সিকোয়েন্সিয়াল পাইপলাইনে, সাব-এজেন্ট কঠোরভাবে ক্রম মেনে এক্সিকিউট করে। প্রথম বিশেষজ্ঞ স্ট্রাকচার্ড প্যারামিটার এক্সট্র্যাক্ট করে এবং output_key="user_preferences" ব্যবহার করে শেয়ার করা সেশন স্টেটে সেগুলি সেভ করে এবং দ্বিতীয় বিশেষজ্ঞ ভ্রমণসূচী ড্রাফ্ট করার জন্য শেয়ার করা স্টেট থেকে {user_preferences} পড়ে।

আর্কিটেকচার ডায়াগ্রাম root_agent-কে master_travel_agent (SequentialAgent)-এ ডেলিগেট করতে দেখাচ্ছে, যা শেয়ার করা সেশন স্টেটের মাধ্যমে user_profiler_agent-এর পরে itinerary_synthesizer_agent রান করে

প্রাথমিক বিশেষজ্ঞ তৈরি করুন (specialists.py)

travel_planner/-এর মধ্যে specialists.py নামের একটি নতুন ফাইল খুলুন:

cloudshell edit ~/adk-agents/travel_planner/specialists.py

user_profiler_agent ও itinerary_synthesizer_agent (পরবর্তী ধাপের জন্য ToolContext ও google_search আগে থেকে ইমপোর্ট করা) সংজ্ঞায়িত করতে travel_planner/specialists.py-এ নিম্নলিখিত কোড পেস্ট করুন:

from google.adk import Agent
from google.adk.tools import ToolContext, google_search

# --- Specialist 1: The User Profiler ---
user_profiler_agent = Agent(
    name="user_profiler_agent",
    description="Extracts travel preferences and constraints from user input.",
    instruction="""
        Extract destination, duration (default 1 day), budget, interests, and exclusions.
        Return a single JSON object with keys: "destination", "duration", "budget", "interests", "exclusions".
    """,
    output_key="user_preferences",  # Saves output to state['user_preferences']
)

# --- Specialist 2: The Synthesizer ---
itinerary_synthesizer_agent = Agent(
    name="itinerary_synthesizer_agent",
    description="Compiles preferences and research into a final Markdown itinerary.",
    instruction="""
        You are an elite Travel Concierge. Write a Markdown itinerary with an itemized USD and local currency cost breakdown using:
        - User Preferences: {user_preferences}
        - Activities (if available): {activity_recommendations?}
        - Restaurants (if available): {restaurant_recommendations?}
    """,
    output_key="final_itinerary",
)

সিকোয়েন্সিয়াল পাইপলাইন ওয়্যার করুন (workflows.py)

বিশেষজ্ঞদের অর্কেস্ট্রেট করতে travel_planner/-এর মধ্যে workflows.py নামে একটি নতুন ফাইল তৈরি করুন:

cloudshell edit ~/adk-agents/travel_planner/workflows.py

travel_planner/workflows.py-এ নিম্নলিখিত SequentialAgent সংজ্ঞা যোগ করুন:

from google.adk.agents import SequentialAgent
from .specialists import (
    user_profiler_agent,
    itinerary_synthesizer_agent,
)

# 1. SEQUENTIAL PHASE: A linear two-step workflow
master_travel_agent = SequentialAgent(
    name="master_travel_agent",
    description="Orchestrates the end-to-end travel planning process for trip and itinerary requests.",
    sub_agents=[
        user_profiler_agent,         # Step 1: Extract constraints into user_preferences
        itinerary_synthesizer_agent,  # Step 2: Draft itinerary from user_preferences
    ],
)

root_agent (agent.py)-এর সাথে ওয়ার্কফ্লো কানেক্ট করুন

এখন master_travel_agent-কে root_agent-এর সাব-এজেন্ট হিসেবে রেজিস্টার করুন। travel_planner/agent.py খুলুন:

cloudshell edit ~/adk-agents/travel_planner/agent.py

travel_planner/agent.py-এর কন্টেন্ট নিম্নলিখিত কোড দিয়ে পরিবর্তন করুন:

from google.adk import Agent
from .workflows import master_travel_agent

MODEL = "gemini-3.8-flash"

root_agent = Agent(
    model=MODEL,
    name="root_agent",
    description="A helpful assistant for user questions.",
    instruction=(
        "Greet the user and delegate any travel or trip planning requests "
        "to master_travel_agent."
    ),
    sub_agents=[master_travel_agent],
)

🔍 আপনার কাজ চেক করুন

আপনার টার্মিনাল থেকে ADK ওয়েব UI চালু করুন:

cd ~/adk-agents
adk web --allow_origins "*"

8000 পোর্টে ওয়েব প্রিভিউ খুলুন এবং প্রম্পট লিখুন:

Help me plan a trip to Kyoto

ইভেন্ট ভিউতে নিম্নলিখিত এক্সিকিউশন ফ্লোর মতো আউটপুট দেখতে পাবেন:

1. root_agent -> calls transfer_to_agent(agent_name="master_travel_agent")
2. user_profiler_agent -> outputs JSON {"destination": "Kyoto", "duration": "1 day", ...} to state['user_preferences']
3. itinerary_synthesizer_agent -> reads {user_preferences} and outputs the formatted Markdown itinerary

ADK 2.14.0 ওয়েব UI-তে root_agent থেকে master_travel_agent হয়ে user_profiler_agent এবং itinerary_synthesizer_agent পর্যন্ত এক্সিকিউশন গ্রাফ এবং তার সাথে জেনারেট করা কিয়োটো ভ্রমণসূচী দেখানো হচ্ছে

যেকোনও ইভেন্ট ব্যাজ (বা State: final_itinerary চিপ) ক্লিক করুন এবং বাঁদিকের ইন্সপেক্টর প্যানেলে স্টেট ট্যাবে পাল্টে নিন যাতে কনফার্ম করা যায় যে user_preferences এবং final_itinerary দুটিই সেশন স্টেটে পপুলেট করা হয়েছে।

ট্রেস পরীক্ষা করা হয়ে গেলে, adk web বন্ধ করতে আপনার টার্মিনালে Ctrl + C প্রেস করুন।

৭. ParallelAgent-এর মাধ্যমে রিসার্চ চালান

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

  • activity_finder_agent: ব্যবহারকারীর গন্তব্য ও আগ্রহের সাথে মেলে এমন ৩টি নির্দিষ্ট আকর্ষণীয় জায়গা খুঁজে বের করে, সাথে টিকিটের আনুমানিক দামও দেখায়।
  • restaurant_finder_agent: ৩টি অত্যন্ত রেটিং প্রাপ্ত স্থানীয় রেস্তোরাঁ এবং জনপ্রতি তাদের আনুমানিক খরচ খুঁজে বের করে।

কারণ, আকর্ষণীয় জায়গা ও রেস্তোরাঁ খোঁজার কাজ একে অপরের উপর নির্ভর করে না, তাই একটির পর আরেকটি করলে সময় নষ্ট হয়। এর পরিবর্তে, আপনি দুটি রিসার্চারকেই একটি ParallelAgent (parallel_research_agent)-এর মধ্যে র‍্যাপ করবেন যাতে ADK দুটি Google Search ওয়ার্কফ্লোই একসাথে এক্সিকিউট করে এবং itinerary_synthesizer_agent-এর কাছে হ্যান্ড অফ করার আগে {activity_recommendations?} ও {restaurant_recommendations?} পপুলেট করে।

আর্কিটেকচার ডায়াগ্রাম যেখানে দেখানো হয়েছে যে, Stage 1-এ master_travel_agent-এর মাধ্যমে user_profiler_agent, Stage 2-এ parallel_research_agent (activity_finder_agent ও restaurant_finder_agent সহ ParallelAgent) এবং Stage 3-এ itinerary_synthesizer_agent রান করছে

specialists.py-এ প্যারালাল রিসার্চ স্পেশালিস্ট যোগ করুন

travel_planner/specialists.py খুলুন:

cloudshell edit ~/adk-agents/travel_planner/specialists.py

travel_planner/specialists.py-এর নিচে (itinerary_synthesizer_agent-এর ঠিক নিচে) নিম্নলিখিত দুজন Google Search বিশেষজ্ঞের নাম যোগ করুন:

# --- Specialist 3: The Activity Finder ---
activity_finder_agent = Agent(
    name="activity_finder_agent",
    description="Finds 3 attractions matching the user's destination and interests.",
    instruction="""
        Based on {user_preferences}, use google_search to find 3 specific attractions (including budget-friendly options).
        Return a JSON list with keys: "attraction_name", "estimated_cost_local", "estimated_cost_usd", "notes".
    """,
    tools=[google_search],
    output_key="activity_recommendations",
)

# --- Specialist 4: The Restaurant Finder ---
restaurant_finder_agent = Agent(
    name="restaurant_finder_agent",
    description="Finds 3 restaurants matching the destination and budget.",
    instruction="""
        Based on {user_preferences}, use google_search to find 3 highly-rated restaurants across price points.
        Return a JSON list with keys: "restaurant_name", "cuisine", "estimated_cost_local", "estimated_cost_usd".
    """,
    tools=[google_search],
    output_key="restaurant_recommendations",
)

workflows.py-এ ParallelAgent যোগ করুন

travel_planner/workflows.py খুলুন:

cloudshell edit ~/adk-agents/travel_planner/workflows.py

ParallelAgent ব্যবহার করে parallel_research_agent সংজ্ঞায়িত করতে travel_planner/workflows.py আপডেট করুন এবং এটিকে user_profiler_agent ও itinerary_synthesizer_agent-এর মধ্যে রাখুন:

from google.adk.agents import ParallelAgent, SequentialAgent
from .specialists import (
    activity_finder_agent,
    itinerary_synthesizer_agent,
    restaurant_finder_agent,
    user_profiler_agent,
)

# Parallel branch: Run activity and restaurant research simultaneously
parallel_research_agent = ParallelAgent(
    name="parallel_research_agent",
    description="Runs activity and restaurant research concurrently.",
    sub_agents=[
        activity_finder_agent,
        restaurant_finder_agent,
    ],
)

# Master pipeline: Profile -> Parallel Research -> Synthesize
master_travel_agent = SequentialAgent(
    name="master_travel_agent",
    description="Orchestrates the end-to-end travel planning process for trip and itinerary requests.",
    sub_agents=[
        user_profiler_agent,          # Step 1: Extract constraints
        parallel_research_agent,      # Step 2: Research activities & restaurants in parallel
        itinerary_synthesizer_agent,  # Step 3: Synthesize into an itinerary
    ],
)

🔍 আপনার কাজ চেক করুন

প্যারালাল রিসার্চ পাইপলাইন পরীক্ষা করতে আবার adk web লঞ্চ করুন:

cd ~/adk-agents
adk web --allow_origins "*"

ওয়েব প্রিভিউ UI-তে, প্রম্পট পাঠান:

Help me plan a trip to Kyoto focused on historic temples and ramen

ইভেন্ট ভিউতে আপনি নিম্নলিখিত ক্রমের মতো আউটপুট দেখতে পাবেন:

1. user_profiler_agent -> writes state['user_preferences']
2. parallel_research_agent -> fans out concurrently:
   - activity_finder_agent invokes google_search -> writes state['activity_recommendations']
   - restaurant_finder_agent invokes google_search -> writes state['restaurant_recommendations']
3. itinerary_synthesizer_agent -> merges all three state keys into state['final_itinerary']
  1. ট্রেস ভিউ: কথোপকথন পেনের (ইভেন্ট-এর পাশে) উপরে ট্রেস বিকল্পে ক্লিক করুন এবং আপনার টার্ন পরীক্ষা করুন। আপনি parallel_research_agent-এর অধীনে activity_finder_agent এবং restaurant_finder_agent-এর জন্য ওভারল্যাপ করা টাইমলাইন স্প্যান দেখতে পাবেন, যা সেগুলিকে ক্রমানুসারে চালানোর তুলনায় মোট ওয়েব-রিসার্চ লেটেন্সি প্রায় অর্ধেক কমিয়ে দেয়।
  2. স্টেট ট্যাব: লাইভ সেশন ডিকশনারি (user_preferences, activity_recommendations, restaurant_recommendations এবং final_itinerary) পরীক্ষা করতে বাঁদিকের ইন্সপেক্টর প্যানেলে স্টেট ট্যাবে ক্লিক করুন।

আপনার পরীক্ষা করা হয়ে গেলে, adk web বন্ধ করতে আপনার টার্মিনালে Ctrl + C প্রেস করুন।

৮. LoopAgent-এর সাহায্যে ড্রাফ্ট রিফাইন করুন

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

বাধ্যবাধকতা মেনে চলা নিশ্চিত করতে, আপনি LoopAgent ব্যবহার করে পাইপলাইনের শেষে একটি মেকার-চেকার রিফাইনমেন্ট লুপ যোগ করবেন:

  1. itinerary_critic_agent (চেকার): {user_preferences}-এর সাথে {final_itinerary} অডিট করে। এটি আনুমানিক খরচ যোগ করে, প্রতিটি নেতিবাচক সীমাবদ্ধতা চেক করে এবং critique_feedback-এ নির্দিষ্ট সংশোধনের নির্দেশাবলী লেখে বা সঠিক বাক্যাংশ "APPROVED" দিয়ে উত্তর দেয়।
  2. itinerary_refiner_agent (The Maker / Exiter): {critique_feedback} পড়ে। সমালোচনা "APPROVED"-এর সমান হলে, এটি exit_loop টুল (tool_context.actions.escalate = True) চালু করে যাতে অবিলম্বে LoopAgent থেকে বেরিয়ে আসা যায়। অন্যথায়, এটি ফ্ল্যাগ করা সমস্যা সমাধান করতে {final_itinerary} সংশোধন করে এবং পরবর্তী পাসের জন্য final_itinerary ওভাররাইট করে।

আর্কিটেকচার ডায়াগ্রাম, যেখানে দেখা যাচ্ছে যে master_travel_agent, Stage 4 refinement_loop_agent (LoopAgent)-এর সাথে itinerary_critic_agent এবং itinerary_refiner_agent-এর মধ্যে সাইকেল করছে, যতক্ষণ না exit_loop কল করা হচ্ছে

specialists.py-এ exit_loop, সমালোচক এবং রিফাইনার যোগ করুন

travel_planner/specialists.py খুলুন:

cloudshell edit ~/adk-agents/travel_planner/specialists.py

exit_loop টুল (ToolContext), itinerary_critic_agent এবং itinerary_refiner_agent travel_planner/specialists.py-এর নিচে যোগ করুন:

def exit_loop(tool_context: ToolContext) -> dict:
    """Call ONLY when the critique is APPROVED to exit the refinement loop."""
    print(f"[Tool Call] exit_loop triggered by {tool_context.agent_name}")
    tool_context.actions.escalate = True
    return {"status": "approved", "message": "Itinerary approved. Exiting refinement loop."}


# --- Specialist 5: The Budget & Constraint Critic (Inside LoopAgent) ---
itinerary_critic_agent = Agent(
    name="itinerary_critic_agent",
    include_contents="none",
    description="Audits the itinerary draft against budget and negative constraints.",
    instruction="""
        Audit Current Itinerary ({final_itinerary}) against User Preferences ({user_preferences}).
        Verify that the USD total stays within the user's budget and no excluded venue types appear.
        If all checks pass, respond EXACTLY with the single word "APPROVED".
        Otherwise, output 1-2 concise revision instructions explaining what to swap or adjust.
    """,
    output_key="critique_feedback",
)

# --- Specialist 6: The Itinerary Refiner / Exiter (Inside LoopAgent) ---
itinerary_refiner_agent = Agent(
    name="itinerary_refiner_agent",
    include_contents="none",
    description="Refines the itinerary from critique feedback, or calls exit_loop when APPROVED.",
    instruction="""
        Review Auditor Critique ({critique_feedback}) for Current Itinerary ({final_itinerary}).
        If the critique is EXACTLY "APPROVED", call `exit_loop` immediately and return the itinerary unchanged.
        Otherwise, revise the draft using {activity_recommendations} and {restaurant_recommendations}
        so all USD budget and exclusion rules pass, and output ONLY the updated Markdown itinerary.
    """,
    tools=[exit_loop],
    output_key="final_itinerary",
)

workflows.py-এ LoopAgent যোগ করুন

travel_planner/workflows.py খুলুন:

cloudshell edit ~/adk-agents/travel_planner/workflows.py

itinerary_critic_agent এবং itinerary_refiner_agent-কে LoopAgent (max_iterations=3)-এ র‍্যাপ করতে travel_planner/workflows.py আপডেট করুন এবং master_travel_agent-এর চতুর্থ ধাপ হিসেবে এটি যোগ করুন:

from google.adk.agents import LoopAgent, ParallelAgent, SequentialAgent
from .specialists import (
    activity_finder_agent,
    itinerary_critic_agent,
    itinerary_refiner_agent,
    itinerary_synthesizer_agent,
    restaurant_finder_agent,
    user_profiler_agent,
)

# Stage 2: Parallel research branch
parallel_research_agent = ParallelAgent(
    name="parallel_research_agent",
    description="Runs activity and restaurant research concurrently.",
    sub_agents=[
        activity_finder_agent,
        restaurant_finder_agent,
    ],
)

# Stage 4: Iterative Maker-Checker refinement loop
refinement_loop_agent = LoopAgent(
    name="refinement_loop_agent",
    description="Iteratively audits and refines the itinerary until constraints and budget are approved.",
    sub_agents=[
        itinerary_critic_agent,
        itinerary_refiner_agent,
    ],
    max_iterations=3,
)

# Master pipeline: Profile -> Parallel Research -> Synthesize -> Refinement Loop
master_travel_agent = SequentialAgent(
    name="master_travel_agent",
    description="Orchestrates the end-to-end travel planning process for trip and itinerary requests.",
    sub_agents=[
        user_profiler_agent,          # Stage 1: Extract constraints
        parallel_research_agent,      # Stage 2: Research activities & restaurants in parallel
        itinerary_synthesizer_agent,  # Stage 3: Draft initial itinerary
        refinement_loop_agent,        # Stage 4: Audit and refine until approved
    ],
)

🔍 আপনার কাজ চেক করুন

সম্পূর্ণ মাল্টি-এজেন্ট ওয়ার্কফ্লো পরীক্ষা করতে adk web শুরু করুন:

cd ~/adk-agents
adk web --allow_origins "*"

8000 পোর্টে ওয়েব প্রিভিউ UI খুলুন, নতুন সেশন শুরু করুন এবং এই Kyoto মাল্টি-কনস্ট্রেন্ট প্রম্পটের মাধ্যমে সম্পূর্ণ সিস্টেম পরীক্ষা করুন:

Design a full-day itinerary for Kyoto with a total budget of $100. My main interests are historical landmarks, temples, and authentic local cuisine. Please do not include any modern art museums or galleries.

ইভেন্ট ভিউ ও টার্মিনাল লগে নিম্নলিখিত এক্সিকিউশন সিকোয়েন্সের মতো আউটপুট দেখতে পাবেন:

1. user_profiler_agent -> writes JSON with destination="Kyoto", budget="$100", exclusions=["modern art museums", "galleries"]
2. parallel_research_agent -> runs activity_finder_agent and restaurant_finder_agent in parallel
3. itinerary_synthesizer_agent -> produces initial draft in state['final_itinerary']
4. refinement_loop_agent:
   - itinerary_critic_agent -> audits USD budget and exclusions -> outputs "APPROVED" (or revision notes)
   - itinerary_refiner_agent -> triggers [Tool Call] exit_loop triggered by itinerary_refiner_agent and outputs the approved itinerary
  1. ইভেন্ট ভিউ: বাঁদিকে তথ্য ট্যাবে এর পেলোড পরীক্ষা করতে itinerary_critic_agent বা itinerary_refiner_agent থেকে যেকোনও ইভেন্ট চিপে ক্লিক করুন। itinerary_refiner_agent যখন exit_loop-কে ইনভোক করে, তখন actions.escalate: true দেখতে ইভেন্টটি পরীক্ষা করুন - এই সিগন্যাল LoopAgent-কে max_iterations=3-এ পৌঁছানোর আগে ইটারেট করা বন্ধ করতে বলে।
  2. স্টেট ট্যাব: পাস জুড়ে state['critique_feedback'] এবং state['final_itinerary'] আপডেট দেখতে স্টেট ট্যাবে ক্লিক করুন। প্রাথমিক ড্রাফ্ট $100 USD-এর বেশি হলে, critique_feedback অডিটরের সংশোধনের নির্দেশাবলী পাস ১-এ ধরে রাখে, এরপরে final_itinerary কম খরচের বিকল্পের সাথে আপডেট করে এবং critique_feedback পাস ২-এ "APPROVED"-এ পরিবর্তিত হয়।

আপনার টেস্টিং শেষ হয়ে গেলে, adk web বন্ধ করতে আপনার টার্মিনালে Ctrl + C প্রেস করুন।

৯. অপ্রয়োজনীয়গুলি মুছুন

স্থানীয় প্রোজেক্ট ফাইল মুছে দিন

আপনার Cloud Shell হোম ফোল্ডার থেকে adk-agents প্রোজেক্ট ডিরেক্টরি এবং ভার্চুয়াল এনভায়রনমেন্ট সরাতে, এটি রান করুন:

cd ~
rm -rf ~/adk-agents

Agent Platform API বন্ধ করুন

আপনার প্রোজেক্টে Agent Platform API চালু রাখার প্রয়োজন না থাকলে, gcloud-এর মাধ্যমে এটি বন্ধ করুন:

gcloud services disable aiplatform.googleapis.com --quiet

সম্পূর্ণ Google Cloud প্রোজেক্ট মুছে দিন (ঐচ্ছিক)

PROJECT_ID=$(gcloud config get-value project)
gcloud projects delete "$PROJECT_ID" --quiet

🔍 আপনার কাজ চেক করুন

~/adk-agents সরিয়ে দেওয়া হয়েছে কিনা তা কনফার্ম করুন:

test ! -d ~/adk-agents && echo "Workspace ~/adk-agents removed"

আপনি এই ধরনের আউটপুট দেখতে পাবেন:

Workspace ~/adk-agents removed

১০. অভিনন্দন

অভিনন্দন! আপনি Google Agent Development Kit (ADK) ব্যবহার করে একটি হায়ারার্কিক্যাল মাল্টি-এজেন্ট সিস্টেম তৈরি করেছেন যা সিকোয়েন্সিয়াল, প্যারালাল ও আইটেরেটিভ লুপ ওয়ার্কফ্লো জুড়ে ছয়টি বিশেষ এজেন্টের একটি টিমকে কোঅর্ডিনেট করে।

আপনি কী কী অর্জন করেছেন

  • শেয়ার করা সেশন স্টেট (output_key এবং {state_variable} টেমপ্লেট ইনজেকশন) ব্যবহার করে স্ট্রাকচার্ড ইন্টার-এজেন্ট কমিউনিকেশন
  • SequentialAgent ব্যবহার করে একটি নির্ধারক ধাপে-ধাপে পাইপলাইন তৈরি করা হয়েছে
  • ParallelAgent ব্যবহার করে একই সাথে স্বতন্ত্র Google Search রিসার্চ এজেন্ট এক্সিকিউট করা হয়েছে
  • LoopAgent এবং tool_context.actions.escalate = True ব্যবহার করে একটি অটোমেটেড মেকার-চেকার যাচাইকরণ লুপ প্রয়োগ করা হয়েছে

পরবর্তী ধাপ