Spanner Omni-এর মাধ্যমে অন-ডিভাইস ডেটা এজেন্ট ও GraphRAG

১. এক নজরে

এই কোডল্যাবে Spanner Omni-এর মৌলিক বিষয়গুলি কভার করা হয়েছে, কেন এটি অটোনোমাস AI এজেন্টের জন্য আল্টিমেট ডেটা ফাউন্ডেশন হিসেবে কাজ করে এবং Spanner Omni (রিলেশনাল + গ্রাফ GQL), Python Flask ও Gemini 3.8 Flash দ্বারা পরিচালিত এজ-ডিপ্লয়েড, এজেন্টসুলভ পিকলবল ট্যাকটিক্যাল কোচ ও ম্যাচ সিমুলেটরের একটি রাফ এন্ড-টু-এন্ড ইমপ্লিমেন্টেশন দেখানো হয়েছে।

সমস্যা

আধুনিক ইন্ট্যার‌্যাক্টিভ স্পোর্টস প্ল্যাটফর্ম এবং রিয়েল-টাইম গেমিং এনভায়রনমেন্টে একসাথে তিনটি ভিন্ন ওয়ার্কলোড ম্যানেজ করতে হয়:

হাই-কনকারেন্সি অপারেশনাল ট্রানজ্যাকশন:

কোর্ট রিজার্ভেশন, প্লেয়ার মেম্বারশিপ, বিলিং এবং টুর্নামেন্ট শিডিউলের জন্য ডবল-বুকিং সংক্রান্ত সমস্যা দূর করতে কঠোর ACID সিরিয়ালাইজেবিলিটি প্রয়োজন।

কানেক্ট করা গ্রাফ টেলিমেট্রি:

ধারাবাহিক র‍্যালি শট সিকোয়েন্স, ট্রানজিশন মার্কভ চেইন এবং জোন কভারেজ গ্রাফের জন্য ভারী ETL পাইপলাইন ছাড়াই কম-লেটেন্সি ট্রাভার্সাল প্রয়োজন।

সাব-মিলিসেকেন্ড এজ রেসপন্সিভনেস:

দ্রুত-গতির ৬০ FPS ফিজিক্স সিমুলেশন যেখানে ওয়াইড-এরিয়া ক্লাউড নেটওয়ার্ক রাউন্ডট্রিপ (১০০–২০০ms) অগ্রহণযোগ্য জিটার প্রবর্তন করবে।

ঐতিহাসিকভাবে, ইঞ্জিনিয়ারিং টিমগুলি ফ্র্যাগমেন্টেড আর্কিটেকচার একসাথে সেলাই করে এটি সমাধান করেছে যা দেখতে কিছুটা এরকম ছিল: ট্রানজ্যাকশনাল ডেটার জন্য PostgreSQL, শট গ্রাফের জন্য Neo4j, এজ ক্যাশিংয়ের জন্য Redis এবং ব্যাকগ্রাউন্ড সিঙ্ক্রোনাইজেশন পাইপলাইন। এর ফলে আর্কিটেকচারাল ড্রিফ্ট, অপারেশনাল জটিলতা এবং কনসিস্টেন্সি সংক্রান্ত বিলম্ব হয়।

আমরা কীভাবে এটি করি!

এজে Google Cloud Spanner Omni ডেপ্লয় করে এবং Google Gemini 3.8 Flash-এর সাথে এটি যুক্ত করে, আমরা Spanner Omni Pickleball Game তৈরি করেছি — এটি একটি সিঙ্গেল-ইঞ্জিন স্পোর্টস গেমিং প্ল্যাটফর্ম যা রিলেশনাল বিজনেস লজিক, নেটিভ ISO GQL শট টেলিমেট্রি এবং রিয়েল-টাইম ট্যাকটিক্যাল AI কোচিংকে একত্রিত করে।

Spanner Omni

