टूल के तौर पर डेटाबेस: ADK, MCP टूलबॉक्स, और Cloud SQL के साथ एजेंटिक RAG

1. परिचय

एआई एजेंट, सिर्फ़ उस डेटा का इस्तेमाल कर सकते हैं जिसे वे ऐक्सेस कर सकते हैं. ज़्यादातर रीयल-वर्ल्ड डेटा, डेटाबेस में मौजूद होता है. एजेंट को डेटाबेस से कनेक्ट करने का मतलब आम तौर पर यह होता है कि आपको अपने एजेंट कोड में कनेक्शन मैनेजमेंट, क्वेरी लॉजिक, और एम्बेडिंग पाइपलाइन लिखनी होंगी. डेटाबेस का ऐक्सेस पाने वाले हर एजेंट को यह काम दोहराना पड़ता है. साथ ही, हर क्वेरी में बदलाव करने के लिए, एजेंट को फिर से डिप्लॉय करना पड़ता है.

इस कोडलैब में, एक अलग तरीका दिखाया गया है. डेटाबेस टूल को YAML फ़ाइल में शामिल किया जाता है. जैसे, स्टैंडर्ड एसक्यूएल क्वेरी, वेक्टर सिमिलैरिटी सर्च, और अपने-आप एम्बेडिंग जनरेट करने की सुविधा. इसके बाद, डेटाबेस के लिए MCP टूलबॉक्स, MCP सर्वर के तौर पर डेटाबेस से जुड़ी सभी कार्रवाइयां करता है. आपका एजेंट कोड कम से कम रहता है: टूल लोड करें और Gemini को यह तय करने दें कि किस टूल को कॉल करना है.

आपको क्या बनाने को मिलेगा

"TechJobs" के लिए स्मार्ट जॉब बोर्ड असिस्टेंट — यह ADK एजेंट है, जो Gemini की मदद से काम करता है. यह डेवलपर को स्टैंडर्ड फ़िल्टर (भूमिका, टेक स्टैक) का इस्तेमाल करके, टेक्नोलॉजी से जुड़ी नौकरियों की लिस्ट ब्राउज़ करने में मदद करता है. साथ ही, आम बोलचाल की भाषा में दिए गए निर्देशों के ज़रिए नौकरियां खोजने में भी मदद करता है. जैसे, "मुझे एआई चैटबॉट पर काम करने के लिए, रिमोट जॉब चाहिए." एजेंट, Cloud SQL PostgreSQL डेटाबेस से डेटा पढ़ता है और उसमें डेटा लिखता है. यह काम पूरी तरह से MCP Toolbox for Databases की मदद से किया जाता है. यह टूल, डेटाबेस के सभी ऐक्सेस को मैनेज करता है. इसमें वेक्टर सर्च के लिए, अपने-आप एम्बेडिंग जनरेट करने की सुविधा भी शामिल है. आखिर में, टूलबॉक्स और एजेंट, दोनों Cloud Run पर चलते हैं.

eb6de681c40990c1.jpeg

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

  • एमसीपी (मॉडल कॉन्टेक्स्ट प्रोटोकॉल), एआई एजेंट के लिए टूल ऐक्सेस को कैसे स्टैंडर्ड बनाता है. साथ ही, एमसीपी टूलबॉक्स फ़ॉर डेटाबेस, इसे डेटाबेस के कामों पर कैसे लागू करता है
  • ADK एजेंट और Cloud SQL PostgreSQL के बीच, MCP Toolbox for Databases को मिडलवेयर के तौर पर सेट अप करना
  • tools.yaml में डेटाबेस टूल के बारे में जानकारी दें. आपके एजेंट में कोई डेटाबेस कोड नहीं होना चाहिए
  • ToolboxToolset का इस्तेमाल करके, ऐसा ADK एजेंट बनाएं जो चालू Toolbox सर्वर से टूल लोड करता हो
  • Cloud SQL के पहले से मौजूद embedding() फ़ंक्शन का इस्तेमाल करके, वेक्टर एम्बेडिंग जनरेट करना और pgvector की मदद से सिमेंटिक सर्च की सुविधा चालू करना
  • लिखने की कार्रवाइयों के दौरान, वेक्टर अपने-आप शामिल करने के लिए valueFromParam सुविधा का इस्तेमाल करना
  • Toolbox सर्वर और ADK एजेंट, दोनों को Cloud Run पर डिप्लॉय करें

ज़रूरी शर्तें

  • मुफ़्त में आज़माने के लिए बिलिंग खाते वाला Google Cloud खाता
  • Python और SQL की बुनियादी जानकारी
  • ADK, MCP Toolbox या pgvector का पहले से अनुभव होना ज़रूरी नहीं है

2. अपना एनवायरमेंट सेट अप करना

इस चरण में, Cloud Shell एनवायरमेंट तैयार किया जाता है. साथ ही, आपके Google Cloud प्रोजेक्ट को कॉन्फ़िगर किया जाता है और रेफ़रंस रिपॉज़िटरी को क्लोन किया जाता है.

Cloud Shell खोलें

अपने ब्राउज़र में Cloud Shell खोलें. Cloud Shell, पहले से कॉन्फ़िगर किया गया एनवायरमेंट उपलब्ध कराता है. इसमें इस कोडलैब के लिए ज़रूरी सभी टूल शामिल होते हैं. जब कहा जाए, तब अनुमति दें पर क्लिक करें

इसके बाद, टर्मिनल खोलने के लिए "देखें" -> "टर्मिनल" पर क्लिक करें.आपका इंटरफ़ेस कुछ ऐसा दिखना चाहिए

86307fac5da2f077.png

यह हमारा मुख्य इंटरफ़ेस होगा, जिसमें ऊपर की ओर आईडीई और नीचे की ओर टर्मिनल होगा

अपनी वर्किंग डायरेक्ट्री सेट अप करना

अपनी वर्किंग डायरेक्ट्री बनाएं. इस कोडलैब में लिखा गया सारा कोड यहां मौजूद होता है:

mkdir -p ~/build-agent-adk-toolbox-cloudsql
cloudshell workspace ~/build-agent-adk-toolbox-cloudsql && cd ~/build-agent-adk-toolbox-cloudsql

Google Cloud प्रोजेक्ट सेट अप करना

जगह की जानकारी वाले वैरिएबल के साथ .env फ़ाइल बनाएं:

# For Vertex AI / Gemini API calls
echo "GOOGLE_CLOUD_LOCATION=global" > .env
# For Cloud SQL, Cloud Run, Artifact Registry
echo "REGION=us-central1" >> .env

प्रोजेक्ट सेटअप स्क्रिप्ट को अपनी वर्किंग डायरेक्ट्री में डाउनलोड करें:

curl -sL https://raw.githubusercontent.com/alphinside/cloud-trial-project-setup/main/setup_verify_trial_project.sh -o setup_verify_trial_project.sh

स्क्रिप्ट चलाएं. यह आपके मुफ़्त में आज़माने वाले बिलिंग खाते की पुष्टि करता है, एक नया प्रोजेक्ट बनाता है या मौजूदा प्रोजेक्ट की पुष्टि करता है, आपके प्रोजेक्ट आईडी को मौजूदा डायरेक्ट्री में मौजूद .env फ़ाइल में सेव करता है, और gcloud में चालू प्रोजेक्ट सेट करता है.

bash setup_verify_trial_project.sh && source .env

स्क्रिप्ट में ये काम किए जाएंगे:

  1. पुष्टि करें कि आपके पास मुफ़्त में आज़माने की सुविधा वाला चालू बिलिंग खाता हो
  2. .env में कोई मौजूदा प्रोजेक्ट है या नहीं, यह देखें
  3. कोई नया प्रोजेक्ट बनाएं या मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें
  4. मुफ़्त में आज़माने की सुविधा वाले बिलिंग खाते को अपने प्रोजेक्ट से लिंक करना
  5. प्रोजेक्ट आईडी को .env में सेव करें
  6. प्रोजेक्ट को चालू gcloud प्रोजेक्ट के तौर पर सेट करें

पुष्टि करें कि प्रोजेक्ट सही तरीके से सेट किया गया है. इसके लिए, Cloud Shell टर्मिनल प्रॉम्प्ट में अपनी वर्किंग डायरेक्ट्री के बगल में मौजूद पीले रंग का टेक्स्ट देखें. इसमें आपका प्रोजेक्ट आईडी दिखना चाहिए.

dcba35ce1389f313.png

अगर इस कोडलैब के दौरान किसी भी समय आपका Cloud Shell सेशन रीसेट हो जाता है, तो अपनी वर्किंग डायरेक्ट्री पर वापस जाएं और अपने प्रोजेक्ट कॉन्फ़िगरेशन को वापस लाने के लिए, bash setup_verify_trial_project.sh && source .env को फिर से चलाएं. पुष्टि करें कि टर्मिनल प्रॉम्प्ट में, पीले रंग का प्रोजेक्ट आईडी टेक्स्ट फिर से दिखता है.

