এই কোডল্যাব সম্পর্কে
1. ওভারভিউ
এআই এজেন্টরা দ্রুত জনপ্রিয়তা বৃদ্ধি পাচ্ছে, লক্ষ্য অর্জনের জন্য তাদের স্বায়ত্তশাসিতভাবে পরিচালনা করার, শেখার এবং তাদের পরিবেশের সাথে যোগাযোগ করার ক্ষমতা দিয়ে টাস্ক অটোমেশন এবং সিদ্ধান্ত গ্রহণে বিপ্লব ঘটাচ্ছে।
কিন্তু ঠিক কিভাবে একজন এজেন্ট তৈরি করতে পারে? এই কোডল্যাব আপনাকে বিভিন্ন দেশের মুদ্রার মধ্যে রূপান্তর করতে পারে এমন একটি কারেন্সি এজেন্ট কীভাবে তৈরি করতে হয় তা দেখিয়ে আপনাকে শুরু করতে সাহায্য করবে। আপনি ইন্টারনেটে (MCP, ADK, A2A) ভাসতে দেখেছেন এমন সংক্ষিপ্ত শব্দগুলি বুঝতে আপনাকে সাহায্য করার জন্য সর্বশেষ প্রযুক্তির মাধ্যমে হাঁটার লক্ষ্য নিয়ে।
মডেল কনটেক্সট প্রোটোকল (MCP)
মডেল কনটেক্সট প্রোটোকল (MCP) হল একটি উন্মুক্ত প্রোটোকল যা প্রমিত করে যে কীভাবে অ্যাপ্লিকেশনগুলি LLM-কে প্রসঙ্গ প্রদান করে। এমসিপি এআই মডেলগুলিকে সংস্থান, প্রম্পট এবং সরঞ্জামগুলির সাথে সংযুক্ত করার একটি প্রমিত উপায় সরবরাহ করে।
এজেন্ট ডেভেলপমেন্ট কিট (ADK)
এজেন্ট ডেভেলপমেন্ট কিট (ADK) হল একটি নমনীয় অর্কেস্ট্রেশন ফ্রেমওয়ার্ক যা এআই এজেন্টদের ডেভেলপ করা এবং মোতায়েন করার জন্য। ADK হল মডেল-অজ্ঞেয়বাদী, স্থাপনা-অজ্ঞেয়বাদী, এবং অন্যান্য কাঠামোর সাথে সামঞ্জস্যের জন্য তৈরি করা হয়েছে। ADK ডিজাইন করা হয়েছে এজেন্ট ডেভেলপমেন্টকে সফটওয়্যার ডেভেলপমেন্টের মতো অনুভব করার জন্য, যাতে ডেভেলপারদের জন্য সহজ কাজ থেকে জটিল ওয়ার্কফ্লো পর্যন্ত এজেন্টিক আর্কিটেকচার তৈরি করা, স্থাপন করা এবং অর্কেস্ট্রেট করা সহজ হয়।
Agent2Agent (A2A) প্রোটোকল
Agent2Agent (A2A) প্রোটোকল হল একটি ওপেন স্ট্যান্ডার্ড যা এআই এজেন্টদের মধ্যে নির্বিঘ্ন যোগাযোগ এবং সহযোগিতা সক্ষম করার জন্য ডিজাইন করা হয়েছে। এমসিপি যেভাবে LLM-কে ডেটা এবং টুলগুলিতে অ্যাক্সেস দেওয়ার জন্য একটি প্রমিত উপায় প্রদান করে, তেমনি A2A এজেন্টদের অন্য এজেন্টদের সাথে কথা বলার জন্য একটি প্রমিত উপায় প্রদান করে! এমন একটি বিশ্বে যেখানে এজেন্ট বিভিন্ন ফ্রেমওয়ার্ক ব্যবহার করে এবং বিভিন্ন বিক্রেতাদের দ্বারা তৈরি করা হয়, A2A একটি সাধারণ ভাষা প্রদান করে, সাইলোগুলি ভেঙে দেয় এবং আন্তঃকার্যক্ষমতা বৃদ্ধি করে।
আপনি কি শিখবেন
- কিভাবে একটি স্থানীয় MCP সার্ভার তৈরি করবেন
- ক্লাউড রানে MCP সার্ভার স্থাপন করা হচ্ছে
- এমসিপি টুল ব্যবহার করে এজেন্ট ডেভেলপমেন্ট কিট দিয়ে কীভাবে এজেন্ট তৈরি করবেন
- একটি A2A সার্ভার হিসাবে একটি ADK এজেন্টকে কীভাবে প্রকাশ করবেন
- A2A ক্লায়েন্ট ব্যবহার করে A2A সার্ভার পরীক্ষা করা হচ্ছে
আপনি কি প্রয়োজন হবে
- একটি ব্রাউজার, যেমন ক্রোম বা ফায়ারফক্স
- বিলিং সক্ষম সহ একটি Google ক্লাউড প্রকল্প৷
2. আপনি শুরু করার আগে
একটি প্রকল্প তৈরি করুন
- Google ক্লাউড কনসোলে , প্রকল্প নির্বাচক পৃষ্ঠায়, একটি Google ক্লাউড প্রকল্প নির্বাচন করুন বা তৈরি করুন।
- নিশ্চিত করুন যে আপনার ক্লাউড প্রকল্পের জন্য বিলিং সক্ষম করা আছে৷ একটি প্রকল্পে বিলিং সক্ষম কিনা তা পরীক্ষা করতে শিখুন।
- এই লিঙ্কে ক্লিক করে ক্লাউড শেল সক্রিয় করুন। আপনি ক্লাউড শেল থেকে সংশ্লিষ্ট বোতামে ক্লিক করে ক্লাউড শেল টার্মিনাল (ক্লাউড কমান্ড চালানোর জন্য) এবং সম্পাদক (প্রকল্প নির্মাণের জন্য) এর মধ্যে টগল করতে পারেন।
- একবার ক্লাউড শেলের সাথে সংযুক্ত হয়ে গেলে, আপনি পরীক্ষা করে দেখুন যে আপনি ইতিমধ্যেই প্রমাণীকৃত হয়েছেন এবং নিম্নলিখিত কমান্ডটি ব্যবহার করে প্রকল্পটি আপনার প্রকল্প আইডিতে সেট করা আছে:
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
- পাইথন 3.10+ আছে তা নিশ্চিত করুন
gcloud কমান্ড এবং ব্যবহারের জন্য ডকুমেন্টেশন পড়ুন।
3. ইনস্টলেশন
- সংগ্রহস্থল ক্লোন করুন:
git clone https://github.com/jackwotherspoon/currency-agent.git
cd currency-agent
- ইউভি ইনস্টল করুন (নির্ভরতা পরিচালনা করতে ব্যবহৃত):
# 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
4. একটি স্থানীয় MCP সার্ভার তৈরি করুন
আপনি আপনার কারেন্সি এজেন্টকে সাজাতে যাওয়ার আগে, আপনার এজেন্টের প্রয়োজন হবে এমন আপনার টুল(গুলি) প্রকাশ করার জন্য আপনি প্রথমে একটি MCP সার্ভার তৈরি করবেন।
একটি MCP সার্ভার আপনাকে সরঞ্জাম হিসাবে নির্দিষ্ট ক্ষমতা (যেমন মুদ্রা বিনিময় হার আনা) প্রকাশ করতে হালকা প্রোগ্রাম লিখতে দেয়। একটি এজেন্ট বা এমনকি একাধিক এজেন্ট প্রমিত মডেল কনটেক্সট প্রোটোকল (MCP) ব্যবহার করে এই সরঞ্জামগুলি অ্যাক্সেস করতে পারে।
FastMCP পাইথন প্যাকেজটি একটি MCP সার্ভার তৈরি করতে ব্যবহার করা যেতে পারে যা get_exchange_rate
নামক একটি একক টুলকে প্রকাশ করে। get_exchange_rate
টুলটি দুটি মুদ্রার মধ্যে বর্তমান বিনিময় হার পেতে ফ্রাঙ্কফুর্টার API- এ ইন্টারনেটের মাধ্যমে একটি কল করে।
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="streamable-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
আপনি 1 USD (US ডলার) থেকে EUR (Euro) এর বর্তমান বিনিময় হার দেখতে পাবেন:
--- 🛠️ 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
) চালিয়ে স্থানীয়ভাবে চলমান MCP সার্ভার বন্ধ করুন।
5. ক্লাউড রানে আপনার MCP সার্ভার স্থাপন করুন
এখন আপনি ক্লাউড রানে একটি দূরবর্তী MCP সার্ভার হিসাবে MCP সার্ভার স্থাপন করতে প্রস্তুত 🚀☁️
দূরবর্তীভাবে একটি MCP সার্ভার চালানোর সুবিধা
ক্লাউড রানে দূরবর্তীভাবে একটি MCP সার্ভার চালানো বিভিন্ন সুবিধা প্রদান করতে পারে:
- 📈 স্কেলেবিলিটি : ক্লাউড রান সমস্ত আগত অনুরোধগুলি পরিচালনা করার জন্য দ্রুত স্কেল আউট করার জন্য তৈরি করা হয়েছে৷ ক্লাউড রান চাহিদার উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে আপনার MCP সার্ভারকে স্কেল করবে।
- 👥কেন্দ্রীভূত সার্ভার : আপনি আইএএম বিশেষাধিকারের মাধ্যমে দলের সদস্যদের সাথে একটি কেন্দ্রীভূত MCP সার্ভারে অ্যাক্সেস শেয়ার করতে পারেন, যাতে তারা স্থানীয়ভাবে তাদের নিজস্ব সার্ভার চালানোর পরিবর্তে তাদের স্থানীয় মেশিন থেকে এটিতে সংযোগ করতে দেয়। যদি MCP সার্ভারে কোনো পরিবর্তন করা হয়, তাহলে দলের সকল সদস্যরা এর থেকে উপকৃত হবেন।
- 🔐নিরাপত্তা : ক্লাউড রান প্রমাণীকৃত অনুরোধ জোর করার একটি সহজ উপায় প্রদান করে। এটি আপনার MCP সার্ভারে শুধুমাত্র সুরক্ষিত সংযোগের অনুমতি দেয়, অননুমোদিত অ্যাক্সেস প্রতিরোধ করে।
mcp-server
ডিরেক্টরিতে পরিবর্তন করুন:
cd mcp-server
ক্লাউড রানে MCP সার্ভার স্থাপন করুন:
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.
MCP ক্লায়েন্ট প্রমাণীকরণ
যেহেতু আপনি প্রমাণীকরণের প্রয়োজনে --no-allow-unauthenticated
উল্লেখ করেছেন, তাই দূরবর্তী MCP সার্ভারের সাথে সংযোগকারী যে কোনো MCP ক্লায়েন্টকে প্রমাণীকরণ করতে হবে।
আপনি আপনার MCP ক্লায়েন্ট কোথায় চালাচ্ছেন তার উপর নির্ভর করে ক্লাউড রানে হোস্ট এমসিপি সার্ভারের অফিসিয়াল ডক্স এই বিষয়ে আরও তথ্য প্রদান করে।
আপনার স্থানীয় মেশিনে দূরবর্তী MCP সার্ভারে একটি প্রমাণীকৃত টানেল তৈরি করতে আপনাকে ক্লাউড রান প্রক্সি চালাতে হবে।
ডিফল্টরূপে, ক্লাউড রান পরিষেবার URL-এর জন্য সমস্ত অনুরোধ ক্লাউড রান ইনভোকার ( roles/run.invoker
) IAM ভূমিকার সাথে অনুমোদিত হতে হবে৷ এই IAM নীতি বাইন্ডিং নিশ্চিত করে যে আপনার স্থানীয় MCP ক্লায়েন্টকে প্রমাণীকরণ করতে একটি শক্তিশালী নিরাপত্তা ব্যবস্থা ব্যবহার করা হয়েছে।
আপনাকে নিশ্চিত করতে হবে যে আপনি বা যে কোনো দলের সদস্যরা দূরবর্তী MCP সার্ভার অ্যাক্সেস করার চেষ্টা করছেন তাদের IAM প্রধান (Google ক্লাউড অ্যাকাউন্ট) এর সাথে আবদ্ধ roles/run.invoker
IAM ভূমিকা আছে।
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 সার্ভারে ফরোয়ার্ড করা হবে।
দূরবর্তী MCP সার্ভার পরীক্ষা করুন
একটি নতুন টার্মিনালে , রুট ফোল্ডারে ফিরে যান এবং দূরবর্তী MCP সার্ভার কাজ করছে তা নিশ্চিত করতে 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
}
} ---
আপনি নিয়োজিত ক্লাউড রান MCP সার্ভারের লগগুলি জিজ্ঞাসা করতে পারেন যদি আপনি যাচাই করতে চান যে রিমোট সার্ভারটিকে প্রকৃতপক্ষে কল করা হয়েছে:
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}}
এখন আপনার কাছে একটি দূরবর্তী MCP সার্ভার আছে, আপনি একটি এজেন্ট তৈরি করতে যেতে পারেন! 🤖
6. এজেন্ট ডেভেলপমেন্ট কিট (ADK) দিয়ে একটি এজেন্ট তৈরি করুন
আপনার একটি স্থাপন করা MCP সার্ভার আছে, এখন সময় এসেছে এজেন্ট ডেভেলপমেন্ট কিট (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.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."
)
def create_agent() -> LlmAgent:
"""Constructs the ADK currency conversion agent."""
logger.info("--- 🔧 Loading MCP tools from MCP Server... ---")
logger.info("--- 🤖 Creating ADK Currency Agent... ---")
return 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")
)
)
],
)
root_agent = create_agent()
মুদ্রা এজেন্ট দ্রুত পরীক্ষা করার জন্য আপনি ADK এর dev UI এর সুবিধা নিতে পারেন, adk web
চালানোর মাধ্যমে অ্যাক্সেস করা যায়:
uv run adk web
একটি ব্রাউজারে, এজেন্ট দেখতে ও পরীক্ষা করতে http://localhost:8000
এ যান!
নিশ্চিত করুন যে currency_agent
ওয়েব UI এর উপরের বাম কোণে এজেন্ট হিসাবে নির্বাচিত হয়েছে৷
চ্যাট এলাকায় আপনার এজেন্টকে জিজ্ঞাসা করুন "250 CAD থেকে USD কি?" . আপনি দেখতে পাবেন যে এজেন্ট আমাদের get_exchange_rate
MCP টুলকে একটি প্রতিক্রিয়া দেওয়ার আগে কল করে।
এজেন্ট কাজ করে! এটি কারেন্সি কনভার্সন 💸 এর চারপাশে আবর্তিত প্রশ্নগুলি পরিচালনা করতে পারে।
7. Agent2Agent (A2A) প্রোটোকল
Agent2Agent (A2A) প্রোটোকল হল একটি ওপেন স্ট্যান্ডার্ড যা এআই এজেন্টদের মধ্যে নির্বিঘ্ন যোগাযোগ এবং সহযোগিতা সক্ষম করার জন্য ডিজাইন করা হয়েছে। এটি বিভিন্ন ফ্রেমওয়ার্ক ব্যবহার করে এবং বিভিন্ন বিক্রেতাদের দ্বারা নির্মিত এজেন্টদেরকে একটি সাধারণ ভাষায় একে অপরের সাথে যোগাযোগ করতে, সাইলো ভেঙ্গে এবং আন্তঃকার্যক্ষমতা বৃদ্ধির অনুমতি দেয়।
A2A এজেন্টদের অনুমতি দেয়:
- আবিষ্কার করুন: অন্যান্য এজেন্ট খুঁজুন এবং প্রমিত এজেন্ট কার্ড ব্যবহার করে তাদের দক্ষতা ( এজেন্টস্কিল ) এবং ক্ষমতা ( এজেন্ট সক্ষমতা ) শিখুন।
- যোগাযোগ করুন: নিরাপদে বার্তা এবং ডেটা বিনিময় করুন।
- সহযোগিতা করুন: জটিল লক্ষ্যগুলি অর্জনের জন্য কাজগুলি অর্পণ করুন এবং ক্রিয়াগুলির সমন্বয় করুন৷
A2A প্রোটোকল "এজেন্ট কার্ড" এর মতো প্রক্রিয়ার মাধ্যমে এই যোগাযোগকে সহজতর করে যা ডিজিটাল ব্যবসায়িক কার্ড এজেন্টরা তাদের ক্ষমতা এবং সংযোগ তথ্যের বিজ্ঞাপন দিতে ব্যবহার করতে পারে।
এখন সময় এসেছে A2A ব্যবহার করে মুদ্রা এজেন্টকে প্রকাশ করার যাতে এটি অন্য এজেন্ট এবং ক্লায়েন্টদের দ্বারা ডাকা যায়।
A2A পাইথন SDK
A2A পাইথন SDK উপরে উল্লিখিত প্রতিটি সংস্থানের জন্য পাইডানটিক মডেল সরবরাহ করে; এজেন্টস্কিল , এজেন্ট ক্যাপাবিলিটিস এবং এজেন্টকার্ড । এটি 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],
)
AgentExecutor ইন্টারফেস একটি A2A এজেন্ট কীভাবে অনুরোধ প্রক্রিয়া করে এবং প্রতিক্রিয়া/ইভেন্ট তৈরি করে তার মূল যুক্তি পরিচালনা করে। A2A পাইথন SDK একটি বিমূর্ত বেস ক্লাস a2a.server.agent_execution.AgentExecutor
প্রদান করে যা আপনাকে বাস্তবায়ন করতে হবে।
সময় এসেছে কারেন্সি এজেন্টের সাথে একত্রিত করার এবং A2A এর শক্তি প্রদর্শন করার!
8. কারেন্সি এজেন্ট A2A সার্ভার
আপনি এখন কোডের কিছু অংশের দিকে নজর দেবেন এবং দেখুন কিভাবে একটি A2A সার্ভার তৈরি করা বিভিন্ন অংশ একত্রিত হয়।
currency_agent/agent_executor.py
ফাইলের ভিতরে একবার দেখুন যেখানে আপনার কাছে ADKAgentExecutor
ক্লাস রয়েছে যা A2A বিমূর্ত AgentExecutor
ক্লাস থেকে উত্তরাধিকারসূত্রে পাওয়া যায়। এটি ADK রানারকে ডাকার মাধ্যমে ADK এজেন্টকে কল করা, এজেন্টের কাছে অনুরোধগুলি প্রক্রিয়াকরণ এবং ADK ব্যবহার করে এমন google.genai.types
এবং A2A ব্যবহার করে এমন a2a.types
এর মধ্যে রূপান্তর করে।
# ... see file for full code
class ADKAgentExecutor(AgentExecutor):
"""An AgentExecutor that runs an ADK agent."""
def __init__(self, runner: Runner, card: AgentCard):
self.runner = runner
self._card = card
self._running_sessions = {}
def _run_agent(
self, session_id, new_message: types.Content
) -> AsyncGenerator[Event, None]:
return self.runner.run_async(
session_id=session_id, user_id="self", new_message=new_message
)
async def _process_request(
self,
new_message: types.Content,
session_id: str,
task_updater: TaskUpdater,
) -> None:
session = await self._upsert_session(
session_id,
)
session_id = session.id
# Run through all events within the request.
async for event in self._run_agent(session_id, new_message):
if event.is_final_response():
parts = convert_genai_parts_to_a2a(event.content.parts)
logger.debug("✅ Yielding final response: %s", parts)
await task_updater.add_artifact(parts)
await task_updater.complete()
break
# If the agent is not making a function call, yield an update.
if not event.get_function_calls():
logger.debug("⏳ Yielding update response")
await task_updater.update_status(
TaskState.working,
message=task_updater.new_agent_message(
convert_genai_parts_to_a2a(event.content.parts),
),
)
else:
logger.debug("➡️ Skipping event")
async def execute(
self,
context: RequestContext,
event_queue: EventQueue,
):
# Run the agent until either complete or the task is suspended.
updater = TaskUpdater(event_queue, context.task_id, context.context_id)
# Immediately notify that the task is submitted.
if not context.current_task:
updater.submit()
updater.start_work()
await self._process_request(
types.UserContent(
parts=convert_a2a_parts_to_genai(context.message.parts),
),
context.context_id,
updater,
)
logger.debug("--- 💵💱💶 [Currency] execute exiting ---")
# ... see file for full code
currency_agent/__main__.py
এর ভিতরে যেখানে আপনি AgentSkill, AgentCard শুরু করেন এবং ADK মুদ্রা এজেন্ট তৈরি করেন। এটি যেখানে আপনি A2A সার্ভার সেট আপ এবং শুরু করেন।
A2A পাইথন SDK একটি A2AFastAPIApplication
ক্লাস প্রদান করে যা একটি A2A-সম্মত HTTP সার্ভার চালানো সহজ করে। এটি ওয়েব ফ্রেমওয়ার্কের জন্য FastAPI ব্যবহার করে এবং সাধারণত Uvicorn এর মত ASGI সার্ভারের সাথে চালানো হয়।
# ... see file for full code
@click.command()
@click.option("--host", "host", default="localhost")
@click.option("--port", "port", default=10000)
def main(host: str, port: int):
# Verify one of Google AI Studio or Vertex AI is being used
if os.getenv("GOOGLE_GENAI_USE_VERTEXAI") != "TRUE" and not os.getenv(
"GOOGLE_API_KEY"
):
raise ValueError(
"GOOGLE_API_KEY environment variable not set and "
"GOOGLE_GENAI_USE_VERTEXAI is not TRUE."
)
# 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?"],
)
# 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],
)
# Create the ADK runner and executor.
runner = Runner(
app_name=agent_card.name,
agent=root_agent,
artifact_service=InMemoryArtifactService(),
session_service=InMemorySessionService(),
memory_service=InMemoryMemoryService(),
)
agent_executor = ADKAgentExecutor(runner, agent_card)
request_handler = DefaultRequestHandler(
agent_executor=agent_executor,
task_store=InMemoryTaskStore(),
)
server = A2AFastAPIApplication(
agent_card=agent_card, http_handler=request_handler
)
uvicorn.run(server.build(), host=host, port=port)
# ... see file for full code
A2A সার্ভার চালানোর জন্য, একটি নতুন টার্মিনালে নিম্নলিখিতগুলি চালান:
uv run currency_agent/
সার্ভার সফলভাবে শুরু হলে, আউটপুটটি নিম্নরূপ দেখাবে যা নির্দেশ করে যে এটি 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 প্রোটোকল ব্যবহার করে অন্যান্য এজেন্ট বা ক্লায়েন্টদের কল করার ক্ষমতা সহ!
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:
client = await A2AClient.get_client_from_agent_card_url(
httpx_client, AGENT_URL
)
print('--- ✅ Connection successful. ---')
await run_single_turn_test(client)
await run_streaming_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"}}}
// ...
--- ⏩ Single Turn Streaming Request ---
--- ⏳ Streaming Chunk ---
{"id":"21239a5f-abbf-4a5e-a249-c101eb1dfbdd","jsonrpc":"2.0","result":{"contextId":"f268ad8c-b3bf-4439-9a64-5e02dfbb9a62","final":false,"kind":"status-update","status":{"state":"submitted"},"taskId":"761d2275-d58b-46f8-9c8d-68cd72e0667d"}}
--- ⏳ Streaming Chunk ---
{"id":"21239a5f-abbf-4a5e-a249-c101eb1dfbdd","jsonrpc":"2.0","result":{"contextId":"f268ad8c-b3bf-4439-9a64-5e02dfbb9a62","final":false,"kind":"status-update","status":{"state":"working"},"taskId":"761d2275-d58b-46f8-9c8d-68cd72e0667d"}}
--- ⏳ Streaming Chunk ---
{"id":"21239a5f-abbf-4a5e-a249-c101eb1dfbdd","jsonrpc":"2.0","result":{"contextId":"f268ad8c-b3bf-4439-9a64-5e02dfbb9a62","final":false,"kind":"status-update","status":{"message":{"contextId":"f268ad8c-b3bf-4439-9a64-5e02dfbb9a62","kind":"message","messageId":"25f5f972-9475-4e4a-a08d-e13f521d7462","parts":[],"role":"agent","taskId":"761d2275-d58b-46f8-9c8d-68cd72e0667d"},"state":"working"},"taskId":"761d2275-d58b-46f8-9c8d-68cd72e0667d"}}
--- ⏳ Streaming Chunk ---
{"id":"21239a5f-abbf-4a5e-a249-c101eb1dfbdd","jsonrpc":"2.0","result":{"artifact":{"artifactId":"35e89e14-b977-4397-a23b-92c84bc32379","parts":[{"kind":"text","text":"The current exchange rate is 1 EUR to 164.15 JPY. So, 50 EUR would be 8207.5 JPY.\n"}]},"contextId":"f268ad8c-b3bf-4439-9a64-5e02dfbb9a62","kind":"artifact-update","taskId":"761d2275-d58b-46f8-9c8d-68cd72e0667d"}}
// ...
--- 🚀 First turn completed, no further input required for this test case. ---
এটা কাজ করে! আপনি সফলভাবে পরীক্ষা করেছেন যে আপনি একটি A2A সার্ভারের মাধ্যমে মুদ্রা এজেন্টের সাথে যোগাযোগ করতে পারেন! 🎉
আরও উন্নত ব্যবহারের ক্ষেত্রে দেখতে GitHub-এ a2a-নমুনা সংগ্রহস্থল দেখুন!
আপনার এজেন্ট স্থাপন করতে খুঁজছেন? Vertex AI এজেন্ট ইঞ্জিন উৎপাদনে AI এজেন্টদের মোতায়েন করার জন্য একটি পরিচালিত অভিজ্ঞতা প্রদান করে!
9. অভিনন্দন
অভিনন্দন! আপনি সফলভাবে একটি দূরবর্তী এমসিপি সার্ভার তৈরি এবং স্থাপন করেছেন, এজেন্ট ডেভেলপমেন্ট কিট (ADK) ব্যবহার করে একটি মুদ্রা এজেন্ট তৈরি করেছেন যা MCP ব্যবহার করে সরঞ্জামগুলির সাথে সংযোগ স্থাপন করে এবং Agent2Agent (A2A) প্রোটোকল ব্যবহার করে আপনার এজেন্টকে প্রকাশ করেছেন! মুদ্রা এজেন্ট এখন A2A ব্যবহার করে যেকোন ফ্রেমওয়ার্কের অন্যান্য এজেন্টদের সাথে যোগাযোগ করতে উপলব্ধ!
এখানে সম্পূর্ণ কোড ডকুমেন্টেশন একটি লিঙ্ক আছে.
আমরা কভার করেছি কি
- কিভাবে একটি স্থানীয় MCP সার্ভার তৈরি করবেন
- ক্লাউড রানে MCP সার্ভার স্থাপন করা হচ্ছে
- এমসিপি টুল ব্যবহার করে এজেন্ট ডেভেলপমেন্ট কিট দিয়ে কীভাবে এজেন্ট তৈরি করবেন
- একটি A2A সার্ভার হিসাবে একটি ADK এজেন্টকে কীভাবে প্রকাশ করবেন
- A2A ক্লায়েন্ট ব্যবহার করে A2A সার্ভার পরীক্ষা করা হচ্ছে
পরিষ্কার করুন
এই ল্যাবে ব্যবহৃত সংস্থানগুলির জন্য আপনার Google ক্লাউড অ্যাকাউন্টে চার্জ এড়াতে, এই পদক্ষেপগুলি অনুসরণ করুন:
- Google ক্লাউড কনসোলে, সম্পদ পরিচালনা পৃষ্ঠাতে যান।
- প্রকল্প তালিকায়, আপনি যে প্রকল্পটি মুছতে চান সেটি নির্বাচন করুন এবং তারপরে মুছুন ক্লিক করুন।
- ডায়ালগে, প্রজেক্ট আইডি টাইপ করুন এবং তারপরে প্রোজেক্ট মুছে ফেলতে শাট ডাউন ক্লিক করুন।