Spanner Omni Google-এর প্ল্যানেটারি-স্কেল ডিস্ট্রিবিউটেড ডেটাবেস ইঞ্জিন — যা হরাইজন্টাল স্কেলেবিলিটি, ACID ট্রানজ্যাকশন এবং মাল্টি-মডেল ক্ষমতা (রিলেশনাল, গ্রাফ, ভেক্টর এবং অ্যানালিটিক্স) সহ সম্পূর্ণ — সেল্ফ-ম্যানেজড, অন-প্রিমিসেস, মাল্টিক্লাউড এবং এয়ার-গ্যাপড এনভায়রনমেন্টে নিয়ে আসে। Spanner Omni হল Google Cloud Spanner-এর একটি ডাউনলোড করা যায়, নিজে ম্যানেজ করা যায় এমন সংস্করণ। আপনি যেখানেই এটি চালানোর জন্য বেছে নিন না কেন, এটি Spanner-এর মূল ডিস্ট্রিবিউটেড ডেটাবেস ক্ষমতা প্রদান করে — অটোমেটিক শার্ডিং, Paxos-ভিত্তিক রেপ্লিকেশন এবং শক্তিশালী এক্সটার্নাল কনসিস্টেন্সি:

acc871a470f63b29.png

আপনি কী শিখবেন

এই কোডল্যাবে, আপনি ট্রাডিশনাল সাইলোড ডেটাবেস আর্কিটেকচার থেকে আধুনিক, ইউনিফায়েড এজ ডেটাবেস সমাধানে ট্রানজিশন করবেন। আপনি শিখবেন:

  1. উচ্চ-পারফর্ম্যান্স, সিঙ্গেল-ইনস্ট্যান্স রিলেশনাল ওয়ার্কলোড ম্যানেজ করতে Docker ব্যবহার করে স্থানীয়ভাবে Spanner Omni ডিপ্লয় ও অর্কেস্ট্রেট করুন।
  2. একটি ইউনিফায়েড রিলেশনাল ও ISO GQL গ্রাফ স্কিমা ডিজাইন করুন যা এক্সটার্নাল ডেটাবেস সিঙ্ক করার প্রয়োজন ছাড়াই হাই-ডাইমেনশনাল গেম টেলিমেট্রির পাশাপাশি ট্রানজ্যাকশনাল বিজনেস মডেল ম্যাপ করে।
  3. প্রোগ্রাম্যাটিক্যালি রেস কন্ডিশন প্রতিরোধ করতে এবং ডবল-বুকিং সংক্রান্ত দ্বন্দ্ব দূর করতে Python রিড-রাইট ট্রানজ্যাকশনের মধ্যে কঠোর ACID সিরিয়ালাইজেবিলিটি প্রয়োগ করুন।
  4. একটি নেটিভ GraphRAG পাইপলাইন তৈরি করুন যা SQL-ইন্টিগ্রেটেড ISO GQL গ্রাফ কোয়েরি ব্যবহার করে রিয়েল-টাইম, প্রাসঙ্গিকভাবে গ্রাউন্ডেড ম্যাচ টেলিমেট্রি সরাসরি Google Gemini-তে ফিড করে, যাতে তাৎক্ষণিক কৌশলগত কোচিং পাওয়া যায়।

প্রয়োজনীয়তা

  • Linux (Ubuntu 22.04+), macOS বা Windows-এ চলা স্ট্যান্ডার্ড লোকাল মেশিন বা ডেভেলপমেন্ট VM।
  • Docker Desktop বা Docker Engine ইনস্টল করা আছে এবং চলছে।
  • Python 3.10 বা তার পরের যেকোনও ভার্সন ইনস্টল করা আছে।
  • একটি টেক্সট এডিটর বা IDE (যেমন VS Code বা PyCharm)।
  • একটি অ্যাক্টিভ Google Gemini API Key। (মনে রাখবেন: Spanner Omni লোকাল ডিভাইসে চালানোর জন্য কোনও Google Cloud বিলিং অ্যাকাউন্টের প্রয়োজন নেই, কারণ এটি ফ্রি-টিয়ার, সেল্ফ-ম্যানেজড ডেভেলপার ইভ্যালুয়েশন লাইসেন্সের অধীনে চলে)।

২. Spanner Omni ডেপ্লয়মেন্ট ও কনফিগারেশন

