ADK ও A2A-এর সাহায্যে মাল্টি-এজেন্ট ফর্মুলা ই ট্র্যাক প্ল্যানার তৈরি করা

১. ১. এক নজরে

এই কোডল্যাবে আপনি একটি মাল্টি-এজেন্ট সিস্টেম তৈরি করবেন যা একটি ফর্মুলা ই স্ট্রিট সার্কিট ডিজাইন করে এবং FIA নিয়মের একটি সরলীকৃত সেটের ভিত্তিতে এটি অনুমোদন করে।

আপনি agents-cli ব্যবহার করে দুটি স্ট্যান্ডার্ড Agent Development Kit (ADK) প্রোজেক্ট তৈরি করবেন, তারপর গুরুত্বপূর্ণ অংশগুলি লিখবেন: একটি Agent Skill, তিনটি এজেন্ট এবং একটি মূল্যায়ন। বাকি সবকিছু (প্রজেক্ট লেআউট, সার্ভার, ডিপেন্ডেন্সি, ডিপ্লয়মেন্ট কনফিগারেশন) CLI থেকে আসে।

Formula E-তে নতুন?

মোটরস্পোর্ট সম্পর্কে আপনার কিছু জানার প্রয়োজন নেই। এই পাঁচটি শব্দই যথেষ্ট:

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

আপনার এজেন্টরা উভয় দিকেই খেলবে: একজন সার্কিট ডিজাইন করবে এবং দুজন FIA-এর জন্য এটি চেক করবে।

আপনি কী তৈরি করবেন

আর্কিটেকচার: track-planner প্রোজেক্টে, Cloud Shell-এ রান করার সময়, track_planner এজেন্ট get_track_topology, fia_assessor এবং remote_gatekeeper ব্যবহার করে। remote_gatekeeper, A2A-এর মাধ্যমে gatekeeper এজেন্টকে কল করে। এজেন্ট রানটাইমে চলা গেটকিপার প্রোজেক্টে, গেটকিপার এজেন্ট verify_infrastructure_checklist ব্যবহার করে।

সবুজ বক্সগুলি হল এজেন্ট এবং ড্যাশ করা বক্সগুলি হল তাদের টুল, ঠিক যেভাবে ADK প্লেগ্রাউন্ড সেগুলি আঁকে। দুটি টুল অন্যান্য এজেন্টকে র‍্যাপ করে: fia_assessor হল FIA অ্যাসেসর এজেন্ট যার FIA কমপ্লায়েন্স স্কিল আছে এবং remote_gatekeeper A2A-এর মাধ্যমে অন্য প্রোজেক্টে গেটকিপার এজেন্টকে কল করে।

এজেন্ট

প্রোজেক্ট

চাকরি

thinking_level

লিড আর্কিটেক্ট

track-planner

ভেনু পড়ে, অ্যাসেসরকে জিজ্ঞাসা করে, সমস্যার সমাধান করে, গেটকিপারের কাছে অনুমোদন চায়

HIGH

FIA Assessor

track-planner

FIA দক্ষতা ও স্কোরিং টুল ব্যবহার করে লেআউট চেক করে

MEDIUM

ডিজিটাল টুইন গেটকিপার

gatekeeper

চূড়ান্ত হোমোলোগেশন চেকলিস্ট রান করে

LOW

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

  • agents-cli scaffold create কীভাবে ADK প্রোজেক্ট লে-আউট করে এবং আপনি কোন ফাইল এডিট করেন।
  • কীভাবে এজেন্ট স্কিল (SKILL.md, references/, scripts/) হিসেবে ডোমেন নলেজ প্যাকেজ করবেন এবং ADK-এর SkillToolset-এর সাথে এটি লোড করবেন।
  • প্রতিটি এজেন্টের কাজের সাথে কীভাবে thinking_level ম্যাচ করতে হয়।
  • agents-cli eval run-এর মাধ্যমে কীভাবে এজেন্ট মূল্যায়ন করবেন।
  • Agent Runtime-এ কীভাবে এজেন্ট ডিপ্লয় করতে হয়, কীভাবে এজেন্ট আইডেন্টিটি কোনও পরিষেবা অ্যাকাউন্ট থেকে আলাদা এবং কীভাবে A2A প্রোটোকলের মাধ্যমে ডিপ্লয় করা এজেন্টকে কল করতে হয়।

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

শুরু করার আগে

বিলিং চালু করা আছে এমন একটি Google Cloud প্রোজেক্ট আপনার প্রয়োজন। আপনি কোনও ইভেন্টে এই কোডল্যাব অনুসরণ করলে, আপনাকে যে অ্যাকাউন্ট ও প্রোজেক্ট দেওয়া হয়েছে সেটি ব্যবহার করুন।

Cloud Shell খুলুন এবং আপনার প্রোজেক্ট সেট করুন

Cloud Shell খুলুন, তারপর রান করুন:

# Cloud Shell sometimes opens without a project set. If so, this sets it to
# the first project on your account.
if [ -z "$(gcloud config get-value project 2>/dev/null)" ]; then
  gcloud config set project "$(gcloud projects list --format='value(projectId)' --limit=1)"
fi

export GOOGLE_CLOUD_PROJECT="$(gcloud config get-value project)"
export REGION="us-central1"
export ASSETS="$HOME/devrel-demos/codelabs/formula-e-track-planner"
echo "Project: $GOOGLE_CLOUD_PROJECT  Region: $REGION"

আপনার এজেন্টের জন্য ক্রেডেনশিয়াল তৈরি করুন

gcloud আগে থেকেই সাইন-ইন করা আছে, তবে আপনার এজেন্ট যে Python কোড রান করে তা অ্যাপ্লিকেশন ডিফল্ট ক্রেডেনশিয়াল (ADC) ব্যবহার করে, যার জন্য আলাদা সাইন-ইন প্রয়োজন:

gcloud auth application-default login

এটি যে লিঙ্ক প্রিন্ট করে সেটি খুলুন, একই অ্যাকাউন্ট দিয়ে সাইন-ইন করুন, কোড কপি করুন এবং Cloud Shell-এ আবার পেস্ট করুন। তারপর, যে প্রোজেক্টে কোটা বিল করা হবে সেটি সেট করুন:

gcloud auth application-default set-quota-project "$GOOGLE_CLOUD_PROJECT"

API চালু করুন

gcloud services enable \
    aiplatform.googleapis.com \
    cloudbuild.googleapis.com \
    artifactregistry.googleapis.com \
    storage.googleapis.com \
    cloudresourcemanager.googleapis.com \
    serviceusage.googleapis.com \
    compute.googleapis.com \
    iam.googleapis.com \
    logging.googleapis.com \
    cloudtrace.googleapis.com

প্রতিটি API কীসের জন্য:

এপিআই

এর জন্য ব্যবহার করা হয়েছে

aiplatform

Gemini মডেল ও এজেন্ট রানটাইম

cloudresourcemanager, serviceusage, iam

gcloud এবং agents-cli deploy যে প্রোজেক্ট ও অনুমতি চেক করে

compute

Compute Engine-এর ডিফল্ট পরিষেবা অ্যাকাউন্ট তৈরি করে যা ৭ নম্বর ধাপে ডিপ্লয় করার সময় ব্যবহার করা হয়

storage, logging, cloudtrace

এজেন্ট রানটাইম সেট-আপ গাইড-এর সাজেশন অনুযায়ী স্টোরেজ, লগ ও ট্রেস

