Gemini 3 Flash और AlloyDB AI की मदद से, ऑटोनॉमस सप्लाई चेन बनाना

1. खास जानकारी

"पढ़ने वाले चैटबॉट" का दौर खत्म हो रहा है. हम एजेंटिक विज़न के दौर में प्रवेश कर रहे हैं.

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

हम Gemini 3 Flash में, सोचो, काम करो, देखो वाले नए लूप का इस्तेमाल करके, ऑटोनॉमस सप्लाई चेन एजेंट बनाएंगे. यह सिर्फ़ देखता नहीं, बल्कि जांच भी करता है.

डिटरमिनिस्टिक आर्किटेक्चर

हम "ब्लाइंड" और "एमनेज़ियाक" सिस्टम से शुरुआत करेंगे. आपको एक-एक करके, मैन्युअल तरीके से इसके सेंसर "चालू" करने होंगे:

17191a91a9c54146.png

  1. आँखें (विजन एजेंट): हम Gemini 3 Flash को कोड एक्ज़ीक्यूट करने की सुविधा के साथ उपलब्ध कराते हैं. किसी संख्या का अनुमान लगाने के लिए टोकन का अनुमान लगाने के बजाय, मॉडल पिक्सल की गिनती करने के लिए Python कोड (OpenCV) लिखता है.
  2. मेमोरी (सप्लायर एजेंट): हम AlloyDB AI को ScaNN (स्केलेबल नियरेस्ट नेबर) के साथ चालू करते हैं. इससे एजेंट को लाखों विकल्पों में से, किसी हिस्से के लिए सही सप्लायर का पता लगाने में कुछ ही मिलीसेकंड लगते हैं.
  3. हैंडशेक (A2A प्रोटोकॉल): हम स्टैंडर्ड agent_card.json का इस्तेमाल करके, एजेंट-टू-एजेंट कम्यूनिकेशन की सुविधा चालू करते हैं. इससे विज़न एजेंट, सप्लायर एजेंट से स्टॉक अपने-आप ऑर्डर कर सकता है.

आपको क्या बनाना है

  • एक विज़न एजेंट, जो कैमरे से मिले फ़ीड पर "विज़ुअल मैथ" करता है.
  • सप्लायर एजेंट, जो वेक्टर को तेज़ी से खोजने के लिए AlloyDB ScaNN का इस्तेमाल करता है.
  • ऑटोनॉमस लूप को विज़ुअलाइज़ करने के लिए, रीयल-टाइम WebSocket अपडेट के साथ Control Tower फ़्रंटएंड.

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

  • वेक्टर एम्बेडिंग और ScaNN इंडेक्स के साथ AlloyDB को सेट अप करने का तरीका.
  • Gemini API का इस्तेमाल करके, gemini-3-flash-preview के साथ Agentic Vision को चालू करने का तरीका.
  • AlloyDB में <=> (कोसाइन दूरी) ऑपरेटर का इस्तेमाल करके, वेक्टर सर्च को लागू करने का तरीका.
  • AlloyDB Python Connector का इस्तेमाल करके, एजेंट को AlloyDB से कनेक्ट करने का तरीका.
  • डाइनैमिक एजेंट डिस्कवरी के लिए, A2A प्रोटोकॉल का इस्तेमाल कैसे करें.

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

  • कोई ब्राउज़र, जैसे कि Chrome या Firefox
  • बिलिंग की सुविधा वाला Google Cloud प्रोजेक्ट.
  • Vision Agent के लिए, Gemini API पासकोड (Google AI Studio पर बिना शुल्क वाला टियर उपलब्ध है).

2. शुरू करने से पहले

प्रोजेक्ट बनाना

  1. Google Cloud Console में, प्रोजेक्ट चुनने वाले पेज पर, Google Cloud प्रोजेक्ट चुनें या बनाएं.
  2. पक्का करें कि आपके Cloud प्रोजेक्ट के लिए बिलिंग चालू हो. किसी प्रोजेक्ट के लिए बिलिंग चालू है या नहीं, यह देखने का तरीका जानें.
  1. आपको Cloud Shell का इस्तेमाल करना होगा. यह Google Cloud में चलने वाला कमांड-लाइन एनवायरमेंट है. Google Cloud Console में सबसे ऊपर मौजूद, Cloud Shell चालू करें पर क्लिक करें.

Cloud Shell बटन की इमेज चालू करें

  1. Cloud Shell से कनेक्ट होने के बाद, यह देखने के लिए कि आपकी पुष्टि हो चुकी है और प्रोजेक्ट को आपके प्रोजेक्ट आईडी पर सेट किया गया है, इस कमांड का इस्तेमाल करें:
gcloud auth list

डेटाबेस सेटअप करें [AlloyDB]

सबसे पहले, डेटाबेस को चालू करते हैं. इसमें ~15 मिनट लगते हैं, इसलिए हम इसे सबसे पहले चालू करेंगे.

  1. Cloud Shell में AlloyDB सेटअप टूल खोलने के लिए, यहां दिए गए बटन पर क्लिक करें:

  1. सेटअप चलाएं:
Sh run.sh
  1. सेटअप यूज़र इंटरफ़ेस (यूआई) खोलने के लिए, वेब की झलक दिखाने वाले टूल (आंख वाला आइकॉन 👁️ → पोर्ट 8080 पर झलक देखें) का इस्तेमाल करें.
  2. अपना प्रोजेक्ट आईडी डालें, कोई क्षेत्र चुनें (जैसे, us-central1), और डेटाबेस का पासवर्ड बनाएं.

⚠️ इस पासवर्ड को सेव करें. सेटअप स्क्रिप्ट के दौरान, आपसे यह पासवर्ड मांगा जाएगा.

  1. 'डिप्लॉयमेंट शुरू करें' पर क्लिक करें. इसके बाद, क्लस्टर के चालू होने के लिए करीब 15 मिनट इंतज़ार करें.

कोड पाएं

AlloyDB के चालू होने के दौरान (या चालू होने के बाद), Cloud Shell में कोडलैब रेपो खोलें:

⚠️ अहम जानकारी: बटन पर क्लिक करने पर, आपको सुरक्षा से जुड़ा एक डायलॉग दिखेगा. "ट्रस्ट रीपो" बॉक्स को चुनें और "पुष्टि करें" पर क्लिक करें.