এই ধাপে, আমরা আমাদের লোকাল এজ ডেটাবেস ইনস্ট্যান্স স্পিন আপ করব। Spanner Omni একটি অত্যন্ত অপ্টিমাইজ করা কন্টেনারের মধ্যে চলে, যা আপনাকে আপনার স্থানীয় ডেভেলপার ল্যাপটপে প্ল্যানেটারি-স্কেল রিলেশনাল ক্ষমতা প্রদান করে।

  1. আপনার টার্মিনাল খুলুন এবং আপনার ডেটাবেস স্কিমা এবং গেম টেলিমেট্রি স্টোর করার জন্য একটি পারসিস্টেন্ট Docker ভলিউম তৈরি করুন:
docker volume create spanner_omni_data
  1. সিঙ্গেল-সার্ভার ডেভেলপার মোডে কনফিগার করা অফিসিয়াল Spanner Omni কন্টেনার ইমেজ পুল করে চালু করুন:
docker run -d --name spanner-omni \
  -p 9010:9010 -p 9020:9020 \
  -v spanner_omni_data:/spanner \
  us-docker.pkg.dev/spanner-omni/images/spanner-omni:2026.r2.1-beta \
  start-single-server
  1. কন্টেনারটি সফলভাবে চালু হয়েছে কিনা তা নিশ্চিত করুন:
docker ps

🛠️ এক লাইনে সমস্যার দ্রুত সমাধান: ব্যাকগ্রাউন্ড প্রসেস বা লিগ্যাসি এমুলেটর রান করার কারণে পোর্ট 9010 বা 9020 আগে থেকেই ব্যবহার করা হচ্ছে বলে আপনার লঞ্চ ব্যর্থ হলে, আপনার টার্মিনালে এই ক্লিনআপ স্ক্রিপ্টটি চালান:

pkill -f "spanner" || true
fuser -k 9010/tcp 9020/tcp 2>/dev/null || true
docker rm -f spanner-local spanner-omni spanner-omni-local 2>/dev/null || true

৩. রিলেশনাল ও ISO GQL গ্রাফ DDL স্কিমা ডিজাইন

Spanner Omni অ্যাক্টিভ থাকলে, আমরা আমাদের ডেটাবেস স্কিমা তৈরি করতে পারি। এই স্কিমা আমাদের single source of truth হিসেবে কাজ করে, যা দ্রুত, কানেক্টেড গ্রাফ টেলিমেট্রি স্কিমার (শট, জোন এবং ট্রানজিশন) সাথে রিলেশনাল বিজনেস এন্টিটি (যেমন কোর্ট, প্লেয়ার এবং বুকিং) একত্রিত করে।

অপারেশনাল ও টেলিমেট্রি টেবিল তৈরি করতে:

  1. Spanner CLI বা আপনার অ্যাপ্লিকেশন ক্লায়েন্ট ব্যবহার করে আপনার ডেটাবেসে কানেক্ট করা
  2. নিম্নলিখিত DDL স্টেটমেন্ট রান করুন

এই মুহূর্তে আপনাকে কোনও অ্যাকশন নিতে হবে না, কারণ আমরা অ্যাপ্লিকেশন কোডে এই সমস্যার সমাধান করছি:

-- ============================================================================
-- 1. OPERATIONAL & FACILITY MANAGEMENT (RELATIONAL ACID)
-- ============================================================================

CREATE TABLE Courts (
    court_id INT64 NOT NULL,
    name STRING(100) NOT NULL,
    location STRING(100) NOT NULL,
    surface_type STRING(50) NOT NULL,
    is_indoor BOOL NOT NULL,
    hourly_rate FLOAT64 NOT NULL,
    has_lighting BOOL NOT NULL,
    created_at TIMESTAMP NOT NULL OPTIONS (allow_commit_timestamp=true)
) PRIMARY KEY (court_id);

CREATE TABLE Players (
    player_id INT64 NOT NULL,
    name STRING(100) NOT NULL,
    email STRING(100) NOT NULL,
    skill_level STRING(20) NOT NULL,
    phone STRING(50),
    created_at TIMESTAMP NOT NULL OPTIONS (allow_commit_timestamp=true)
) PRIMARY KEY (player_id);