gcloud services enable \
  aiplatform.googleapis.com \
  sqladmin.googleapis.com \
  compute.googleapis.com \
  run.googleapis.com \
  cloudbuild.googleapis.com \
  artifactregistry.googleapis.com
  • Vertex AI API (aiplatform.googleapis.com) — इसमें आपका एजेंट, Gemini मॉडल का इस्तेमाल करता है. साथ ही, टूलबॉक्स, वेक्टर सर्च के लिए Embedding API का इस्तेमाल करता है.
  • Cloud SQL Admin API (sqladmin.googleapis.com) — इससे PostgreSQL इंस्टेंस को मैनेज किया जाता है.
  • Compute Engine API (compute.googleapis.com) — Cloud SQL इंस्टेंस बनाने के लिए ज़रूरी है.
  • Cloud Run, Cloud Build, Artifact Registry — इनका इस्तेमाल इस कोडलैब में बाद में डिप्लॉयमेंट के चरण में किया जाता है

3. डेटाबेस इंस्टेंस बनाना

इस चरण में, बैकग्राउंड में Cloud SQL इंस्टेंस बनाने की प्रोसेस शुरू हो जाती है. जब तक आप ट्यूटोरियल पूरा करते हैं, तब तक यह प्रोसेस पूरी हो जाती है.

इंस्टेंस बनाना शुरू करें

अपनी .env फ़ाइल में डेटाबेस का पासवर्ड जोड़ें और उसे फिर से लोड करें:

echo "DB_PASSWORD=techjobs-pwd-2025" >> .env
source .env

Cloud SQL इंस्टेंस बनाना शुरू करें. यह सुविधा बैकग्राउंड में काम करती है, ताकि आप अपना काम जारी रख सकें:

gcloud sql instances create jobs-instance \
  --database-version=POSTGRES_17 \
  --tier=db-custom-1-3840 \
  --edition=ENTERPRISE \
  --region=$REGION \
  --root-password=$DB_PASSWORD \
  --enable-google-ml-integration \
  --database-flags cloudsql.enable_google_ml_integration=on \
  --quiet &
  • db-custom-1-3840, ENTERPRISE वर्शन में सबसे छोटा डेडीकेटेड-कोर Cloud SQL टियर है. इसमें 1 vCPU और 3.75 जीबी रैम होती है. ज़्यादा जानकारी के लिए, यहां जाएं. Vertex AI ML के इंटिग्रेशन के लिए, एक डेडीकेटेड कोर की ज़रूरत होती है. शेयर किए गए कोर टियर (db-f1-micro, db-g1-small) इसे सपोर्ट नहीं करते.
  • --root-password, डिफ़ॉल्ट postgres उपयोगकर्ता के लिए पासवर्ड सेट करता है.
  • --enable-google-ml-integration की मदद से, Cloud SQL को Vertex AI के साथ इंटिग्रेट किया जा सकता है. इससे, embedding() फ़ंक्शन का इस्तेमाल करके, SQL से सीधे तौर पर एम्बेडिंग मॉडल को कॉल किया जा सकता है.
  • &, बैकग्राउंड में कमांड चलाता है.

यह बैकग्राउंड में चलेगा. अब MCP टूलबॉक्स बाइनरी डाउनलोड करते हैं. एक ही टर्मिनल में ऐसा किया जा सकता है

Toolbox बाइनरी डाउनलोड करना

इस ट्यूटोरियल में, हम MCP टूलबॉक्स का इस्तेमाल करेंगे. अच्छी बात यह है कि यह पहले से बने बाइनरी के साथ आता है, जिसे Linux एनवायरमेंट में इस्तेमाल किया जा सकता है. इसे बैकग्राउंड में डाउनलोड होने दें, क्योंकि इसमें काफ़ी समय लगता है

cd ~/build-agent-adk-toolbox-cloudsql
curl -O https://storage.googleapis.com/genai-toolbox/v0.27.0/linux/amd64/toolbox &

इस प्रोसेस को मौजूदा टैब में चलने दें. हम इसे पहले से ही बैकग्राउंड में चला रहे हैं. हालांकि, आउटपुट अब भी दिखेगा. आइए, Cloud Shell में नया टर्मिनल टैब खोलें (प्लस आइकॉन पर क्लिक करें), ताकि हम ज़्यादा ध्यान दे सकें.

b01e3fbd89f17332.png

अपनी वर्किंग डायरेक्ट्री पर फिर से जाएं और पिछली सेटअप स्क्रिप्ट का इस्तेमाल करके प्रोजेक्ट को चालू करें.

cd ~/build-agent-adk-toolbox-cloudsql
bash setup_verify_trial_project.sh && source .env

इस चरण में, Python प्रोजेक्ट सेट अप किया जाता है, डिपेंडेंसी इंस्टॉल की जाती हैं, और ADK एजेंट डायरेक्ट्री को तैयार किया जाता है

4. एजेंट प्रोजेक्ट को शुरू करना

Python प्रोजेक्ट सेट अप करना

uv एक तेज़ Python पैकेज और प्रोजेक्ट मैनेजर है. इसे Rust में लिखा गया है ( uv के दस्तावेज़ ). इस कोडलैब में, इसे तेज़ी से काम करने और इस्तेमाल करने में आसानी के लिए इस्तेमाल किया गया है.

Python प्रोजेक्ट शुरू करें और ज़रूरी डिपेंडेंसी जोड़ें:

uv init
uv add google-adk==1.25.0 toolbox-adk==0.6.0
  • google-adk — Google का एजेंट डेवलपमेंट किट, जिसमें Gemini SDK शामिल है
  • toolbox-adk — डेटाबेस के लिए MCP Toolbox के लिए ADK इंटिग्रेशन.

एजेंट डायरेक्ट्री का स्ट्रक्चर बनाना

ADK को एक खास फ़ोल्डर लेआउट की ज़रूरत होती है: आपके एजेंट के नाम वाली एक डायरेक्ट्री, जिसमें __init__.py, agent.py, और .env शामिल हों. इसमें स्ट्रक्चर को तुरंत सेट अप करने के लिए, पहले से मौजूद कमांड दी गई है:

uv run adk create jobs_agent \
    --model gemini-2.5-flash \
    --project ${GOOGLE_CLOUD_PROJECT} \
    --region ${GOOGLE_CLOUD_LOCATION}

अब आपकी डायरेक्ट्री ऐसी दिखनी चाहिए:

build-agent-adk-toolbox-cloudsql/
├── jobs_agent/
│   ├── __init__.py
│   ├── agent.py
│   └── .env
├── pyproject.toml
├── .env              (project setup — already exists)
└── .venv/

5. नौकरी की लिस्टिंग वाले डेटाबेस को सीड करना

इस चरण में, सीड डेटा लिखा जाता है. साथ ही, Cloud SQL इंस्टेंस के प्रोविज़निंग की प्रोसेस पूरी होने का इंतज़ार किया जाता है. इसके बाद, jobs टेबल में 15 नौकरी की लिस्टिंग और उनके ब्यौरे की एम्बेडिंग लोड की जाती है

सीड एसक्यूएल लिखना

हम Cloud Shell Editor में seed.sql नाम की एक फ़ाइल बनाएंगे. इसमें नौकरियों की सूची का कॉन्टेंट होगा. इससे pgvector सहायता के साथ jobs टेबल बनती है और टेक्नोलॉजी कंपनियों में 15 नौकरी की लिस्टिंग डाली जाती हैं.

सबसे पहले, इस कमांड का इस्तेमाल करके seed.sql फ़ाइल बनाएं:

cloudshell edit seed.sql

इसके बाद, इन स्क्रिप्ट को फ़ाइल में कॉपी करें

-- seed.sql
-- DISCLAIMER: These job listings are entirely fictional and created for tutorial
-- purposes only. Company names are used for illustrative context — the positions,
-- salaries, and descriptions do not reflect real openings.

CREATE EXTENSION IF NOT EXISTS google_ml_integration;
CREATE EXTENSION IF NOT EXISTS vector;

CREATE TABLE IF NOT EXISTS jobs (
    id SERIAL PRIMARY KEY,
    title VARCHAR NOT NULL,
    company VARCHAR NOT NULL,
    role VARCHAR NOT NULL,
    tech_stack VARCHAR NOT NULL,
    salary_range VARCHAR NOT NULL,
    location VARCHAR NOT NULL,
    openings INTEGER NOT NULL,
    description TEXT NOT NULL,
    description_embedding vector(3072)
);

