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

মডেল প্রসঙ্গ প্রোটোকল (MCP)
মডেল কনটেক্সট প্রোটোকল (MCP) একটি উন্মুক্ত প্রোটোকল যা অ্যাপ্লিকেশনগুলো কীভাবে এলএলএম-কে কনটেক্সট প্রদান করে, তার একটি মান নির্ধারণ করে। MCP এআই মডেলগুলোকে রিসোর্স, প্রম্পট এবং টুলের সাথে সংযুক্ত করার একটি মানসম্মত উপায় প্রদান করে।
এজেন্ট ডেভেলপমেন্ট কিট (ADK)
এজেন্ট ডেভেলপমেন্ট কিট (ADK) হলো এআই এজেন্ট তৈরি এবং স্থাপন করার জন্য একটি নমনীয় অর্কেস্ট্রেশন ফ্রেমওয়ার্ক। ADK মডেল-নিরপেক্ষ, স্থাপন-নিরপেক্ষ এবং অন্যান্য ফ্রেমওয়ার্কের সাথে সামঞ্জস্যপূর্ণ করে তৈরি করা হয়েছে। ADK-কে এমনভাবে ডিজাইন করা হয়েছে যাতে এজেন্ট ডেভেলপমেন্ট প্রক্রিয়াটি সফটওয়্যার ডেভেলপমেন্টের মতো মনে হয় এবং ডেভেলপাররা সাধারণ কাজ থেকে শুরু করে জটিল ওয়ার্কফ্লো পর্যন্ত বিভিন্ন ধরনের এজেন্টিক আর্কিটেকচার সহজে তৈরি, স্থাপন এবং অর্কেস্ট্রেট করতে পারেন।
এজেন্ট২এজেন্ট (এ২এ) প্রোটোকল
এজেন্টটুএজেন্ট (A2A) প্রোটোকল হলো একটি উন্মুক্ত স্ট্যান্ডার্ড, যা এআই এজেন্টদের মধ্যে নির্বিঘ্ন যোগাযোগ এবং সহযোগিতা সক্ষম করার জন্য ডিজাইন করা হয়েছে। ঠিক যেমনভাবে এমসিপি (MCP) এলএলএম-দের ডেটা এবং টুলস ব্যবহারের সুযোগ দেওয়ার জন্য একটি প্রমিত পদ্ধতি প্রদান করে, তেমনি এ২এ (A2A) এজেন্টদের একে অপরের সাথে কথা বলার জন্য একটি প্রমিত পদ্ধতি প্রদান করে! এমন এক বিশ্বে যেখানে এজেন্টরা বিভিন্ন ফ্রেমওয়ার্ক ব্যবহার করে এবং ভিন্ন ভিন্ন বিক্রেতাদের দ্বারা নির্মিত হয়, সেখানে এ২এ একটি সাধারণ ভাষা প্রদান করে, যা বিভাজন ভেঙে দেয় এবং আন্তঃকার্যক্ষমতা বৃদ্ধি করে।
আপনি যা শিখবেন
- কীভাবে একটি স্থানীয় এমসিপি সার্ভার তৈরি করবেন
- ক্লাউড রানে এমসিপি সার্ভার স্থাপন করা হচ্ছে
- এজেন্ট ডেভেলপমেন্ট কিট ব্যবহার করে কীভাবে MCP টুলস দিয়ে একটি এজেন্ট তৈরি করবেন
- কীভাবে একটি ADK এজেন্টকে 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ফাইলের মাধ্যমে):
নিম্নলিখিত কমান্ডটি চালিয়ে একটি .env ফাইল তৈরি করুন:
echo "GOOGLE_GENAI_USE_VERTEXAI=TRUE" >> .env \
&& echo "GOOGLE_CLOUD_PROJECT=$PROJECT_ID" >> .env \
&& echo "GOOGLE_CLOUD_LOCATION=us-central1" >> .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) ব্যবহার করে কারেন্সি এজেন্ট তৈরি করার সময় এসেছে।
এজেন্ট ডেভেলপমেন্ট কিট সম্প্রতি এর v1.0.0 স্থিতিশীল সংস্করণটি প্রকাশ করেছে। এই মাইলফলকটি নির্দেশ করে যে পাইথন 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-2.5-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
ব্রাউজারে 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.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.A2AClient একটি ক্লাস রয়েছে যা আপনার জন্য এই কাজটি সহজ করে দেয়।
currency_agent/test_client.py ফাইলটিতে এমন কোড রয়েছে যা A2A সার্ভারের বিরুদ্ধে বিভিন্ন টেস্ট কেস চালায়।
# ... see file for full code
# Example test using A2AClient
async def run_single_turn_test(client: A2AClient) -> None:
"""Runs a single-turn non-streaming test."""
send_message_payload = create_send_message_payload(text="how much is 100 USD in CAD?")
request = SendMessageRequest(
id=str(uuid4()), params=MessageSendParams(**send_message_payload)
)
print("--- ✉️ Single Turn Request ---")
# Send Message
response: SendMessageResponse = await client.send_message(request)
print_json_response(response, "📥 Single Turn Request Response")
if not isinstance(response.root, SendMessageSuccessResponse):
print("received non-success response. Aborting get task ")
return
if not isinstance(response.root.result, Task):
print("received non-task response. Aborting get task ")
return
task_id: str = response.root.result.id
print("--- ❔ Query Task ---")
# query the task
get_request = GetTaskRequest(id=str(uuid4()), params=TaskQueryParams(id=task_id))
get_response: GetTaskResponse = await client.get_task(get_request)
print_json_response(get_response, "📥 Query Task Response")
# ----- Main Entrypoint (Create client --> Run tests) -----
async def main() -> None:
"""Main function to run the tests."""
print(f'--- 🔄 Connecting to agent at {AGENT_URL}... ---')
try:
async with httpx.AsyncClient() as httpx_client:
# Create a resolver to fetch the agent card
resolver = A2ACardResolver(
httpx_client=httpx_client,
base_url=AGENT_URL,
)
agent_card = await resolver.get_agent_card()
# Create a client to interact with the agent
client = A2AClient(
httpx_client=httpx_client,
agent_card=agent_card,
)
print('--- ✅ Connection successful. ---')
await run_single_turn_test(client)
await run_multi_turn_test(client)
except Exception as e:
traceback.print_exc()
print(f'--- ❌ An error occurred: {e} ---')
print('Ensure the agent server is running.')
নিম্নলিখিত কমান্ড ব্যবহার করে পরীক্ষাগুলো চালান:
uv run currency_agent/test_client.py
একটি সফল পরীক্ষামূলক চালনার ফলে নিম্নলিখিত ফলাফল পাওয়া যাবে:
--- 🔄 Connecting to agent at http://localhost:10000... ---
--- ✅ Connection successful. ---
--- ✉️ Single Turn Request ---
--- 📥 Single Turn Request Response ---
{"id":"3bc92d7b-d857-4e93-9ff0-b2fb865f6e35","jsonrpc":"2.0","result":{"artifacts":[{"artifactId":"35e89e14-b977-4397-a23b-92c84bc32379","parts":[{"kind":"text","text":"Based on the current exchange rate, 1 USD is equivalent to 1.3704 CAD. Therefore, 100 USD would be 137.04 CAD.\n"}]}],"contextId":"2d66f277-152c-46ef-881d-7fe32866e9f5","history":[{"contextId":"2d66f277-152c-46ef-881d-7fe32866e9f5","kind":"message","messageId":"59819269f7d04849b0bfca7d43ec073c","parts":[{"kind":"text","text":"how much is 100 USD in CAD?"}],"role":"user","taskId":"52ae2392-84f5-429a-a14b-8413d3d20d97"},{"contextId":"2d66f277-152c-46ef-881d-7fe32866e9f5","kind":"message","messageId":"286095c6-12c9-40cb-9596-a9676d570dbd","parts":[],"role":"agent","taskId":"52ae2392-84f5-429a-a14b-8413d3d20d97"}],"id":"52ae2392-84f5-429a-a14b-8413d3d20d97","kind":"task","status":{"state":"completed"}}}
// ...
--- 🚀 First turn completed, no further input required for this test case. ---
এটা কাজ করেছে! আপনি সফলভাবে পরীক্ষা করে দেখেছেন যে একটি A2A সার্ভারের মাধ্যমে কারেন্সি এজেন্টের সাথে যোগাযোগ করা যায়! 🎉
আরও উন্নত ব্যবহার দেখতে গিটহাবে a2a-samples রিপোজিটরিটি দেখুন!
আপনার এজেন্ট ডেপ্লয় করতে চাইছেন? ভার্টেক্স এআই এজেন্ট ইঞ্জিন প্রোডাকশনে এআই এজেন্ট ডেপ্লয় করার জন্য একটি সুপরিচালিত অভিজ্ঞতা প্রদান করে!
৯. অভিনন্দন
অভিনন্দন! আপনি সফলভাবে একটি রিমোট এমসিপি (MCP) সার্ভার তৈরি ও স্থাপন করেছেন, এজেন্ট ডেভেলপমেন্ট কিট (ADK) ব্যবহার করে একটি কারেন্সি এজেন্ট তৈরি করেছেন যা এমসিপি (MCP) ব্যবহার করে বিভিন্ন টুলের সাথে সংযোগ স্থাপন করে, এবং এজেন্টটুএজেন্ট (A2A) প্রোটোকল ব্যবহার করে আপনার এজেন্টটিকে উন্মুক্ত করেছেন! কারেন্সি এজেন্টটি এখন A2A ব্যবহার করে যেকোনো ফ্রেমওয়ার্কের অন্যান্য এজেন্টের সাথে যোগাযোগ করতে পারবে!
এখানে সম্পূর্ণ কোড ডকুমেন্টেশনের লিঙ্ক দেওয়া হলো।
আমরা যা আলোচনা করেছি
- কীভাবে একটি স্থানীয় এমসিপি সার্ভার তৈরি করবেন
- ক্লাউড রানে এমসিপি সার্ভার স্থাপন করা হচ্ছে
- এজেন্ট ডেভেলপমেন্ট কিট ব্যবহার করে কীভাবে MCP টুলস দিয়ে একটি এজেন্ট তৈরি করবেন
- কীভাবে একটি ADK এজেন্টকে A2A সার্ভার হিসেবে প্রকাশ করা যায়
- A2A ক্লায়েন্ট ব্যবহার করে A2A সার্ভার পরীক্ষা করা হচ্ছে
পরিষ্কার করা
এই ল্যাবে ব্যবহৃত রিসোর্সগুলির জন্য আপনার গুগল ক্লাউড অ্যাকাউন্টে চার্জ হওয়া এড়াতে, এই ধাপগুলি অনুসরণ করুন:
- গুগল ক্লাউড কনসোলে, 'ম্যানেজ রিসোর্সেস' পৃষ্ঠায় যান।
- প্রজেক্ট তালিকা থেকে, আপনি যে প্রজেক্টটি মুছতে চান সেটি নির্বাচন করুন এবং তারপর ডিলিট বোতামে ক্লিক করুন।
- ডায়ালগ বক্সে প্রজেক্ট আইডি টাইপ করুন এবং তারপর প্রজেক্টটি মুছে ফেলার জন্য 'শাট ডাউন'-এ ক্লিক করুন।