CREATE TABLE Bookings (
    booking_id INT64 NOT NULL,
    court_id INT64 NOT NULL,
    player_id INT64 NOT NULL,
    booking_date DATE NOT NULL,
    start_hour INT64 NOT NULL,
    end_hour INT64 NOT NULL,
    player_name STRING(100) NOT NULL,
    court_name STRING(100) NOT NULL,
    status STRING(20) NOT NULL,
    notes STRING(MAX),
    created_at TIMESTAMP NOT NULL OPTIONS (allow_commit_timestamp=true)
) PRIMARY KEY (booking_id);

CREATE TABLE MatchRequests (
    match_id INT64 NOT NULL,
    player_id INT64 NOT NULL,
    player_name STRING(100) NOT NULL,
    court_id INT64,
    court_name STRING(100),
    play_date DATE NOT NULL,
    start_hour INT64 NOT NULL,
    skill_required STRING(20) NOT NULL,
    match_type STRING(20) NOT NULL,
    spots_open INT64 NOT NULL,
    status STRING(20) NOT NULL,
    notes STRING(MAX),
    created_at TIMESTAMP NOT NULL OPTIONS (allow_commit_timestamp=true)
) PRIMARY KEY (match_id);

-- ============================================================================
-- 2. TACTICAL GAME TELEMETRY & PROPERTY GRAPH (ISO GQL)
-- ============================================================================

CREATE TABLE CourtZones (
    zone_id STRING(50) NOT NULL,
    name STRING(100) NOT NULL,
    is_kitchen BOOL NOT NULL,
    side STRING(50) NOT NULL
) PRIMARY KEY (zone_id);

CREATE TABLE Shots (
    shot_id STRING(50) NOT NULL,
    player_id STRING(50) NOT NULL,
    shot_type STRING(100) NOT NULL,
    speed_mph FLOAT64,
    spin_type STRING(50),
    outcome STRING(50),
    from_zone_id STRING(50),
    to_zone_id STRING(50)
) PRIMARY KEY (shot_id);

CREATE TABLE ShotTransitions (
    transition_id STRING(50) NOT NULL,
    from_shot_id STRING(50) NOT NULL,
    to_shot_id STRING(50) NOT NULL,
    rally_depth INT64,
    pressure_level STRING(20)
) PRIMARY KEY (transition_id);

-- ============================================================================
-- 3. MATCH SESSIONS & AI COACHING HISTORY
-- ============================================================================

CREATE TABLE GameSessions (
    session_id STRING(50) NOT NULL,
    player_id INT64 NOT NULL,
    player_score INT64 NOT NULL,
    bot_score INT64 NOT NULL,
    bot_difficulty STRING(20) NOT NULL,
    winner STRING(20) NOT NULL,
    rally_length INT64 NOT NULL,
    fault_type STRING(100),
    coaching_summary STRING(MAX),
    created_at TIMESTAMP NOT NULL OPTIONS (allow_commit_timestamp=true)
) PRIMARY KEY (session_id);
cat << 'EOF' > Dockerfile
FROM ollama/ollama:latest
ENV OLLAMA_HOST=0.0.0.0:8080
ENV OLLAMA_MODELS=/root/.ollama
ENV MODEL=gemma4:e2b
RUN ollama serve & sleep 5 && ollama pull $MODEL
ENTRYPOINT ["ollama", "serve"]
EOF

💡 কমিট টাইমস্ট্যাম্প কেন গুরুত্বপূর্ণ: OPTIONS (allow_commit_timestamp=true) নির্দিষ্ট করলে তা সমস্ত লোকাল নোড রেপ্লিকা জুড়ে মনোটনিক, মাইক্রোসেকেন্ড-সঠিক অর্ডারিং সক্ষম করে। এটি হাই-স্পিড গেম ইভেন্ট (যেমন লাইন-কল ভিডিও ফুটেজ) সংশ্লিষ্ট ডেটাবেস শট টেলিমেট্রি লগের সাথে সিঙ্ক করার জন্য অত্যন্ত গুরুত্বপূর্ণ।

৪. ACID কনকারেন্সি কন্ট্রোল ও ডবল-বুকিং প্রতিরোধ

