১. সংক্ষিপ্ত বিবরণ
এআই এজেন্টগুলোর জনপ্রিয়তা দ্রুত বাড়ছে এবং লক্ষ্য অর্জনের জন্য স্বয়ংক্রিয়ভাবে কাজ করা, শেখা ও পরিবেশের সাথে মিথস্ক্রিয়া করার ক্ষমতার মাধ্যমে তারা কার্য স্বয়ংক্রিয়করণ ও সিদ্ধান্ত গ্রহণ ব্যবস্থায় বৈপ্লবিক পরিবর্তন আনছে।
কিন্তু ঠিক কীভাবে একটি এজেন্ট তৈরি করতে হয়? এই কোডল্যাবটি আপনাকে বিভিন্ন দেশের মুদ্রার মধ্যে রূপান্তর করতে সক্ষম একটি কারেন্সি এজেন্ট তৈরি করার পদ্ধতি দেখিয়ে কাজ শুরু করতে সাহায্য করবে। এরপর আপনি একটি ট্র্যাভেল এজেন্সি এজেন্ট তৈরি করবেন এবং সেটিকে কারেন্সি এজেন্টের সাথে সংযুক্ত করবেন। এর মূল লক্ষ্য হলো আপনাকে সর্বশেষ প্রযুক্তিগুলোর সাথে পরিচয় করিয়ে দেওয়া, যাতে আপনি ইন্টারনেটে প্রচলিত কিছু সংক্ষিপ্ত রূপ (যেমন MCP, ADK, A2A) বুঝতে পারেন এবং দেখতে পারেন যে সেগুলো কীভাবে একসাথে কাজ করে।