cloudbuild, artifactregistry

কন্টেনার বিল্ড এবং ছবি, ধাপ ৭-এ ডিপ্লয় করার জন্য সতর্কতা হিসেবে অন্তর্ভুক্ত করা হয়েছে

অনেক প্রোজেক্টে এগুলির মধ্যে কিছু আগে থেকেই চালু করা আছে। আগে থেকেই চালু থাকা API চালু করলে কোনও পরিবর্তন হয় না।

uv ও agents-cli ইনস্টল করুন

curl -LsSf https://astral.sh/uv/install.sh | sh
export PATH="$HOME/.local/bin:$PATH"
uv tool install google-agents-cli==1.10.0
agents-cli --version

এই কোডল্যাব agents-cli 1.10.0-এর সাথে টেস্ট করা হয়েছে, তাই একই জেনারেট করা ফাইল পেতে সেই ভার্সন ইনস্টল করুন।

৩. ৩. প্রোজেক্টের স্ক্যাফোল্ড তৈরি করে অ্যাসেট যোগ করুন

দুটি প্রোজেক্টই তৈরি করুন

agents-cli scaffold create একটি সম্পূর্ণ, ডিপ্লয় করার উপযুক্ত ADK প্রোজেক্ট তৈরি করে। এটি দুবার চালান, প্রতিটি এজেন্ট সিস্টেমের জন্য একবার করে।

প্রথমে, ট্র্যাক প্ল্যানার:

cd ~
agents-cli scaffold create track-planner \
  --agent adk \
  --deployment-target agent_runtime \
  --region "$REGION" \
  --prototype \
  --yes

তারপর গেটকিপার:

cd ~
agents-cli scaffold create gatekeeper \
  --agent adk \
  --deployment-target agent_runtime \
  --region "$REGION" \
  --prototype \
  --yes

পতাকা

অর্থ

--agent adk

Python ADK টেমপ্লেট থেকে শুরু করুন

--deployment-target agent_runtime

এজেন্ট রানটাইমের জন্য সার্ভার ও কনফিগারেশন জেনারেট করুন

--prototype

CI/CD এড়িয়ে যান; প্রোজেক্ট যতটা সম্ভব ছোট রাখুন

--yes

প্রম্পট না করেই ডিফল্ট সেটিংস গ্রহণ করুন

লেআউট এক্সপ্লোর করুন

জেনারেট করা প্রোজেক্টটি এইরকম দেখতে। আপনি শুধু ✍️ চিহ্ন দেওয়া ফাইল এডিট করতে পারবেন:

track-planner/
├── agents-cli-manifest.yaml   # Records the template, deployment target and root agent name
├── pyproject.toml             # Dependencies (google-adk, a2a-sdk, ...)
├── .env                       # Your project and model location, filled in for you
├── Dockerfile                 # Used by `agents-cli deploy`; copies app/ into the image
├── app/
│   ├── agent.py               # ✍️ Your agents
│   ├── fast_api_app.py        # Generated server: ADK API, A2A routes, Agent Runtime routes
│   └── app_utils/             # Generated helpers (A2A, sessions)
└── tests/
    ├── unit/                  # Fast tests with no model calls
    ├── integration/           # Generated server tests
    └── eval/                  # ✍️ eval_config.yaml and datasets for `agents-cli eval`

জেনারেট করা প্রতিটি ফাইলের বিবরণের জন্য, Agents CLI গাইডে প্রোজেক্ট স্ট্রাকচার দেখুন।

তৈরি করা এজেন্ট ব্যবহার করে দেখুন

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

cd ~/track-planner
agents-cli install
agents-cli playground --port 8080

এটি খুলতে, Cloud Shell টুলবারে ওয়েব প্রিভিউ বোতামে ক্লিক করুন (উপরে ডানদিকে চোখের আইকন), তারপর পোর্ট ৮০৮০-তে প্রিভিউ বিকল্প বেছে নিন।

প্লেগ্রাউন্ডে, টেমপ্লেট এজেন্টকে এমন একটি প্রশ্ন জিজ্ঞাসা করুন যার উত্তর তার টুল দিতে পারে, যেমন:

What's the weather in San Francisco?

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

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

Formula E অ্যাসেট যোগ করুন

ভেন্যু ডেটা, FIA নিয়ম, ফিজিক্স স্ক্রিপ্ট, টুল ও মূল্যায়ন ডেটাসেট এই পাঠের অংশ নয়, তাই GitHub থেকে সেগুলি টাইপ করার পরিবর্তে কপি করুন:

cd ~
git clone --depth 1 --filter=blob:none --sparse \
  --branch formula-e-lab-v1 \
  https://github.com/tdsymonds/devrel-demos.git
git -C devrel-demos sparse-checkout set codelabs/formula-e-track-planner

cp -r "$ASSETS/track-planner/." ~/track-planner/
cp -r "$ASSETS/gatekeeper/." ~/gatekeeper/

formula-e-lab-v1 হল একটি নির্দিষ্ট রিলিজ ট্যাগ, তাই সবাই একই ফাইল পান। $ASSETS ২ নম্বর ধাপে সেট করা হয়েছে এবং আপনি যে ফোল্ডারটি ক্লোন করেছেন সেটিকে নির্দেশ করে।

এটি এইসব ফাইল যোগ করে:

track-planner/
├── app/
│   ├── tools.py                                  # get_track_topology, evaluate_track_layout
│   ├── auth.py                                   # A2A client with per-request token refresh
│   ├── data/circuits.json                        # Five candidate venues
│   └── skills/fia-compliance-skill/
│       ├── references/track_regulations.md       # The FIA rules
│       └── scripts/calculate_regen_zones.py      # Braking-energy calculator
└── tests/
    ├── unit/test_tools.py
    └── eval/datasets/track_eval.json, track_eval_quick.json
gatekeeper/
├── app/tools.py                                  # verify_infrastructure_checklist
└── tests/unit/test_tools.py

ইনস্টল ও টেস্ট করুন

(cd ~/track-planner && agents-cli install && uv run pytest tests/unit)
(cd ~/gatekeeper && agents-cli install && uv run pytest tests/unit)

প্রতিটি প্রোজেক্টের জন্য ভার্চুয়াল এনভায়রনমেন্ট তৈরি করতে agents-cli install uv sync রান করে। সব ইউনিট টেস্ট পাস করতে হবে।

৪. ৪. FIA কমপ্লায়েন্স স্কিল সম্পর্কে লেখা

এজেন্ট স্কিল একটি ফোল্ডারে নির্দেশাবলী, রেফারেন্স ডকুমেন্ট এবং স্ক্রিপ্ট প্যাক করে। ADK-এর SkillToolset এটি তিনটি লেভেলে লোড করে, তাই এজেন্ট শুধুমাত্র তার প্রয়োজনীয় জিনিস পড়ে:

লেভেল

ফাইল

এজেন্ট যখন এটি দেখে

1

SKILL.md ফ্রন্ট ম্যাটার (name, description)

সবসময় (কয়েক ডজন টোকেন)

2

SKILL.md বডি

এটি যখন load_skill-কে কল করে

3

references/, scripts/

load_skill_resource বা run_skill_script-এ কল করলে

দক্ষতা app/skills/-এ থাকে কারণ জেনারেট করা Dockerfile শুধুমাত্র app/-কে ডিপ্লয় করা ছবিতে কপি করে।