इसके अलावा, मैन्युअल तरीके से क्लोन करें:

git clone https://github.com/MohitBhimrajka/visual-commerce-gemini-3-alloydb.git

cd visual-commerce-gemini-3-alloydb

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

इस Cloud Shell टर्मिनल में, पुष्टि करें कि आपका प्रोजेक्ट सेट है:

gcloud config set project <YOUR_PROJECT_ID>

AlloyDB पर सार्वजनिक आईपी चालू करना

AlloyDB प्रोविज़निंग पूरी होने के बाद, सार्वजनिक आईपी चालू करें, ताकि Python कनेक्टर Cloud Shell से कनेक्ट हो सके:

  1. AlloyDB Console पर जाएं
  2. अपने क्लस्टर पर क्लिक करें → अपने प्राइमरी इंस्टेंस पर क्लिक करें
  3. बदलाव करें पर क्लिक करें
  4. 'सार्वजनिक आईपी कनेक्टिविटी' पर जाएं और 'सार्वजनिक आईपी चालू करें' विकल्प को चुनें
  5. 'इंस्टेंस अपडेट करें' पर क्लिक करें

💡 ध्यान दें: AlloyDB Python Connector, पुष्टि करने और एन्क्रिप्शन की प्रोसेस को मैनेज करता है. इसलिए, आपको किसी भी बाहरी नेटवर्क को अनुमति देने की ज़रूरत नहीं है.

Vertex AI को अनुमतियां देना

AlloyDB सेवा खाते को एम्बेडिंग जनरेट करने के लिए, Vertex AI का ऐक्सेस चाहिए. इस कमांड को उसी Cloud Shell विंडो में चलाएं:

PROJECT_ID=$(gcloud config get-value project)


gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
  --role="roles/aiplatform.user"

सेटअप स्क्रिप्ट चलाना

अब सेटअप स्क्रिप्ट चलाएं. यह आपके AlloyDB इंस्टेंस का अपने-आप पता लगा लेगी:

sh setup.sh

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

  • gcloud CLI, पुष्टि करने की सुविधा, प्रोजेक्ट, और Python 3 की पुष्टि करता है
  • ज़रूरी एपीआई (AlloyDB, Vertex AI, Compute, Service Networking) की जांच करता है और उन्हें चालू करता है
  • Gemini API पासकोड के लिए प्रॉम्प्ट
  • AlloyDB इंस्टेंस का अपने-आप पता लगाता है और क्षेत्र, क्लस्टर, और इंस्टेंस का नाम निकालता है
  • आपके डेटाबेस का पासवर्ड मांगता है
  • यह .env कॉन्फ़िगरेशन फ़ाइल जनरेट करता है
  • Python डिपेंडेंसी इंस्टॉल करता है

3. डेटाबेस सेटअप

हमारे ऐप्लिकेशन के लिए, AlloyDB for PostgreSQL सबसे अहम है. हम इसकी बेहतर वेक्टर क्षमताओं और ScaNN इंडेक्स का इस्तेमाल करके, मिलते-जुलते शब्दों वाले कॉन्टेंट को खोजने की सुविधा को रीयल-टाइम में चालू करेंगे. इससे हमारे एजेंट, कुछ ही मिलीसेकंड में हज़ारों रिकॉर्ड में इन्वेंट्री से मिलते-जुलते आइटम ढूंढ पाएंगे.

इस सेक्शन में, आपको AlloyDB Studio से स्कीमा, सीड डेटा, और एम्बेडिंग जनरेट करने का तरीका बताया जाएगा.

AlloyDB Studio से कनेक्ट करना

  1. AlloyDB Console में जाकर, अपने AlloyDB इंस्टेंस पर जाएं
  2. बाईं ओर मौजूद नेविगेशन में, AlloyDB Studio पर क्लिक करें
  3. इनसे पुष्टि करें:
  4. उपयोगकर्ता नाम: postgres
  5. डेटाबेस: postgres
  6. पासवर्ड: क्लस्टर बनाते समय सेट किया गया पासवर्ड

एक्सटेंशन चालू करना

AlloyDB में, वेक्टर और एआई के लिए पहले से मौजूद एक्सटेंशन उपलब्ध होते हैं. AlloyDB Studio में यह एसक्यूएल चलाएं:

CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector;
CREATE EXTENSION IF NOT EXISTS alloydb_scann CASCADE;
  • google_ml_integration: यह ai.embedding() फ़ंक्शन को चालू करता है, ताकि SQL से सीधे Vertex AI को कॉल किया जा सके.
  • vector: यह 768 डाइमेंशन वाले वेक्टर एम्बेडिंग को सेव करता है.
  • alloydb_scann: यह विकल्प, वेक्टर को बहुत तेज़ी से खोजने के लिए Google के ScaNN इंडेक्स को चालू करता है.

इन्वेंट्री टेबल बनाना

DROP TABLE IF EXISTS inventory;

CREATE TABLE inventory (
    id SERIAL PRIMARY KEY,
    part_name TEXT NOT NULL,
    supplier_name TEXT NOT NULL,
    description TEXT,
    stock_level INT DEFAULT 0,
    part_embedding vector(768)
);

part_embedding कॉलम में, text-embedding-005 से मिले 768 डाइमेंशन वाले वेक्टर सेव होते हैं. इसी से सिमैंटिक सर्च की सुविधा काम करती है.

सैंपल डेटा डालें

वेयरहाउस में मौजूद 20 इन्वेंट्री आइटम शामिल करें:

INSERT INTO inventory (part_name, supplier_name, description, stock_level) VALUES
('Cardboard Shipping Box Large', 'Packaging Solutions Inc', 'Heavy-duty corrugated cardboard shipping container, 24x18x12 inches', 250),
('Warehouse Storage Container', 'Industrial Supply Co', 'Stackable plastic storage bin with snap-lock lid, blue', 180),
('Product Shipping Boxes', 'Acme Packaging', 'Medium corrugated boxes for warehouse storage, 18x14x10 inches', 320),
('Industrial Widget X-9', 'Acme Corp', 'Heavy-duty industrial coupling for pneumatic systems', 50),
('Precision Bolt M4', 'Global Fasteners Inc', 'Stainless steel M4 allen bolt, 20mm length, grade A2-70', 200),
('Hexagonal Nut M6', 'Metro Supply Co', 'Galvanized steel hex nut M6, DIN 934 standard', 150),
('Phillips Head Screw 3x20', 'Acme Corp', 'Zinc-plated Phillips head wood screw, 3mm x 20mm', 500),
('Wooden Dowel 10mm', 'Craft Materials Ltd', 'Hardwood birch dowel rod, 10mm diameter x 300mm length', 80),
('Rubber Gasket Small', 'SealTech Industries', 'Buna-N rubber gasket, 25mm OD x 15mm ID, oil resistant', 120),
('Spring Tension 5kg', 'Mechanical Parts Co', 'Stainless steel compression spring, 5kg load capacity', 60),
('Bearing 6204', 'Bearings Direct', 'Deep groove ball bearing 6204-2RS, 20x47x14mm sealed', 45),
('Warehouse Shelf Boxes', 'Storage Systems Ltd', 'Standardized warehouse inventory boxes, corrugated, bulk pack', 400),
('Inventory Container Units', 'Supply Chain Pros', 'Modular stackable storage units for warehouse racking', 95),
('Aluminum Extrusion Bar', 'MetalWorks International', 'T-slot aluminum extrusion 20x20mm profile, 1 meter length', 110),
('Cable Tie Pack 200mm', 'ElectroParts Depot', 'Nylon cable ties, 200mm x 4.8mm, UV resistant black, pack of 100', 600),
('Hydraulic Hose 1/2 inch', 'FluidPower Systems', 'High-pressure hydraulic hose, 1/2 inch ID, 3000 PSI rated', 35),
('Safety Goggles Clear', 'WorkSafe Equipment Co', 'ANSI Z87.1 rated clear safety goggles, anti-fog coating', 275),
('Packing Tape Industrial', 'Packaging Solutions Inc', 'Heavy-duty polypropylene packing tape, 48mm x 100m, clear', 450),
('Stainless Steel Sheet 1mm', 'MetalWorks International', '304 stainless steel sheet, 1mm thickness, 300x300mm', 70),
('Silicone Sealant Tube', 'SealTech Industries', 'Industrial-grade RTV silicone sealant, 300ml cartridge, grey', 190);

वीडियो एंबेड करने की अनुमतियां देना

GRANT EXECUTE ON FUNCTION embedding TO postgres;

वेक्टर एम्बेडिंग जनरेट करना

यह AlloyDB के बिल्ट-इन ai.embedding() फ़ंक्शन का इस्तेमाल करता है, ताकि SQL से सीधे तौर पर Vertex AI के text-embedding-005 मॉडल को कॉल किया जा सके. इसके लिए, Python कोड की ज़रूरत नहीं होती:

UPDATE inventory
SET part_embedding = ai.embedding(
    'text-embedding-005',
    part_name || '. ' || description
)::vector
WHERE part_embedding IS NULL;

इससे 768 डाइमेंशन वाले वेक्टर जनरेट होते हैं. ये वेक्टर, हर पुर्ज़े के नाम और ब्यौरे के सिमैंटिक मतलब को कैप्चर करते हैं. ScaNN इंडेक्स, एक जैसी चीज़ें खोजने के लिए इनका इस्तेमाल करेगा. [इसे पूरा करने में करीब 3 से 5 मिनट लगेंगे]

ScaNN इंडेक्स बनाना

SET scann.allow_blocked_operations = true;

CREATE INDEX IF NOT EXISTS idx_inventory_scann
ON inventory USING scann (part_embedding cosine)
WITH (num_leaves=5, quantizer='sq8');

पुष्टि करना कि सब कुछ ठीक से काम कर रहा है

SELECT part_name, supplier_name, stock_level,
       (part_embedding IS NOT NULL) as has_embedding
FROM inventory
ORDER BY id;

आपको 20 लाइनें दिखेंगी. सभी में has_embedding = true होगा.

4. आर्किटेक्चर को समझना

कोड में बदलाव करने से पहले, आइए समझते हैं कि सिस्टम कैसे काम करता है. आर्किटेक्चर, "जागने" के पैटर्न को फ़ॉलो करता है:

एजेंट स्टैक

Vision Agent (agents/vision-agent/)

  • agent.py — इसमें Gemini 3 Flash का मुख्य लॉजिक होता है. यह कोड, मॉडल को ऐसी इमेज भेजता है जिनमें कोड एक्ज़ीक्यूशन की सुविधा चालू होती है. इससे मॉडल, आइटम की गिनती करने के लिए Python (OpenCV) लिखता है.
  • agent_executor.py — यह A2A प्रोटोकॉल के अनुरोधों को एजेंट लॉजिक से जोड़ता है.
  • main.py — Uvicorn A2A सर्वर, जो /.well-known/agent-card.json दिखाता है और अनुरोधों को हैंडल करता है.

सप्लायर एजेंट (agents/supplier-agent/)

  • inventory.py — यह AlloyDB Python Connector के ज़रिए AlloyDB से कनेक्ट होता है. इसके लिए, Auth Proxy की ज़रूरत नहीं होती. इसमें find_supplier() फ़ंक्शन होता है, जो ScaNN वेक्टर सर्च करता है.
  • agent_executor.py — यह A2A प्रोटोकॉल को इन्वेंट्री खोजने की लॉजिक से जोड़ता है.
  • main.py — एजेंट कार्ड और हेल्थ एंडपॉइंट के साथ Uvicorn A2A सर्वर.

Control Tower (frontend/)

  • app.py — FastAPI + WebSocket सर्वर, जो A2A के ज़रिए एजेंटों का पता लगाता है. साथ ही, विज़न → खोज → ऑर्डर पाइपलाइन को व्यवस्थित करता है और ब्राउज़र को रीयल-टाइम अपडेट स्ट्रीम करता है.

A2A फ़्लो

  • Control Tower, हर एजेंट से /.well-known/agent-card.json पढ़ता है
  • क्षमताएं (स्किल, एंडपॉइंट) ढूंढता है — कोई हार्डकोड किया गया यूआरएल नहीं
  • इमेज को Vision Agent को भेजता है → आइटम की संख्या और ब्यौरा मिलता है
  • सप्लायर एजेंट को एम्बेड करने की क्वेरी के तौर पर जानकारी भेजता है → कुछ हद तक मिलती-जुलती जानकारी मिलती है
  • अपने-आप ऑर्डर करता है

