১. ভূমিকা
সংক্ষিপ্ত বিবরণ
এই কোডল্যাবে, আপনি ক্লাউড রান-এ একটি ব্যাকএন্ড সার্ভিস হিসেবে একটি ADK এজেন্ট ডেপ্লয় করবেন এবং তারপর সেই ADK এজেন্টের জন্য একটি গ্র্যাডিও ফ্রন্টএন্ডকে দ্বিতীয় ক্লাউড রান সার্ভিস হিসেবে ডেপ্লয় করবেন। এই কোডল্যাবটি দেখায় কিভাবে আপনার ADK এজেন্ট সার্ভিসে অথেন্টিকেশন বাধ্যতামূলক করতে হয় এবং গ্র্যাডিও ফ্রন্টএন্ড সার্ভিস থেকে এতে অথেন্টিকেটেড কল করা যায়।
আপনি যা শিখবেন
- ক্লাউড রানে কীভাবে একটি ADK এজেন্ট স্থাপন করবেন
- ক্লাউড রানে কীভাবে একটি গ্রেডিও অ্যাপ ডেপ্লয় করবেন
- ক্লাউড রানে কীভাবে প্রমাণীকৃত সার্ভিস-টু-সার্ভিস কল করবেন
২. এপিআই সক্রিয় করুন
প্রথমে আপনার গুগল ক্লাউড প্রজেক্টটি সেট করুন।
gcloud config set project <YOUR_PROJECT_ID>
নিম্নলিখিত কমান্ডটি চালিয়ে আপনি আপনার গুগল ক্লাউড প্রজেক্টটি নিশ্চিত করতে পারেন:
gcloud config get-value project
এই কোডল্যাবটির জন্য নিম্নলিখিত API-গুলি সক্রিয় করতে হবে:
gcloud services enable run.googleapis.com \
compute.googleapis.com \
run.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com \
aiplatform.googleapis.com
৩. সেটআপ এবং প্রয়োজনীয়তা
এই অংশে, আপনি কয়েকটি সার্ভিস অ্যাকাউন্ট তৈরি করবেন এবং সেগুলোকে উপযুক্ত IAM রোল প্রদান করবেন। প্রতিটি ক্লাউড-চালিত সার্ভিসের নিজস্ব সার্ভিস অ্যাকাউন্ট থাকবে।
প্রথমে, এই কোডল্যাবের জন্য এনভায়রনমেন্ট ভেরিয়েবলগুলো সেট করুন, যেগুলো পুরো কোডল্যাব জুড়ে ব্যবহৃত হবে।
export PROJECT_ID=<YOUR_PROJECT_ID>
export REGION=<YOUR_REGION>
export SERVICE_ACCOUNT_ADK="adk-agent-cr"
export SERVICE_ACCOUNT_ADDRESS_ADK=$SERVICE_ACCOUNT_ADK@$PROJECT_ID.iam.gserviceaccount.com
export SERVICE_ACCOUNT_GRADIO="adk-agent-gradio"
export SERVICE_ACCOUNT_ADDRESS_GRADIO=$SERVICE_ACCOUNT_GRADIO@$PROJECT_ID.iam.gserviceaccount.com
export AGENT_APP_NAME="multi_tool_agent"
এরপরে, ADK এজেন্টের জন্য সার্ভিস অ্যাকাউন্ট তৈরি করুন।
gcloud iam service-accounts create $SERVICE_ACCOUNT_ADK \
--display-name="Service account for adk agent on cloud run"
এবং ADK পরিষেবা অ্যাকাউন্টকে "Vertex AI User" ভূমিকাটি প্রদান করুন।
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$SERVICE_ACCOUNT_ADDRESS_ADK" \
--role="roles/aiplatform.user"
এখন, Gradio ফ্রন্টএন্ডের জন্য সার্ভিস অ্যাকাউন্ট তৈরি করুন।
gcloud iam service-accounts create $SERVICE_ACCOUNT_GRADIO \
--display-name="Service account for gradio frontend cloud run"
এবং Gradio ফ্রন্টএন্ডকে Cloud Run ইনভোকার রোলটি প্রদান করুন, যা এটিকে Cloud Run-এ হোস্ট করা ADK এজেন্টকে কল করার অনুমতি দেবে।
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$SERVICE_ACCOUNT_ADDRESS_GRADIO" \
--role="roles/run.invoker"
৪. একটি ADK অ্যাপ তৈরি করুন
পরবর্তী ধাপে, আপনি ADK কুইকস্টার্ট অ্যাপ্লিকেশনটির জন্য কোড তৈরি করবেন।
দ্রষ্টব্য: ল্যাব শেষে আপনার ফাইল কাঠামোটি নিম্নলিখিতের মতো দেখতে হবে:
- codelab-gradio-adk <-- you'll deploy the ADK agent from here
- gradio-frontend <-- you'll deploy the gradio app from here
- app.py
- requirements.txt
- multi_tool_agent
- __init__.py
- agent.py
- requirements.txt
প্রথমে, সম্পূর্ণ কোডল্যাবের জন্য একটি ডিরেক্টরি তৈরি করুন।
mkdir codelab-gradio-adk
cd codelab-gradio-adk
এখন, ADK এজেন্ট সার্ভিসের জন্য একটি ডিরেক্টরি তৈরি করুন।
mkdir multi_tool_agent && cd multi_tool_agent
নিম্নলিখিত বিষয়বস্তু সহ একটি __init__.py ফাইল তৈরি করুন:
from . import agent
একটি requirements.txt ফাইল তৈরি করুন:
google-adk
agent.py নামে একটি ফাইল তৈরি করুন।
import datetime
from zoneinfo import ZoneInfo
from google.adk.agents import Agent
def get_weather(city: str) -> dict:
"""Retrieves the current weather report for a specified city.
Args:
city (str): The name of the city for which to retrieve the weather report.
Returns:
dict: status and result or error msg.
"""
if city.lower() == "new york":
return {
"status": "success",
"report": (
"The weather in New York is sunny with a temperature of 25 degrees"
" Celsius (77 degrees Fahrenheit)."
),
}
else:
return {
"status": "error",
"error_message": f"Weather information for '{city}' is not available.",
}
def get_current_time(city: str) -> dict:
"""Returns the current time in a specified city.
Args:
city (str): The name of the city for which to retrieve the current time.
Returns:
dict: status and result or error msg.
"""
if city.lower() == "new york":
tz_identifier = "America/New_York"
else:
return {
"status": "error",
"error_message": (
f"Sorry, I don't have timezone information for {city}."
),
}
tz = ZoneInfo(tz_identifier)
now = datetime.datetime.now(tz)
report = (
f'The current time in {city} is {now.strftime("%Y-%m-%d %H:%M:%S %Z%z")}'
)
return {"status": "success", "report": report}
root_agent = Agent(
name="weather_time_agent",
model="gemini-2.5-flash",
description=(
"Agent to answer questions about the time and weather in a city."
),
instruction=(
"You are a helpful agent who can answer user questions about the time and weather in a city."
),
tools=[get_weather, get_current_time],
)
৫. ADK এজেন্ট স্থাপন করুন
এই অংশে, আপনি ক্লাউড রান-এ ADK এজেন্টটি ডেপ্লয় করবেন। তারপর, ADK-এর দেওয়া ডেভ ওয়েব UI ব্যবহার করে ডেপ্লয়মেন্টটি সফল হয়েছে কিনা তা যাচাই করবেন। সবশেষে, এই সার্ভিসে অথেনটিকেটেড কলের জন্য আপনাকে অনুমতি নিতে হবে।
প্যারেন্ট ফোল্ডারে যান।
দ্রষ্টব্য: ADK এজেন্ট কোডে অবশ্যই multi_tool_agent ফোল্ডারটিকে তার রুট ফোল্ডার হিসেবে অন্তর্ভুক্ত করতে হবে।
cd ..
প্রথমে, ক্লাউড রান পরিষেবাটি তৈরি করুন:
দ্রষ্টব্য: ডেভ UI দিয়ে পরীক্ষা করার জন্য --with_ui ঐচ্ছিক, যা পরবর্তী একটি ধাপে দেখানো হবে:
দ্রষ্টব্য: -- কমান্ডটি আপনাকে অন্তর্নিহিত gcloud run deploy কমান্ডে কমান্ড লাইন ফ্ল্যাগ পাস করার সুযোগ দেয়।
দ্রষ্টব্য: ` uvx --from কমান্ডটি `google-adk` প্যাকেজ থেকে একটি কমান্ড কার্যকর করে। `uvx` একটি অস্থায়ী ভার্চুয়াল এনভায়রনমেন্ট তৈরি করবে, তাতে `google-adk` ইনস্টল করবে, নির্দিষ্ট কমান্ডটি চালাবে এবং তারপর এনভায়রনমেন্টটি বন্ধ করে দেবে।
uvx --from google-adk \
adk deploy cloud_run \
--project=$PROJECT_ID \
--region=$REGION \
--service_name=adk-agent-cr \
--with_ui \
./multi_tool_agent \
-- \
--service-account=$SERVICE_ACCOUNT_ADDRESS_ADK \
--allow-unauthenticated
এরপর, URL-টি একটি env var হিসেবে সংরক্ষণ করুন, যা আপনি এই কোডল্যাবের দ্বিতীয় অংশে ব্যবহার করবেন।
AGENT_SERVICE_URL=$(gcloud run services describe adk-agent-cr --region $REGION --format 'value(status.url)')
এখন, এজেন্টকে চেষ্টা করুন।
আপনার ওয়েব ব্রাউজারে সার্ভিস ইউআরএলটি খুলুন এবং জিজ্ঞাসা করুন, " tell me about the weather in new york "। আপনি "নিউ ইয়র্কের আবহাওয়া রৌদ্রোজ্জ্বল এবং তাপমাত্রা ২৫ ডিগ্রি সেলসিয়াস (৭৭ ডিগ্রি ফারেনহাইট)"-এর মতো একটি উত্তর দেখতে পাবেন।
সবশেষে, এজেন্টকে সুরক্ষিত করুন।
চলুন এখন এজেন্টের অ্যাক্সেস সুরক্ষিত করি। পরবর্তী অংশে, আপনি একটি ক্লাউড রান সার্ভিস ডেপ্লয় করবেন যা এই ব্যাকএন্ড সার্ভিসে একটি অথেনটিকেটেড কল করবে।
gcloud run services remove-iam-policy-binding adk-agent-cr \
--member="allUsers" \
--role="roles/run.invoker" \
--region=$REGION
৬. একটি গ্রাডিও ফ্রন্ট-এন্ড স্থাপন করুন
এই ধাপে, আপনি আপনার ADK এজেন্টের জন্য একটি গ্রেডিও ফ্রন্টএন্ড তৈরি করবেন।
দ্রষ্টব্য: আপনি ADK এজেন্টের সাথে একই সার্ভিসে গ্রেডিও অ্যাপটি রাখতে পারেন। এই কোডল্যাবটি ক্লাউড রানে কীভাবে অথেনটিকেটেড সার্ভিস টু সার্ভিস কল করতে হয় তা দেখানোর জন্য ২টি পৃথক সার্ভিস প্রদান করে।
প্রথমে, multi_tool_agent ফোল্ডারের পাশে একটি অ্যাপ তৈরি করুন।
mkdir gradio-frontend && cd gradio-frontend
এরপর, requirements.txt একটি ফাইল তৈরি করুন যাতে নিম্নলিখিত বিষয়গুলো থাকবে।
gradio
requests
google-auth
এখন, একটি app.py ফাইল তৈরি করুন।
import gradio as gr
import requests
import json
import uuid
import os
import google.auth.transport.requests
import google.oauth2.id_token
# https://weather-time-service2-392295011265.us-west4.run.app
BASE_URL = os.environ.get("AGENT_SERVICE_URL")
# multi_tool_agent
APP_NAME = os.environ.get("AGENT_APP_NAME")
# Generate a unique user ID for each session of the Gradio app
USER_ID = f"gradio-user-{uuid.uuid4()}"
# API Endpoints
CREATE_SESSION_URL = f"{BASE_URL}/apps/{APP_NAME}/users/{USER_ID}/sessions"
RUN_SSE_URL = f"{BASE_URL}/run_sse"
def get_id_token():
"""Get an ID token to authenticate with the other Cloud Run service."""
audience = BASE_URL
request = google.auth.transport.requests.Request()
id_token = google.oauth2.id_token.fetch_id_token(request, audience)
return id_token
def create_session() -> str | None:
"""Creates a new session and returns the session ID."""
try:
id_token = get_id_token()
headers = {"Authorization": f"Bearer {id_token}"}
response = requests.post(CREATE_SESSION_URL, headers=headers)
response.raise_for_status()
return response.json().get("id")
except Exception as e:
print(f"Error creating session: {e}")
return None
def query_agent(prompt: str):
"""Sends a prompt to the agent and returns the streamed response."""
session_id = create_session()
if not session_id:
return "Error: Could not create a session."
id_token = get_id_token()
headers = {
"Content-Type": "application/json",
"Accept": "text/event-stream",
"Authorization": f"Bearer {id_token}",
}
payload = {
"app_name": APP_NAME,
"user_id": USER_ID,
"session_id": session_id,
"new_message": {"role": "user", "parts": [{"text": prompt}]},
"streaming": True
}
full_response = ""
try:
with requests.post(RUN_SSE_URL, headers=headers, json=payload, stream=True) as response:
response.raise_for_status()
for chunk in response.iter_lines():
if chunk and chunk.decode('utf-8').startswith('data:'):
json_data = chunk.decode('utf-8')[len('data:'):].strip()
try:
data = json.loads(json_data)
text = data.get("content", {}).get("parts", [{}])[0].get("text", "")
if text:
full_response = text
except json.JSONDecodeError:
pass # Ignore chunks that are not valid JSON
return full_response
except requests.exceptions.RequestException as e:
return f"An error occurred: {e}"
iface = gr.Interface(
fn=query_agent,
inputs=gr.Textbox(lines=2, placeholder="e.g., What's the weather in new york?"),
outputs="text",
title="Weather and Time Agent",
description="Ask a question about the weather or time in a specific location.",
)
if __name__ == "__main__":
iface.launch()
৭. আপনার গ্রেডিও অ্যাপটি ডেপ্লয় ও টেস্ট করুন
এই ধাপে, আপনি ফ্রন্ট এন্ড গ্রেডিও অ্যাপটি ক্লাউড রান-এ ডেপ্লয় করবেন।
নিশ্চিত করুন যে আপনি gradio অ্যাপ ডিরেক্টরিতে আছেন।
pwd
আপনার codelab-gradio-adk/gradio-frontend দেখা উচিত।
এখন আপনার গ্রেডিও অ্যাপটি ডেপ্লয় করুন।
দ্রষ্টব্য: যদিও এই গ্র্যাডিও ফ্রন্টএন্ড সার্ভিসটি একটি সর্বজনীনভাবে উপলব্ধ ওয়েবসাইট, এর ব্যাকএন্ড সার্ভিসের জন্য অথেনটিকেশন প্রয়োজন। কেন আপনি এটি করতে চাইতে পারেন তা বোঝানোর জন্য, আপনি এই ফ্রন্টএন্ড সার্ভিসে ইউজার অথেনটিকেশন (যেমন ফায়ারবেস অথেনটিকেশন) যোগ করতে পারেন এবং তারপর শুধুমাত্র সাইন-ইন করা ব্যবহারকারীদেরই ব্যাকএন্ড সার্ভিসে কল করার অনুমতি দিতে পারেন।
gcloud run deploy my-adk-gradio-frontend \
--source . \
--region $REGION \
--allow-unauthenticated \
--set-env-vars AGENT_SERVICE_URL=$AGENT_SERVICE_URL,AGENT_APP_NAME=$AGENT_APP_NAME \
--service-account=$SERVICE_ACCOUNT_ADDRESS_GRADIO
একবার স্থাপন করা হলে, জিজ্ঞাসা করুন what's the weather in new york? এবং আপনি এরকম একটি উত্তর পাবেন The weather in New York is sunny with a temperature of 25 degrees Celsius (77 degrees Fahrenheit).
৮. অভিনন্দন!
কোডল্যাবটি সম্পন্ন করার জন্য অভিনন্দন!
আমরা এআই অ্যাপ হোস্টিং এবং এজেন্ট ডকুমেন্টেশন পর্যালোচনা করার পরামর্শ দিই।
আমরা যা আলোচনা করেছি
- ক্লাউড রানে কীভাবে একটি ADK এজেন্ট স্থাপন করবেন
- ক্লাউড রানে কীভাবে একটি গ্রেডিও অ্যাপ ডেপ্লয় করবেন
- ক্লাউড রানে কীভাবে প্রমাণীকৃত সার্ভিস-টু-সার্ভিস কল করবেন
৯. পরিষ্কার করুন
অনিচ্ছাকৃত চার্জ এড়ানোর জন্য, উদাহরণস্বরূপ, যদি ফ্রি টিয়ারে আপনার মাসিক ক্লাউড রান ব্যবহারের বরাদ্দের চেয়ে ক্লাউড রান পরিষেবাগুলো অনিচ্ছাকৃতভাবে বেশিবার চালু হয়ে যায়, তাহলে আপনি ধাপ ৬-এ তৈরি করা ক্লাউড রান পরিষেবাটি মুছে ফেলতে পারেন।
Cloud Run সার্ভিসগুলো ডিলিট করতে, https://console.cloud.google.com/run-এ অবস্থিত Cloud Run ক্লাউড কনসোলে যান এবং my-adk-gradio-frontend ও adk-agent-cr সার্ভিসগুলো ডিলিট করে দিন।
সম্পূর্ণ প্রজেক্টটি ডিলিট করতে, 'Manage Resources'- এ যান, ধাপ ২-এ তৈরি করা প্রজেক্টটি সিলেক্ট করুন এবং 'Delete' বেছে নিন। প্রজেক্টটি ডিলিট করলে, আপনাকে আপনার Cloud SDK-তে প্রজেক্ট পরিবর্তন করতে হবে। gcloud projects list চালিয়ে আপনি সমস্ত উপলব্ধ প্রজেক্টের তালিকা দেখতে পারেন।