লেভেল ৩ ফাইলগুলি দেখুন

আপনি ধাপ ৩-এ স্কিলের লেভেল ৩ ফাইল কপি করেছেন:

  • references/track_regulations.md-এ অ্যাসেসরের চেক করা নিয়মগুলি থাকে: দৈর্ঘ্য ও প্রস্থের সীমা, প্রতিটি ব্রেকিং জোনে কোন বাধা প্রয়োজন, বাধ্যতামূলক CAD লেয়ার (সাথে হাসপাতালের রুটের জন্য মেডিকেল লেয়ার), রিজেনারেশন টার্গেট ও অ্যাটাক মোডের নিয়ম।
  • scripts/calculate_regen_zones.py হল একটি ক্যালকুলেটর। ব্রেকিং জোনে প্রবেশের গতি, বেরোনোর গতি এবং ব্রেকিং দূরত্ব থেকে এটি কতটা এনার্জি রিকভার করা হয়েছে এবং কর্নারে কতটা বাধা প্রয়োজন তা হিসেব করে, তাই এজেন্টকে কখনই ফিজিক্স অনুমান করতে হয় না।

লন্ডনের টার্ন ১০-এর জন্য স্ক্রিপ্ট রান করো, যেখানে গাড়ি ৮২ মিটারের মধ্যে ২১৫ থেকে ৫৫ কিমি/ঘণ্টা গতিতে ব্রেক করে:

cd ~/track-planner
uv run python app/skills/fia-compliance-skill/scripts/calculate_regen_zones.py \
  --entry-kph 215 --exit-kph 55 --brake-dist-m 82

গাড়িটি এখানে প্রায় ৫০৮ কিলোওয়াট রিকভার করে, যা ২৫০ কিলোওয়াট লক্ষ্যের উপরে। এটি 2G-এর বেশি গতিতে ধীর হয়ে যায়, তাই কোণে Tecpro ব্যারিয়ার (F1_TEC3) প্রয়োজন:

{"entry_kph": 215.0, "exit_kph": 55.0, "brake_dist_m": 82.0, "deceleration_g": 2.07, "estimated_regen_kw": 507.7, "meets_250kw_target": true, "required_barrier_layer": "F1_TEC3"}

SKILL.md লিখুন

স্কিলকে একসাথে বেঁধে রাখে এমন ফাইল তৈরি করুন:

cloudshell edit app/skills/fia-compliance-skill/SKILL.md

এই কন্টেন্ট যোগ করুন:

---
name: fia-compliance-skill
description: >
  FIA Formula E street circuit rules: length and width limits, mandatory CAD
  layers, barrier selection, and Gen3 regenerative braking estimates. Use when
  designing, checking or fixing a Formula E circuit layout.
---

# FIA Formula E Compliance

Follow these steps for every circuit you check.

1. **Read the rules.** Call `load_skill_resource` with
   `file_path="references/track_regulations.md"`.
2. **Estimate regeneration for every heavy braking zone.** Call
   `run_skill_script` with `file_path="scripts/calculate_regen_zones.py"` and
   `args={"entry-kph": <entry>, "exit-kph": <exit>, "brake-dist-m": <distance>}`.
   Never guess kW values. Use the highest `estimated_regen_kw` as the
   circuit's peak regeneration.
3. **Check barriers.** Any zone whose `required_barrier_layer` is `F1_TEC3`
   needs the `F1_TEC3` CAD layer.
4. **Report.** List every rule the layout fails and a concrete fix for each
   one.

description হল সেই টেক্সট যা মডেল পড়ে সিদ্ধান্ত নেয় যে কখন স্কিল ব্যবহার করতে হবে, তাই এটি স্কিল কী কভার করে এবং কখন এটি ব্যবহার করতে হবে, দুটিই বলে।

স্কিল কীভাবে কাজ করে তা দেখুন

Cloud Shell এডিটরে app/tools.py খুলুন:

cloudshell edit app/tools.py

build_fia_skill_toolset ফাংশনটি খুঁজুন:

def build_fia_skill_toolset() -> SkillToolset:
    return SkillToolset(
        skills=[load_skill_from_dir(SKILL_DIR)],
        code_executor=UnsafeLocalCodeExecutor(),
    )
  • load_skill_from_dir স্কিল ফোল্ডার পড়ে: SKILL.md, references/ এবং scripts/।
  • SkillToolset এটিকে এমন টুলে পরিণত করে যা এজেন্ট কল করতে পারে: list_skills, load_skill, load_skill_resource এবং run_skill_script।
  • UnsafeLocalCodeExecutor, run_skill_script-কে এই মেশিনে Python স্ক্রিপ্ট রান করার অনুমতি দেয়। এটি ল্যাবের জন্য ঠিক আছে; প্রোডাকশনে স্যান্ডবক্সড এক্সিকিউটর ব্যবহার করুন।

পরবর্তী ধাপে আপনি এই টুলসেটটি Assessor-এর সাথে অ্যাটাচ করবেন।

৫. ৫. এজেন্টদের লিখুন

Gemini 3 মডেল টোকেন বাজেটের পরিবর্তে thinking_level (LOW, MEDIUM বা HIGH) দিয়ে রিজনিং কন্ট্রোল করে। ADK-তে আপনি এটি types.ThinkingConfig(thinking_level=types.ThinkingLevel.HIGH) দিয়ে সেট করেন। প্রতিটি এজেন্টের কাজের সাথে এটি ম্যাচ করুন: আরও বেশি চিন্তাভাবনা করার অর্থ হল আরও ভাল পরিকল্পনা করা, তবে এর ফলে আরও বেশি লেটেন্সি ও খরচ হবে।

গেটকিপার (LOW)

Gatekeeper শুধুমাত্র একটি নির্ধারক চেকলিস্ট রান করে, তাই এটির জন্য খুব কম যুক্তি প্রয়োজন। টেমপ্লেট এজেন্ট পরিবর্তন করুন:

cloudshell edit ~/gatekeeper/app/agent.py
"""FIA Digital Twin Gatekeeper agent.

This agent runs in its own project and is deployed to Agent Runtime. The track
planner calls it over the A2A protocol.
"""

from google.adk.agents import Agent
from google.adk.apps import App
from google.adk.models import Gemini
from google.genai import types

from app.tools import verify_infrastructure_checklist

# Tested with Gemini 3.8 Flash. To try Gemini 4 Argon, change this to
# "gemini-4-argon", delete the `temperature` settings below (Argon ignores
# them) and run `uv add "google-genai>=2.30.1"` in this project first.
MODEL = "gemini-3.8-flash"

root_agent = Agent(
    # Must match `root_agent_name` in agents-cli-manifest.yaml.
    name="gatekeeper",
    model=Gemini(
        model=MODEL,
        retry_options=types.HttpRetryOptions(attempts=3),
    ),
    description=(
        "FIA Digital Twin Gatekeeper. Runs the final homologation checklist "
        "for a Formula E circuit blueprint."
    ),
    instruction=(
        "You are the FIA Digital Twin Gatekeeper. For every circuit blueprint "
        "you receive, call `verify_infrastructure_checklist` with its circuit "
        "ID, CAD layers, minimum width and peak regeneration. Reply with the "
        "status and any missing CAD layers. Never approve a blueprint the "
        "checklist rejects."
    ),
    # A deterministic checklist needs little reasoning: keep it fast and cheap.
    generate_content_config=types.GenerateContentConfig(
        temperature=0.0,
        thinking_config=types.ThinkingConfig(
            thinking_level=types.ThinkingLevel.LOW,
        ),
    ),
    tools=[verify_infrastructure_checklist],
)