অ্যাক্টিভ স্পোর্টস বুকিং পোর্টালে, একাধিক ব্যবহারকারী প্রায়ই একই কোর্ট টাইম স্লট রিজার্ভ করার জন্য প্রতিযোগিতা করেন। রেস কন্ডিশন প্রতিরোধ করতে, আমরা Spanner Omni-তে একটি Python রিড-রাইট ট্রানজ্যাকশন লিখব যাতে সম্পূর্ণ, ডবল-বুকিং প্রুফ সিরিয়ালাইজেবিলিটি নিশ্চিত করা যায়।

আপনাকে এখন কোনও অ্যাকশন নিতে হবে না, শুধু কোডটি দেখুন:

from google.cloud import spanner

def create_booking_transaction(transaction, booking_data):
    # 1. Query for existing overlapping confirmed bookings on the same court
    query = """
        SELECT booking_id, player_name, start_hour, end_hour
        FROM Bookings
        WHERE court_id = @court_id
          AND booking_date = @booking_date
          AND status = 'CONFIRMED'
          AND NOT (end_hour <= @start_hour OR start_hour >= @end_hour)
    """
    params = {
        "court_id": booking_data["court_id"],
        "booking_date": booking_data["booking_date"],
        "start_hour": booking_data["start_hour"],
        "end_hour": booking_data["end_hour"],
    }
    param_types = {
        "court_id": spanner.param_types.INT64,
        "booking_date": spanner.param_types.DATE,
        "start_hour": spanner.param_types.INT64,
        "end_hour": spanner.param_types.INT64,
    }
    
    results = list(transaction.execute_sql(query, params=params, param_types=param_types))
    
    if results:
        conflict = results[0]
        raise ValueError(
            f"Court conflict: Already booked by {conflict[1]} ({conflict[2]}:00-{conflict[3]}:00)"
        )
    
    # 2. Insert new confirmed booking with Spanner commit timestamp
    insert_stmt = """
        INSERT INTO Bookings (
            booking_id, court_id, player_id, booking_date, start_hour, end_hour,
            player_name, court_name, status, notes, created_at
        ) VALUES (
            @booking_id, @court_id, @player_id, @booking_date, @start_hour, @end_hour,
            @player_name, @court_name, 'CONFIRMED', @notes, PENDING_COMMIT_TIMESTAMP()
        )
    """
    # execute_update statement writing to Spanner Omni...
    transaction.execute_update(insert_stmt, params=booking_data, param_types=booking_types)

৫. রিয়েল-টাইম ৬০ FPS ফিজিক্স ও অ্যাডজাস্টেবল DUPR বট ইঞ্জিন

আমাদের অ্যাপ্লিকেশনের ফ্রন্টএন্ডে 2.5D HTML5 ক্যানভাস সিমুলেশন ব্যবহার করা হয় যা প্রতি সেকেন্ডে ৬০ ফ্রেম (FPS) রেন্ডার করে। এই রেন্ডারিং ডেটাবেস লেয়ার থেকে সম্পূর্ণ আলাদাভাবে চলে যাতে পারফর্ম্যান্স মসৃণ থাকে এবং র‍্যালি শেষ হলে তবেই টেলিমেট্রি ফ্ল্যাশ করা হয়।

সিমুলেটরে একটি অ্যাডজাস্টেবল OmniBot AI ইঞ্জিন রয়েছে যা বাস্তব-জগতের DUPR (ডাইনামিক ইউনিভার্সাল পিকলবল রেটিং) লেভেলের উপর ভিত্তি করে একটি ডিফিকাল্টি ম্যাট্রিক্স ব্যবহার করে।

1640056a824b47e6.png

আপনাকে এখন কোনও অ্যাকশন নিতে হবে না, শুধু বিবরণ দেখুন।

৬. ISO GQL Shot Telemetry Graph Processing

প্রতিটি র‍্যালি শেষ হওয়ার পরে, ফ্রন্টএন্ড কানেক্ট করা ট্র্যাজেক্টরি গ্রাফ আমাদের ব্যাকএন্ড এন্ডপয়েন্ট /api/rally-end-এ পোস্ট করে। প্রতিটি শট রিলেশনাল নোড হিসেবে রেকর্ড করা হয় এবং ট্রানজিশন এজের মাধ্যমে সিকোয়েন্স ডায়নামিক্যালি লিঙ্ক করা হয়।