INSERT INTO jobs (title, company, role, tech_stack, salary_range, location, openings, description) VALUES
('Senior Backend Engineer', 'Stripe', 'Backend', 'Go, PostgreSQL, gRPC, Kubernetes', '$180-250K/year', 'San Francisco, Hybrid', 3,
 'Design and build high-throughput microservices powering payment infrastructure for millions of businesses. Optimize Go services for sub-100ms latency at scale, work with PostgreSQL and Redis for data persistence, and deploy on Kubernetes clusters handling billions of API calls.'),

('Machine Learning Engineer', 'Spotify', 'Data/AI', 'Python, TensorFlow, BigQuery, Vertex AI', '$170-230K/year', 'Stockholm, Remote', 2,
 'Build and deploy ML models for music recommendation and personalization systems serving hundreds of millions of listeners. Design feature pipelines in BigQuery, train models using distributed computing, and serve predictions through real-time APIs processing thousands of requests per second.'),

('Frontend Engineer', 'Vercel', 'Frontend', 'React, TypeScript, Next.js', '$140-190K/year', 'Remote', 4,
 'Build developer-facing dashboard interfaces and deployment tools used by millions of developers worldwide. Create responsive, accessible React components for project management, analytics, and real-time deployment monitoring with a focus on developer experience.'),

('DevOps Engineer', 'Datadog', 'DevOps', 'Terraform, GCP, Docker, Kubernetes, ArgoCD', '$160-220K/year', 'New York, Hybrid', 2,
 'Manage cloud infrastructure powering an observability platform used by thousands of engineering teams. Automate deployment pipelines with ArgoCD, manage multi-cloud Kubernetes clusters, and implement infrastructure-as-code with Terraform across production environments.'),

('Mobile Engineer (Android)', 'Grab', 'Mobile', 'Kotlin, Jetpack Compose, GraphQL', '$120-170K/year', 'Singapore, Hybrid', 3,
 'Develop features for a super-app serving millions of users across Southeast Asia. Build modern Android UIs with Jetpack Compose, integrate GraphQL APIs, and optimize app performance for diverse device capabilities and network conditions.'),

('Data Engineer', 'Airbnb', 'Data', 'Python, Apache Spark, Airflow, BigQuery', '$160-210K/year', 'San Francisco, Hybrid', 2,
 'Build data pipelines that process booking, search, and pricing data for a global travel marketplace. Design ETL workflows with Apache Spark and Airflow, maintain data warehouses in BigQuery, and ensure data quality for analytics and machine learning teams.'),

('Full Stack Engineer', 'Revolut', 'Full Stack', 'TypeScript, Node.js, React, PostgreSQL', '$130-180K/year', 'London, Remote', 5,
 'Build the next generation of financial products making banking accessible to millions of users across 35 countries. Develop real-time trading interfaces with React and WebSockets, build Node.js APIs handling market data streams, and design PostgreSQL schemas for financial transactions.'),

('Site Reliability Engineer', 'Cloudflare', 'SRE', 'Go, Prometheus, Grafana, GCP, Terraform', '$170-230K/year', 'Austin, Hybrid', 2,
 'Ensure 99.99% uptime for a global network handling millions of requests per second. Define SLOs, build monitoring dashboards with Prometheus and Grafana, manage incident response, and automate infrastructure scaling across 300+ data centers worldwide.'),

('Cloud Architect', 'Google Cloud', 'Cloud', 'GCP, Terraform, Kubernetes, Python', '$200-280K/year', 'Seattle, Hybrid', 1,
 'Help enterprises modernize their infrastructure on Google Cloud. Design multi-region architectures, lead migration projects from on-premises to GKE, and build reference implementations using Terraform and Cloud Foundation Toolkit.'),

('Backend Engineer (Payments)', 'Square', 'Backend', 'Java, Spring Boot, PostgreSQL, Kafka', '$160-220K/year', 'San Francisco, Hybrid', 3,
 'Build payment processing systems handling millions of transactions for businesses of all sizes. Design event-driven architectures using Kafka, implement idempotent payment flows with Spring Boot, and ensure PCI-DSS compliance across all services.'),

('AI Engineer', 'Hugging Face', 'Data/AI', 'Python, LangChain, Vertex AI, FastAPI, PostgreSQL', '$150-210K/year', 'Paris, Remote', 2,
 'Build AI-powered tools for the largest open-source ML community. Develop RAG pipelines that index and search model documentation, create conversational agents using LangChain, and deploy AI services with FastAPI on cloud infrastructure.'),

('Platform Engineer', 'Coinbase', 'Platform', 'Rust, Kubernetes, AWS, Terraform', '$180-250K/year', 'Remote', 0,
 'Build the infrastructure platform for a leading cryptocurrency exchange. Develop high-performance matching engines in Rust, manage Kubernetes clusters for microservices, and design CI/CD pipelines that enable rapid feature deployment with zero downtime.'),

('QA Automation Engineer', 'Shopify', 'QA', 'Python, Selenium, Cypress, Jenkins', '$110-160K/year', 'Toronto, Hybrid', 3,
 'Design and maintain automated test suites for a commerce platform powering millions of merchants. Build end-to-end test frameworks with Cypress and Selenium, integrate tests into Jenkins CI pipelines, and establish quality gates that prevent regressions in checkout and payment flows.'),

('Security Engineer', 'CrowdStrike', 'Security', 'Python, SIEM, Kubernetes, Penetration Testing', '$170-240K/year', 'Austin, On-site', 1,
 'Protect enterprise customers from cyber threats on a leading endpoint security platform. Conduct penetration testing, design security monitoring with SIEM tools, implement zero-trust networking in Kubernetes environments, and lead incident response for security events.'),

('Product Engineer', 'GitLab', 'Full Stack', 'Go, React, PostgreSQL, Redis, GCP', '$140-200K/year', 'Remote', 4,
 'Own features end-to-end for an all-in-one DevSecOps platform used by millions of developers. Build Go microservices for CI/CD pipelines, create React frontends for code review and project management, and collaborate with product managers to iterate on user-facing features using data-driven development.');

सीड स्क्रिप्ट, PostgreSQL के दो एक्सटेंशन इंस्टॉल करती है:

  • google_ml_integration — यह embedding() एसक्यूएल फ़ंक्शन उपलब्ध कराता है. यह एसक्यूएल से सीधे तौर पर Vertex AI के एम्बेडिंग मॉडल को कॉल करता है. यह डेटाबेस-लेवल का एक्सटेंशन है. इससे jobs_db में एमएल फ़ंक्शन उपलब्ध होते हैं. इंस्टेंस बनाते समय सेट किया गया इंस्टेंस-लेवल का फ़्लैग (--enable-google-ml-integration), Cloud SQL VM को Vertex AI तक पहुंचने की अनुमति देता है. एक्सटेंशन, SQL फ़ंक्शन को इस खास डेटाबेस में उपलब्ध कराता है.
  • vector (pgvector) — यह vector डेटा टाइप और दूरी के ऑपरेटर जोड़ता है, ताकि एम्बेडिंग को सेव किया जा सके और उनसे क्वेरी की जा सके.

description_embedding कॉलम, vector(3072) है. यह pgvector कॉलम है, जो 3072 डाइमेंशन वाले वेक्टर सेव करता है. फ़िलहाल, यह NULL है. embedding() फ़ंक्शन का इस्तेमाल करके, अगले चरण में एम्बेडिंग जनरेट और पॉप्युलेट करें.

डेटाबेस का सेटअप पूरा करना

आपने पिछले चरण में Cloud SQL इंस्टेंस बनाना शुरू किया था. यह प्रोसेस अब भी जारी हो सकती है और पूरी नहीं हुई है. पुष्टि करें कि इंस्टेंस तैयार है:

gcloud sql instances describe jobs-instance --format="value(state)"

आपको यह आउटपुट दिखेगा

RUNNABLE

34f5b48006b4cb3a.png

इसके बाद, Cloud SQL इंस्टेंस के सेवा खाते को Vertex AI को कॉल करने की अनुमति दें. यह embedding() फ़ंक्शन के लिए ज़रूरी है. इसका इस्तेमाल अगले चरण में किया जाएगा:

SERVICE_ACCOUNT=$(gcloud sql instances describe jobs-instance --format="value(serviceAccountEmailAddress)")

gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
  --member="serviceAccount:$SERVICE_ACCOUNT" \
  --role="roles/aiplatform.user" \
  --quiet

इसके बाद, नौकरी की लिस्टिंग के लिए एक डेटाबेस बनाएं:

gcloud sql databases create jobs_db --instance=jobs-instance

आपको आउटपुट में यह पुष्टि दिखेगी कि डेटाबेस बन गया है:

Creating Cloud SQL database...done.                                                                         
Created database [jobs_db].
instance: jobs-instance
name: jobs_db
project: workshop-xxxxxxx

डेटाबेस को कनेक्ट करना और उसमें डेटा डालना