app = App(
    root_agent=root_agent,
    name="app",
)

লোকালি Gatekeeper রান করুন

দ্বিতীয় Cloud Shell ট্যাব খুলে ৮০০১ পোর্টে Gatekeeper-এর জেনারেট করা সার্ভার চালু করুন:

cd ~/gatekeeper
APP_URL=http://localhost:8001 uv run uvicorn app.fast_api_app:app --port 8001

প্রথম ট্যাবে ফিরে গিয়ে Gatekeeper-এর A2A এজেন্ট কার্ড দেখুন। অন্যান্য এজেন্ট এইভাবে Gatekeeper কী এবং এটি কী করতে পারে তা জানতে পারে:

curl -s http://localhost:8001/a2a/app/.well-known/agent-card.json | jq .

আপনি এই ধরনের JSON দেখতে পাবেন (সংক্ষিপ্ত):

{
  "name": "gatekeeper",
  "description": "FIA Digital Twin Gatekeeper. Runs the final homologation checklist for a Formula E circuit blueprint.",
  "supportedInterfaces": [
    {"url": "http://localhost:8001/a2a/app", "protocolBinding": "JSONRPC", "protocolVersion": "1.0"}
  ],
  "skills": [
    {"id": "gatekeeper", "name": "model", "description": "FIA Digital Twin Gatekeeper. ..."},
    {"id": "gatekeeper-verify_infrastructure_checklist", "name": "verify_infrastructure_checklist", "description": "Runs the final homologation checklist ..."}
  ]
}
  • name এবং description সরাসরি আপনার Agent(...) সংজ্ঞা থেকে আসে।
  • skills এজেন্ট কী করতে পারে তা তালিকাভুক্ত করে। টুলের ডকস্ট্রিং ব্যবহার করে ADK অটোমেটিক verify_infrastructure_checklist যোগ করেছে।
  • supportedInterfaces কলারদের বলে দেয় যে A2A অনুরোধ কোথায় পাঠাতে হবে। সেই জন্যই আপনি APP_URL=http://localhost:8001 দিয়ে সার্ভার শুরু করেছেন: একজন কলার প্রথমে কার্ডটি পড়েন, তারপর কার্ডটি যে url-এর বিজ্ঞাপন দেয়, সেখানে তার অনুরোধ পাঠান।

এখানে কোনও কিছু হাতে লেখা হয়নি: স্ক্যাফোল্ড করা সার্ভার আপনার এজেন্ট থেকে কার্ড তৈরি করে। ট্র্যাক প্ল্যানার এই কার্ডটি পড়ে গেটকিপারকে খুঁজে বের করবে এবং কল করবে।

অ্যাসেসর (MEDIUM) এবং লিড আর্কিটেক্ট (HIGH)

ট্র্যাক প্ল্যানারে দুটি এজেন্ট আছে:

  • Assessor একাধিক নিয়ম বিবেচনা করে, তাই এটি MEDIUM পায়। এটি একটি AgentTool-এ মোড়ানো থাকে, তাই লিড আর্কিটেক্ট এটিকে একটি ফাংশনের মতো কল করে এবং রায় ফেরত পায়।
  • লিড আর্কিটেক্ট প্ল্যান, ফিক্স ও কোঅর্ডিনেট করে, তাই এটি HIGH পায়। এটি RemoteA2aAgent-এর মাধ্যমে Gatekeeper-এর কাছে পৌঁছায়, যা create_remote_gatekeeper_agent()-এর মাধ্যমে app/auth.py-এ তৈরি করা হয়েছে এবং এটি AgentTool-এ র‍্যাপ করা থাকে।

Why wrap both helpers as tools? AgentTool কলারকে উত্তর দেয়, তাই লিড আর্কিটেক্ট দায়িত্বে থাকেন এবং ফাইনাল ব্লুপ্রিন্ট লেখেন। Gatekeeper যদি sub_agent হত, তাহলে লিড আর্কিটেক্ট কথোপকথনটি তাকে হস্তান্তর করত এবং Gatekeeper-এর সংক্ষিপ্ত স্ট্যাটাসটিই চূড়ান্ত উত্তর হত।

ট্র্যাক প্ল্যানারের app/agent.py ফাইল খুলুন:

cloudshell edit ~/track-planner/app/agent.py

নিম্নলিখিত কোড কপি করে ~/track-planner/app/agent.py-এর সম্পূর্ণ কন্টেন্ট এটি দিয়ে পরিবর্তন করুন:

"""Formula E track planner: Lead Architect, FIA Assessor and remote Gatekeeper.

- The Lead Architect (root agent) designs the circuit and stays in charge.
- The FIA Assessor checks the layout and is called as a tool (`AgentTool`).
- The Gatekeeper runs in a separate project. It is also called as a tool, over
  A2A, so its verdict comes back to the Lead Architect.
"""

from google.adk.agents import Agent
from google.adk.apps import App
from google.adk.models import Gemini
from google.adk.tools.agent_tool import AgentTool
from google.genai import types

from app.auth import create_remote_gatekeeper_agent
from app.tools import build_fia_skill_toolset
from app.tools import evaluate_track_layout
from app.tools import get_track_topology

# Tested with Gemini 3.8 Flash. To try Gemini 4 Argon, change this to
# "gemini-4-argon", delete the `temperature` settings below (Argon ignores
# them) and run `uv add "google-genai>=2.30.1"` in this project first.
MODEL = "gemini-3.8-flash"

fia_skill_toolset = build_fia_skill_toolset()

# 1. FIA Assessor: MEDIUM thinking to weigh several rules without much latency.
assessor_agent = Agent(
    name="fia_assessor",
    model=Gemini(
        model=MODEL,
        retry_options=types.HttpRetryOptions(attempts=3),
    ),
    description=(
        "FIA safety and energy assessor. Audits a proposed circuit against "
        "the geometry, regeneration and CAD layer rules."
    ),
    instruction=(
        "You are the FIA Assessor. Load the `fia-compliance-skill` and follow "
        "it. Estimate regeneration for each braking zone with "
        "`calculate_regen_zones.py`, then call `evaluate_track_layout` with "
        "the highest value. Reply with the verdict, the score and every "
        "remediation note."
    ),
    generate_content_config=types.GenerateContentConfig(
        temperature=0.1,
        thinking_config=types.ThinkingConfig(
            thinking_level=types.ThinkingLevel.MEDIUM,
        ),
    ),
    tools=[fia_skill_toolset, evaluate_track_layout],
)

# 2. Remote Gatekeeper, reached over A2A (see app/auth.py).
remote_gatekeeper = create_remote_gatekeeper_agent()