AlloyDB कनेक्शन

सप्लायर एजेंट, पारंपरिक Auth Proxy के बजाय AlloyDB Python Connector का इस्तेमाल करता है:

from google.cloud.alloydbconnector import Connector

connector = Connector()
conn = connector.connect(
    inst_uri,       # Full instance URI
    "pg8000",       # Driver
    user="postgres",
    password=DB_PASS,
    ip_type="PUBLIC",  # Cloud Shell uses Public IP
)

यह IAM ऑथेंटिकेशन, एसएसएल/टीएलएस, और कनेक्शन रूटिंग को अपने-आप मैनेज करता है. बाद में Cloud Run पर डिप्लॉय करते समय, वीपीसी ऐक्सेस के लिए ip_type को "PRIVATE" पर सेट करें.

5. पहला चरण: मेमोरी (सप्लायर एजेंट)

सप्लायर एजेंट, AlloyDB ScaNN का इस्तेमाल करके लाखों पार्ट्स की जानकारी याद रखता है. फ़िलहाल, यह एक प्लेसहोल्डर क्वेरी के साथ शिप होता है. यह एक ऐसी क्वेरी है जो पहली पंक्ति में मौजूद डेटा को दिखाती है. भले ही, आपने कुछ भी खोजा हो.

The Audit: The Amnesiac

अगर अब सप्लायर एजेंट से क्वेरी की जाती है, तो वह कोई भी नतीजा दिखाएगा. इसमें समानता का कोई कॉन्सेप्ट नहीं है. चलिए, इसे ठीक करते हैं।

सप्लायर एजेंट को शुरू करना

A2A सर्वर (main.py), agent_executor.py को डेलिगेट करता है. यह inventory.py में मौजूद बिज़नेस लॉजिक के लिए प्रोटोकॉल को ब्रिज करता है.

pkill -f uvicorn #Kill all uvicorn processes

पहला चरण: एजेंट डायरेक्ट्री पर जाना

cd agents/supplier-agent

दूसरा चरण: डिपेंडेंसी इंस्टॉल करना

pip install -r requirements.txt

तीसरा चरण: एजेंट सर्वर शुरू करना

uvicorn main:app --host 0.0.0.0 --port 8082 > /dev/null 2>&1 &

> /dev/null 2>&1 & कमांड, सर्वर को बैकग्राउंड में चलाती है और आउटपुट को छिपा देती है, ताकि यह आपके टर्मिनल में रुकावट न डाले.

चौथा चरण: पुष्टि करें कि एजेंट काम कर रहा है. इसके लिए, एजेंट को शुरू करने के बाद दो से तीन सेकंड इंतज़ार करें

curl http://localhost:8082/.well-known/agent-card.json

अनुमानित आउटपुट: एजेंट कॉन्फ़िगरेशन वाला JSON (इसमें कोई गड़बड़ी नहीं होनी चाहिए)

समस्या हल करने का तरीका: <=> ऑपरेटर लागू करना

agents/supplier-agent/inventory.py खोलें और लाइन 60-70 के आस-पास find_supplier() फ़ंक्शन ढूंढें. आपको यह प्लेसहोल्डर दिखेगा:

# TODO: Replace this placeholder query with ScaNN vector search

sql = "SELECT part_name, supplier_name FROM inventory LIMIT 1;"
cursor.execute(sql)

उन दो लाइनों की जगह यह कोड डालें:

sql = """
SELECT part_name, supplier_name,
       part_embedding <=> %s::vector as distance
FROM inventory
ORDER BY part_embedding <=> %s::vector
LIMIT 1;
"""
cursor.execute(sql, (embedding_str, embedding_str))

इससे क्या होता है:

  • <=> PostgreSQL में कोसाइन डिस्टेंस ऑपरेटर है
  • ORDER BY part_embedding <=> %s::vector, सबसे मिलते-जुलते नतीजे (सबसे कम दूरी = सबसे मिलते-जुलते शब्दार्थ) ढूंढता है
  • %s::vector आपके एम्बेडिंग ऐरे को PostgreSQL के वेक्टर टाइप में बदलता है
  • ScaNN इंडेक्स की मदद से, इस क्वेरी की प्रोसेसिंग की स्पीड अपने-आप बढ़ जाती है!

चौथा चरण: फ़ाइल सेव करें (Ctrl+S या Cmd+S)

अब एजेंट, रैंडम नतीजे दिखाने के बजाय सिमैंटिक सर्च का इस्तेमाल करेगा!

पुष्टि

A2A की सुविधा खोजने और इन्वेंट्री की जांच करने के लिए:

curl http://localhost:8082/.well-known/agent-card.json

44500cdeeca3cee8.png

python3 -c "
from inventory import find_supplier
import json
vec = [0.1]*768
r = find_supplier(vec)
if r:
    result = {'part': r[0], 'supplier': r[1]}
    if len(r) > 2:
        result['distance'] = float(r[2]) if r[2] else None
    print(json.dumps(result))
else:
    print('No result found')
"

अनुमानित नतीजा: agent-card.json, एजेंट कार्ड दिखाता है. Python स्निपेट, सीड किए गए डेटा से पार्ट और सप्लायर की जानकारी दिखाता है.

6. दूसरा चरण: आंखें (विजन एजेंट)

डेटाबेस ऐक्सेस किया जा सकता है. इसलिए, Gemini 3 Flash का इस्तेमाल करके, आंखों को जगाते हैं. विज़न एजेंट, कोड एक्ज़ीक्यूशन की मदद से "विज़ुअल मैथ" करता है.

ऑडिट: मनगढ़ंत जानकारी

अगर किसी स्टैंडर्ड मल्टीमॉडल मॉडल से पूछा जाए कि "इस इमेज में कितने बॉक्स हैं?", तो वह इमेज को स्टैटिक स्नैपशॉट के तौर पर प्रोसेस करता है और अनुमान लगाता है.

  • मॉडल कहता है: "मुझे करीब 12 बॉक्स दिख रहे हैं."
  • असल में: यहां 15 बॉक्स हैं.
  • नतीजा: सप्लाई चेन से जुड़ी गड़बड़ी हुई है.

