Cloud Run पर चल रहे बैकएंड ADK एजेंट को कॉल करने वाले Gradio फ़्रंटएंड ऐप्लिकेशन को डिप्लॉय करने का तरीका

1. परिचय

खास जानकारी

इस कोडलैब में, आपको ADK एजेंट को Cloud Run पर बैकएंड सेवा के तौर पर डिप्लॉय करना होगा. इसके बाद, ADK एजेंट के लिए Gradio फ़्रंटएंड को दूसरी Cloud Run सेवा के तौर पर डिप्लॉय करना होगा. इस कोडलैब में, ADK एजेंट सेवा के लिए पुष्टि करने की सुविधा को चालू करने का तरीका बताया गया है. साथ ही, इसमें gradio की फ़्रंटएंड सेवा से पुष्टि किए गए कॉल करने का तरीका भी बताया गया है.

आपको क्या सीखने को मिलेगा

  • ADK एजेंट को Cloud Run पर डिप्लॉय करने का तरीका
  • Cloud Run पर Gradio ऐप्लिकेशन को डिप्लॉय करने का तरीका
  • Cloud Run में, सेवा से सेवा के बीच पुष्टि किए गए कॉल कैसे किए जाते हैं

2. एपीआई चालू करें

सबसे पहले, अपना Google Cloud प्रोजेक्ट सेट करें.

gcloud config set project <YOUR_PROJECT_ID>

नीचे दिए गए निर्देश को चलाकर, अपने Google Cloud प्रोजेक्ट की पुष्टि की जा सकती है:

gcloud config get-value project

इस कोडलैब के लिए, इन एपीआई को चालू करना ज़रूरी है:

gcloud services enable run.googleapis.com \
    compute.googleapis.com \
    run.googleapis.com \
    cloudbuild.googleapis.com \
    artifactregistry.googleapis.com \
    aiplatform.googleapis.com

3. सेटअप और ज़रूरी शर्तें

इस सेक्शन में, आपको कुछ सेवा खाते बनाने होंगे. साथ ही, उन्हें आईएएम की सही भूमिकाएं असाइन करनी होंगी. हर Cloud Run सेवा का अपना सेवा खाता होगा.

सबसे पहले, इस कोडलैब के लिए एनवायरमेंट वैरिएबल सेट करें. इनका इस्तेमाल पूरे कोडलैब में किया जाएगा.

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 उपयोगकर्ता" की भूमिका असाइन करें

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 invoker की भूमिका असाइन करें. इससे वह Cloud Run पर होस्ट किए गए ADK एजेंट को कॉल कर पाएगा.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$SERVICE_ACCOUNT_ADDRESS_GRADIO" \
  --role="roles/run.invoker"

4. ADK ऐप्लिकेशन बनाना

अगले चरण में, ADK क्विकस्टार्ट ऐप्लिकेशन के लिए कोड बनाया जाएगा.

ध्यान दें: लैब के आखिर में, आपकी फ़ाइल का स्ट्रक्चर ऐसा दिखना चाहिए:

- codelab-gradio-adk  <-- you'll deploy the ADK agent from here
  - gradio-frontend
    - app.py
    - requirements.txt
  - multi_tool_agent  <-- you'll deploy the gradio app from here
    - __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],
)

5. ADK एजेंट को डिप्लॉय करना

इस सेक्शन में, आपको Cloud Run पर ADK एजेंट को डिप्लॉय करने के बारे में जानकारी मिलेगी. इसके बाद, ADK की ओर से उपलब्ध कराए गए डेवलपर वेब यूज़र इंटरफ़ेस (यूआई) का इस्तेमाल करके, यह पुष्टि करें कि डिप्लॉयमेंट काम कर रहा है. आखिर में, आपको इस सेवा के लिए पुष्टि किए गए कॉल की ज़रूरत होगी.

पैरंट फ़ोल्डर पर जाएं.

ध्यान दें: एडीके एजेंट कोड में, multi_tool_agent फ़ोल्डर को रूट फ़ोल्डर के तौर पर शामिल करना ज़रूरी है.

cd ..

सबसे पहले, Cloud Run सेवा बनाएं:

ध्यान दें: डेवलपर यूज़र इंटरफ़ेस (यूआई) के साथ टेस्ट करने के लिए, --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