Cloud SQL Auth प्रॉक्सी शुरू करें (cloud-sql-proxy, Cloud Shell में पहले से इंस्टॉल होता है). इससे Cloud Shell से आपके Cloud SQL इंस्टेंस तक सुरक्षित और पुष्टि किया गया कनेक्शन मिलता है:

d72e56478b517b5c.jpeg

cloud-sql-proxy ${GOOGLE_CLOUD_PROJECT}:${REGION}:jobs-instance --port 5432 &

अगर प्रॉक्सी शुरू हो जाती है, तो आपको टर्मिनल में यह आउटपुट दिखेगा:

... Authorizing with Application Default Credentials
... [workshop-xxxxxx:your-location:jobs-instance] Listening on 127.0.0.1:5432
... The proxy has started successfully and is ready for new connections!

अब मौजूदा टर्मिनल, Cloud SQL Proxy का लॉग लगातार दिखाता है. आइए, Cloud Shell में नया टर्मिनल टैब खोलें (प्लस आइकॉन पर क्लिक करें), ताकि हम ज़्यादा ध्यान दे सकें.

b01e3fbd89f17332.png

अपनी वर्किंग डायरेक्ट्री पर फिर से जाएं और पिछली सेटअप स्क्रिप्ट का इस्तेमाल करके प्रोजेक्ट को चालू करें.

cd ~/build-agent-adk-toolbox-cloudsql
bash setup_verify_trial_project.sh && source .env

इसके बाद, सीड स्क्रिप्ट चलाएं

psql "host=127.0.0.1 port=5432 dbname=jobs_db user=postgres password=$DB_PASSWORD" -f seed.sql

आपको टर्मिनल का आउटपुट इस तरह दिखेगा

CREATE EXTENSION
CREATE EXTENSION
CREATE TABLE
INSERT 0 15

आइए, डेटा की पुष्टि करें

psql "host=127.0.0.1 port=5432 dbname=jobs_db user=postgres password=$DB_PASSWORD" \
  -c "SELECT title, company, role, openings FROM jobs ORDER BY role, title;"

आपको अलग-अलग भूमिकाओं के लिए, नौकरी की 15 लिस्टिंग दिखनी चाहिए:

             title              |    company     |   role    | openings
---------------------------------+----------------+-----------+----------
 Senior Backend Engineer         | Stripe         | Backend   |        3
 Backend Engineer (Payments)     | Square         | Backend   |        3
 Cloud Architect                 | Google Cloud   | Cloud     |        1
 ...
(15 rows)

नौकरी के ब्यौरे के लिए एंबेड जनरेट करना

jobs टेबल में मौजूद description_embedding कॉलम की वैल्यू फ़िलहाल NULL है. Cloud SQL के बिल्ट-इन google_ml_integration एक्सटेंशन में, embedding() फ़ंक्शन उपलब्ध होता है. यह फ़ंक्शन, SQL से सीधे Vertex AI को कॉल करता है. इसके लिए, Python स्क्रिप्ट या बाहरी एसडीके की ज़रूरत नहीं होती.

बैकग्राउंड में एम्बेडिंग जनरेट करने की प्रोसेस शुरू करें. यह Vertex AI को कॉल करता है, ताकि वह 15 नौकरी के ब्यौरों में से हर एक के लिए, gemini-embedding-001 मॉडल का इस्तेमाल करके 3072 डाइमेंशन वाला वेक्टर जनरेट कर सके:

psql "host=127.0.0.1 port=5432 dbname=jobs_db user=postgres password=$DB_PASSWORD" \
  -c "UPDATE jobs SET description_embedding = embedding('gemini-embedding-001', description)::vector;" &

यह स्क्रिप्ट ये काम करती है:

  • embedding('gemini-embedding-001', description) — यह Vertex AI के Gemini Embedding मॉडल को सीधे तौर पर SQL से कॉल करता है. साथ ही, हर नौकरी के description टेक्स्ट को पास करता है. यह google_ml_integration एक्सटेंशन है, जिसे आपने सीड स्क्रिप्ट में इंस्टॉल किया है.
  • ::vector — यह फ़ंक्शन, फ़्लोट ऐरे को pgvector के vector टाइप में बदलता है, ताकि इसे सेव किया जा सके और दूरी के ऑपरेटरों के साथ क्वेरी की जा सके.
  • UPDATE को सभी 15 लाइनों में चलाया जाता है. इससे नौकरी के हर ब्यौरे के लिए, 3072 डाइमेंशन वाली एक एम्बेडिंग जनरेट होती है.
  • & बैकग्राउंड में कमांड चलाता है, ताकि Vertex AI एम्बेडिंग को प्रोसेस करते समय, आपके पास काम जारी रखने का विकल्प हो.

पिछली बैकग्राउंड प्रोसेस की तरह ही, मौजूदा टर्मिनल प्रोसेस का लॉग आउटपुट करेगा. आइए, Cloud Shell में नया टर्मिनल टैब खोलें (प्लस आइकॉन पर क्लिक करें), ताकि हम ज़्यादा ध्यान दे सकें.

b01e3fbd89f17332.png

अपनी वर्किंग डायरेक्ट्री पर फिर से जाएं और पिछली सेटअप स्क्रिप्ट का इस्तेमाल करके प्रोजेक्ट को चालू करें.

cd ~/build-agent-adk-toolbox-cloudsql
bash setup_verify_trial_project.sh && source .env

इसके बाद, हम अगली प्रोसेस पर जा सकते हैं

6. MCP Toolbox for Databases को कॉन्फ़िगर करना

इस चरण में, डेटाबेस के लिए एमसीपी टूलबॉक्स के बारे में बताया गया है. साथ ही, इसे आपके Cloud SQL इंस्टेंस से कनेक्ट करने के लिए कॉन्फ़िगर किया गया है. इसमें दो स्टैंडर्ड एसक्यूएल क्वेरी टूल के बारे में भी बताया गया है.

एमसीपी क्या है और Toolbox का इस्तेमाल क्यों किया जाता है?

e7b9be2e1c98b4db.png

एमसीपी (मॉडल कॉन्टेक्स्ट प्रोटोकॉल) एक ओपन प्रोटोकॉल है. यह स्टैंडर्ड तय करता है कि एआई एजेंट, बाहरी टूल को कैसे ढूंढते हैं और उनके साथ कैसे इंटरैक्ट करते हैं. यह क्लाइंट-सर्वर मॉडल तय करता है: एजेंट, एमसीपी क्लाइंट को होस्ट करता है. साथ ही, टूल एमसीपी सर्वर से दिखाए जाते हैं. MCP के साथ काम करने वाला कोई भी क्लाइंट, MCP के साथ काम करने वाले किसी भी सर्वर का इस्तेमाल कर सकता है. एजेंट को हर टूल के लिए, कस्टम इंटिग्रेशन कोड की ज़रूरत नहीं होती.

d5baa77423f0f465.png

MCP Toolbox for Databases एक ओपन-सोर्स एमसीपी सर्वर है. इसे खास तौर पर डेटाबेस ऐक्सेस करने के लिए बनाया गया है. इसके बिना, आपको Python फ़ंक्शन लिखने होंगे. ये फ़ंक्शन, डेटाबेस कनेक्शन खोलते हैं, कनेक्शन पूल मैनेज करते हैं, एसक्यूएल इंजेक्शन को रोकने के लिए पैरामीटर वाली क्वेरी बनाते हैं, गड़बड़ियों को ठीक करते हैं, और उस पूरे कोड को अपने एजेंट में एम्बेड करते हैं. डेटाबेस का ऐक्सेस पाने के लिए, हर एजेंट को यह काम दोहराना पड़ता है. क्वेरी बदलने का मतलब है कि एजेंट को फिर से डिप्लॉय करना होगा.

टूलबॉक्स की मदद से, YAML फ़ाइल लिखी जाती है. हर टूल, पैरामीटर वाले एसक्यूएल स्टेटमेंट पर मैप करता है. टूलबॉक्स, कनेक्शन पूलिंग, पैरामीटर वाली क्वेरी, पुष्टि करने की सुविधा, और निगरानी करने की सुविधा को मैनेज करता है. टूल को एजेंट से अलग कर दिया गया है. एजेंट के कोड में बदलाव किए बिना, �> में बदलाव करके और टूलबॉक्स को फिर से शुरू करके क्वेरी को अपडेट करें.tools.yaml ये टूल, ADK, LangGraph, LlamaIndex या एमसीपी के साथ काम करने वाले किसी भी फ़्रेमवर्क पर काम करते हैं.

टूल का कॉन्फ़िगरेशन लिखना

अब हमें Cloud Shell Editor में tools.yaml नाम की एक फ़ाइल बनानी होगी, ताकि हम अपने टूल का कॉन्फ़िगरेशन सेट अप कर सकें

cloudshell edit tools.yaml