समस्या हल करने का तरीका: सोचो-काम करो-देखो लूप को चालू करना

हम कोड एक्ज़ीक्यूशन और ThinkingConfig को चालू करते हैं, ताकि मॉडल Python (OpenCV) को लिख सके और गिनती कर सके.

  1. agents/vision-agent/agent.py खोलें .
  2. GenerateContentConfig सेक्शन ढूंढें (लगभग लाइन 68 से 78 के बीच).
  3. thinking_config=types.ThinkingConfig(...) ब्लॉक और tools=[types.Tool(code_execution=...)] दोनों को अनकमेंट करें.
  4. क्लाइंट को पहले से ही एनवायरमेंट से GEMINI_API_KEY का इस्तेमाल करने के लिए कॉन्फ़िगर किया गया है.

फ़ाइल: agents/vision-agent/agent.py

config = types.GenerateContentConfig(
    temperature=0,
    # CODELAB STEP 1: Uncomment to enable reasoning
    thinking_config=types.ThinkingConfig(
        thinking_level="MINIMAL",  # Valid: "MINIMAL", "LOW", "MEDIUM", "HIGH"
        include_thoughts=False    # Set to True for debugging
    ),
    # CODELAB STEP 2: Uncomment to enable code execution
    tools=[types.Tool(code_execution=types.ToolCodeExecution)]
)

thinking_level="MINIMAL" क्यों है?

इस टास्क (कोड को लागू करके आइटम गिनना) के लिए, "MINIMAL" मोड में स्क्रिप्ट को प्लान करने और गिनती की पुष्टि करने के लिए ज़रूरी जानकारी मिलती है. "HIGH" का इस्तेमाल करने पर, टास्क को पूरा होने में दो से तीन गुना ज़्यादा समय लगेगा. हालांकि, इससे टास्क के सटीक नतीजे मिलने की संभावना नहीं बढ़ेगी. लागत-परफ़ॉर्मेंस ऑप्टिमाइज़ेशन — टास्क की जटिलता के हिसाब से, जवाब देने के लिए इस्तेमाल किए गए डेटा की गहराई को मैच करें.

लागत-परफ़ॉर्मेंस ऑप्टिमाइज़ेशन, प्रोडक्शन एआई इंजीनियरिंग के लिए एक अहम स्किल है: टास्क की जटिलता के हिसाब से तर्क की गहराई को मैच करना.

Vision Agent को शुरू करना

🔄 पाथ की जांच करें: अगर आप अब भी agents/supplier-agent/ में हैं, तो cd ../.. का इस्तेमाल करके, पहले repo root पर वापस जाएं

पहला चरण: विज़न एजेंट डायरेक्ट्री पर जाना

cd agents/vision-agent

दूसरा चरण: डिपेंडेंसी इंस्टॉल करना

pip install -r requirements.txt

तीसरा चरण: विज़न एजेंट सर्वर शुरू करना

uvicorn main:app --host 0.0.0.0 --port 8081 > /dev/null 2>&1 &

> /dev/null 2>&1 & कमांड, सर्वर को बैकग्राउंड में चलाती है और आउटपुट को छिपा देती है, ताकि यह आपके टर्मिनल में रुकावट न डाले.

पुष्टि

A2A की सुविधा खोजने की जांच करें:

curl http://localhost:8081/.well-known/agent-card.json

ज़रूरी है: एजेंट के नाम और उसकी क्षमताओं के साथ JSON. आठवें चरण में, कंट्रोल टावर के यूज़र इंटरफ़ेस (यूआई) की मदद से, विज़न काउंटिंग की जांच की जाएगी.

dc9bc53007336472.png

7. तीसरा चरण: हैंडशेक (A2A एजेंट कार्ड)

हमारे एजेंट को समस्या (Vision) दिखती है और उसे सप्लायर (Memory) के बारे में पता है. A2A प्रोटोकॉल, डाइनैमिक डिस्कवरी की सुविधा देता है. इससे फ़्रंटएंड को हर एजेंट से बातचीत करने का तरीका पता चलता है. इसके लिए, वह एजेंट के कार्ड को पढ़ता है.

A2A बनाम पारंपरिक REST API

Aspect

ट्रेडिशनल REST

A2A प्रोटोकॉल

एंडपॉइंट डिस्कवरी

कॉन्फ़िगरेशन में हार्डकोड किए गए यूआरएल

/.well-known/agent-card.json के ज़रिए डाइनैमिक

सुविधा की जानकारी

एपीआई दस्तावेज़ (लोगों के लिए)

कौशल (मशीन से पढ़ा जा सकता है)

इंटिग्रेशन

हर सेवा के लिए मैन्युअल कोड

सिमेंटिक मैचिंग: "मुझे इन्वेंट्री खोज की सुविधा चाहिए" → स्किल का पता चलता है

नया एजेंट जोड़ा गया

सभी क्लाइंट के कॉन्फ़िगरेशन अपडेट करें

कोई कॉन्फ़िगरेशन नहीं—अपने-आप पता लगाया गया

असल दुनिया में फ़ायदा: पारंपरिक माइक्रोसेवा में, अगर आपको तीसरा "लॉजिस्टिक्स एजेंट" जोड़ना है, तो आपको कंट्रोल टॉवर के कोड को उसके यूआरएल और एपीआई अनुबंध के साथ अपडेट करना होगा. A2A की मदद से, कंट्रोल टॉवर को इसका अपने-आप पता चल जाता है. साथ ही, यह बोलचाल की भाषा में बताई गई जानकारी से इसकी क्षमताओं को समझ लेता है.

इसलिए, A2A प्लग-एंड-प्ले एजेंट कंपोज़िशन की सुविधा देता है. यह स्वायत्त सिस्टम के लिए आर्किटेक्चरल पैटर्न है.

एजेंट कार्ड बनाना

🔄 पाथ की जांच करें: अगर आप अब भी agents/vision-agent/ में हैं, तो cd ../.. का इस्तेमाल करके, पहले repo root पर वापस जाएं

एजेंट कार्ड, agents/supplier-agent/agent_card.json में पहले से मौजूद है. इसे खोलें और इसकी समीक्षा करें:

{
  "name": "Acme Supplier Agent",
  "description": "Autonomous fulfillment for industrial parts via AlloyDB ScaNN.",
  "version": "1.0.0",
  "skills": [{
    "id": "search_inventory",
    "name": "Search Inventory",
    "description": "Searches the warehouse database for semantic matches using AlloyDB ScaNN vector search.",
    "tags": ["inventory", "search", "alloydb"],
    "examples": ["Find stock for Industrial Widget X-9", "Who supplies ball bearings?"]
  }]
}

अपने इस्तेमाल के उदाहरण के हिसाब से, नाम, ब्यौरे या उदाहरणों में बदलाव करें.

कार्ड लोड करने के लिए, सप्लायर एजेंट को रीस्टार्ट करें:

पहला चरण: चालू एजेंट को बंद करना

pkill -f "uvicorn main:app.*8082"

दूसरा चरण: एजेंट डायरेक्ट्री पर जाएं

cd agents/supplier-agent

तीसरा चरण: एजेंट को फिर से शुरू करना

uvicorn main:app --host 0.0.0.0 --port 8082 > /dev/null 2>&1 &

> /dev/null 2>&1 & कमांड, सर्वर को बैकग्राउंड में चलाती है और आउटपुट को छिपा देती है, ताकि यह आपके टर्मिनल में रुकावट न डाले.

चौथा चरण: नए एजेंट कार्ड की पुष्टि करना (शुरू होने के बाद दो से तीन सेकंड इंतज़ार करें)

curl http://localhost:8082/.well-known/agent-card.json

अनुमानित आउटपुट: JSON फ़ॉर्मैट में, आपके भरे गए नाम, ब्यौरे, और कौशल की जानकारी.

dd352ca2e7e6109a.png

8. चौथा चरण: कंट्रोल टावर

FastAPI + WebSockets की मदद से, Control Tower के फ़्रंटएंड को चलाएं. यह A2A के ज़रिए एजेंटों का पता लगाता है और रीयल-टाइम अपडेट के साथ पूरे लूप को व्यवस्थित करता है.

सभी सेवाएं शुरू करें

सभी सेवाओं को शुरू करने का सबसे आसान तरीका:

पुष्टि करें कि आप रेपो रूट में हैं

pwd  # Should end with: visual-commerce-gemini-3-alloydb

इसके बाद,

sh run.sh

इस एक कमांड से ये काम शुरू हो जाते हैं:

  • पोर्ट 8081 पर विज़न एजेंट
  • पोर्ट 8082 पर सप्लायर एजेंट
  • पोर्ट 8080 पर कंट्रोल टावर

सभी सेवाओं के शुरू होने के लिए, करीब 10 सेकंड इंतज़ार करें.

सिस्टम की जांच करना

कंट्रोल टावर को ऐक्सेस करना:

  1. Cloud Shell टूलबार में मौजूद, वेब प्रीव्यू बटन (आंख वाला आइकॉन 👁️) पर क्लिक करें
  2. "पोर्ट 8080 पर झलक देखें" को चुनें
  3. Control Tower डैशबोर्ड नए टैब में खुलेगा

डेमो चलाएं:

  1. सबसे ऊपर दाईं ओर: कनेक्शन की स्थिति (हरा "लाइव" बिंदु), डेमो/ऑटो मोड टॉगल, और ऑडियो कंट्रोल
  2. सेंटर: इमेज अपलोड करने और विश्लेषण के विज़ुअलाइज़ेशन की सुविधा वाला मुख्य वर्कफ़्लो कैनवस
  3. साइड पैनल (विश्लेषण के दौरान दिखते हैं): वर्कफ़्लो टाइमलाइन (बाईं ओर), प्रोग्रेस ट्रैकिंग और कोड व्यूअर (दाईं ओर)

पहला विकल्प: क्विक स्टार्ट (सुझाया गया)

  1. होम पेज पर, आपको "जल्दी शुरू करें" सेक्शन दिखेगा. इसमें सैंपल इमेज भी दिखेंगी
  2. विश्लेषण अपने-आप शुरू करने के लिए, किसी भी सैंपल इमेज पर क्लिक करें
  3. ऑटोनॉमस वर्कफ़्लो (~30 से 45 सेकंड) देखें

दूसरा विकल्प: अपनी इमेज अपलोड करना

  1. वेयरहाउस/शेल्फ़ की इमेज (PNG, JPG, 10 एमबी तक) को खींचकर छोड़ें या ब्राउज़ करने के लिए क्लिक करें
  2. "ऑटोनॉमस वर्कफ़्लो शुरू करें" पर क्लिक करें
  3. चार चरणों वाली पाइपलाइन को मॉनिटर करना

क्या होता है:

  1. एजेंट की खोज: A2A प्रोटोकॉल के मॉडल, विज़न एजेंट और सप्लायर एजेंट कार्ड दिखाते हैं. इनमें उनकी क्षमताएं और एंडपॉइंट शामिल होते हैं
  2. इमेज का विश्लेषण: Gemini 3 Flash, आइटम की गिनती करने के लिए Python कोड (OpenCV) जनरेट करता है और उसे लागू करता है. प्रोग्रेस बार में उप-चरण दिखाए गए हैं. पहचाने गए आइटम पर बाउंडिंग बॉक्स ओवरले होते हैं. नतीजे वाले बैज में "✓ कोड की पुष्टि हो गई" या "~ अनुमानित" दिखता है
  3. सप्लायर मैच: AlloyDB ScaNN की वेक्टर सर्च का ऐनिमेशन. खोज क्वेरी दिखती है. जैसे, "इंडस्ट्रियल मेटल बॉक्स". नतीजे वाले कार्ड में, मैच किया गया हिस्सा, सप्लायर, और कॉन्फ़िडेंस स्कोर दिखता है
  4. ऑर्डर किया गया: ऑर्डर आईडी, संख्या, और जानकारी के साथ रसीद कार्ड

सलाह: प्रज़ेंटेशन के दौरान हर चरण पर रुकने के लिए, सबसे ऊपर दाईं ओर मौजूद DEMO मोड को चालू रखें. ऑटो मोड में, वर्कफ़्लो लगातार चलता रहता है.

1a031c4fd407a183.png

यह क्या हुआ