মডেল প্রসঙ্গ প্রোটোকল (MCP)
মডেল কনটেক্সট প্রোটোকল (MCP) একটি উন্মুক্ত প্রোটোকল যা অ্যাপ্লিকেশনগুলো কীভাবে এলএলএম-কে কনটেক্সট প্রদান করে, তার একটি মান নির্ধারণ করে। MCP এআই মডেলগুলোকে রিসোর্স, প্রম্পট এবং টুলের সাথে সংযুক্ত করার একটি মানসম্মত উপায় প্রদান করে।
এজেন্ট ডেভেলপমেন্ট কিট (ADK)
এজেন্ট ডেভেলপমেন্ট কিট (ADK) হলো এআই এজেন্ট তৈরি এবং স্থাপন করার জন্য একটি নমনীয় অর্কেস্ট্রেশন ফ্রেমওয়ার্ক। ADK মডেল-নিরপেক্ষ, স্থাপন-নিরপেক্ষ এবং অন্যান্য ফ্রেমওয়ার্কের সাথে সামঞ্জস্যপূর্ণ করে তৈরি করা হয়েছে। ADK-কে এমনভাবে ডিজাইন করা হয়েছে যাতে এজেন্ট ডেভেলপমেন্ট প্রক্রিয়াটি সফটওয়্যার ডেভেলপমেন্টের মতো মনে হয় এবং ডেভেলপাররা সাধারণ কাজ থেকে শুরু করে জটিল ওয়ার্কফ্লো পর্যন্ত বিভিন্ন ধরনের এজেন্টিক আর্কিটেকচার সহজে তৈরি, স্থাপন এবং অর্কেস্ট্রেট করতে পারেন।
এজেন্ট২এজেন্ট (এ২এ) প্রোটোকল
এজেন্টটুএজেন্ট (A2A) প্রোটোকল হলো একটি উন্মুক্ত স্ট্যান্ডার্ড, যা এআই এজেন্টদের মধ্যে নির্বিঘ্ন যোগাযোগ এবং সহযোগিতা সক্ষম করার জন্য ডিজাইন করা হয়েছে। ঠিক যেমনভাবে এমসিপি (MCP) এলএলএম-দের ডেটা এবং টুলস ব্যবহারের সুযোগ দেওয়ার জন্য একটি প্রমিত পদ্ধতি প্রদান করে, তেমনি এ২এ (A2A) এজেন্টদের একে অপরের সাথে কথা বলার জন্য একটি প্রমিত পদ্ধতি প্রদান করে! এমন এক বিশ্বে যেখানে এজেন্টরা বিভিন্ন ফ্রেমওয়ার্ক ব্যবহার করে এবং ভিন্ন ভিন্ন বিক্রেতাদের দ্বারা নির্মিত হয়, সেখানে এ২এ একটি সাধারণ ভাষা প্রদান করে, যা বিভাজন ভেঙে দেয় এবং আন্তঃকার্যক্ষমতা বৃদ্ধি করে।
আপনি যা শিখবেন
- কীভাবে একটি স্থানীয় এমসিপি সার্ভার তৈরি করবেন
- ক্লাউড রানে এমসিপি সার্ভার স্থাপন করা হচ্ছে
- এজেন্ট ডেভেলপমেন্ট কিট ব্যবহার করে কীভাবে MCP টুলস দিয়ে একটি এজেন্ট তৈরি করবেন
- কীভাবে একটি ADK এজেন্টকে A2A সার্ভার হিসেবে প্রকাশ করা যায়
- একটি A2A ক্লায়েন্ট ব্যবহার করে A2A সার্ভার পরীক্ষা করা হচ্ছে
- A2A প্রোটোকলের মাধ্যমে অন্য এজেন্টের সাথে যোগাযোগের জন্য কীভাবে একটি এজেন্ট তৈরি করবেন
আপনার যা যা লাগবে
- ক্রোম বা ফায়ারফক্সের মতো একটি ব্রাউজার
- বিলিং সক্ষম একটি গুগল ক্লাউড প্রজেক্ট।
২. শুরু করার আগে
একটি প্রকল্প তৈরি করুন
আপনার যদি কোনো গুগল ক্লাউড প্রজেক্ট না থাকে, তাহলে একটি তৈরি করুন।
গুগল ক্লাউড কনসোলের প্রজেক্ট সিলেক্টর পেজে, একটি গুগল ক্লাউড প্রজেক্ট নির্বাচন করুন বা তৈরি করুন।
এছাড়াও নিশ্চিত করুন যে আপনার ক্লাউড প্রজেক্টের জন্য বিলিং চালু আছে। কোনো প্রজেক্টে বিলিং চালু আছে কিনা তা কীভাবে পরীক্ষা করবেন তা জানুন।
ক্লাউড শেল সক্রিয় করুন
গুগল ক্লাউড শেল হলো একটি ইন্টারেক্টিভ, ব্রাউজার-ভিত্তিক ডেভেলপমেন্ট এনভায়রনমেন্ট যা সরাসরি গুগল ক্লাউড কনসোলের মধ্যেই পাওয়া যায়। স্থানীয়ভাবে কোনো টুল ইনস্টল করার প্রয়োজন ছাড়াই গুগল ক্লাউডের সাথে কাজ শুরু করার এটিই সবচেয়ে সহজ উপায়।
এই লিঙ্কে ক্লিক করে ক্লাউড শেল সক্রিয় করুন। ক্লাউড শেল থেকে সংশ্লিষ্ট বোতামে ক্লিক করে আপনি ক্লাউড শেল টার্মিনাল (ক্লাউড কমান্ড চালানোর জন্য) এবং এডিটর (প্রজেক্ট তৈরির জন্য) এর মধ্যে পরিবর্তন করতে পারবেন।
ক্লাউড শেলে সংযুক্ত হওয়ার পর, আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করে যাচাই করে নিন যে আপনি ইতিমধ্যেই প্রমাণীকৃত এবং প্রজেক্টটি আপনার প্রজেক্ট আইডিতে সেট করা আছে:
gcloud auth list
gcloud কমান্ডটি আপনার প্রজেক্ট সম্পর্কে অবগত আছে কিনা, তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান।
gcloud config list project
আপনার প্রজেক্ট সেট করতে নিম্নলিখিত কমান্ডটি ব্যবহার করুন:
export PROJECT_ID=<YOUR_PROJECT_ID>
gcloud config set project $PROJECT_ID
ক্লাউড এপিআই সক্ষম করুন
নিম্নলিখিত কমান্ডটি ব্যবহার করে প্রয়োজনীয় API-গুলো সক্রিয় করুন। এতে কয়েক মিনিট সময় লাগতে পারে।
gcloud services enable cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
run.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com \
aiplatform.googleapis.com \
compute.googleapis.com
gcloud কমান্ড ও তার ব্যবহারবিধি জানতে ডকুমেন্টেশন দেখুন।
কোডটি নিন
রিপোজিটরিটি ক্লোন করুন:
git clone https://github.com/jackwotherspoon/currency-agent.git
cd currency-agent
uv ডিপেন্ডেন্সি ম্যানেজ করতে ব্যবহৃত হয় এবং এটি ক্লাউড শেলে আগে থেকেই ইনস্টল করা থাকে, কিন্তু আপনি যদি কোডল্যাবটি লোকালি চালান, তাহলে এটি নিম্নোক্তভাবে ইনস্টল করতে পারেন:
# macOS and Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows (uncomment below line)
# powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
একটি .env ফাইলের মাধ্যমে এনভায়রনমেন্ট ভেরিয়েবল কনফিগার করতে নিম্নলিখিত কমান্ডটি চালান:
echo "GOOGLE_GENAI_USE_ENTERPRISE=TRUE" >> .env \
&& echo "GOOGLE_CLOUD_PROJECT=$PROJECT_ID" >> .env \
&& echo "GOOGLE_CLOUD_LOCATION=global" >> .env
৩. একটি স্থানীয় এমসিপি সার্ভার তৈরি করুন
আপনার কারেন্সি এজেন্ট পরিচালনা শুরু করার আগে, আপনাকে প্রথমে একটি এমসিপি (MCP) সার্ভার তৈরি করতে হবে, যা আপনার এজেন্টের প্রয়োজনীয় টুলগুলো সরবরাহ করবে।
একটি এমসিপি সার্ভার আপনাকে নির্দিষ্ট সক্ষমতা (যেমন মুদ্রা বিনিময় হার সংগ্রহ করা) টুল হিসাবে প্রকাশ করার জন্য হালকা প্রোগ্রাম লিখতে দেয়। এরপর একটি এজেন্ট বা এমনকি একাধিক এজেন্ট প্রমিত মডেল কনটেক্সট প্রোটোকল (এমসিপি) ব্যবহার করে এই টুলগুলি অ্যাক্সেস করতে পারে।
FastMCP পাইথন প্যাকেজটি ব্যবহার করে একটি MCP সার্ভার তৈরি করা যায়, যা get_exchange_rate নামক একটিমাত্র টুল সরবরাহ করে। এই get_exchange_rate টুলটি দুটি মুদ্রার মধ্যে বর্তমান বিনিময় হার জানার জন্য ইন্টারনেটের মাধ্যমে ফ্রাঙ্কফুর্টার এপিআই -তে একটি কল করে।
MCP সার্ভারের কোডটি mcp-server/server.py ফাইলে পাওয়া যাবে:
import logging
import os
import httpx
from fastmcp import FastMCP
# Set up logging
logger = logging.getLogger(__name__)
logging.basicConfig(format="[%(levelname)s]: %(message)s", level=logging.INFO)
mcp = FastMCP("Currency MCP Server 💵")
@mcp.tool()
def get_exchange_rate(
currency_from: str = 'USD',
currency_to: str = 'EUR',
currency_date: str = 'latest',
):
"""Use this to get current exchange rate.
Args:
currency_from: The currency to convert from (e.g., "USD").
currency_to: The currency to convert to (e.g., "EUR").
currency_date: The date for the exchange rate or "latest". Defaults to "latest".
Returns:
A dictionary containing the exchange rate data, or an error message if the request fails.
"""
logger.info(f"--- 🛠️ Tool: get_exchange_rate called for converting {currency_from} to {currency_to} ---")
try:
response = httpx.get(
f'https://api.frankfurter.app/{currency_date}',
params={'from': currency_from, 'to': currency_to},
)
response.raise_for_status()
data = response.json()
if 'rates' not in data:
return {'error': 'Invalid API response format.'}
logger.info(f'✅ API response: {data}')
return data
except httpx.HTTPError as e:
return {'error': f'API request failed: {e}'}
except ValueError:
return {'error': 'Invalid JSON response from API.'}
if __name__ == "__main__":
logger.info(f"🚀 MCP server started on port {os.getenv('PORT', 8080)}")
# Could also use 'sse' transport, host="0.0.0.0" required for Cloud Run.
asyncio.run(
mcp.run_async(
transport="http",
host="0.0.0.0",
port=os.getenv("PORT", 8080),
)
)
স্থানীয়ভাবে MCP সার্ভার চালু করতে, একটি টার্মিনাল খুলুন এবং নিম্নলিখিত কমান্ডটি চালান (সার্ভারটি http://localhost:8080 এ চালু হবে):
uv run mcp-server/server.py
পরীক্ষা করে দেখুন যে MCP সার্ভারটি সঠিকভাবে কাজ করছে এবং মডেল কনটেক্সট প্রোটোকল ব্যবহার করে get_exchange_rate টুলটি অ্যাক্সেসযোগ্য।
একটি নতুন টার্মিনাল উইন্ডোতে (যাতে স্থানীয় MCP সার্ভারটি বন্ধ না হয়) নিম্নলিখিত কমান্ডটি চালান:
uv run mcp-server/test_server.py
আপনি ১ মার্কিন ডলার (USD) থেকে ইউরো (EUR)-এর বর্তমান বিনিময় হার দেখতে পাবেন:
--- 🛠️ Tool found: get_exchange_rate ---
--- 🪛 Calling get_exchange_rate tool for USD to EUR ---
--- ✅ Success: {
"amount": 1.0,
"base": "USD",
"date": "2025-05-26",
"rates": {
"EUR": 0.87866
}
} ---
চমৎকার! আপনি সফলভাবে একটি কার্যকরী এমসিপি সার্ভার তৈরি করেছেন, যার সাথে এমন একটি টুলও রয়েছে যা আপনার এজেন্ট অ্যাক্সেস করতে পারবে।
পরবর্তী স্টেশনে যাওয়ার আগে, যে টার্মিনালে আপনি MCP সার্ভারটি চালু করেছিলেন, সেখানে Ctrl+C (অথবা Mac-এ Command+C ) চেপে সেটি বন্ধ করুন।
৪. আপনার এমসিপি সার্ভারটি ক্লাউড রান-এ স্থাপন করুন।
এখন আপনি ক্লাউড রান-এ এমসিপি সার্ভারটিকে একটি রিমোট এমসিপি সার্ভার হিসেবে ডেপ্লয় করার জন্য প্রস্তুত 🚀☁️
দূর থেকে এমসিপি সার্ভার চালানোর সুবিধা
ক্লাউড রানে দূরবর্তীভাবে একটি এমসিপি সার্ভার চালানোর বেশ কিছু সুবিধা পাওয়া যেতে পারে:
- 📈স্কেলেবিলিটি : ক্লাউড রান সমস্ত আগত অনুরোধ সামাল দেওয়ার জন্য দ্রুত স্কেল আউট করতে তৈরি করা হয়েছে। ক্লাউড রান চাহিদার উপর ভিত্তি করে আপনার এমসিপি সার্ভারকে স্বয়ংক্রিয়ভাবে স্কেল করবে।
- 👥কেন্দ্রীভূত সার্ভার : আপনি IAM প্রিভিলেজের মাধ্যমে টিমের সদস্যদের সাথে একটি কেন্দ্রীভূত MCP সার্ভারের অ্যাক্সেস শেয়ার করতে পারেন, যার ফলে তারা প্রত্যেকে স্থানীয়ভাবে নিজস্ব সার্ভার চালানোর পরিবর্তে তাদের লোকাল মেশিন থেকেই এতে সংযোগ করতে পারে। MCP সার্ভারে কোনো পরিবর্তন করা হলে, টিমের সকল সদস্যই এর সুবিধা পাবে।
- 🔐নিরাপত্তা : ক্লাউড রান প্রমাণীকৃত অনুরোধ বাধ্যতামূলক করার একটি সহজ উপায় প্রদান করে। এটি আপনার MCP সার্ভারে শুধুমাত্র সুরক্ষিত সংযোগের অনুমতি দেয়, যা অননুমোদিত প্রবেশ প্রতিরোধ করে।
mcp-server ডিরেক্টরিতে প্রবেশ করুন:
cd mcp-server
ক্লাউড রান-এ এমসিপি সার্ভারটি স্থাপন করুন:
gcloud run deploy mcp-server --no-allow-unauthenticated --region=us-central1 --source .
আপনার পরিষেবাটি সফলভাবে স্থাপন করা হলে আপনি নিম্নলিখিতের মতো একটি বার্তা দেখতে পাবেন:
Service [mcp-server] revision [mcp-server-12345-abc] has been deployed and is serving 100 percent of traffic.
এমসিপি ক্লায়েন্টদের প্রমাণীকরণ
যেহেতু আপনি প্রমাণীকরণ বাধ্যতামূলক করার জন্য --no-allow-unauthenticated নির্দিষ্ট করেছেন, তাই রিমোট MCP সার্ভারে সংযোগকারী যেকোনো MCP ক্লায়েন্টকে প্রমাণীকরণ করতে হবে।
আপনি আপনার এমসিপি ক্লায়েন্টটি কোথায় চালাচ্ছেন তার উপর নির্ভর করে , ক্লাউড রানে এমসিপি সার্ভার হোস্ট করার অফিসিয়াল ডকুমেন্টেশনে এই বিষয়ে আরও তথ্য দেওয়া আছে।
আপনার স্থানীয় মেশিনে রিমোট এমসিপি সার্ভারের সাথে একটি প্রমাণীকৃত টানেল তৈরি করতে ক্লাউড রান প্রক্সি চালাতে হবে।
ডিফল্টরূপে, ক্লাউড রান পরিষেবাগুলির URL-এর জন্য সমস্ত অনুরোধকে ক্লাউড রান ইনভোকার ( roles/run.invoker ) IAM রোল দ্বারা অনুমোদিত হতে হয়। এই IAM পলিসি বাইন্ডিং নিশ্চিত করে যে আপনার স্থানীয় MCP ক্লায়েন্টকে প্রমাণীকরণের জন্য একটি শক্তিশালী নিরাপত্তা ব্যবস্থা ব্যবহার করা হয়।
আপনাকে নিশ্চিত করতে হবে যে, আপনি বা আপনার দলের যে কোনো সদস্য যারা রিমোট এমসিপি সার্ভার অ্যাক্সেস করার চেষ্টা করছেন, তাদের আইএএম প্রিন্সিপালের (গুগল ক্লাউড অ্যাকাউন্ট) সাথে roles/run.invoker আইএএম রোলটি সংযুক্ত আছে।
gcloud run services proxy mcp-server --region=us-central1
আপনি নিম্নলিখিত আউটপুট দেখতে পাবেন:
Proxying to Cloud Run service [mcp-server] in project [<YOUR_PROJECT_ID>] region [us-central1]
http://127.0.0.1:8080 proxies to https://mcp-server-abcdefgh-uc.a.run.app
এখন থেকে http://127.0.0.1:8080 এ আসা সমস্ত ট্র্যাফিক প্রমাণীকরণ করা হবে এবং রিমোট এমসিপি সার্ভারে পাঠানো হবে।
রিমোট এমসিপি সার্ভার পরীক্ষা করুন
একটি নতুন টার্মিনালে , রুট ফোল্ডারে ফিরে যান এবং রিমোট এমসিপি সার্ভারটি কাজ করছে কিনা তা নিশ্চিত করতে mcp-server/test_server.py ফাইলটি পুনরায় চালান।
cd ..
uv run mcp-server/test_server.py
স্থানীয়ভাবে সার্ভারটি চালানোর সময় আপনি যে আউটপুট পেয়েছিলেন, তার অনুরূপ একটি আউটপুট দেখতে পাবেন:
--- 🛠️ Tool found: get_exchange_rate ---
--- 🪛 Calling get_exchange_rate tool for USD to EUR ---
--- ✅ Success: {
"amount": 1.0,
"base": "USD",
"date": "2025-05-26",
"rates": {
"EUR": 0.87866
}
} ---
রিমোট সার্ভারটি সত্যিই কল করা হয়েছিল কিনা, তা যাচাই করার জন্য আপনি ডেপ্লয় করা ক্লাউড রান এমসিপি সার্ভারের লগগুলো কোয়েরি করতে পারেন:
gcloud run services logs read mcp-server --region us-central1 --limit 5
লগগুলিতে আপনি নিম্নলিখিত আউটপুট দেখতে পাবেন:
2025-06-04 14:28:29,871 [INFO]: --- 🛠️ Tool: get_exchange_rate called for converting USD to EUR ---
2025-06-04 14:28:30,610 [INFO]: HTTP Request: GET https://api.frankfurter.app/latest?from=USD&to=EUR "HTTP/1.1 200 OK"
2025-06-04 14:28:30,611 [INFO]: ✅ API response: {'amount': 1.0, 'base': 'USD', 'date': '2025-06-03', 'rates': {'EUR': 0.87827}}
এখন যেহেতু আপনার একটি রিমোট এমসিপি সার্ভার আছে, আপনি এজেন্ট তৈরির দিকে এগিয়ে যেতে পারেন! 🤖
৫. ADK দিয়ে একটি এজেন্ট তৈরি করুন
আপনার একটি এমসিপি সার্ভার ডেপ্লয় করা আছে, এখন এজেন্ট ডেভেলপমেন্ট কিট (ADK) ব্যবহার করে কারেন্সি এজেন্ট তৈরি করার সময় এসেছে।
ADK এজেন্ট তৈরি করাকে অত্যন্ত সহজ করে তোলে এবং MCP টুলসের জন্য অন্তর্নির্মিত সমর্থনের মাধ্যমে সেগুলোকে MCP সার্ভারের সাথে সংযোগ স্থাপন করতে দেয়। কারেন্সি এজেন্টটি ADK-এর MCPToolset ক্লাস ব্যবহার করে get_exchange_rate টুলটি অ্যাক্সেস করবে।
কারেন্সি এজেন্টের কোডটি currency_agent/agent.py তে অবস্থিত:
import logging
import os
from dotenv import load_dotenv
from google.adk.agents import LlmAgent
from google.adk.a2a.utils.agent_to_a2a import to_a2a
from google.adk.tools.mcp_tool import MCPToolset, StreamableHTTPConnectionParams
logger = logging.getLogger(__name__)
logging.basicConfig(format="[%(levelname)s]: %(message)s", level=logging.INFO)
load_dotenv()
SYSTEM_INSTRUCTION = (
"You are a specialized assistant for currency conversions. "
"Your sole purpose is to use the 'get_exchange_rate' tool to answer questions about currency exchange rates. "
"If the user asks about anything other than currency conversion or exchange rates, "
"politely state that you cannot help with that topic and can only assist with currency-related queries. "
"Do not attempt to answer unrelated questions or use tools for other purposes."
)
logger.info("--- 🔧 Loading MCP tools from MCP Server... ---")
logger.info("--- 🤖 Creating ADK Currency Agent... ---")
root_agent = LlmAgent(
model="gemini-3.7-flash",
name="currency_agent",
description="An agent that can help with currency conversions",
instruction=SYSTEM_INSTRUCTION,
tools=[
MCPToolset(
connection_params=StreamableHTTPConnectionParams(
url=os.getenv("MCP_SERVER_URL", "http://localhost:8080/mcp")
)
)
],
)
কারেন্সি এজেন্টটি দ্রুত পরীক্ষা করার জন্য আপনি ADK-এর ডেভ UI ব্যবহার করতে পারেন, যা adk web কমান্ডটি চালিয়ে অ্যাক্সেস করা যায়।
uv run adk web --allow_origins "regex:https://.*\.cloudshell\.dev"
ব্রাউজারে http://localhost:8000 এ গিয়ে এজেন্টটি দেখুন ও পরীক্ষা করুন!
ওয়েব UI-এর উপরের বাম কোণায় এজেন্ট হিসেবে currency_agent নির্বাচিত আছে কিনা, তা নিশ্চিত করুন।

চ্যাট এরিয়াতে আপনার এজেন্টকে "২৫০ CAD এর পরিবর্তে USD কত?" এর মতো কিছু জিজ্ঞাসা করুন। উত্তর দেওয়ার আগে এজেন্টকে আমাদের get_exchange_rate MCP টুলটি কল করতে দেখবেন।

এজেন্টটি কাজ করে! এটি মুদ্রা রূপান্তর 💸 সংক্রান্ত কোয়েরিগুলো সামলাতে পারে।
৬. এজেন্ট২এজেন্ট (এ২এ) প্রোটোকল
এজেন্ট২এজেন্ট (A2A) প্রোটোকল হলো একটি উন্মুক্ত মান, যা এআই এজেন্টদের মধ্যে নির্বিঘ্ন যোগাযোগ ও সহযোগিতা সক্ষম করার জন্য ডিজাইন করা হয়েছে। এটি বিভিন্ন ফ্রেমওয়ার্ক ব্যবহার করে এবং ভিন্ন ভিন্ন বিক্রেতা দ্বারা নির্মিত এজেন্টদের একটি সাধারণ ভাষায় একে অপরের সাথে যোগাযোগ করতে দেয়, যা বিভেদ দূর করে এবং আন্তঃকার্যক্ষমতা বৃদ্ধি করে।

A2A এজেন্টদের নিম্নলিখিত কাজগুলো করার সুযোগ দেয়:
- আবিষ্কার করুন: প্রমিত এজেন্ট কার্ড ব্যবহার করে অন্যান্য এজেন্টদের খুঁজুন এবং তাদের দক্ষতা ( AgentSkill ) ও সক্ষমতা ( AgentCapabilities ) সম্পর্কে জানুন।
- যোগাযোগ করুন: নিরাপদে বার্তা ও তথ্য আদান-প্রদান করুন।
- সহযোগিতা করুন: জটিল লক্ষ্য অর্জনের জন্য দায়িত্ব অর্পণ করুন এবং কার্যক্রমের সমন্বয় সাধন করুন।
A2A প্রোটোকল "এজেন্ট কার্ড"-এর মতো ব্যবস্থার মাধ্যমে এই যোগাযোগকে সহজ করে তোলে, যা ডিজিটাল বিজনেস কার্ড হিসেবে কাজ করে এবং এজেন্টরা তাদের সক্ষমতা ও সংযোগের তথ্য প্রচারের জন্য এটি ব্যবহার করতে পারে।

এখন A2A ব্যবহার করে কারেন্সি এজেন্টটিকে উন্মুক্ত করার সময় এসেছে, যাতে অন্যান্য এজেন্ট ও ক্লায়েন্টরা এটিকে কল করতে পারে।
A2A পাইথন এসডিকে
A2A পাইথন SDK উপরে উল্লিখিত প্রতিটি রিসোর্সের জন্য— AgentSkill , AgentCapabilities এবং AgentCard— Pydantic মডেল প্রদান করে। এটি A2A প্রোটোকলের সাথে উন্নয়ন এবং একীকরণকে ত্বরান্বিত করার জন্য একটি ইন্টারফেস প্রদান করে।
একটি AgentSkill মাধ্যমে আপনি অন্যান্য এজেন্টদের কাছে প্রচার করবেন যে কারেন্সি এজেন্টের কাছে get_exchange_rate করার একটি টুল আছে।
# A2A Agent Skill definition
skill = AgentSkill(
id='get_exchange_rate',
name='Currency Exchange Rates Tool',
description='Helps with exchange values between various currencies',
tags=['currency conversion', 'currency exchange'],
examples=['What is exchange rate between USD and GBP?'],
)
তারপর AgentCard অংশ হিসেবে এটি এজেন্টের দক্ষতা ও সক্ষমতার তালিকার পাশাপাশি এজেন্টটি যে ইনপুট ও আউটপুট মোডগুলো পরিচালনা করতে পারে, সেগুলোর মতো অতিরিক্ত বিবরণও তালিকাভুক্ত করবে:
# A2A Agent Card definition
agent_card = AgentCard(
name='Currency Agent',
description='Helps with exchange rates for currencies',
url=f'http://{host}:{port}/',
version='1.0.0',
defaultInputModes=["text"],
defaultOutputModes=["text"],
capabilities=AgentCapabilities(streaming=True),
skills=[skill],
)
কারেন্সি এজেন্টের সাথে সবকিছু একত্রিত করে A2A-এর শক্তি প্রদর্শনের সময় এসে গেছে!
৭. কারেন্সি এজেন্টকে A2A সার্ভার হিসেবে প্রকাশ করুন
ADK আপনার জন্য A2A প্রোটোকল ব্যবহার করে এজেন্ট তৈরি এবং সংযোগ করার প্রক্রিয়াকে সহজ করে তোলে। একটি বিদ্যমান ADK এজেন্টকে A2A সার্ভার হিসাবে অ্যাক্সেসযোগ্য (এক্সপোজ) করার কাজটি ADK-এর to_a2a(root_agent) ফাংশনের মাধ্যমে করা হয় (সম্পূর্ণ বিবরণের জন্য ADK ডকুমেন্টেশন দেখুন)।
` to_a2a ফাংশনটি একটি বিদ্যমান এজেন্টকে A2A-এর সাথে কাজ করার জন্য রূপান্তর করে এবং এটিকে uvicorn মাধ্যমে একটি সার্ভার হিসাবে প্রকাশ করতে সক্ষম করে। এর মানে হলো, আপনি যদি আপনার এজেন্টকে প্রোডাকশনাইজ করার পরিকল্পনা করেন, তবে আপনি কী প্রকাশ করতে চান তার উপর আপনার আরও কঠোর নিয়ন্ত্রণ থাকবে। ` to_a2a() ফাংশনটি নেপথ্যে A2A পাইথন SDK ব্যবহার করে আপনার এজেন্ট কোডের উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে একটি এজেন্ট কার্ড তৈরি করে।
currency_agent/agent.py ফাইলটির ভেতরে তাকালেই আপনি to_a2a এর ব্যবহার দেখতে পাবেন এবং কীভাবে মাত্র দুটি কোডের লাইনের মাধ্যমে কারেন্সি এজেন্টকে একটি A2A সার্ভার হিসেবে উন্মুক্ত করা হয়েছে তাও জানতে পারবেন!
from google.adk.a2a.utils.agent_to_a2a import to_a2a
# ... see file for full code
# Make the agent A2A-compatible
a2a_app = to_a2a(root_agent, port=10000)
A2A সার্ভারটি চালু করতে, একটি নতুন টার্মিনালে নিম্নলিখিত কমান্ডটি চালান:
uv run uvicorn currency_agent.agent:a2a_app --host localhost --port 10000
সার্ভার সফলভাবে চালু হলে, আউটপুটটি নিম্নরূপ দেখাবে, যা নির্দেশ করে যে এটি 10000 পোর্টে চলছে:
[INFO]: --- 🔧 Loading MCP tools from MCP Server... ---
[INFO]: --- 🤖 Creating ADK Currency Agent... ---
INFO: Started server process [45824]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://localhost:10000 (Press CTRL+C to quit)
কারেন্সি এজেন্টটি এখন সফলভাবে একটি A2A সার্ভার হিসেবে চলছে এবং A2A প্রোটোকল ব্যবহার করে অন্যান্য এজেন্ট বা ক্লায়েন্ট এটিকে কল করতে পারে!
রিমোট এজেন্টটি চালু আছে কিনা যাচাই করুন
to_a2a() ফাংশন দ্বারা স্বয়ংক্রিয়ভাবে তৈরি হওয়া কারেন্সি এজেন্টের এজেন্ট কার্ড URL-এ গিয়ে আপনি আপনার এজেন্টটি চালু আছে কিনা তা পুনরায় যাচাই করতে পারেন।
আপনার ব্রাউজারে http://localhost:10000/.well-known/agent-card.json- এ যান।
আপনাকে নিম্নলিখিত এজেন্ট কার্ডটি দেখতে হবে:
{
"capabilities": {
},
"defaultInputModes": [
"text/plain"
],
"defaultOutputModes": [
"text/plain"
],
"description": "An agent that can help with currency conversions",
"name": "currency_agent",
"preferredTransport": "JSONRPC",
"protocolVersion": "0.3.0",
"skills": [
{
"description": "An agent that can help with currency conversions I am a specialized assistant for currency conversions. my sole purpose is to use the 'get_exchange_rate' tool to answer questions about currency exchange rates. If the user asks about anything other than currency conversion or exchange rates, politely state that I cannot help with that topic and can only assist with currency-related queries. Do not attempt to answer unrelated questions or use tools for other purposes.",
"id": "currency_agent",
"name": "model",
"tags": [
"llm"
]
},
{
"description": "Use this to get current exchange rate.\n\nArgs:\n currency_from: The currency to convert from (e.g., \"USD\").\n currency_to: The currency to convert to (e.g., \"EUR\").\n currency_date: The date for the exchange rate or \"latest\". Defaults to \"latest\".\n\nReturns:\n A dictionary containing the exchange rate data, or an error message if the request fails.",
"id": "currency_agent-get_exchange_rate",
"name": "get_exchange_rate",
"tags": [
"llm",
"tools"
]
}
],
"supportsAuthenticatedExtendedCard": false,
"url": "http://localhost:10000",
"version": "0.0.1"
}
A2A সার্ভার পরীক্ষা করুন
এখন আপনি A2A ব্যবহার করে সার্ভারটিতে কিছু অনুরোধ পাঠিয়ে তা পরীক্ষা করতে পারেন!
A2A পাইথন SDK-তে একটি a2a.client.Client ক্লাস রয়েছে যা আপনার জন্য এই কাজটি সহজ করে দেয়।
currency_agent/test_a2aclient.py ফাইলটিতে এমন কোড রয়েছে যা দেখায় কীভাবে এজেন্ট কার্ডটি সংগ্রহ করতে হয় এবং A2A সার্ভারে একটি বার্তা পাঠাতে হয়।
# ... see file for full code
async def get_agent_card():
"""Get the agent card."""
print(f"🔄 Fetching the agent card at {AGENT_URL}")
async with httpx.AsyncClient() as httpx_client:
resolver = A2ACardResolver(
httpx_client=httpx_client,
base_url=AGENT_URL,
)
public_agent_card = await resolver.get_agent_card()
print("✅ Successfully fetched the agent card")
return public_agent_card
async def send_message(text_query: str) -> None:
"""
Send a text query to the agent and print the response.
"""
public_agent_card = await get_agent_card()
print("🔄 Initializing a non-streaming client")
config = ClientConfig(streaming=False)
client = await create_client(agent=public_agent_card, client_config=config)
message = new_text_message(text_query, role=Role.ROLE_USER)
print("Sending request:")
request = SendMessageRequest(message=message)
print(request)
print("Response:")
async for chunk in client.send_message(request):
print(chunk)
await client.close()
নিম্নলিখিত কমান্ড ব্যবহার করে পরীক্ষাগুলো চালান:
uv run currency_agent/test_a2aclient.py
একটি সফল পরীক্ষামূলক চালনার ফলে নিম্নলিখিত ফলাফল পাওয়া যাবে:
🔄 Fetching the agent card at http://localhost:10000
✅ Successfully fetched the agent card
====================================================
AgentCard
====================================================
--- General ---
Name : currency_agent
Description : An agent that can help with currency conversions
Version : 0.0.1
--- Interfaces ---
[0] http://localhost:10000 (JSONRPC 1.0)
--- Capabilities ---
Streaming : False
Push notifications : False
Extended agent card : False
--- I/O Modes ---
Input : text/plain
Output : text/plain
--- Skills ---
----------------------------------------------------
ID : currency_agent
Name : model
Description : An agent that can help with currency conversions
Tags : llm
----------------------------------------------------
ID : currency_agent-get_exchange_rate
Name : get_exchange_rate
Description : Use this to get current exchange rate.
Tags : llm, tools
====================================================
🔄 Fetching the agent card at http://localhost:10000
✅ Successfully fetched the agent card
🔄 Initializing a non-streaming client
Sending request:
message {
message_id: "5d190c88-336e-4a22-925d-e2af49cf4bad"
role: ROLE_USER
parts {
text: "how much is 100 USD in GBP?"
}
}
Response:
task {
id: "e6f311bb-654a-477f-82a9-81c7a48f7b81"
context_id: "672e351b-0ff3-4aed-a059-868b383c41a0"
status {
state: TASK_STATE_COMPLETED
timestamp {
seconds: 1787836031
nanos: 994786000
}
}
artifacts {
artifact_id: "e0a05ac8-25c7-471c-a33c-1073fe48cbb8"
parts {
text: "100 USD is currently equal to approximately **73.37 GBP** (at an exchange rate of 1 USD = 0.73368 GBP)."
}
}
...
এটা কাজ করে! আপনি সফলভাবে পরীক্ষা করে দেখেছেন যে, একটি A2A ক্লায়েন্ট ব্যবহার করে A2A প্রোটোকলের মাধ্যমে কারেন্সি এজেন্টের সাথে যোগাযোগ করা যায়! 🎉
আরও A2A স্যাম্পলের জন্য GitHub-এ থাকা a2a-samples রিপোজিটরিটি দেখুন।
৮. A2A-এর মাধ্যমে রিমোট কারেন্সি এজেন্টটি ব্যবহার করুন।
পূর্ববর্তী ধাপে, আপনি A2A-এর মাধ্যমে কারেন্সি এজেন্টের সাথে যোগাযোগের জন্য একটি A2A ক্লায়েন্ট ব্যবহার করেছিলেন।
এই ধাপে, চলুন দেখি কিভাবে আপনি অন্য একটি ট্র্যাভেল এজেন্ট থেকে রিমোট এজেন্ট হিসেবে কারেন্সি এজেন্ট ব্যবহার করতে পারেন।
ট্র্যাভেল এজেন্টের কোডটি travel_agent/agent.py ফাইলে রয়েছে:
import logging
import os
from dotenv import load_dotenv
from google.adk.agents import LlmAgent
from google.adk.tools.agent_tool import AgentTool
from google.adk.agents.remote_a2a_agent import RemoteA2aAgent, AGENT_CARD_WELL_KNOWN_PATH
logger = logging.getLogger(__name__)
logging.basicConfig(format="[%(levelname)s]: %(message)s", level=logging.INFO)
load_dotenv()
SYSTEM_INSTRUCTION = (
"You are a helpful travel assistant. You help users plan trips, recommend places, "
"and answer travel-related questions. "
"Whenever a user asks about currency exchange rates or money conversions, "
"delegate the request to the 'currency_agent' sub-agent."
)
CURRENCY_AGENT_URL = os.getenv("CURRENCY_AGENT_URL", "http://localhost:10000")
logger.info(
"--- 🔗 Connecting to Remote A2A Currency Agent at %s... ---",
CURRENCY_AGENT_URL,
)
currency_remote_agent = RemoteA2aAgent(
name="currency_agent",
agent_card=f"{CURRENCY_AGENT_URL}{AGENT_CARD_WELL_KNOWN_PATH}",
description="An agent that can help with currency conversions and exchange rates.",
)
logger.info("--- 🤖 Creating ADK Travel Agent... ---")
root_agent = LlmAgent(
model="gemini-3.7-flash",
name="travel_agent",
description="A travel assistant that can help plan trips and convert currencies via the remote currency agent.",
instruction=SYSTEM_INSTRUCTION,
tools=[AgentTool(agent=currency_remote_agent)],
)
লক্ষ্য করুন, কীভাবে RemoteA2aAgent ব্যবহার করে কারেন্সি এজেন্ট অ্যাক্সেস করা হয়।
ট্র্যাভেল এজেন্টটি পরীক্ষা করার জন্য adk web চালান:
uv run adk web --allow_origins "regex:https://.*\.cloudshell\.dev"
এজেন্টটি দেখতে ও পরীক্ষা করতে ব্রাউজারে http://localhost:8000 এ যান।
ওয়েব UI-এর উপরের বাম কোণায় এজেন্ট হিসেবে travel_agent নির্বাচিত আছে কিনা, তা নিশ্চিত করুন।
চ্যাট এরিয়াতে আপনার এজেন্টকে জিজ্ঞাসা করুন , "২৫০ CAD কে USD তে রূপান্তর করলে কত হয়?" ।
আপনি দেখবেন যে ট্র্যাভেল এজেন্ট প্রতিক্রিয়া জানানোর আগে দূর থেকে currency_agent কল করে।

এজেন্টটি কাজ করে! এটি A2A ব্যবহার করে একটি রিমোট এজেন্টকে কল করার মাধ্যমে মুদ্রা রূপান্তর 💸 সংক্রান্ত কোয়েরিগুলো সমাধান করতে পারে!
৯. অভিনন্দন
অভিনন্দন! আপনি সফলভাবে একটি রিমোট এমসিপি (MCP) সার্ভার তৈরি ও স্থাপন করেছেন, এজেন্ট ডেভেলপমেন্ট কিট (ADK) ব্যবহার করে একটি কারেন্সি এজেন্ট তৈরি করেছেন যা এমসিপি (MCP) ব্যবহার করে বিভিন্ন টুলের সাথে সংযোগ স্থাপন করে, এবং এজেন্টটুএজেন্ট (A2A) প্রোটোকল ব্যবহার করে আপনার এজেন্টটিকে উন্মুক্ত করেছেন। এরপর আপনি এটুএ (A2A) ব্যবহার করে দূর থেকে কারেন্সি এজেন্টের সাথে যোগাযোগের জন্য একটি ট্র্যাভেল এজেন্টও তৈরি করেছেন!
এখানে সম্পূর্ণ কোড ডকুমেন্টেশনের লিঙ্ক দেওয়া হল।
আপনার এজেন্ট ডেপ্লয় করতে চাইছেন? জেমিনি এন্টারপ্রাইজ এজেন্ট প্ল্যাটফর্মের এজেন্ট রানটাইম, প্রোডাকশনে এআই এজেন্ট ডেপ্লয় করার জন্য একটি পরিচালিত অভিজ্ঞতা প্রদান করে!
আমরা যা আলোচনা করেছি
- কীভাবে একটি স্থানীয় এমসিপি সার্ভার তৈরি করবেন
- ক্লাউড রানে এমসিপি সার্ভার স্থাপন করা হচ্ছে
- এজেন্ট ডেভেলপমেন্ট কিট ব্যবহার করে কীভাবে MCP টুলস দিয়ে একটি এজেন্ট তৈরি করবেন
- কীভাবে একটি ADK এজেন্টকে A2A সার্ভার হিসেবে প্রকাশ করা যায়
- একটি A2A ক্লায়েন্ট ব্যবহার করে A2A সার্ভার পরীক্ষা করা হচ্ছে
- A2A প্রোটোকলের মাধ্যমে অন্য এজেন্টের সাথে যোগাযোগের জন্য কীভাবে একটি এজেন্ট তৈরি করবেন
পরিষ্কার করা
এই ল্যাবে ব্যবহৃত রিসোর্সগুলির জন্য আপনার গুগল ক্লাউড অ্যাকাউন্টে চার্জ হওয়া এড়াতে, এই ধাপগুলি অনুসরণ করুন:
- গুগল ক্লাউড কনসোলে, 'ম্যানেজ রিসোর্সেস' পৃষ্ঠায় যান।
- প্রজেক্ট তালিকা থেকে, আপনি যে প্রজেক্টটি মুছতে চান সেটি নির্বাচন করুন এবং তারপর ডিলিট বোতামে ক্লিক করুন।
- ডায়ালগ বক্সে প্রজেক্ট আইডি টাইপ করুন এবং তারপর প্রজেক্টটি মুছে ফেলার জন্য 'শাট ডাউন'-এ ক্লিক করুন।