इस फ़ाइल में मल्टी-डॉक्युमेंट YAML का इस्तेमाल किया गया है. हर ब्लॉक को --- से अलग किया गया है. यह एक स्टैंडअलोन रिसॉर्स है. हर संसाधन में एक kind होता है, जो यह बताता है कि वह क्या है (डेटाबेस कनेक्शन के लिए sources, एजेंट की मदद से की जा सकने वाली कार्रवाइयों के लिए tools). साथ ही, इसमें एक type होता है, जो बैकएंड के बारे में बताता है (सोर्स के लिए cloud-sql-postgres, SQL पर आधारित टूल के लिए postgres-sql). टूल, अपने सोर्स का रेफ़रंस name के ज़रिए देता है. इससे टूलबॉक्स को पता चलता है कि किस कनेक्शन पूल को एक्ज़ीक्यूट करना है. एनवायरमेंट वैरिएबल, ${VAR_NAME} सिंटैक्स का इस्तेमाल करते हैं और स्टार्टअप के समय हल किए जाते हैं.

अब, नीचे दी गई स्क्रिप्ट को सबसे पहले tools.yaml फ़ाइल में कॉपी करें

# tools.yaml

# --- Data Source ---
kind: sources
name: jobs-db
type: cloud-sql-postgres
project: ${GOOGLE_CLOUD_PROJECT}
region: ${REGION}
instance: jobs-instance
database: jobs_db
user: postgres
password: ${DB_PASSWORD}

---

यहां दी गई स्क्रिप्ट में, इस संसाधन के बारे में बताया गया है:

  • सोर्स (jobs-db) — इससे टूलबॉक्स को पता चलता है कि आपके Cloud SQL PostgreSQL इंस्टेंस से कैसे कनेक्ट करना है. cloud-sql-postgres टाइप, Cloud SQL कनेक्टर का इस्तेमाल करता है. यह पुष्टि करने और सुरक्षित कनेक्शन को अपने-आप मैनेज करता है. ${GOOGLE_CLOUD_PROJECT} , ${REGION}, और ${DB_PASSWORD} प्लेसहोल्डर, स्टार्टअप के दौरान एनवायरमेंट वैरिएबल से हल किए जाते हैं.

इसके बाद, tools.yaml में --- सिंबल के नीचे दी गई स्क्रिप्ट जोड़ें

# --- Tool 1: Search jobs by role and/or tech stack ---
kind: tools
name: search-jobs
type: postgres-sql
source: jobs-db
description: >-
  Search for job listings by role category and/or tech stack.
  Use this tool when the developer wants to browse listings
  by role (e.g., Backend, Frontend, Data) or find jobs
  using a specific technology. Both parameters accept an
  empty string to match all values.
statement: |
  SELECT title, company, role, tech_stack, salary_range, location, openings
  FROM jobs
  WHERE ($1 = '' OR LOWER(role) = LOWER($1))
  AND ($2 = '' OR LOWER(tech_stack) LIKE '%' || LOWER($2) || '%')
  ORDER BY title
  LIMIT 10
parameters:
  - name: role
    type: string
    description: "The role category to filter by (e.g., 'Backend', 'Frontend', 'Data/AI', 'DevOps'). Use empty string for all roles."
  - name: tech_stack
    type: string
    description: "A technology to search for in the tech stack (partial match, e.g., 'Python', 'Kubernetes'). Use empty string for all tech stacks."

---

# --- Tool 2: Get full details for a specific job ---
kind: tools
name: get-job-details
type: postgres-sql
source: jobs-db
description: >-
  Get full details for a specific job listing including its description,
  salary range, location, and number of openings. Use this tool when the
  developer asks about a particular job by title or company.
statement: |
  SELECT title, company, role, tech_stack, salary_range, location, openings, description
  FROM jobs
  WHERE LOWER(title) LIKE '%' || LOWER($1) || '%'
  OR LOWER(company) LIKE '%' || LOWER($1) || '%'
parameters:
  - name: search_term
    type: string
    description: "The job title or company name to look up (partial match supported)."

---

यहां दी गई स्क्रिप्ट में, इस संसाधन के बारे में बताया गया है:

  • टूल 1 और 2 (search-jobs, get-job-details) — स्टैंडर्ड एसक्यूएल क्वेरी टूल. इनमें से हर एक, टूल के नाम (जो एजेंट को दिखता है) को पैरामीटर वाले एसक्यूएल स्टेटमेंट (जिसे डेटाबेस एक्ज़ीक्यूट करता है) से मैप करता है. पैरामीटर, $1, $2 पोज़ीशनल प्लेसहोल्डर का इस्तेमाल करते हैं. टूलबॉक्स, इन्हें तैयार किए गए स्टेटमेंट के तौर पर एक्ज़ीक्यूट करता है. इससे SQL इंजेक्शन को रोका जा सकता है.

आइए, जारी रखें. tools.yaml में --- सिंबल के नीचे, यहां दी गई स्क्रिप्ट जोड़ें

# --- Embedding Model ---
kind: embeddingModels
name: gemini-embedding
type: gemini
model: gemini-embedding-001
dimension: 3072

---

यहां दी गई स्क्रिप्ट में, इस संसाधन के बारे में बताया गया है:

  • Embedding model (gemini-embedding) — यह टूलबॉक्स को कॉन्फ़िगर करता है, ताकि वह Gemini के gemini-embedding-001 मॉडल को कॉल करके 3072 डाइमेंशन वाले टेक्स्ट एम्बेडिंग जनरेट कर सके. Toolbox, पुष्टि करने के लिए ऐप्लिकेशन डिफ़ॉल्ट क्रेडेंशियल (एडीसी) का इस्तेमाल करता है. Cloud Shell या Cloud Run में एपीआई पासकोड की ज़रूरत नहीं होती. ध्यान दें कि यहां कॉन्फ़िगर किया गया यह dimension, डेटाबेस को सीड करने के लिए पहले कॉन्फ़िगर किए गए dimension के जैसा ही होना चाहिए

आइए, जारी रखें. tools.yaml में --- सिंबल के नीचे, यहां दी गई स्क्रिप्ट जोड़ें

# --- Tool 3: Semantic search by description ---
kind: tools
name: search-jobs-by-description
type: postgres-sql
source: jobs-db
description: >-
  Find jobs that match a natural language description of what the developer
  is looking for. Use this tool when the developer describes their ideal job
  using interests, work style, career goals, or project type rather than a
  specific role or tech stack. Examples: "I want to work on AI chatbots,"
  "a remote job at a fintech startup," "something involving infrastructure
  and reliability."
statement: |
  SELECT title, company, role, tech_stack, salary_range, location, description
  FROM jobs
  WHERE description_embedding IS NOT NULL
  ORDER BY description_embedding <=> $1
  LIMIT 5
parameters:
  - name: search_query
    type: string
    description: "A natural language description of the kind of job the developer is looking for."
    embeddedBy: gemini-embedding

---

यहां दी गई स्क्रिप्ट में, इस संसाधन के बारे में बताया गया है:

  • तीसरा टूल (search-jobs-by-description) — यह एक वेक्टर सर्च टूल है. search_query पैरामीटर में embeddedBy: gemini-embedding है. इससे Toolbox को यह पता चलता है कि उसे रॉ टेक्स्ट को इंटरसेप्ट करना है, उसे एम्बेडिंग मॉडल को भेजना है, और SQL स्टेटमेंट में नतीजे के तौर पर मिले वेक्टर का इस्तेमाल करना है. <=> ऑपरेटर, pgvector का कोसाइन डिस्टेंस है. इसकी वैल्यू जितनी कम होगी, ब्यौरे उतने ही मिलते-जुलते होंगे.

आखिर में, tools.yaml फ़ाइल में --- सिंबल के नीचे मौजूद टूल को जोड़ें

# --- Tool 4: Add a new job listing with automatic embedding ---
kind: tools
name: add-job
type: postgres-sql
source: jobs-db
description: >-
  Add a new job listing to the platform. Use this tool when a user asks
  to post a job that is not currently listed.
statement: |
  INSERT INTO jobs (title, company, role, tech_stack, salary_range, location, openings, description, description_embedding)
  VALUES ($1, $2, $3, $4, $5, $6, CAST($7 AS INTEGER), $8, $9)
  RETURNING title, company
parameters:
  - name: title
    type: string
    description: "The job title (e.g., 'Senior Backend Engineer')."
  - name: company
    type: string
    description: "The company name (e.g., 'Stripe', 'Spotify')."
  - name: role
    type: string
    description: "The role category (e.g., 'Backend', 'Frontend', 'Data/AI', 'DevOps')."
  - name: tech_stack
    type: string
    description: "Comma-separated list of technologies (e.g., 'Python, FastAPI, GCP')."
  - name: salary_range
    type: string
    description: "The salary range (e.g., '$150-200K/year')."
  - name: location
    type: string
    description: "Work location and arrangement (e.g., 'Remote')."
  - name: openings
    type: string
    description: "The number of open positions."
  - name: description
    type: string
    description: "A short description of the job (2-3 sentences)."
  - name: description_vector
    type: string
    description: "Auto-generated embedding vector for the job description."
    valueFromParam: description
    embeddedBy: gemini-embedding