Control Tower ने A2A प्रोटोकॉल का इस्तेमाल करके, दोनों एजेंटों का पता लगाया. इसके लिए, /.well-known/agent-card.json का इस्तेमाल किया गया. साथ ही, विज़न विश्लेषण (कोड एक्ज़ीक्यूशन के साथ Gemini 3 Flash), वेक्टर सर्च (AlloyDB ScaNN) किया गया. इसके अलावा, बिना किसी मानवीय सहायता के ऑर्डर दिया गया. इन सभी कामों के लिए, रीयल-टाइम WebSocket अपडेट का इस्तेमाल किया गया. हर एजेंट, A2A स्टैंडर्ड के ज़रिए अपनी क्षमताओं को दिखाता है. इससे कस्टम एसडीके के बिना, प्लग-एंड-प्ले कंपोज़िशन की सुविधा मिलती है. ज़्यादा जानें: A2A प्रोटोकॉल

समस्या का हल

पाथ से जुड़ी गड़बड़ियां:

  • कमांड चलाने पर, "ऐसी कोई फ़ाइल या डायरेक्ट्री नहीं है" मैसेज दिख रहा है: इसका मतलब है कि आप रेपो रूट में नहीं हैं.
# Check where you are
pwd

# If you're lost, navigate to home and back to repo
cd
cd visual-commerce-gemini-3-alloydb

सेवा से जुड़ी गड़बड़ियां:

  • "पते का इस्तेमाल पहले से किया जा रहा है": पिछली प्रोसेस अब भी चालू हैं.
# Kill all services and restart
pkill -f uvicorn
sh run.sh  # Or manually restart individual agents
  • सेवाएं शुरू नहीं हो रही हैं: देखें कि पोर्ट इस्तेमाल किए जा रहे हैं या नहीं:
# Check which processes are using the ports
lsof -i :8080  # Control Tower
lsof -i :8081  # Vision Agent
lsof -i :8082  # Supplier Agent
  • AlloyDB से"कनेक्शन अस्वीकार किया गया" मैसेज मिलने पर: पुष्टि करें कि आपके AlloyDB इंस्टेंस पर सार्वजनिक आईपी चालू हो

9. 🎁 बोनस: Cloud Run पर डिप्लॉय करना

ज़रूरी नहीं — सब कुछ स्थानीय तौर पर काम करता है! हालांकि, अगर आपको अपनी बनाई गई चीज़ को सार्वजनिक यूआरएल के साथ शेयर करना है, तो:

# From repo root
sh deploy/deploy.sh

इससे क्या होता है:

  1. यह कुकी, आपके .env कॉन्फ़िगरेशन को पढ़ती है
  2. यह कुकी आपका नाम मांगती है, जो डिप्लॉय किए गए ऐप्लिकेशन में दिखता है
  3. तीनों सेवाओं को एक ही Cloud Run कंटेनर के तौर पर डिप्लॉय करता है
  4. AlloyDB को ऐक्सेस करने के लिए आईएएम की भूमिकाएं असाइन करता है
  5. शेयर किया जा सकने वाला यूआरएल दिखाता है

आपके यूआरएल को खोलने वाले लोगों को यह पॉप-अप दिखेगा:

10. साफ़-सफ़ाई सेवा

शुल्क से बचने के लिए, अपने-आप साफ़ होने वाली स्क्रिप्ट की मदद से सभी संसाधनों को मिटाएं:

# From repo root
sh deploy/cleanup.sh

इससे ये चीज़ें सुरक्षित तरीके से हट जाती हैं:

  • AlloyDB क्लस्टर (लागत का मुख्य ड्राइवर)
  • Cloud Run की सेवाएं (अगर डिप्लॉय की गई हैं)
  • इससे जुड़े सेवा खाते

स्क्रिप्ट, किसी भी आइटम को मिटाने से पहले पुष्टि करने के लिए कहेगी.

11. रेफ़रंस और इसके बारे में ज़्यादा जानकारी

इस कोडलैब में किए गए सभी तकनीकी दावों की पुष्टि, Google Cloud और Google के एआई से जुड़े आधिकारिक दस्तावेज़ों से की गई है.

आधिकारिक दस्तावेज़

Gemini 3 Flash:

AlloyDB AI और ScaNN:

डेटाबेस के लिए एमसीपी टूलबॉक्स (अन्य तरीका):

किराये की जानकारी:

परफ़ॉर्मेंस से जुड़े पुष्टि किए गए दावे

सुविधा

दावा करें

सोर्स

ScaNN बनाम HNSW (फ़िल्टर किया गया)

10 गुना तेज़

Google Cloud Blog (सत्यापित)

ScaNN बनाम HNSW (स्टैंडर्ड)

चार गुना तेज़

Google Cloud Blog (सत्यापित)

ScaNN का मेमोरी फ़ुटप्रिंट

3 से 4 गुना छोटा

Google Cloud Blog (सत्यापित)

ScaNN इंडेक्स बनाने में लगने वाला समय

आठ गुना तेज़ी से

Google Cloud Blog (सत्यापित)

कोड को चलाने में टाइम आउट से ज़्यादा समय लगा

ज़्यादा से ज़्यादा 30 सेकंड

Google Cloud Docs (पुष्टि की गई)

कोड चलाने की प्रोसेस के दौरान फ़ाइल I/O

ये काम नहीं करते हैं

Google Cloud Docs (पुष्टि की गई)

Temperature=0 का व्यवहार

डिटरमिनिस्टिक आउटपुट

समुदाय ने इसकी पुष्टि की है

अतिरिक्त संसाधन

Agent-to-Agent (A2A) प्रोटोकॉल:

  • A2A, एजेंट की खोज और कम्यूनिकेशन को स्टैंडर्ड बनाता है
  • /.well-known/agent-card.json पर दिखाए गए एजेंट कार्ड
  • ऑटोनॉमस एजेंट के साथ मिलकर काम करने के लिए नया स्टैंडर्ड

ScaNN रिसर्च:

  • Google Research के 12 सालों के अनुभव के आधार पर
  • Google Search और YouTube पर अरबों लोगों को सेवा देता है
  • सभी के लिए उपलब्ध होने की तारीख: अक्टूबर 2024
  • लाखों से लेकर अरबों वेक्टर के लिए, पहला PostgreSQL वेक्टर इंडेक्स

12. चैलेंज मोड: एआई एजेंट के तौर पर काम करने की अपनी क्षमताओं को बेहतर बनाएं