আপনাকে এখন কোনও অ্যাকশন নিতে হবে না, শুধু কোডটি দেখুন:

@app.route("/api/execute-shot", methods=["POST"])
def execute_shot():
    data = request.json or {}
    shot_id = f"shot_{int(time.time()*1000)}"
    
    # 1. Insert the Shot Node
    insert_shot_sql = """
        INSERT INTO Shots (shot_id, player_id, shot_type, speed_mph, spin_type, outcome, from_zone_id, to_zone_id)
        VALUES (@shot_id, @player_id, @shot_type, @speed, @spin, @outcome, @from_zone, @to_zone)
    """
    
    # 2. If part of a continuous rally, link with a ShotTransition Edge
    if data.get("prev_shot_id"):
        transition_id = f"trans_{int(time.time()*1000)}"
        insert_trans_sql = """
            INSERT INTO ShotTransitions (transition_id, from_shot_id, to_shot_id, rally_depth, pressure_level)
            VALUES (@trans_id, @from_shot, @to_shot, @depth, @pressure)
        """
        # Executed within a single, unified Spanner Omni transaction...

Spanner-এর নেটিভ ISO GQL গ্রাফ কোয়েরি ইঞ্জিন ব্যবহার করে, কোনও কোচ বা অ্যানালিটিক্স প্রোগ্রাম ভারী ডেটাবেস জয়েন রান না করেই জটিল, ডিপ-হপ স্ট্রাকচারাল প্যাটার্ন কোয়েরি করতে পারে:

-- Find highest-frequency transition sequences leading to player unforced errors
GRAPH PickleballTelemetry
MATCH (s1:Shots)-[t:ShotTransitions]->(s2:Shots)
WHERE s1.shot_type = 'Speedup' AND s2.outcome = 'FAULT_NET'
RETURN s1.speed_mph, s2.from_zone_id, COUNT(*) AS occurrences
ORDER BY occurrences DESC
LIMIT 5;

৭. Gemini AI ট্যাকটিক্যাল কোচিং ও গ্রাউন্ডেড RAG চ্যাট

এখন, আমরা আমাদের অ্যাপ্লিকেশনের ব্রেন অ্যাক্টিভেট করব: Google Gemini 3.8 Flash। আমাদের Python ব্যাকএন্ড, Spanner Omni-র মাধ্যমে সরাসরি গ্রাউন্ড করা তিনটি রিয়েল-টাইম AI ক্ষমতা প্রদান করতে মডেলটি ব্যবহার করে।

সিস্টেমটি কিছু নির্দিষ্ট রিয়েল-টাইম AI ওয়ার্কফ্লোর জন্য Google Gemini 3.8 Flash ব্যবহার করে:

রিয়েল-টাইম র‍্যালি ব্রেকডাউন ও ট্যাকটিক্যাল রেফারি:

প্রতিটি পয়েন্টের পরে, Gemini শট চেইন, বটের অসুবিধা এবং কোর্টে পজিশনিং বিশ্লেষণ করে।

Spanner Multi-Table Grounded AI Concierge & Match Analyst:

ব্যবহারকারীরা কোর্টের শিডিউল, সুবিধার রেট সম্পর্কে কোয়েরি করতে এবং সাধারণ ভাষায় "OmniBot-এর বিরুদ্ধে আমি কেমন পারফর্ম করেছি?" জিজ্ঞাসা করতে পারবেন। ব্যাকএন্ড ডাইনামিকভাবে চারটি ডোমেন (কোর্ট, বুকিং, গেম সেশন এবং শট) জুড়ে Spanner Omni-কে কোয়েরি করে যাতে Gemini-কে শূন্য হ্যালুসিনেশন সহ গ্রাউন্ড করা যায়।

রিয়েল-টাইম পারফর্ম্যান্স অ্যানালিটিক্স API (/api/performance):