यहां दी गई स्क्रिप्ट में, इस संसाधन के बारे में बताया गया है:

  • टूल 4 (add-job) — इससे वेक्टर इनजेस्ट करने का तरीका पता चलता है. description_vector पैरामीटर में दो खास फ़ील्ड होते हैं:
  • valueFromParam: description — टूलबॉक्स, description पैरामीटर से वैल्यू को कॉपी करके इसमें डालता है. एलएलएम को यह पैरामीटर कभी नहीं दिखता.
  • embeddedBy: gemini-embedding — टूलबॉक्स, कॉपी किए गए टेक्स्ट को SQL में पास करने से पहले, उसे वेक्टर में एम्बेड करता है.

नतीजा: एक टूल कॉल, ब्यौरे के रॉ टेक्स्ट और उसके वेक्टर एम्बेडिंग, दोनों को सेव करता है. हालांकि, एजेंट को एम्बेडिंग के बारे में कुछ भी पता नहीं होता.

मल्टी-डॉक्युमेंट YAML फ़ॉर्मैट में, हर संसाधन को --- से अलग किया जाता है. हर दस्तावेज़ में kind, name, और type फ़ील्ड होते हैं. इनसे पता चलता है कि दस्तावेज़ किस बारे में है. खास जानकारी में, हमने पहले ही इन सभी चीज़ों को कॉन्फ़िगर कर दिया है:

  • सोर्स डेटाबेस तय करना
  • डेटाबेस से क्वेरी करने के लिए, स्टैंडर्ड फ़िल्टर के साथ टूल ( टूल 1 और 2 ) तय करें
  • एम्बेड करने का मॉडल तय करना
  • डेटाबेस में वेक्टर सर्च करने के लिए टूल तय करो ( tool 3 )
  • डेटाबेस में वेक्टर डेटा डालने के लिए, टूल तय करें ( tool 4 )

एम्बेड किए गए कॉन्टेंट की पुष्टि करना

टूलबॉक्स शुरू करने से पहले, पुष्टि करें कि बैकग्राउंड एम्बेडिंग जनरेट करने की प्रोसेस पूरी हो गई है. देखें कि अब सभी नौकरियों के लिए एम्बेडिंग की सुविधा उपलब्ध है या नहीं:

psql "host=127.0.0.1 port=5432 dbname=jobs_db user=postgres password=$DB_PASSWORD" \
  -c "SELECT title, (description_embedding IS NOT NULL) AS has_embedding FROM jobs ORDER BY title;"

हर लाइन में, has_embedding कॉलम में t (सही) दिखना चाहिए. अगर ऐसा नहीं है, तो सभी लाइनें एम्बेड करने की प्रोसेस पूरी होने तक इंतज़ार किया जा सकता है

           title            | has_embedding 
-----------------------------+---------------
 AI Engineer                 | t
 Backend Engineer (Payments) | t
 Cloud Architect             | t
 Data Engineer               | t
 DevOps Engineer             | t
 Frontend Engineer           | t
 Full Stack Engineer         | t

टूलबॉक्स सर्वर शुरू करना

सेटअप के चरण में, हमने toolbox एक्ज़ीक्यूटेबल को पहले ही डाउनलोड कर लिया है. पक्का करें कि यह बाइनरी फ़ाइल मौजूद हो और डाउनलोड हो गई हो. अगर ऐसा नहीं है, तो इसे डाउनलोड करें और डाउनलोड पूरा होने तक इंतज़ार करें

cd ~/build-agent-adk-toolbox-cloudsql
if [ ! -f toolbox ]; then
  curl -O https://storage.googleapis.com/genai-toolbox/v0.27.0/linux/amd64/toolbox
fi
chmod +x toolbox

ज़रूरी एनवायरमेंट वैरिएबल एक्सपोर्ट करें और Toolbox शुरू करें. GOOGLE_CLOUD_LOCATION और GOOGLE_GENAI_USE_VERTEXAI वैरिएबल ज़रूरी हैं, क्योंकि कॉन्फ़िगरेशन में एक एम्बेडिंग मॉडल शामिल है. GOOGLE_GENAI_USE_VERTEXAI, Gemini SDK को Vertex AI के ज़रिए रूट करने के लिए कहता है (उपयोगकर्ता के Gemini API के बजाय). वहीं, GOOGLE_CLOUD_LOCATION, Gemini SDK को बताता है कि किस रीजनल एंडपॉइंट का इस्तेमाल करना है.

export GOOGLE_CLOUD_PROJECT=$GOOGLE_CLOUD_PROJECT
export GOOGLE_CLOUD_LOCATION=$GOOGLE_CLOUD_LOCATION
export GOOGLE_GENAI_USE_VERTEXAI=true
export DB_PASSWORD=$DB_PASSWORD
export REGION=$REGION
./toolbox --tools-file tools.yaml &

आपको ऐसा आउटपुट दिखेगा जिससे पता चलेगा कि सर्वर तैयार है. यह आउटपुट यहां दिखाया गया है:

... INFO "Initialized 0 authServices: " 
... INFO "Initialized 1 embeddingModels: gemini-embedding" 
... INFO "Initialized 4 tools: add-job, search-jobs, get-job-details, search-jobs-by-description" 
...
... INFO "Server ready to serve!"

पिछले चरण की तरह, इससे एक और प्रोसेस शुरू होगी और आउटपुट जनरेट होंगे. आइए, Cloud Shell में नया टर्मिनल टैब खोलें (प्लस आइकॉन पर क्लिक करें), ताकि हम ज़्यादा ध्यान दे सकें.

b01e3fbd89f17332.png

अपनी वर्किंग डायरेक्ट्री पर फिर से जाएं और पिछली सेटअप स्क्रिप्ट का इस्तेमाल करके प्रोजेक्ट को चालू करें.

cd ~/build-agent-adk-toolbox-cloudsql
bash setup_verify_trial_project.sh && source .env

टूल की पुष्टि करना

रजिस्टर किए गए सभी टूल की सूची पाने के लिए, Toolbox API से क्वेरी करें:

curl -s http://localhost:5000/api/toolset | python3 -m json.tool

आपको टूल, उनके ब्यौरे, और पैरामीटर दिखेंगे. नीचे दिए गए उदाहरण की तरह

...
       
"search-jobs-by-description": {
            "description": "Find jobs that match a natural language description of what the developer is looking for. Use this tool when the developer describes their ideal job using interests, work style, career goals, or project type rather than a specific role or tech stack. Examples: \"I want to work on AI chatbots,\" \"a remote job at a fintech startup,\" \"something involving infrastructure and reliability.\"",
            "parameters": [
                {
                    "name": "search_query",
                    "type": "string",
                    "required": true,
                    "description": "A natural language description of the kind of job the developer is looking for.",
                    "authSources": []
                }
            ],
            "authRequired": []
        }
...

search-jobs टूल को सीधे तौर पर टेस्ट करें:

curl -s -X POST http://localhost:5000/api/tool/search-jobs/invoke \
  -H "Content-Type: application/json" \
  -d '{"role": "Backend", "tech_stack": ""}' | jq '.result | fromjson'

जवाब में, आपके सीड डेटा से दो बैकएंड इंजीनियरिंग जॉब शामिल होनी चाहिए.

[
  {
    "title": "Backend Engineer (Payments)",
    "company": "Square",
    "role": "Backend",
    "tech_stack": "Java, Spring Boot, PostgreSQL, Kafka",
    "salary_range": "$160-220K/year",
    "location": "San Francisco, Hybrid",
    "openings": 3
  },
  {
    "title": "Senior Backend Engineer",
    "company": "Stripe",
    "role": "Backend",
    "tech_stack": "Go, PostgreSQL, gRPC, Kubernetes",
    "salary_range": "$180-250K/year",
    "location": "San Francisco, Hybrid",
    "openings": 3
  }
]

7. ADK एजेंट बनाना

इस चरण में, ADK एजेंट को चालू Toolbox सर्वर से कनेक्ट किया जाता है. साथ ही, चारों टूल की जांच की जाती है. ये टूल हैं: स्टैंडर्ड क्वेरी, सिमैंटिक सर्च, और वेक्टर इनजेशन. एजेंट कोड बहुत कम होता है: डेटाबेस से जुड़ा सारा लॉजिक tools.yaml में होता है.

एजेंट के एनवायरमेंट को कॉन्फ़िगर करना