# 3. Lead Architect: HIGH thinking for multi-step planning and trade-offs.
root_agent = Agent(
    # Must match `root_agent_name` in agents-cli-manifest.yaml.
    name="track_planner",
    model=Gemini(
        model=MODEL,
        retry_options=types.HttpRetryOptions(attempts=3),
    ),
    description=(
        "Lead Formula E circuit architect. Designs FIA-compliant street "
        "circuits and gets them homologated."
    ),
    instruction=(
        "You are the Lead Formula E Circuit Architect. For every request:\n"
        "1. Call `get_track_topology` for the venue.\n"
        "2. Call the `fia_assessor` tool with the full topology.\n"
        "3. If the Assessor rejects the layout, propose concrete fixes (for "
        "example widen a sector to 10.0m or add missing CAD layers) and "
        "re-assess the fixed layout.\n"
        "4. Once the Assessor passes it, call the `remote_gatekeeper` tool "
        "with the circuit ID, CAD layers, minimum width and peak "
        "regeneration for final approval.\n"
        "5. Finish with a short blueprint: circuit ID, length, minimum width, "
        "peak regeneration, every CAD layer by name, and the Gatekeeper's "
        "status."
    ),
    generate_content_config=types.GenerateContentConfig(
        temperature=0.2,
        thinking_config=types.ThinkingConfig(
            thinking_level=types.ThinkingLevel.HIGH,
        ),
    ),
    # Both helpers are tools, so their answers come back to the Lead Architect
    # and it writes the final blueprint.
    tools=[
        get_track_topology,
        AgentTool(agent=assessor_agent),
        AgentTool(agent=remote_gatekeeper),
    ],
)

app = App(
    root_agent=root_agent,
    name="app",
)

প্লেগ্রাউন্ডে পুরো সিস্টেমটি চালান

আপনার দ্বিতীয় ট্যাবে Gatekeeper এখনও চলছে কিনা তা নিশ্চিত করুন। প্রথম ট্যাবে, ট্র্যাক প্ল্যানারের প্লেগ্রাউন্ড শুরু করুন:

cd ~/track-planner
agents-cli playground --port 8080

ধাপ ৩-এ যেভাবে করেছিলেন, ঠিক সেভাবে ওয়েব প্রিভিউ > পোর্ট ৮০৮০-তে প্রিভিউ বিকল্পে ক্লিক করুন।

নিয়ম মেনে চলে এমন কোনও ভেন্যুতে সার্কিট সম্পর্কে জিজ্ঞাসা করুন:

Design and homologate a Formula E circuit at Tokyo Bay.

এজেন্টরা কাজ করার সময় ইভেন্ট প্যানেল দেখুন। আপনি এই ক্রমে দেখতে পাবেন:

  1. get_track_topology: লিড আর্কিটেক্ট টোকিও বে-র ডেটা লোড করেন।
  2. fia_assessor: লিড আর্কিটেক্ট লেআউটটি অ্যাসেসরের হাতে তুলে দেয়, যা load_skill, load_skill_resource এবং run_skill_script (ব্রেকিং জোনে একবার করে) এবং তারপর evaluate_track_layout-কে কল করে।
  3. remote_gatekeeper: লিড আর্কিটেক্ট A2A-এর মাধ্যমে গেটকিপারকে কল করেন। আপনার দ্বিতীয় ট্যাবে লগ-ইন করা অনুরোধ দেখতে পাবেন।
  4. লিড আর্কিটেক্টের থেকে পাওয়া ফাইনাল ব্লুপ্রিন্ট, যেখানে প্রতিটি CAD লেয়ার এবং গেটকিপারের অনুমোদিত স্ট্যাটাস তালিকাভুক্ত করা আছে।

যেকোনও ইভেন্টের সঠিক ইনপুট ও আউটপুট দেখতে সেটিতে ক্লিক করুন।

এখন একটি নতুন সেশন শুরু করুন এবং এমন একটি ভেন্যু চেষ্টা করুন যা নিয়ম ভঙ্গ করে:

Can the Monaco Harbour layout be homologated? If not, fix it and try again.

এইবার অ্যাসেসর ৬.৮ মিটারের চিকেনটি বাতিল করে দেন, লিড আর্কিটেক্ট আরও চওড়া একটি চিকেনের প্রস্তাব দেন এবং গেটকিপারের কাছে পৌঁছানোর আগে ফিক্সড লেআউটটি অ্যাসেসরের কাছে ফেরত যায়।

আপনার কাজ হয়ে গেলে, প্লেগ্রাউন্ড বন্ধ করতে প্রথম ট্যাবে Ctrl+C প্রেস করুন। দ্বিতীয় ট্যাবে Gatekeeper চালু রাখুন: পরবর্তী ধাপে এটি আপনার প্রয়োজন হবে।

৬. ৬. এজেন্ট মূল্যায়ন করুন

agents-cli eval run আপনার এজেন্টকে একটি ডেটাসেটের উপর রান করে, প্রতিটি টার্ন এবং টুল কল রেকর্ড করে এবং ফলাফল গ্রেড করে। tests/eval/eval_config.yaml-এ কী পরিমাপ করতে হবে তা আপনিই ঠিক করেন।

ডেটাসেট দেখুন

Cloud Shell এডিটরে ডেটাসেট খুলুন:

cd ~/track-planner
cloudshell edit tests/eval/datasets/track_eval.json

ফাইলে eval_cases-এর তালিকা আছে। প্রতিটি কেসে একটি eval_case_id, একটি prompt (ব্যবহারকারী যা জিজ্ঞাসা করেন) এবং একটি reference (একটি ভালো উত্তর কেমন হয়) থাকে। LLM বিচারক রেফারেন্সের সাথে এজেন্টের উত্তর তুলনা করে।

eval_case_id

এটি কী পরীক্ষা করে দেখে

fe_001_tokyo_compliant

এমন একটি ভেন্যু যা প্রতিটি নিয়ম মেনে চলে এবং অনুমোদন পায়

fe_002_monaco_narrow

৬.৮ মিটারের চিকেন প্রস্থের নিয়ম লঙ্ঘন করে

fe_003_berlin_too_long

৪৩৫০ মিটারের সার্কিট দৈর্ঘ্যের নিয়ম পূরণ করে না

fe_004_missing_layers

একটি লেআউটে বাধ্যতামূলক CAD লেয়ার নেই

fe_005_low_regen

২৫০ কিলোওয়াট টার্গেটের নিচে ব্রেকিং জোন

fe_006_sao_paulo_medical

হাসপাতাল অ্যাক্সেস করার জন্য মেডিকেল CAD লেয়ার প্রয়োজন

fe_007_attack_mode

রেসিং লাইনে অ্যাটাক মোড জোন

fe_008_multiturn_remediation

মাল্টি-টার্ন কথোপকথন: মোনাকো বাতিল করা হয়েছে, ব্যবহারকারী সমাধান চেয়েছেন এবং সমাধান করা লেআউট অনুমোদন করা উচিত

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

একই ফোল্ডারে track_eval_quick.json-এর মধ্যে মাত্র দুটি কেস আছে: কেস ১ (একটি প্রশ্ন) এবং কেস ৮ (একটি কথোপকথন)। আপনি সেটি চালাবেন কারণ এটি দ্রুত এবং কম কোটা ব্যবহার করে।

মেট্রিক লিখুন

ডেটাসেট থেকে জানা যায় যে এজেন্টকে কী জিজ্ঞাসা করতে হবে। eval_config.yaml কীভাবে উত্তর স্কোর করতে হয় তা বলে। এজেন্ট প্রতিটি কেসের উত্তর দেওয়ার পরে agents-cli eval run সেটি পড়ে এবং প্রতিটি উত্তরের জন্য প্রতিটি মেট্রিক রান করে।

স্ক্যাফোল্ডের তৈরি করা ফাইলটি খুলুন:

cloudshell edit tests/eval/eval_config.yaml