প্লেয়ার ড্যাশবোর্ডের জন্য Spanner Omni-এর GameSessions টেবিল থেকে সরাসরি লাইভ জয়-পরাজয়ের অনুপাত, গড় র‍্যালি ডেপথ এবং সাম্প্রতিক গেম সেশন একত্রিত করে।

আপনাকে এখন কোনও অ্যাকশন নিতে হবে না, শুধু বিবরণ দেখুন।

৮. কনফিগার, রান এবং টেস্ট করুন!

সিস্টেমটি এন্ড-টু-এন্ড যাচাই করার জন্য আপনার লোকাল মেশিনে সম্পূর্ণ অ্যাপ্লিকেশনটি লঞ্চ করা যাক।

  1. আপনার হোস্ট টার্মিনাল খুলুন এবং প্রোজেক্ট রিপোজিটরি ক্লোন করুন:
git clone https://github.com/AbiramiSukumaran/pickleball

cd pickleball
  1. নিম্নলিখিত ডকুমেন্টেশনে উল্লেখ করা ধাপগুলি অনুসরণ করে আপনার Gemini API Key পান:

https://medium.com/google-cloud/get-api-key-from-google-ai-studio-b2d2059a171d

  1. আপনার এডিটরে .env ফাইলটি খুলুন এবং আপনার এনভায়রনমেন্টের বিবরণ কনফিগার করুন:
SPANNER_EMULATOR_HOST="localhost:9010"
SPANNER_PROJECT="PROJECT_ID"
SPANNER_INSTANCE="omni-instance"
SPANNER_DATABASE="pickleball-db"
GEMINI_API_KEY="REPLACE_WITH_YOUR_ACTUAL_GEMINI_KEY"
  1. Python ডিপেন্ডেন্সি ইনস্টল করে অ্যাপ্লিকেশন রান করুন:
pip install -r requirements.txt

python app.py
  1. আপনার ওয়েব ব্রাউজার খুলুন এবং খেলা শুরু করতে http://localhost:5000-এ নেভিগেট করুন! আপনি রিজার্ভেশন ট্যাব থেকে কোর্ট বুক করতে পারবেন, অ্যাডজাস্ট করা যায় এমন DUPR OmniBot-এর বিরুদ্ধে খেলতে পারবেন এবং কোর্টের পাশে রিয়েল-টাইম Gemini ম্যাচ অ্যানালিস্ট-এর সাথে পরামর্শ করতে পারবেন।

ওয়েব ব্রাউজার খুলুন অথবা আপনার লোকালহোস্টে চলা অ্যাপের লিঙ্কে ক্লিক করুন!

a2d18f8288607c66.png

৯. অভিনন্দন!

এই কোডল্যাব সম্পূর্ণ করার মাধ্যমে, আপনি ডেটাবেস ইঞ্জিনিয়ারিংয়ের ক্ষেত্রে একটি দৃষ্টান্তমূলক পরিবর্তন প্রত্যক্ষ করেছেন। বহু বছর ধরে, এজ-এ (ফ্যাক্টরি ফ্লোর, মিলিটারি জোন বা কোর্ট-সাইড স্পোর্টস নেটওয়ার্কে) রেসপন্সিভ, রিয়েল-টাইম এজেন্ট তৈরি করার জন্য ডিজাইনে অনেক আপোষ করতে হয়েছে: বিচ্ছিন্ন ট্রানজ্যাকশনাল সিস্টেম, আলাদা গ্রাফ নোড এবং ভেক্টর সার্চ ইন্ডেক্সের মধ্যে ভঙ্গুর ETL পাইপলাইন একসাথে জুড়ে দেওয়া।

Spanner Omni এই ট্রেড-অফকে ভেঙে দেয়। এটি প্ল্যানেট-স্কেল ডিস্ট্রিবিউটেড কনসিস্টেন্সি, ISO GQL গ্রাফ কোয়েরি এবং রিলেশনাল পারফর্ম্যান্সকে একটি ডাউনলোডযোগ্য লোকাল কন্টেনারে একত্রিত করে। আপনার ডোমেন যাই হোক না কেন, Spanner Omni আপনার এজ এজেন্টদের জন্য একটি অটল বাস্তবিক সত্যের গ্যারান্টি দেয়।