ADK, शेल एनवायरमेंट से GOOGLE_GENAI_USE_VERTEXAI, GOOGLE_CLOUD_PROJECT, और GOOGLE_CLOUD_LOCATION को पढ़ता है. इन्हें आपने पहले ही सेट कर दिया था. सिर्फ़ एजेंट के लिए उपलब्ध वैरिएबल TOOLBOX_URL है. इसे एजेंट की .env फ़ाइल में जोड़ें:

echo -e "\nTOOLBOX_URL=http://127.0.0.1:5000" >> jobs_agent/.env

एजेंट मॉड्यूल को अपडेट करना

Cloud Shell Editor में jobs_agent/agent.py खोलें

cloudshell edit jobs_agent/agent.py

और इस कोड से कॉन्टेंट बदलें:

# jobs_agent/agent.py
import os

from google.adk.agents import LlmAgent
from toolbox_adk import ToolboxToolset

TOOLBOX_URL = os.environ.get("TOOLBOX_URL", "http://127.0.0.1:5000")

toolbox = ToolboxToolset(TOOLBOX_URL)

root_agent = LlmAgent(
    name="jobs_agent",
    model="gemini-2.5-flash",
    instruction="""You are a helpful assistant at "TechJobs," a tech job listing platform.

Your job:
- Help developers browse job listings by role or tech stack.
- Provide full details about specific positions, including salary range and number of openings.
- Recommend jobs based on natural language descriptions of what the developer is looking for.
- Add new job listings to the platform when asked.

When a developer asks about a specific job by title or company, use the get-job-details tool.
When a developer asks for a specific role category or tech stack, use the search-jobs tool.
When a developer describes what kind of job they want — by interest area, work style,
career goals, or project type — use the search-jobs-by-description tool for semantic search.
When in doubt between search-jobs and search-jobs-by-description, prefer
search-jobs-by-description — it searches job descriptions and finds more relevant matches.

If a position has no openings (openings is 0), let the developer know
and suggest similar alternatives from the search results.

Be conversational, knowledgeable, and concise.""",
    tools=[toolbox],
)

ध्यान दें कि इसमें कोई डेटाबेस कोड नहीं है — ToolboxToolset स्टार्टअप के समय Toolbox सर्वर से कनेक्ट होता है और सभी उपलब्ध टूल लोड करता है. एजेंट, टूल को नाम से कॉल करता है. टूलबॉक्स, उन कॉल को Cloud SQL के ख़िलाफ़ SQL क्वेरी में बदलता है.

लोकल डेवलपमेंट के लिए, TOOLBOX_URL एनवायरमेंट वैरिएबल की डिफ़ॉल्ट वैल्यू http://127.0.0.1:5000 होती है. बाद में Cloud Run पर डिप्लॉय करते समय, इसे Toolbox सेवा के Cloud Run यूआरएल से बदलें. इसके लिए, कोड में कोई बदलाव करने की ज़रूरत नहीं है.

फ़िलहाल, निर्देश में सिर्फ़ दो स्टैंडर्ड टूल (search-jobs और get-job-details) का रेफ़रंस दिया गया है. सिमैंटिक सर्च और डेटा इंटेक टूल जोड़ने के दौरान, अगले चरण में इसे बढ़ाया जाएगा.

एजेंट की जांच करना

ADK के डेवलपर यूज़र इंटरफ़ेस (यूआई) को शुरू करें:

cd ~/build-agent-adk-toolbox-cloudsql
uv run adk web