এতে আগে থেকেই একটি জেনেরিক LLM জাজ (custom_response_quality) এবং একটি agent_turn_count মেট্রিক রয়েছে যা শুধুমাত্র টার্ন গণনা করে। যেকোনও এজেন্টের জন্য এটি একটি ভালো শুরু, তবে এটি Formula E সম্পর্কে কিছুই বলে না। আপনি বিচারক রাখবেন এবং একটি মেট্রিক যোগ করবেন যা এই ডোমেনের জন্য নির্দিষ্ট একটি নিয়ম চেক করে।

ভালো মূল্যায়নে সাধারণত দুই ধরনের মেট্রিক মেশানো থাকে:

ফাইলের ধরন

এটি কীভাবে স্কোর করে

এর জন্য ভাল

ট্রেড-অফ

LLM-as-a-judge

একটি মডেল উত্তর এবং কেসের reference পড়ে, তারপর ব্যাখ্যা সহ ১ থেকে ৫ পর্যন্ত স্কোর দেয়

অস্পষ্ট কোয়ালিটি: উত্তরটি কি সঠিক, সম্পূর্ণ এবং স্পষ্ট?

প্রতিটি কেসের জন্য একটি মডেল কল খরচ হয়; রান করার সময় স্কোর সামান্য আলাদা হতে পারে

কোড মেট্রিক

একটি ছোট Python ফাংশন উত্তর চেক করে দেখে

সঠিক, যাচাইযোগ্য তথ্য: উত্তরে কি এমন কিছু অন্তর্ভুক্ত ছিল যা সেখানে থাকতেই হবে?

আপনি কোডে যা প্রকাশ করতে পারেন তা শুধু চেক করে

ফাইলের কন্টেন্ট এর সাথে পরিবর্তন করুন:

metrics_to_run:
  - custom_response_quality
  - fia_cad_layer_compliance

custom_metrics:
  # LLM-as-a-judge. response_quality.py is generated by `agents-cli scaffold
  # create`; it grades the final answer against the case's `reference`.
  - name: custom_response_quality
    custom_function_file: response_quality.py

  # Deterministic code metric: an approved blueprint must name every
  # mandatory FIA CAD layer.
  - name: fia_cad_layer_compliance
    custom_function: |
      def evaluate(instance):
          response = str(instance.get("response") or "")
          reference = str(instance.get("reference") or "")
          # Only approvals must list every layer. Rejections and other
          # questions (such as Attack Mode) don't, so skip them.
          if "APPROVED" not in reference:
              return {"score": 1.0, "explanation": "Not an approval case."}
          required = [
              "F1_TRACK_CENTRELINE",
              "F1_PIT_ENTRY_SPEED_LIMIT_LANE",
              "F1_WALL_TEMP",
              "F1_TEC3",
          ]
          missing = [layer for layer in required if layer not in response]
          return {
              "score": round(1 - len(missing) / len(required), 2),
              "explanation": "Missing: " + (", ".join(missing) or "none"),
          }

প্রতিটি অংশের কাজ কী:

  • metrics_to_run রান করার জন্য মেট্রিকগুলি নাম অনুসারে তালিকাভুক্ত করে। এখানে কোনও নাম সরিয়ে দিলে, সেই মেট্রিক মুছে না গিয়ে বন্ধ হয়ে যায়।
  • custom_response_quality হল LLM বিচারক। tests/eval/response_quality.py-এ custom_function_file পয়েন্ট, যা স্ক্যাফোল্ড তৈরি করেছে। আপনি বিচার করার প্রম্পট দেখতে চাইলে এটি খুলুন।
  • fia_cad_layer_compliance হল আপনার কোড মেট্রিক, যা custom_function-এর অধীনে ইনলাইন লেখা আছে। প্রতিটি কেসের জন্য এটি একটি instance (প্রম্পট, এজেন্টের ফাইনাল response এবং reference) পায়। যেসব কেসে প্রত্যাশিত উত্তর হল অনুমোদন, সেখানে এটি চেক করে দেখে যে উত্তরে চারটি বাধ্যতামূলক CAD লেয়ারের নাম আছে কিনা এবং কোনওটি বাদ গেলে সেটি তালিকাভুক্ত করে। একটি ব্লুপ্রিন্ট যা F1_TEC3 বাদ দেয়, উদাহরণস্বরূপ, স্কোর ০.৭৫। অন্যান্য ক্ষেত্রে স্কোর ১.০, কারণ প্রত্যাখ্যান বা অ্যাটাক মোড উত্তরের ক্ষেত্রে প্রতিটি লেয়ারের তালিকা দেখানোর প্রয়োজন নেই।

CAD লেয়ার কেন চেক করবেন? অনুমোদিত ব্লুপ্রিন্ট থেকে বাধ্যতামূলক লেয়ার বাদ দিলে, সেটি পড়তে ভালো লাগলেও ভুল হিসেবে গণ্য করা হয় এবং LLM বিচারক সেটি উপেক্ষা করতে পারেন। কোড চেক করার সময় প্রতিবার একই নিয়ম একইভাবে প্রয়োগ করা হয়।

মূল্যায়ন রান করুন

আপনার দ্বিতীয় ট্যাবে লোকাল Gatekeeper চালু রাখুন, তারপর এটি রান করুন:

agents-cli eval run \
  --dataset tests/eval/datasets/track_eval_quick.json \
  --config tests/eval/eval_config.yaml \
  --concurrency 1
ls artifacts/grade_results/

মূল্যায়ন করতে কয়েক মিনিট সময় লাগে। প্রতিটি কেস সম্পূর্ণ মাল্টি-এজেন্ট ফ্লো রান করে, HIGH-এ লিড আর্কিটেক্টের সাথে প্রায় দশটি মডেল কল চিন্তা করে, তাই Step 1/2: eval generate হল ধীরগতির অংশ। এটি আটকে যায়নি।

এটি শেষ হলে, Cloud Shell Editor-এর মাধ্যমে artifacts/grade_results/-এ HTML রিপোর্ট খুলুন। fia_cad_layer_compliance-এর কম স্কোর থেকে বোঝা যায় যে লিড আর্কিটেক্টের চূড়ান্ত উত্তরে লেয়ার বাদ দেওয়া হচ্ছে। এর নির্দেশাবলী আরও কঠোর করে মূল্যায়ন আবার রান করে দেখুন।

৭. ৭. এজেন্ট রানটাইমে গেটকিপার ডিপ্লয় করুন

আপনি শুধু Gatekeeper ডিপ্লয় করেন। ট্র্যাক প্ল্যানার Cloud Shell-এ চলতে থাকে এবং এটিকে কল করে।

নতুন Cloud Shell ট্যাব খুলুন

ডিপ্লয় করতে ৫ থেকে ৮ মিনিট সময় লাগে, তাই ধাপ ৬-এর মূল্যায়ন শেষ হওয়ার সময় নতুন ট্যাবে এটি করুন:

  1. নতুন ট্যাব খুলুন (+) Cloud Shell টুলবারে ক্লিক করুন।
  2. নতুন ট্যাবে ২ নম্বর ধাপের ভেরিয়েবল থাকে না, তাই সেগুলি আবার সেট করুন:
    export GOOGLE_CLOUD_PROJECT="$(gcloud config get-value project)"
    export REGION="us-central1"
    export ASSETS="$HOME/devrel-demos/codelabs/formula-e-track-planner"
    export PATH="$HOME/.local/bin:$PATH"
    echo "Project: $GOOGLE_CLOUD_PROJECT  Region: $REGION"
    