इसके बाद, यूआरएल को ऐसे 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 से पूछें. आपको "न्यूयॉर्क में मौसम साफ़ है और तापमान 25 डिग्री सेल्सियस (77 डिग्री फ़ैरनहाइट) है." जैसा जवाब दिखेगा.

आखिर में, एजेंट को सुरक्षित करें

अब एजेंट को सुरक्षित तरीके से ऐक्सेस करने की सुविधा चालू करते हैं. अगले सेक्शन में, Cloud Run सेवा को डिप्लॉय किया जाएगा. यह सेवा, इस बैकएंड सेवा को पुष्टि किया गया कॉल करती है.

gcloud run services remove-iam-policy-binding adk-agent-cr \
  --member="allUsers" \
  --role="roles/run.invoker" \
  --region=$REGION

6. Gradio फ़्रंट-एंड को डिप्लॉय करना

इस चरण में, आपको अपने एडीके एजेंट के लिए, Gradio फ़्रंटएंड बनाना होगा

ध्यान दें: ADK एजेंट की तरह ही, gradio ऐप्लिकेशन को भी एक ही सेवा में इस्तेमाल किया जा सकता है. इस कोडलैब में, दो अलग-अलग सेवाएं दी गई हैं. इनसे यह दिखाया गया है कि Cloud Run में, सेवा से सेवा के बीच पुष्टि किए गए कॉल कैसे किए जाते हैं.

सबसे पहले, 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()

7. अपने Gradio ऐप्लिकेशन को डिप्लॉय करना और उसकी जांच करना

इस चरण में, आपको फ़्रंट एंड Gradio ऐप्लिकेशन को Cloud Run पर डिप्लॉय करना होगा.

पक्का करें कि आप gradio ऐप्लिकेशन की डायरेक्ट्री में हों.

pwd

आपको codelab-gradio-adk/gradio-frontend दिखेगा

अब अपने Gradio ऐप्लिकेशन को डिप्लॉय करें.

ध्यान दें: यह Gradio फ़्रंटएंड सेवा, सार्वजनिक तौर पर उपलब्ध वेबसाइट है. हालांकि, बैकएंड सेवा के लिए पुष्टि करना ज़रूरी है. इसकी वजह बताने के लिए, इस फ़्रंटएंड सेवा में उपयोगकर्ता की पुष्टि करने की सुविधा (जैसे, Firebase Auth) जोड़ी जा सकती है. इसके बाद, सिर्फ़ उन उपयोगकर्ताओं को बैकएंड सेवा पर कॉल करने की अनुमति दी जा सकती है जिन्होंने साइन इन किया है.

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). जैसा जवाब मिलेगा

8. बधाई हो!

कोडलैब पूरा करने के लिए बधाई!

हमारा सुझाव है कि आप एआई ऐप्लिकेशन और एजेंट होस्ट करने के बारे में दस्तावेज़ पढ़ें.

हमने क्या-क्या कवर किया है

  • ADK एजेंट को Cloud Run पर डिप्लॉय करने का तरीका
  • Cloud Run पर Gradio ऐप्लिकेशन को डिप्लॉय करने का तरीका
  • Cloud Run में, सेवा से सेवा के बीच पुष्टि किए गए कॉल कैसे किए जाते हैं

9. व्यवस्थित करें

अनचाहे शुल्क से बचने के लिए, उदाहरण के लिए, अगर Cloud Run सेवाओं को मुफ़्त टियर में Cloud Run सेवाओं के लिए तय की गई मासिक सीमा से ज़्यादा बार इस्तेमाल किया जाता है, तो चरण 6 में बनाई गई Cloud Run सेवा को मिटाया जा सकता है.

Cloud Run सेवाओं को मिटाने के लिए, Cloud Run Cloud Console पर जाएं. इसके लिए, https://console.cloud.google.com/run पर जाएं. इसके बाद, my-adk-gradio-frontend और adk-agent-cr सेवाओं को मिटाएं.

पूरे प्रोजेक्ट को मिटाने के लिए, संसाधन मैनेज करें पर जाएं. इसके बाद, दूसरे चरण में बनाया गया प्रोजेक्ट चुनें और मिटाएं को चुनें. प्रोजेक्ट मिटाने पर, आपको Cloud SDK में प्रोजेक्ट बदलने होंगे. gcloud projects list कमांड चलाकर, सभी उपलब्ध प्रोजेक्ट की सूची देखी जा सकती है.