Cloud Shell की वेब प्रीव्यू सुविधा का इस्तेमाल करके, टर्मिनल में दिखाए गए यूआरएल (आम तौर पर http://localhost:8000) को खोलें. इसके अलावा, टर्मिनल में दिखाए गए यूआरएल पर ctrl + क्लिक करके भी इसे खोला जा सकता है. सबसे ऊपर बाएं कोने में मौजूद एजेंट ड्रॉपडाउन से, jobs_agent चुनें.

स्टैंडर्ड क्वेरी की जांच करना

मानक एसक्यूएल टूल की पुष्टि करने के लिए, इन प्रॉम्प्ट को आज़माएं:

What backend engineering jobs do you have?
Any jobs using Kubernetes?
Tell me about the Cloud Architect position

93ac33e7f73aa0b9.png 240c53376042a916.png

ऐसी जानकारी दें जो किसी खास भूमिका या टेक्नोलॉजी स्टैक से जुड़ी न हो:

I want a remote job where I can work on AI and machine learning
Find me something in fintech with good work-life balance
I'm interested in infrastructure and reliability engineering

एजेंट, क्वेरी के टाइप के आधार पर सही टूल चुनने की कोशिश करेगा: स्ट्रक्चर्ड फ़िल्टर search-jobs से होकर जाते हैं, जबकि आम बोलचाल की भाषा में दिए गए ब्यौरे search-jobs-by-description से होकर जाते हैं.

b0ea629f5c9b4c26.png

वेक्टर डेटा डालने की सुविधा की जांच करना

एजेंट से नई नौकरी जोड़ने के लिए कहें:

Add a new job: 'Robotics Software Engineer' at Boston Dynamics, role Robotics, tech stack: Python, C++, ROS, Computer Vision, salary $160-230K/year, location Waltham MA, Hybrid, 2 openings. Description: Design and implement autonomous navigation and manipulation algorithms for next-generation robots. Work on perception pipelines using computer vision and lidar, develop motion planning software in C++ and Python, and test systems on real hardware in warehouse and logistics environments.

c601a7a9bc0a705b.png

अब इसे खोजने की कोशिश करें:

Find me jobs involving autonomous systems and working with physical hardware

INSERT के दौरान, एम्बेडिंग अपने-आप जनरेट हो गई थी. इसके लिए, अलग से कोई कार्रवाई करने की ज़रूरत नहीं पड़ी.

5a3d8e6f523dc18b.png

अब आपके पास ADK, MCP टूलबॉक्स, और CloudSQL का इस्तेमाल करने वाला, पूरी तरह से काम करने वाला एजेंटिक RAG ऐप्लिकेशन है. बधाई हो! आइए, इन ऐप्लिकेशन को Cloud Run पर डिप्लॉय करने के लिए एक और कदम आगे बढ़ाते हैं!

अब, आगे बढ़ने से पहले Ctrl+C को दो बार दबाकर, dev UI को बंद करें.

8. Cloud Run पर डिप्लॉय करें

एजेंट और टूलबॉक्स, स्थानीय तौर पर काम करते हैं. इस चरण में, दोनों को Cloud Run सेवाओं के तौर पर डिप्लॉय किया जाता है, ताकि इन्हें इंटरनेट पर ऐक्सेस किया जा सके. टूलबॉक्स सेवा, Cloud Run पर एमसीपी सर्वर के तौर पर काम करती है. एजेंट सेवा इससे कनेक्ट होती है.

डिप्लॉयमेंट के लिए टूलबॉक्स तैयार करना

Toolbox सेवा के लिए, डिप्लॉयमेंट डायरेक्ट्री बनाएं:

cd ~/build-agent-adk-toolbox-cloudsql
mkdir -p deploy-toolbox
cp toolbox tools.yaml deploy-toolbox/

Toolbox के लिए Dockerfile बनाएं. Cloud Shell Editor में deploy-toolbox/Dockerfile खोलें:

cloudshell edit deploy-toolbox/Dockerfile

इसके बाद, इस स्क्रिप्ट को कॉपी करें

# deploy-toolbox/Dockerfile
FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY toolbox tools.yaml ./
RUN chmod +x toolbox
EXPOSE 8080
CMD ["./toolbox", "--tools-file", "tools.yaml", "--address", "0.0.0.0", "--port", "8080"]

Toolbox बाइनरी और tools.yaml को एक छोटे Debian इमेज में पैकेज किया जाता है. Cloud Run, ट्रैफ़िक को पोर्ट 8080 पर भेजता है.

Toolbox सेवा को डिप्लॉय करना

cd ~/build-agent-adk-toolbox-cloudsql
gcloud run deploy toolbox-service \
  --source deploy-toolbox/ \
  --region $REGION \
  --set-env-vars "DB_PASSWORD=$DB_PASSWORD,GOOGLE_CLOUD_PROJECT=$GOOGLE_CLOUD_PROJECT,REGION=$REGION,GOOGLE_CLOUD_LOCATION=$GOOGLE_CLOUD_LOCATION,GOOGLE_GENAI_USE_VERTEXAI=true" \
  --allow-unauthenticated \
  --quiet

यह कमांड, सोर्स को Cloud Build पर सबमिट करती है. साथ ही, कंटेनर इमेज बनाती है, उसे Artifact Registry पर पुश करती है, और Cloud Run पर डिप्लॉय करती है. इसमें कुछ मिनट लगते हैं. आइए, Cloud Shell में नया टर्मिनल टैब खोलें (इसके लिए, + आइकॉन पर क्लिक करें), ताकि हम ज़्यादा ध्यान दे सकें.

b01e3fbd89f17332.png

अपनी वर्किंग डायरेक्ट्री पर फिर से जाएं और पिछली सेटअप स्क्रिप्ट का इस्तेमाल करके प्रोजेक्ट को चालू करें.

cd ~/build-agent-adk-toolbox-cloudsql
bash setup_verify_trial_project.sh && source .env

एजेंट को डिप्लॉयमेंट के लिए तैयार करना

टूलबॉक्स के बनने के दौरान, एजेंट की डिप्लॉयमेंट फ़ाइलें सेट अप करें.

प्रोजेक्ट के रूट में Dockerfile बनाएं. Cloud Shell Editor में Dockerfile खोलें:

cloudshell edit Dockerfile

इसके बाद, इस कॉन्टेंट को कॉपी करें

# Dockerfile
FROM ghcr.io/astral-sh/uv:python3.12-trixie-slim
WORKDIR /app
COPY pyproject.toml ./
COPY uv.lock ./
RUN uv sync --no-dev
COPY jobs_agent/ jobs_agent/
EXPOSE 8080
CMD ["uv", "run", "adk", "web", "--host", "0.0.0.0", "--port", "8080"]

इस Dockerfile में ghcr.io/astral-sh/uv को बेस इमेज के तौर पर इस्तेमाल किया गया है. इसमें Python और uv, दोनों पहले से इंस्टॉल होते हैं. इसलिए, pip के ज़रिए uv को अलग से इंस्टॉल करने की ज़रूरत नहीं होती.

कंटेनर इमेज से गैर-ज़रूरी फ़ाइलों को हटाने के लिए, .dockerignore फ़ाइल बनाएं:

cloudshell edit .dockerignore

इसके बाद, उसमें यह स्क्रिप्ट कॉपी करें

# .dockerignore
.venv/
__pycache__/
*.pyc
.env
jobs_agent/.env
toolbox
tools.yaml
seed.sql
deploy-toolbox/

एजेंट सेवा को डिप्लॉय करना

टूलबॉक्स को डिप्लॉय करने की प्रोसेस पूरी होने तक इंतज़ार करें. नीचे दिए गए कमांड का इस्तेमाल करके, Cloud Run का यूआरएल पाएं

TOOLBOX_URL=$(gcloud run services describe toolbox-service \
  --region=$REGION \
  --format='value(status.url)')
echo "Toolbox URL: $TOOLBOX_URL"

आपको इससे मिलता-जुलता आउटपुट दिखेगा

Toolbox URL: https://toolbox-service-xxxxxx-xx.a.run.app

इसके बाद, आइए पुष्टि करें कि डिप्लॉय किया गया Toolbox काम कर रहा है या नहीं:

curl -s "$TOOLBOX_URL/api/toolset" | python3 -m json.tool | head -5

अगर आउटपुट इस उदाहरण की तरह दिखता है, तो इसका मतलब है कि डिप्लॉयमेंट पहले ही पूरा हो चुका है

{
    "serverVersion": "0.27.0+binary.linux.amd64.c5524d3",
    "tools": {
        "add-job": {
            "description": "Add a new job listing to the platform. Use this tool when a user asks to post a job that is not currently listed.",

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

cd ~/build-agent-adk-toolbox-cloudsql
gcloud run deploy jobs-agent \
  --source . \
  --region $REGION \
  --set-env-vars "TOOLBOX_URL=$TOOLBOX_URL,GOOGLE_CLOUD_PROJECT=$GOOGLE_CLOUD_PROJECT,GOOGLE_CLOUD_LOCATION=$GOOGLE_CLOUD_LOCATION,GOOGLE_GENAI_USE_VERTEXAI=TRUE" \
  --allow-unauthenticated \
  --quiet

एजेंट कोड, एनवायरमेंट से TOOLBOX_URL को पढ़ता है. इसे आपने पहले सेट अप किया था. लोकल तौर पर यह http://127.0.0.1:5000 पर ले जाता है. Cloud Run पर यह Toolbox सेवा के यूआरएल पर ले जाता है. इसके लिए, कोड में कोई बदलाव करने की ज़रूरत नहीं होती.

डिप्लॉय किए गए एजेंट की जांच करना

एजेंट का Cloud Run यूआरएल वापस पाएं:

AGENT_URL=$(gcloud run services describe jobs-agent \
  --region=$REGION \
  --format='value(status.url)')
echo "Agent URL: $AGENT_URL"

अपने ब्राउज़र में यूआरएल खोलें. ADK का डेवलपर यूज़र इंटरफ़ेस (यूआई) लोड होता है. यह वही इंटरफ़ेस है जिसका इस्तेमाल आपने लोकल तौर पर किया था. अब यह Cloud Run पर चल रहा है.

ड्रॉपडाउन से jobs_agent चुनें और जांच करें:

What backend engineering jobs do you have?
I want a remote job working on AI and machine learning

दोनों क्वेरी, डिप्लॉय की गई सेवाओं के ज़रिए काम करती हैं: Cloud Run पर मौजूद एजेंट, Cloud Run पर मौजूद टूलबॉक्स को कॉल करता है. इसके बाद, टूलबॉक्स, Cloud SQL से क्वेरी करता है.

9. बधाई हो / जगह खाली करें

आपने एक स्मार्ट जॉब बोर्ड असिस्टेंट बनाई है और उसे डिप्लॉय किया है. यह असिस्टेंट, ADK एजेंट और Cloud SQL PostgreSQL को जोड़ने के लिए, MCP Toolbox for Databases का इस्तेमाल करती है. इसमें स्टैंडर्ड एसक्यूएल क्वेरी और सिमैंटिक वेक्टर सर्च, दोनों का इस्तेमाल किया जाता है.

आपने क्या सीखा

  • एमसीपी, एआई एजेंट के लिए टूल ऐक्सेस को कैसे स्टैंडर्ड बनाता है. साथ ही, MCP Toolbox for Databases, इसे खास तौर पर डेटाबेस के ऑपरेशन पर कैसे लागू करता है. इसमें कस्टम डेटाबेस कोड को डिक्लेरेटिव YAML कॉन्फ़िगरेशन से बदल दिया जाता है
  • cloud-sql-postgres सोर्स टाइप का इस्तेमाल करके, Cloud SQL PostgreSQL को Toolbox डेटा सोर्स के तौर पर कॉन्फ़िगर करने का तरीका
  • पैरामीटर वाले स्टेटमेंट की मदद से, एसक्यूएल इंजेक्शन को रोकने वाले स्टैंडर्ड एसक्यूएल क्वेरी टूल को कैसे तय करें
  • pgvector और gemini-embedding-001 का इस्तेमाल करके, वेक्टर सर्च की सुविधा चालू करने का तरीका. साथ ही, क्वेरी को अपने-आप एम्बेड करने के लिए embeddedBy पैरामीटर का इस्तेमाल करने का तरीका
  • valueFromParam, वेक्टर को अपने-आप कैसे शामिल करता है — एलएलएम, टेक्स्ट की जानकारी देता है. वहीं, Toolbox चुपचाप टेक्स्ट के साथ वेक्टर को कॉपी, एम्बेड, और सेव करता है
  • ADK का ToolboxToolset, चालू Toolbox सर्वर से टूल कैसे लोड करता है. इससे एजेंट कोड कम से कम रहता है और डेटाबेस लॉजिक पूरी तरह से अलग हो जाता है
  • Toolbox MCP सर्वर और ADK एजेंट, दोनों को Cloud Run पर अलग-अलग सेवाओं के तौर पर डिप्लॉय करने का तरीका

खाली करने के लिए जगह

इस कोडलैब में बनाए गए संसाधनों के लिए, अपने Google Cloud खाते से शुल्क लिए जाने से बचने के लिए, अलग-अलग संसाधनों को मिटाया जा सकता है या पूरे प्रोजेक्ट को मिटाया जा सकता है.

प्रोजेक्ट को मिटाकर, आसानी से साफ़ किया जा सकता है. इससे प्रोजेक्ट से जुड़े सभी संसाधन हट जाते हैं.

gcloud projects delete $GOOGLE_CLOUD_PROJECT

दूसरा विकल्प: एक-एक करके संसाधन मिटाना

अगर आपको प्रोजेक्ट रखना है, लेकिन इस कोडलैब में बनाए गए सिर्फ़ संसाधन हटाने हैं, तो:

gcloud run services delete jobs-agent --region=$REGION --quiet
gcloud run services delete toolbox-service --region=$REGION --quiet
gcloud sql instances delete jobs-instance --quiet
gcloud artifacts repositories delete cloud-run-source-deploy --location=$REGION --quiet 2>/dev/null