আপনার দ্বিতীয় ট্যাবে লোকাল Gatekeeper চালু রাখুন: মূল্যায়ন এখনও এটি ব্যবহার করে এবং ডেপ্লয় করার জন্য এটি বন্ধ করার প্রয়োজন নেই।

ডিপ্লয় করুন

নতুন ট্যাবে, Gatekeeper ডিপ্লয় করুন। এটি প্রোজেক্টের Compute Engine ডিফল্ট পরিষেবা অ্যাকাউন্ট হিসেবে রান করে:

cd ~/gatekeeper
PROJECT_NUMBER=$(gcloud projects describe "$GOOGLE_CLOUD_PROJECT" --format="value(projectNumber)")
agents-cli deploy \
  --no-agent-identity \
  --service-account "${PROJECT_NUMBER}-compute@developer.gserviceaccount.com" \
  --project "$GOOGLE_CLOUD_PROJECT" \
  --region "$REGION" \
  --no-confirm-project

ডিপ্লয় করতে ৫ থেকে ৮ মিনিট সময় লাগে। Cloud Shell চলাকালীন ট্যাবটি বন্ধ করবেন না। লগ স্ট্রিম ডিসকানেক্ট হয়ে গেলে, agents-cli deploy --status-এর মাধ্যমে প্রগ্রেস চেক করুন। অপেক্ষা করার সময়, ধাপ ৬-এ ফিরে যান এবং আপনার মূল্যায়ন রিপোর্ট পড়ুন।

এজেন্টের পরিচয় যাচাই করুন

agents-cli, deployment_metadata.json-এ ডিপ্লয় করা রিসোর্স রেকর্ড করে:

export RUNTIME_ID=$(jq -r .remote_agent_runtime_id ~/gatekeeper/deployment_metadata.json)
echo "$RUNTIME_ID"

curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  "https://${REGION}-aiplatform.googleapis.com/v1beta1/${RUNTIME_ID}" \
  | jq -r .spec.effectiveIdentity

আউটপুটের দ্বিতীয় লাইন হল Gatekeeper-এর পরিচয়:

এর সাথে ডিপ্লয় করা হয়েছে

আউটপুটের উদাহরণ

পরিষেবা অ্যাকাউন্ট (ডিফল্ট)

123456789012-compute@developer.gserviceaccount.com

এজেন্টের পরিচয়

agents.global.org-.system.id.goog/resources/aiplatform/projects//locations/us-central1/reasoningEngines/

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

৮. ৮. A2A-এর মাধ্যমে ডিপ্লয় করা Gatekeeper-এর সাথে কানেক্ট করুন

এজেন্ট রানটাইম, যাচাই করা /api পাথের পিছনে গেটকিপারের তৈরি করা A2A রুট পরিবেশন করে।

৬ নম্বর ধাপের মূল্যায়ন সম্পূর্ণ হয়েছে কিনা তা নিশ্চিত করুন, তারপর আপনার দ্বিতীয় ট্যাবে (Ctrl+C) লোকাল Gatekeeper বন্ধ করুন। এখন থেকে ট্র্যাক প্ল্যানার ডিপ্লয় করা ট্র্যাককে কল করে। আপনার প্রথম ট্যাবে, ট্র্যাক প্ল্যানারকে এটির দিকে পয়েন্ট করুন:

export RUNTIME_ID=$(jq -r .remote_agent_runtime_id ~/gatekeeper/deployment_metadata.json)
: "${RUNTIME_ID:?No deployed Gatekeeper found. Complete Step 7 first.}"
cd ~/track-planner
echo "GATEKEEPER_A2A_URL=https://${REGION}-aiplatform.googleapis.com/reasoningEngines/v1/${RUNTIME_ID}/api/a2a/app" >> .env

ক্লায়েন্ট কেন তার টোকেন রিফ্রেশ করে

app/auth.py খুলুন। Google Cloud অ্যাক্সেস টোকেনের মেয়াদ এক ঘণ্টা পরে শেষ হয়ে যায়, তাই স্টার্টআপে নির্দিষ্ট Authorization হেডার সেট করা ক্লায়েন্ট এক ঘণ্টা পরে 401 Unauthorized-এর সাথে কাজ করা বন্ধ করে দেয়। GoogleAuthRefresh সাবক্লাস httpx.Auth এবং প্রতিটি অনুরোধে ক্রেডেনশিয়াল চেক করে, প্রয়োজন হলে সেগুলি রিফ্রেশ করে। create_remote_gatekeeper_agent() শুধুমাত্র https:// URL-এর জন্য এটি অ্যাটাচ করে।

এটি শুরু থেকে শেষ পর্যন্ত চালান

প্লেগ্রাউন্ড আবার চালু করুন যাতে এটি নতুন GATEKEEPER_A2A_URL বেছে নেয়:

agents-cli playground --port 8080

ওয়েব প্রিভিউ > পোর্ট ৮০৮০-তে প্রিভিউ বিকল্পে ক্লিক করুন, নতুন সেশন শুরু করুন এবং জিজ্ঞাসা করুন:

Assess the Monaco Harbour layout, widen the chicane to 11m, and get Gatekeeper approval.

ইভেন্টগুলি ধাপ ৫-এর মতোই দেখায়, তবে remote_gatekeeper কলটি এখন আপনার দ্বিতীয় ট্যাবের পরিবর্তে Agent Runtime-এ Gatekeeper-এ যায়।

এজেন্ট রানটাইমে কল আসতে দেখুন

অনুরোধটি সত্যিই A2A-এর মাধ্যমে ডিপ্লয় করা Gatekeeper-এ পৌঁছেছে কিনা তা প্রমাণ করুন:

  1. Cloud কনসোলে, এজেন্ট প্ল্যাটফর্ম সার্চ করুন, তারপর বাঁদিকের মেনুতে ডেপ্লয়মেন্ট খুলুন।
  2. gatekeeper বেছে নিন।
  3. সেশন ট্যাব খুলুন।

আপনি একটি নতুন সেশন দেখতে পাবেন যার ব্যবহারকারী আইডি A2A_USER_ দিয়ে শুরু হয়। আপনার ট্র্যাক প্ল্যানার কল করার সময় Gatekeeper-এর A2A সার্ভার এটি তৈরি করেছে। একই পৃষ্ঠায় ট্রেস ট্যাব খুলে Gatekeeper-এর মডেল কল এবং সেই অনুরোধের জন্য verify_infrastructure_checklist টুল কল দেখুন।

ঐচ্ছিক: ট্র্যাক প্ল্যানারও ডিপ্লয় করুন

এখনও পর্যন্ত ট্র্যাক প্ল্যানার Cloud Shell-এ রান করে, তাই Gatekeeper-এ এর A2A কল আপনার ক্রেডেনশিয়াল ব্যবহার করে। প্ল্যানারও ডিপ্লয় করুন এবং দুটি এজেন্টই এজেন্ট রানটাইমে রান করে, তাদের নিজস্ব ডিপ্লয় করা পরিচয়ের মাধ্যমে একে অপরকে কল করে।

প্লেগ্রাউন্ড বন্ধ করতে Ctrl+C প্রেস করুন, তারপর গেটকিপারের মতো একইভাবে প্ল্যানার ডিপ্লয় করুন:

cd ~/track-planner
PROJECT_NUMBER=$(gcloud projects describe "$GOOGLE_CLOUD_PROJECT" --format="value(projectNumber)")
agents-cli deploy \
  --no-agent-identity \
  --service-account "${PROJECT_NUMBER}-compute@developer.gserviceaccount.com" \
  --project "$GOOGLE_CLOUD_PROJECT" \
  --region "$REGION" \
  --no-confirm-project

দুটি এজেন্টই একই Compute Engine পরিষেবা অ্যাকাউন্ট হিসেবে রান করে। --service-account রাখুন: এটি ছাড়া, প্ল্যানার এজেন্ট রানটাইমের ডিফল্ট সার্ভিস এজেন্ট হিসেবে চলে এবং গেটকিপারকে কল করতে পারে না (ধাপ ৭-এ এই পরিষেবা অ্যাকাউন্ট কেন? দেখুন)।

কীভাবে ডিপ্লয় করা প্ল্যানার গেটকিপারের কাছে পৌঁছায়:

  • agents-cli deploy, .env-এর ভ্যালু ডেপ্লয়মেন্টে কপি করে, যাতে প্ল্যানার আপনার উপরে যোগ করা GATEKEEPER_A2A_URL পায়।
  • এজেন্ট রানটাইমের মধ্যে, app/auth.py-এ GoogleAuthRefresh আপনার পরিবর্তে প্ল্যানারের ডিপ্লয় করা পরিচয় বেছে নেয়।

ডিপ্লয় করতে ৫ থেকে ৮ মিনিট সময় লাগে। এটি শেষ হলে, প্ল্যানার কোন পরিচয় হিসেবে রান করে তা চেক করুন:

export PLANNER_ID=$(jq -r .remote_agent_runtime_id deployment_metadata.json)
curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  "https://${REGION}-aiplatform.googleapis.com/v1beta1/${PLANNER_ID}" \
  | jq -r .spec.effectiveIdentity

ডেপ্লয় করা সিস্টেম ব্যবহার করে দেখতে:

  1. Cloud কনসোলে, Agent Platform > ডেপ্লয়মেন্ট বিকল্পে ফিরে যান।
  2. ট্র্যাক-প্ল্যানার বেছে নিন এবং প্লেগ্রাউন্ড ট্যাব খুলুন।
  3. লিখুন:
    Design and homologate a Formula E circuit at Tokyo Bay.
    
  4. Gatekeeper-এর অনুমোদিত স্ট্যাটাস সহ ব্লুপ্রিন্টের জন্য অপেক্ষা করুন।
  5. ডেপ্লয়মেন্ট বিকল্পে ফিরে যান, গেটকিপার বেছে নিন এবং সেশন ট্যাব খুলুন। সবচেয়ে নতুন A2A_USER_ সেশনটি Cloud Shell থেকে নয়, ডিপ্লয় করা প্ল্যানার থেকে এসেছে।

পরবর্তী ধাপে আপনি যখন ক্লিন-আপ করবেন, তখন প্ল্যানারও মুছে দিন:

curl -X DELETE -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  "https://${REGION}-aiplatform.googleapis.com/v1beta1/${PLANNER_ID}?force=true"

৯. ৯. সমস্যার সমাধান করা ও মুছে ফেলা

সমস্যার সমাধান

সমস্যার উপসর্গ

এর সমাধান করুন

UREQ_TOS_NOT_ACCEPTED

Cloud কনসোলে পরিষেবার শর্তাবলীতে সম্মতি জানান, তারপর আবার চেষ্টা করুন।

প্রোজেক্ট হল (unset)

ধাপ ২-এ প্রোজেক্ট কমান্ডগুলি আবার রান করুন।

service account info is missing 'email' field

gcloud auth application-default login (ধাপ ২) রান করুন, তারপর চালু থাকা যেকোনও সার্ভার রিস্টার্ট করুন।

SKILL.md-এর জন্য FileNotFoundError

ধাপ ৪ সম্পূর্ণ করুন অথবা $ASSETS/solution/track-planner/.-কে ~/track-planner/-এ কপি করুন।

Connection refused থেকে localhost:8001

লোকাল Gatekeeper চালু করুন (ধাপ ৫) অথবা ডিপ্লয় করা Gatekeeper-এ GATEKEEPER_A2A_URL সেট করুন (ধাপ ৮)।

ডিপ্লয় করার সময় Permission 'resourcemanager.projects.setIamPolicy' denied

আপনার অ্যাকাউন্ট এজেন্ট আইডেন্টিটি ব্যবহার করতে পারবে না। ৭ নম্বর ধাপে ক্লিন-আপ বক্স অনুসরণ করুন, তারপর পরিষেবা অ্যাকাউন্ট ডেপ্লয় ব্যবহার করুন।

ডিপ্লয় করা ট্র্যাক প্ল্যানার গেটকিপার থেকে 403 Forbidden রিপোর্ট করে

প্ল্যানারের পরিচয় Gatekeeper-কে কল করার অনুমতি দেয় না। ৭ নম্বর ধাপের মতো --service-account দিয়ে অথবা আপনি প্রোজেক্টের মালিক হলে --agent-identity দিয়ে এটি আবার ডিপ্লয় করুন।

429 RESOURCE_EXHAUSTED

আপনি Gemini কোটায় পৌঁছে গেছেন। এক মিনিট অপেক্ষা করুন অথবা agents-cli eval run-এ --concurrency 1 --qps 2 যোগ করুন।

Address already in use

অন্য সার্ভার বন্ধ করুন অথবা অন্য --port বেছে নিন।

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

ডিপ্লয় করা Gatekeeper মুছে দিন যাতে এটি চলতে না থাকে:

export RUNTIME_ID=$(jq -r .remote_agent_runtime_id ~/gatekeeper/deployment_metadata.json)
: "${RUNTIME_ID:?No deployed Gatekeeper found.}"
curl -X DELETE -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  "https://${REGION}-aiplatform.googleapis.com/v1beta1/${RUNTIME_ID}?force=true"

আপনি যদি শুধু এই কোডল্যাবের জন্য কোনও প্রোজেক্ট তৈরি করে থাকেন, তাহলে এর পরিবর্তে আপনি পুরো প্রোজেক্টটি মুছে দিতে পারেন। আপনি কোনও ইভেন্টে থাকলে, আয়োজকরা অন্য কিছু না বলা পর্যন্ত আপনাকে যে প্রোজেক্ট দেওয়া হয়েছে সেটি রাখুন।

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

  • agents-cli scaffold create আপনাকে একটি স্ট্যান্ডার্ড, ডিপ্লয় করার উপযুক্ত ADK প্রোজেক্ট দেয়; আপনি শুধু এজেন্ট, স্কিল ও মূল্যায়ন লেখেন।
  • এজেন্টের প্রয়োজন না হওয়া পর্যন্ত এজেন্ট স্কিল ডোমেন নলেজকে প্রম্পটের বাইরে রাখে।
  • thinking_level আপনাকে প্রতিটি এজেন্টের জন্য স্পিডের পরিবর্তে রিজনিংয়ের গভীরতা বেছে নেওয়ার সুবিধা দেয়।
  • agents-cli eval run "এটি কি কাজ করে?" প্রশ্নটিকে এমন স্কোরে পরিণত করে যা আপনি ট্র্যাক করতে পারবেন।
  • Agent Identity ও A2A-এর মাধ্যমে স্বাধীনভাবে ডিপ্লয় করা এজেন্টরা একসাথে নিরাপদে কাজ করতে পারে।

আরও জানুন