आपने एक ऐसी सप्लाई चेन बनाई है जो अपने-आप काम करती है. क्या आपको और जानकारी चाहिए? इन चुनौतियों में, आपने जो पैटर्न सीखे हैं उन्हें नई समस्याओं पर लागू किया जाता है.

पहला चैलेंज: इमेज के आधार पर खोज करना (मल्टीमॉडल एम्बेडिंग)

मौजूदा फ़्लो: विज़न एजेंट, आइटम की गिनती करता है → टेक्स्ट क्वेरी जनरेट करता है → सप्लायर एजेंट, टेक्स्ट एम्बेड करता है → AlloyDB में खोज करता है

चैलेंज: टेक्स्ट को पूरी तरह से अनदेखा करें. काटी गई इमेज को सीधे तौर पर सप्लायर एजेंट को भेजें.

संकेत:

  1. Vision Agent का कोड एक्ज़ीक्यूशन, शेल्फ़ की इमेज से अलग-अलग आइटम काट सकता है
  2. Vertex AI का multimodalembedding@001 मॉडल, इमेज को सीधे तौर पर एम्बेड कर सकता है
  3. इमेज बाइट को टेक्स्ट के बजाय स्वीकार करने के लिए, inventory.py में बदलाव करें
  4. A2A स्किल के ब्यौरे को अपडेट करके, "स्वीकार करता है: image/jpeg या text" बताएं

यह क्यों ज़रूरी है: विज़ुअल सर्च, जटिल दिखने वाले हिस्सों (रंगों में अंतर, नुकसान, पैकेजिंग में अंतर) के लिए ज़्यादा सटीक होती है.

दूसरी चुनौती: निगरानी—पारदर्शिता से भरोसा जीतना

मौजूदा स्थिति: सिस्टम काम करता है, लेकिन आपको "अंदरूनी तौर पर" नहीं दिखता

चैलेंज: यह साबित करने के लिए कि वेक्टर सर्च काम कर रही है, AlloyDB के क्वेरी लॉग की जांच करें.

तरीका:

  • AlloyDB पर क्वेरी की अहम जानकारी देने वाली सुविधा डिफ़ॉल्ट रूप से चालू होती है. पुष्टि करने के लिए, यह कमांड चलाएं:
gcloud alloydb instances describe INSTANCE_NAME \
  --cluster=CLUSTER_NAME \
  --region=us-central1 \
  --format="value(queryInsightsConfig.queryPlansPerMinute)"
  • यूज़र इंटरफ़ेस (यूआई) के ज़रिए सप्लायर खोजें
  • लागू की गई एसक्यूएल क्वेरी देखें:
gcloud logging read \
  'resource.type="alloydb.googleapis.com/Instance" AND textPayload:"ORDER BY part_embedding"' \
  --limit 5 \
  --format=json

अनुमानित आउटपुट: आपको ORDER BY part_embedding <=> $1::vector LIMIT 1 क्वेरी दिखेगी. साथ ही, इसे पूरा होने में लगने वाला समय भी दिखेगा.

यह क्यों ज़रूरी है: ऑब्ज़र्वेबिलिटी से भरोसा बढ़ता है. जब स्टेकहोल्डर पूछते हैं कि "यह एजेंट फ़ैसले कैसे लेता है?", तो उन्हें सिर्फ़ आउटपुट नहीं, बल्कि क्वेरी प्लान भी दिखाया जा सकता है.

तीसरा चैलेंज: मल्टी-एजेंट कंपोज़िशन

चुनौती: एक तीसरे एजेंट (लॉजिस्टिक्स एजेंट) को जोड़ें. यह एजेंट, गोदाम की जगह और आइटम के वज़न के हिसाब से शिपिंग के लिए खरीदार से लिए जाने वाले शुल्क का हिसाब लगाता है.

आर्किटेक्चर:

  • Vision Agent के आउटपुट: आइटम की संख्या
  • सप्लायर एजेंट के आउटपुट: सप्लायर की जगह की जानकारी
  • लॉजिस्टिक्स एजेंट (नया) के इनपुट: मंज़िल, वज़न → आउटपुट: शिपिंग के लिए खरीदार से लिया जाने वाला शुल्क + पहुंचने का अनुमानित समय

अहम जानकारी: A2A प्रोटोकॉल की मदद से, इसे आसानी से किया जा सकता है. शिपिंग के लिए शुल्क का हिसाब लगाने की सुविधा वाला नया एजेंट कार्ड बनाएं. Control Tower को इसका अपने-आप पता चल जाएगा.

सीखा जा रहा पैटर्न: यह एजेंट-ओरिएंटेड आर्किटेक्चर का मुख्य हिस्सा है. इसमें छोटे-छोटे, कंपोज़ेबल स्पेशलिस्ट से जटिल सिस्टम बनाए जाते हैं.

13. नतीजा

आपने जनरेटिव एआई से एजेंटिक एआई पर स्विच कर लिया है.

हमने क्या बनाया:

  • विजन: हमने "अनुमान लगाने" की सुविधा को कोड एक्ज़ीक्यूशन (एपीआई पासकोड के ज़रिए Gemini 3 Flash) से बदल दिया है.
  • मेमोरी: हमने "खोज में ज़्यादा समय लगना" की समस्या को AlloyDB ScaNN (GCP के ज़रिए) से बदल दिया है.
  • कार्रवाई: हमने "एपीआई इंटिग्रेशन" को A2A प्रोटोकॉल से बदल दिया है.

हाइब्रिड आर्किटेक्चर के फ़ायदे:

इस कोडलैब में, हाइब्रिड अप्रोच के बारे में बताया गया है:

  • Vision Agent: यह Gemini API (एपीआई पासकोड) का इस्तेमाल करता है. यह इस्तेमाल करने में आसान है और इसका मुफ़्त टियर उपलब्ध है. इसके लिए, GCP बिलिंग की ज़रूरत नहीं होती
  • सप्लायर एजेंट: यह GCP (Vertex AI + AlloyDB) का इस्तेमाल करता है. यह एंटरप्राइज़-ग्रेड और अनुपालन के लिए तैयार है

यह ऑटोनॉमस इकॉनमी का आर्किटेक्चर है. यह कोड आपके पास रहेगा.

अगले चरण