বাড়ি ফিরে যাওয়ার পথ - স্তর ০: নিজেকে চিহ্নিত করুন

১. বিপদের সংকেত

হেডার

আপনার এস্কেপ পডটি এক অজানা জগতের বায়ুমণ্ডল ভেদ করে তীব্রবেগে ছুটে চলেছে। প্রতিটি প্যানেলে সতর্কীকরণ বাতি জ্বলে উঠছে। নেভিগেশন সিস্টেমটি বিকল হয়ে গেছে। যোগাযোগ ব্যবস্থা বিচ্ছিন্ন। পডটির জরুরি প্রোটোকলগুলো সক্রিয় হওয়ার সাথে সাথে, এআই অ্যাসিস্ট্যান্টটি সশব্দে সচল হয়ে ওঠে:

জীবিত ব্যক্তি শনাক্ত করা হয়েছে। জরুরি অবতরণ সফল হয়েছে। উদ্ধার বীকন প্রোটোকল শুরু করা হচ্ছে...

সতর্কীকরণ: পরিচয় যাচাইকরণ আবশ্যক। ছায়াপথীয় উদ্ধার নেটওয়ার্ক অনিবন্ধিত অভিযাত্রীদের সনাক্ত করতে পারে না। আপনার বীকন সক্রিয় করতে অনুগ্রহ করে আপনার পরিচয় নিশ্চিত করুন।

আপনি ভিউপোর্টের বাইরে তাকান। দিগন্ত পর্যন্ত এক অচেনা ভূদৃশ্য বিস্তৃত—বিচিত্র শিলা গঠন, অচেনা গাছপালা, আর এক অদ্ভুত রঙের আকাশ। এই গ্রহের পৃষ্ঠে কোথাও না কোথাও আপনার অভিযানের অন্যান্য জীবিতরা ছড়িয়ে-ছিটিয়ে আছে।

তবে প্রথম কাজ হলো: আপনাকে এই সিস্টেমে বিদ্যমান থাকতে হবে।

আপনি যা তৈরি করবেন

এই লেভেলে, আপনি গুগলের জেমিনি ইমেজ জেনারেশন মডেল (যা ন্যানো ব্যানানা 🍌 নামেও পরিচিত) ব্যবহার করে মাল্টি-টার্ন ইমেজ জেনারেশনের মাধ্যমে আপনার অনন্য স্পেস এক্সপ্লোরার পরিচয় তৈরি করবেন। আপনার অ্যাভাটারটি গ্লোবাল রেসকিউ ম্যাপে প্রদর্শিত হবে, যা আপনার ওয়ার্কশপ ইভেন্টে উপস্থিত অন্য সকল সারভাইভার দেখতে পাবে।

স্থাপত্য

আপনি যা শিখবেন

ধারণা

বর্ণনা

মাল্টি-টার্ন ইমেজ জেনারেশন

চ্যাট সেশন ব্যবহার করে একাধিকবার ইমেজ তৈরির সময় অক্ষরের সামঞ্জস্য কীভাবে বজায় রাখা যায়

ছবির জন্য দ্রুত প্রকৌশল

নির্দিষ্ট সীমাবদ্ধতার মধ্যে শৈলীগত ও সামঞ্জস্যপূর্ণ আউটপুটের জন্য কার্যকর নির্দেশিকা তৈরি করা

জেমিনি ইমেজ এপিআই (ন্যানো বানানা)

পাইথন এসডিকে-এর মাধ্যমে জেমিনির নিজস্ব ইমেজ তৈরির ক্ষমতা ব্যবহার করে

চ্যাট সেশন

পুনরাবৃত্তিমূলক পরিমার্জন এবং চরিত্রের সামঞ্জস্যের জন্য কথোপকথনের প্রেক্ষাপটকে কাজে লাগানো

এই স্তর শেষে আপনি যা অর্জন করবেন:

✅ টেক্সট-টু-ইমেজ এআই ব্যবহার করে আপনার অভিযাত্রীর একটি প্রতিকৃতি তৈরি করা হয়েছে
✅ একাধিক পালাক্রমে কথোপকথন ব্যবহার করে একটি সামঞ্জস্যপূর্ণ মানচিত্র আইকন তৈরি করা হয়েছে
✅ উদ্ধারকারী নেটওয়ার্কে আপনার পরিচয় নিবন্ধন করুন
✅ অন্যান্য অভিযাত্রীদের পাশাপাশি জীবন্ত বিশ্ব মানচিত্রে প্রদর্শিত হয়েছেন

চলুন আপনাকে পরিচিত করে তুলি! 📍

২. আপনার পরিবেশ প্রস্তুত করুন

ক্লাউড শেল অ্যাক্সেস করুন

প্রথমে, আমরা ক্লাউড শেল খুলব, যেটি হলো একটি ব্রাউজার-ভিত্তিক টার্মিনাল এবং এতে গুগল ক্লাউড এসডিকে ও অন্যান্য প্রয়োজনীয় টুল আগে থেকেই ইনস্টল করা থাকে।

গুগল ক্লাউড ক্রেডিট প্রয়োজন?

আপনি যদি কোনো প্রশিক্ষক-পরিচালিত কর্মশালায় অংশগ্রহণ করেন : আপনার প্রশিক্ষক আপনাকে একটি ক্রেডিট কোড দেবেন। অনুগ্রহ করে তাঁর দেওয়া কোডটিই ব্যবহার করুন।
আপনি যদি এই কোডল্যাবটি নিজে নিজে সম্পন্ন করেন : ওয়ার্কশপের খরচ মেটানোর জন্য আপনি একটি বিনামূল্যের গুগল ক্লাউড ক্রেডিট রিডিম করতে পারেন। ক্রেডিট পেতে অনুগ্রহ করে এই লিঙ্কে ক্লিক করুন এবং আপনার অ্যাকাউন্টে এটি প্রয়োগ করার জন্য নিচের ভিডিও গাইডের ধাপগুলো অনুসরণ করুন।
ভিডিওটি দেখুন

Google Cloud Console-এর শীর্ষে থাকা Activate Cloud Shell- এ ক্লিক করুন (এটি উপরের ডানদিকের নেভিগেশন বারে থাকা টার্মিনাল আইকন)।

মেঘের খোলস

ক্লাউড শেল খুলে গেলে, আপনি প্রমাণীকৃত কিনা তা যাচাই করুন:

# Check that you are logged in
gcloud auth list

আপনার অ্যাকাউন্টটি (ACTIVE) হিসেবে তালিকাভুক্ত দেখতে পাবেন।

রিপোজিটরি ক্লোন করুন

Way Back Home রিপোজিটরিটি ক্লোন করুন এবং প্রজেক্টটিতে যান:

git clone https://github.com/gca-americas/way-back-home.git
cd way-back-home

নির্ভরতা ইনস্টল করুন

লেভেল ০-তে যান এবং প্রয়োজনীয় পাইথন প্যাকেজগুলো ইনস্টল করুন:

cd level_0
uv sync

মূল নির্ভরশীলতাগুলো হলো:

প্যাকেজ

উদ্দেশ্য

google-genai

ছবি তৈরির জন্য জেমিনি এপিআই ক্লায়েন্ট

requests

মিশন কন্ট্রোলে এপিআই কলের জন্য এইচটিটিপি ক্লায়েন্ট

Pillow

ইমেজ প্রসেসিং এবং ফাইল হ্যান্ডলিং

সেটআপ যাচাই করুন

সবকিছু সঠিকভাবে কনফিগার করা হয়েছে কিনা তা নিশ্চিত করতে দ্রুত যাচাই করে নিন:

uv run python ../scripts/verify_setup.py

আপনার দেখা উচিত:

✓ Authenticated as: your-email@google.com
✓ Python environment ready (uv)
✓ Ready to proceed!

আপনি এইমাত্র যা সম্পন্ন করেছেন

✓ ক্লাউড শেল খোলা হয়েছে
✓ গুগল ক্লাউড দ্বারা প্রমাণীকৃত
✓ কোডল্যাব রিপোজিটরি ক্লোন করা হয়েছে
uv দিয়ে পাইথন নির্ভরতাগুলো ইনস্টল করা হয়েছে
✓ আপনার সেটআপ যাচাই করা হয়েছে

এরপর: মিশন কন্ট্রোলের সাথে সংযোগ করুন — সেটআপ স্ক্রিপ্টটি আপনার গুগল ক্লাউড প্রজেক্ট এবং এপিআইগুলো স্বয়ংক্রিয়ভাবে কনফিগার করে দেবে।

৩. মিশন কন্ট্রোলের সাথে সংযোগ করুন

সেটআপ স্ক্রিপ্টটি চালান

সেটআপ স্ক্রিপ্টটি আপনাকে Way Back Home রেসকিউ নেটওয়ার্কের সাথে সংযুক্ত করে এবং আপনার এক্সপ্লোরার আইডেন্টিটি সংরক্ষণ করে। প্রজেক্ট রুট থেকে এটি চালান:

cd $HOME/way-back-home
chmod +x scripts/setup.sh
./scripts/setup.sh

আপনার কাছে দুটি তথ্য চাওয়া হবে।

আপনার ইভেন্ট কোড লিখুন

ইভেন্ট কোডটি শনাক্ত করে যে আপনি কোন কর্মশালা ইভেন্টে অংশগ্রহণ করছেন।

আপনি যদি কোনো কর্মশালায় থাকেন: কিউআর কোড, স্লাইড বা আপনার কর্মশালার প্রশিক্ষকের কাছ থেকে ইভেন্ট কোডটি প্রবেশ করান।

🚀 Welcome to Way Back Home!

Enter event code (from QR/slide): devfest-nyc-26
Validating event...
✓ Connected to: DevFest NYC 2026

আপনি যদি নিজে নিজে শিখতে চান: সর্বজনীন শিক্ষণ পরিবেশে যোগ দিতে sandbox প্রবেশ করুন।

🚀 Welcome to Way Back Home!

Enter event code (from QR/slide): sandbox
Validating event...
✓ Connected to: Way Back Home Sandbox

আপনার এক্সপ্লোরার নামটি বেছে নিন

আপনার অভিযাত্রীর জন্য একটি অনন্য নাম বেছে নিন। বিশ্ব মানচিত্র এবং লিডারবোর্ডে আপনাকে এভাবেই দেখানো হবে।

Choose your explorer name: AstroAyo
✓ Username available!

যদি একই অনুষ্ঠানে আপনার নির্বাচিত নামটি অন্য কোনো অংশগ্রহণকারী ইতিমধ্যেই নিয়ে থাকেন:

Choose your explorer name: SpaceExplorer
⚠️  That name is taken. Try another.
Choose your explorer name: SpaceExplorer42
✓ Username available!

সেটআপ সম্পন্ন

সম্পন্ন হলে, আপনি একটি নিশ্চিতকরণ বার্তা দেখতে পাবেন:

Initializing your explorer profile...

✓ Environment configured!
  Explorer ID: a1b2c3d4
  Starting coordinates: (47, 23)

Next: cd level_0 && python customize.py

এখন লেভেল ০ ডিরেক্টরিতে যান (আপনার ডিপেন্ডেন্সিগুলো মডিউল ২ থেকে ইতিমধ্যেই ইনস্টল করা আছে):

cd level_0

আপনার কনফিগারেশন পরীক্ষা করুন

কী সংরক্ষণ করা হয়েছে তা দেখে নিন (config.json প্রজেক্ট রুটে আছে):

cat ../config.json
{
    "event_code": "devfest-nyc-26",
    "event_name": "DevFest NYC 2026",
    "username": "AstroAyo",
    "participant_id": "a1b2c3d4",
    "starting_x": 47,
    "starting_y": 23,
    "api_base": "https://api.waybackhome.dev",
    "project_id": "your-project-id"
}

এই কনফিগারেশন ফাইলটি পরবর্তী স্ক্রিপ্টগুলো দ্বারা রেসকিউ নেটওয়ার্কের কাছে আপনাকে শনাক্ত করতে ব্যবহৃত হবে।

আপনি এইমাত্র যা সম্পন্ন করেছেন

✓ মিশন কন্ট্রোল এপিআই-এর সাথে সংযুক্ত
✓ আপনার অনন্য এক্সপ্লোরার নামটি সংরক্ষিত করুন
✓ আপনার অংশগ্রহণকারী আইডি এবং শুরুর স্থানাঙ্ক পাওয়া গেছে
✓ পরবর্তী ধাপগুলোর জন্য কনফিগারেশন সংরক্ষিত হয়েছে

এরপর: আপনার অভিযাত্রীর চেহারা নিজের পছন্দমতো সাজিয়ে নিন।

৪. আপনার এক্সপ্লোরার কাস্টমাইজ করুন

কাস্টমাইজেশন স্ক্রিপ্টটি চালান

আপনার অ্যাভাটার তৈরি করার আগে, আপনাকে আপনার অভিযাত্রীর চেহারা সম্পর্কে কয়েকটি সিদ্ধান্ত নিতে হবে:

uv run python customize.py

আপনার স্যুটের রঙ নির্বাচন করুন

আপনার অভিযাত্রীর মহাকাশ পোশাকের জন্য একটি রঙ বেছে নিন:

🎨 Let's create your explorer identity!

Select suit color:
  1. Deep Blue
  2. Crimson Red
  3. Forest Green
  4. Royal Purple
  5. Solar Gold
  6. Silver

Choice [1-6, default=6]: 1
✓ Deep Blue selected

আপনার অভিযাত্রীর বর্ণনা দিন (ঐচ্ছিক)

আপনি আপনার অভিযাত্রীর চেহারা সম্পর্কে একটি সংক্ষিপ্ত বিবরণ দিতে পারেন, অথবা এলোমেলোভাবে একটি চরিত্র নির্ধারণের জন্য এন্টার চাপতে পারেন:

Brief description of your explorer (or Enter for random):
Example: 'short dark hair, glasses, friendly smile'
> short dark hair, glasses, determined expression

✓ Preferences saved!

কিছু টাইপ না করে এন্টার চাপলে, আপনি এলোমেলো বৈশিষ্ট্য পাবেন:

> 
✓ Random traits: confident expression, short styled hair

কনফিগারেশন আপডেট করা হয়েছে

আপনার পছন্দগুলি এখন সংরক্ষিত হয়েছে:

✓ Preferences saved!
Next: Open generator.py and follow the codelab instructions

আপডেট করা কনফিগারেশন যাচাই করুন:

cat ../config.json

আপনার পছন্দগুলি যোগ করা হয়েছে দেখতে পাবেন:

{
    "event_code": "devfest-nyc-26",
    "event_name": "DevFest NYC 2026",
    "username": "AstroAyo",
    "participant_id": "a1b2c3d4",
    "starting_x": 47,
    "starting_y": 23,
    "api_base": "https://api.waybackhome.dev",
    "project_id": "your-project-id",
    "suit_color": "deep blue with silver accents",
    "appearance": "short dark hair, glasses, determined expression"
}

আপনি এইমাত্র যা সম্পন্ন করেছেন

✓ আপনার স্যুটের রঙ নির্বাচন করা হয়েছে
✓ আপনার অভিযাত্রীর চেহারা নির্ধারণ করা হয়েছে
✓ ইমেজ তৈরির জন্য কনফিগারেশন প্রস্তুত

এরপর: মূল পর্ব—ইমেজ তৈরির কোড লেখা!

৫. অ্যাভাটার জেনারেটরটি তৈরি করুন

এটিই মূল শিক্ষণ মডিউল। আপনি পাইথন কোড লিখবেন যা জেমিনির মাল্টি-টার্ন ইমেজ জেনারেশন ক্ষমতা (ন্যানো ব্যানানা) ব্যবহার করে আপনার অনন্য এক্সপ্লোরার অ্যাভাটার তৈরি করবে।

জেনারেটর ফাইলটি খুলুন

ক্লাউড শেল এডিটর-এ অ্যাভাটার জেনারেটরটি খুলুন:

cloudshell edit generator.py

অথবা ক্লাউড শেলে ওপেন এডিটর- এ ক্লিক করুন এবং level_0 ফোল্ডারে থাকা generator.py ফাইলটিতে যান।

ফাইল কাঠামো বোঝা

ফাইলটিতে স্টার্টার কোড এবং তিনটি প্লেসহোল্ডার সেকশন রয়েছে, যেখানে আপনি আপনার ইমপ্লিমেন্টেশন যোগ করবেন:

"""
Level 0: Avatar Generator

This module generates your unique space explorer avatar using
multi-turn image generation with Gemini (Nano Banana) for
character consistency across portrait and icon.
"""

from google import genai
from google.genai import types
from PIL import Image
import json
import os
import io

# Load configuration from setup (config.json is in project root)
CONFIG_PATH = "../config.json"

with open(CONFIG_PATH) as f:
    config = json.load(f)

USERNAME = config["username"]
SUIT_COLOR = config["suit_color"]
APPEARANCE = config["appearance"]

# Initialize the Gemini client for Vertex AI
client = genai.Client(
    vertexai=True,
    project=os.environ.get("GOOGLE_CLOUD_PROJECT", config.get("project_id")),
    location="us-central1"
)


def generate_explorer_avatar() -> dict:
    """
    Generate portrait and icon using multi-turn chat for consistency.
    
    The key technique here is using a CHAT SESSION rather than independent
    API calls. This allows Gemini to "remember" the character it created
    in the first turn, ensuring the icon matches the portrait.
    
    Returns:
        dict with portrait_path and icon_path
    """
    
    # MODULE_5_STEP_1_CREATE_CHAT_SESSION
    # TODO: Create a chat session for multi-turn generation
    chat = None  # Replace this line
    
    # MODULE_5_STEP_2_GENERATE_PORTRAIT
    # TODO: Generate the explorer portrait
    portrait_image = None  # Replace this section
    
    # MODULE_5_STEP_3_GENERATE_ICON
    # TODO: Generate a consistent map icon
    icon_image = None  # Replace this section
    
    return {
        "portrait_path": "outputs/portrait.png",
        "icon_path": "outputs/icon.png"
    }


if __name__ == "__main__":
    # Create outputs directory if it doesn't exist
    os.makedirs("outputs", exist_ok=True)
    
    print(f"Generating avatar for {USERNAME}...")
    result = generate_explorer_avatar()
    print(f"✅ Avatar created!")
    print(f"   Portrait: {result['portrait_path']}")
    print(f"   Icon: {result['icon_path']}")

আপনি তিনটি TODO সেকশন আপনার বাস্তবায়ন দিয়ে প্রতিস্থাপন করবেন।

ধাপ ১: চ্যাট সেশন তৈরি করুন

MODULE_5_STEP_1_CREATE_CHAT_SESSION প্লেসহোল্ডারটি খুঁজুন এবং chat = None # Replace this line :

    # MODULE_5_STEP_1_CREATE_CHAT_SESSION
    # Create a chat session to maintain character consistency across generations.
    # The chat session preserves context between turns, so Gemini "remembers"
    # what it generated and can create consistent variations.
    chat = client.chats.create(
        model="gemini-2.5-flash-image",  # Nano Banana - Gemini with image generation
        config=types.GenerateContentConfig(
            response_modalities=["TEXT", "IMAGE"]
        )
    )

ধাপ ২: প্রতিকৃতিটি তৈরি করুন

MODULE_5_STEP_2_GENERATE_PORTRAIT খুঁজুন এবং portrait_image = None # Replace this section :

    # MODULE_5_STEP_2_GENERATE_PORTRAIT
    # First turn: Generate the explorer portrait.
    # This establishes the character that will be referenced in subsequent turns.
    portrait_prompt = f"""Create a stylized space explorer portrait.

Character appearance: {APPEARANCE}
Name on suit patch: "{USERNAME}"
Suit color: {SUIT_COLOR}

CRITICAL STYLE REQUIREMENTS:
- Digital illustration style, clean lines, vibrant saturated colors
- Futuristic but weathered space suit with visible mission patches
- Background: Pure solid white (#FFFFFF) - absolutely no gradients, patterns, or elements
- Frame: Head and shoulders only, 3/4 view facing slightly left
- Lighting: Soft diffused studio lighting, no harsh shadows
- Expression: Determined but approachable
- Art style: Modern animated movie character portrait (similar to Pixar or Dreamworks style)

The white background is essential - the avatar will be composited onto a map."""

    print("🎨 Generating your portrait...")
    portrait_response = chat.send_message(portrait_prompt)
    
    # Extract the image from the response.
    # Gemini returns a response with multiple "parts" - we need to find the image part.
    portrait_image = None
    for part in portrait_response.candidates[0].content.parts:
        if part.inline_data is not None:
            # Found the image! Convert from bytes to PIL Image and save.
            image_bytes = part.inline_data.data
            portrait_image = Image.open(io.BytesIO(image_bytes))
            portrait_image.save("outputs/portrait.png")
            break
    
    if portrait_image is None:
        raise Exception("Failed to generate portrait - no image in response")
    
    print("✓ Portrait generated!")

ধাপ ৩: মানচিত্র আইকনটি তৈরি করুন

MODULE_5_STEP_3_GENERATE_ICON খুঁজুন এবং icon_image = None # Replace this section :

    # MODULE_5_STEP_3_GENERATE_ICON
    # Second turn: Generate a consistent icon for the map.
    # Because we're in the same chat session, Gemini remembers the character
    # from the portrait and will maintain visual consistency.
    icon_prompt = """Now create a circular map icon of this SAME character.

CRITICAL REQUIREMENTS:
- SAME person, SAME face, SAME expression, SAME suit — maintain perfect consistency with the portrait
- Tighter crop: just the head and very top of shoulders
- Background: Pure solid white (#FFFFFF)
- Optimized for small display sizes (will be used as a 64px map marker)
- Keep the exact same art style, colors, and lighting as the portrait
- Square 1:1 aspect ratio

This icon must be immediately recognizable as the same character from the portrait."""

    print("🖼️  Creating map icon...")
    icon_response = chat.send_message(icon_prompt)
    
    # Extract the icon image from the response
    icon_image = None
    for part in icon_response.candidates[0].content.parts:
        if part.inline_data is not None:
            image_bytes = part.inline_data.data
            icon_image = Image.open(io.BytesIO(image_bytes))
            icon_image.save("outputs/icon.png")
            break
    
    if icon_image is None:
        raise Exception("Failed to generate icon - no image in response")
    
    print("✓ Icon generated!")

আপনার সম্পূর্ণ কোড

তিনটি সেকশন যোগ করার পর, আপনার generate_explorer_avatar() ফাংশনটি দেখতে এইরকম হবে:

def generate_explorer_avatar() -> dict:
    """
    Generate portrait and icon using multi-turn chat for consistency.
    
    The key technique here is using a CHAT SESSION rather than independent
    API calls. This allows Gemini to "remember" the character it created
    in the first turn, ensuring the icon matches the portrait.
    
    Returns:
        dict with portrait_path and icon_path
    """
    
    # MODULE_5_STEP_1_CREATE_CHAT_SESSION
    # Create a chat session to maintain character consistency across generations.
    # The chat session preserves context between turns, so Gemini "remembers"
    # what it generated and can create consistent variations.
    chat = client.chats.create(
        model="gemini-2.5-flash-image",  # Nano Banana - Gemini with image generation
        config=types.GenerateContentConfig(
            response_modalities=["TEXT", "IMAGE"]
        )
    )
    
    # MODULE_5_STEP_2_GENERATE_PORTRAIT
    # First turn: Generate the explorer portrait.
    # This establishes the character that will be referenced in subsequent turns.
    portrait_prompt = f"""Create a stylized space explorer portrait.

Character appearance: {APPEARANCE}
Name on suit patch: "{USERNAME}"
Suit color: {SUIT_COLOR}

CRITICAL STYLE REQUIREMENTS:
- Digital illustration style, clean lines, vibrant saturated colors
- Futuristic but weathered space suit with visible mission patches
- Background: Pure solid white (#FFFFFF) - absolutely no gradients, patterns, or elements
- Frame: Head and shoulders only, 3/4 view facing slightly left
- Lighting: Soft diffused studio lighting, no harsh shadows
- Expression: Determined but approachable
- Art style: Modern animated movie character portrait (similar to Pixar or Dreamworks style)

The white background is essential - the avatar will be composited onto a map."""

    print("🎨 Generating your portrait...")
    portrait_response = chat.send_message(portrait_prompt)
    
    # Extract the image from the response.
    # Gemini returns a response with multiple "parts" - we need to find the image part.
    portrait_image = None
    for part in portrait_response.candidates[0].content.parts:
        if part.inline_data is not None:
            # Found the image! Convert from bytes to PIL Image and save.
            image_bytes = part.inline_data.data
            portrait_image = Image.open(io.BytesIO(image_bytes))
            portrait_image.save("outputs/portrait.png")
            break
    
    if portrait_image is None:
        raise Exception("Failed to generate portrait - no image in response")
    
    print("✓ Portrait generated!")
    
    # MODULE_5_STEP_3_GENERATE_ICON
    # Second turn: Generate a consistent icon for the map.
    # Because we're in the same chat session, Gemini remembers the character
    # from the portrait and will maintain visual consistency.
    icon_prompt = """Now create a circular map icon of this SAME character.

CRITICAL REQUIREMENTS:
- SAME person, SAME face, SAME expression, SAME suit — maintain perfect consistency with the portrait
- Tighter crop: just the head and very top of shoulders
- Background: Pure solid white (#FFFFFF)
- Optimized for small display sizes (will be used as a 64px map marker)
- Keep the exact same art style, colors, and lighting as the portrait
- Square 1:1 aspect ratio

This icon must be immediately recognizable as the same character from the portrait."""

    print("🖼️  Creating map icon...")
    icon_response = chat.send_message(icon_prompt)
    
    # Extract the icon image from the response
    icon_image = None
    for part in icon_response.candidates[0].content.parts:
        if part.inline_data is not None:
            image_bytes = part.inline_data.data
            icon_image = Image.open(io.BytesIO(image_bytes))
            icon_image.save("outputs/icon.png")
            break
    
    if icon_image is None:
        raise Exception("Failed to generate icon - no image in response")
    
    print("✓ Icon generated!")
    
    return {
        "portrait_path": "outputs/portrait.png",
        "icon_path": "outputs/icon.png"
    }

আপনার ফাইল সংরক্ষণ করুন

generator.py সংরক্ষণ করতে ভুলবেন না:

  • ক্লাউড শেল এডিটর: Ctrl+S (উইন্ডোজ/লিনাক্স) অথবা Cmd+S (ম্যাক)
  • vim: Escape চাপুন, তারপর :wq টাইপ করে Enter চাপুন।

আপনি এইমাত্র যা তৈরি করেছেন

✓ একাধিক ধাপে ছবি তৈরির জন্য একটি চ্যাট সেশন তৈরি করা হয়েছে
✓ শৈলীগত সীমাবদ্ধতা সহ প্রতিকৃতি তৈরির জন্য একটি বিশদ নির্দেশিকা তৈরি করা হয়েছে
✓ কথোপকথনের প্রেক্ষাপট ব্যবহার করে একটি সামঞ্জস্যপূর্ণ মানচিত্র আইকন তৈরি করা হয়েছে
✓ জেমিনি প্রতিক্রিয়া থেকে ছবির ডেটা বিশ্লেষণ করতে শিখেছি

আয়ত্ত করা মূল ধারণাসমূহ:

ধারণা

আপনি যা শিখেছেন

চ্যাট সেশন

client.chats.create() একাধিক টার্ন জুড়ে কনটেক্সট বজায় রাখে।

প্রতিক্রিয়া পদ্ধতি

["TEXT", "IMAGE"] উত্তরে ছবি তৈরি করতে সক্ষম করে

প্রম্পট কাঠামো

বিষয় → চলক → শৈলী → প্রযুক্তিগত সীমাবদ্ধতা

চরিত্রের সামঞ্জস্য

একই চ্যাট সেশন = ছবি জুড়ে একই চরিত্র

প্রতিক্রিয়া পার্সিং

রেসপন্স পার্টসের inline_data থেকে ছবি বের করা

এরপর: আপনার কোডটি রান করুন এবং মানচিত্রে নিজেকে দেখুন!

৬. তৈরি করুন এবং নিবন্ধন করুন

আপনার প্রজেক্ট আইডি সেট করুন

নিশ্চিত করুন যে আপনার প্রজেক্ট আইডি একটি এনভায়রনমেন্ট ভেরিয়েবল হিসেবে উপলব্ধ আছে:

export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project)

আইডেন্টিটি ক্রিয়েটর চালান

এখন মূল স্ক্রিপ্টটি চালান যা জেনারেশন, আপলোড এবং রেজিস্ট্রেশন পরিচালনা করে:

uv run python create_identity.py

আপনি প্রজন্মের অগ্রগতি রিয়েল-টাইমে দেখতে পাবেন:

দ্রষ্টব্য: লাইভ ম্যাপে আপনার অ্যাভাটারটি প্রদর্শিত হতে ৫ সেকেন্ড পর্যন্ত সময় লাগতে পারে, তাই ম্যাপে নিজেকে সঙ্গে সঙ্গে দেখতে না পেলে রিফ্রেশ করুন।

🚀 Creating identity for AstroAyo...

🎨 Generating your portrait...
✓ Portrait generated!
🖼️  Creating map icon...
✓ Icon generated!

☁️  Uploading to mission database...
✓ Avatar uploaded!

📍 Registering with rescue network...
✓ Registration complete!

╔═══════════════════════════════════════════════════════════════╗
║                    ✅ IDENTITY CONFIRMED!                      ║
╠═══════════════════════════════════════════════════════════════╣
║                                                               ║
║  Explorer: AstroAyo                                           ║
║  Location: (47, 23) — unconfirmed                             ║
║                                                               ║
║  🗺️  You're now on the map!                                   ║
║  https://waybackhome.dev/e/devfest-nyc-26                     ║
║                                                               ║
║  NEXT: Proceed to Level 1 to pinpoint your exact location!   ║
║                                                               ║
╚═══════════════════════════════════════════════════════════════╝

আপনার তৈরি করা অবতার দেখুন

আপনার তৈরি করা ছবিগুলো স্থানীয়ভাবে দেখে নিন:

# List the generated files
ls -la outputs/

# Download to view on your local machine
cloudshell download outputs/portrait.png
cloudshell download outputs/icon.png

অথবা outputs/ ফোল্ডারে গিয়ে ইমেজ ফাইলগুলোতে ক্লিক করে সরাসরি ক্লাউড শেল এডিটর-এ সেগুলো দেখুন।

তৈরি হওয়া পোর্ট্রেট এবং আইকনটি দেখতে এই ছবিগুলোর মতো হবে:

উদাহরণ প্রতিকৃতিউদাহরণ আইকন

মানচিত্রে নিজেকে দেখুন!

আপনার আউটপুটে দেখানো বিশ্ব মানচিত্রের URL-টি খুলুন:

https://waybackhome.dev/e/{your-event-code}

উদাহরণস্বরূপ: https://waybackhome.dev/e/devfest-nyc-26

মানচিত্রে আপনার অবতারটি খুঁজুন! আপনি দেখতে পাবেন:

  • গ্রহপৃষ্ঠে আপনার অবস্থান চিহ্নিতকারী আইকন।
  • আপনার আইকনের নিচে লেবেল হিসেবে আপনার এক্সপ্লোরারের নাম।
  • আপনার চিহ্নিত স্থানের চারপাশে ধীরে ধীরে স্পন্দিত হওয়া একটি ম্লান বাতিঘর।

মানচিত্রে উদাহরণ অবতার

ডিটেইল কার্ডে আপনার সম্পূর্ণ প্রতিকৃতি দেখতে আপনার মার্কারটিতে ক্লিক করুন।

আপনার অ্যাভাটার পছন্দ হচ্ছে না? রিজেনারেট করুন!

আপনি যদি অন্য কোনো অ্যাভাটার চান, তাহলে সেটি পুনরায় তৈরি করতে পারেন:

# Option 1: Change your appearance settings first
uv run python customize.py

# Option 2: Just regenerate with current settings
uv run python create_identity.py

প্রতিবার আপনি যখন create_identity.py ফাইলটি চালান, এটি একটি সম্পূর্ণ নতুন অ্যাভাটার তৈরি করে (নতুন চ্যাট সেশন = নতুন ক্যারেক্টার) এবং আপনার রেজিস্ট্রেশন আপডেট করে। ফলাফল সন্তোষজনক না হওয়া পর্যন্ত আপনি এটি পরিবর্তন করতে পারেন!

সমস্যা সমাধান

আপনি এইমাত্র যা সম্পন্ন করেছেন

✓ আপনার অনন্য অভিযাত্রী প্রতিকৃতি তৈরি করা হয়েছে
✓ একটি সামঞ্জস্যপূর্ণ মানচিত্র আইকন তৈরি করা হয়েছে
✓ মিশন কন্ট্রোলে সম্পদ আপলোড করা হয়েছে
✓ উদ্ধারকারী নেটওয়ার্কে আপনার পরিচয় নিবন্ধন করুন
✓ জীবন্ত বিশ্ব মানচিত্রে প্রদর্শিত হয়েছে!

অভিনন্দন, অভিযাত্রী! আপনি এখন উদ্ধার নেটওয়ার্কে অন্তর্ভুক্ত। আপনার বীকনটি সক্রিয় (যদিও অনুজ্জ্বল), এবং অন্যান্য জীবিতরা আপনাকে মানচিত্রে দেখতে পাবে।

৭. উপসংহার

আপনি যা তৈরি করেছেন

মাত্র ১০ মিনিটে, আপনি মাল্টি-টার্ন এআই ইমেজ জেনারেশন ব্যবহার করে একটি সম্পূর্ণ অ্যাভাটার জেনারেশন সিস্টেম তৈরি করেছেন:

┌─────────────────────────────────────────────────────────────┐
                     Your Creation                           
├─────────────────────────────────────────────────────────────┤
                                                             
   📝 Input                       🖼️  Output                  
   ──────────                     ────────                    
    Explorer name                 Stylized portrait         
    Suit color                    Consistent map icon       
    Appearance description        Live map presence         
                                                              
├─────────────────────────────────────────────────────────────┤
                                                             
   🧠 Techniques You Used                                     
   ──────────────────────                                    
    Multi-turn chat sessions for character consistency      
    Structured prompt engineering with style constraints    
    Response parsing to extract generated images            
    API integration for cloud registration                  
                                                             
└─────────────────────────────────────────────────────────────┘

মূল বিষয়বস্তু

পাঠ

কেন এটি গুরুত্বপূর্ণ

চ্যাট সেশনগুলি প্রাসঙ্গিকতা বজায় রাখে

একাধিক ছবিতে বৈচিত্র্যের বিচ্যুতি ছাড়াই সামঞ্জস্যপূর্ণ বৈশিষ্ট্য তৈরি করার জন্য অপরিহার্য।

প্রম্পট কাঠামো গুরুত্বপূর্ণ

সুস্পষ্ট সীমাবদ্ধতা (সাদা পটভূমি, নির্দিষ্ট শৈলী, কাঠামো) অনুমানযোগ্য ও উৎপাদনের জন্য প্রস্তুত ফলাফল তৈরি করে।

একাধিক পালা স্বাধীন কলকে পরাজিত করে

চ্যাটের প্রতিটি বার্তা পূর্ববর্তী প্রসঙ্গের উপর ভিত্তি করে গড়ে ওঠে, যা পুনরাবৃত্তিমূলক পরিমার্জন এবং সামঞ্জস্যতা নিশ্চিত করে।

প্রতিক্রিয়া পদ্ধতি আউটপুট নিয়ন্ত্রণ করে

ছবি তৈরি করার জন্য ["TEXT", "IMAGE"] সেট করা আবশ্যক—এটি ছাড়া আপনি শুধু টেক্সট পাবেন।

খরচের সারাংশ

এই লেভেলের জন্য, আপনি জেমিনি ২.৫ ফ্ল্যাশ (ন্যানো ব্যানানা) ব্যবহার করে ২টি ছবি তৈরি করেছেন:

আইটেম

টোকেন

খরচ

প্রতিকৃতি (১০২৪×১০২৪)

~১,২৯০টি আউটপুট টোকেন

~$০.০৩৯

আইকন (১০২৪×১০২৪)

~১,২৯০টি আউটপুট টোকেন

~$০.০৩৯

মোট

~২,৫৮০ টোকেন

~$০.০৮

যাত্রা অব্যাহত রয়েছে

আপনার অভিযাত্রী পরিচয় নিশ্চিত করা হয়েছে, কিন্তু একটি সমস্যা আছে: আপনার অবস্থান নিশ্চিত করা হয়নি।

বিশ্ব মানচিত্রের দিকে তাকান—আপনার সংকেত বাতিটি ক্ষীণ, ধীরে ধীরে স্পন্দিত হচ্ছে। উদ্ধারকারী নেটওয়ার্ক জানে যে আপনার অস্তিত্ব আছে, কিন্তু আপনি ঠিক কোথায় আছেন তা তারা জানে না। আপনি এই গ্রহের পৃষ্ঠের এক বিশাল অঞ্চলের যেকোনো জায়গায় থাকতে পারেন।

লেভেল ১: আপনার অবস্থান চিহ্নিত করুন-এ , আপনি যা করবেন:

  • গুগলের এজেন্ট ডেভেলপমেন্ট কিট (ADK) ব্যবহার করে একটি মাল্টি-এজেন্ট সিস্টেম তৈরি করুন।
  • ভূতাত্ত্বিক, উদ্ভিদবিদ্যাগত এবং জ্যোতির্বিদ্যাগত বিশ্লেষণের জন্য এমসিপি সার্ভার তৈরি করুন
  • বহুবিধ ইনপুট প্রক্রিয়া করুন (আপনার দুর্ঘটনা স্থলের ছবি)
  • এআই ব্যবহার করে আপনার নিশ্চিত অবস্থানের একটি ভূ-প্রাকৃতিক মানচিত্র তৈরি করুন।
  • আপনার বীকনটি সত্যি সত্যি জ্বালিয়ে দিন — যাতে উদ্ধারকারী দল আপনাকে খুঁজে পায়!

লেভেল ১-এ আরও অনেক উন্নত ধারণা তুলে ধরা হয়েছে: মাল্টি-এজেন্ট অর্কেস্ট্রেশন, মডেল কনটেক্সট প্রোটোকল (MCP), এবং প্রোডাকশন ডেপ্লয়মেন্ট প্যাটার্ন। আপনি একটিমাত্র মডেল ফিচার ব্যবহার করা থেকে শুরু করে একটি সম্পূর্ণ এজেন্টিক সিস্টেম তৈরি করার পর্যায়ে যাবেন।

পরিষ্কার করা (ঐচ্ছিক)

আপনি যদি স্থানীয় ফাইলগুলি পরিষ্কার করতে চান ( level_0 ডিরেক্টরি থেকে চালান):

rm -rf outputs/
deactivate  # Exit virtual environment

উদ্ধারকারী নেটওয়ার্কে আপনার নিবন্ধন বহাল থাকবে—স্থানীয় ফাইল মুছে ফেলার পরেও আপনাকে মানচিত্রে দেখা যাবে। ছবিগুলো ক্লাউডে সংরক্ষিত থাকে, স্থানীয়ভাবে নয়।

সম্পদ

আপনার বীকনটি নিশ্চিতকরণের অপেক্ষায় রয়েছে। লেভেল ১-এ দেখা হবে, অভিযাত্রী। 🚀

৮. বোনাস: ছবি-ভিত্তিক অ্যাভাটার (ঐচ্ছিক)

কখন ফটো-টু-অ্যাভাটার ব্যবহার করবেন

আপনি এই পদ্ধতিটি পছন্দ করতে পারেন যদি:

  • আপনি চান আপনার অবতারটি যেন দেখতে হুবহু আপনার মতোই হয়।
  • আপনার একটি নির্দিষ্ট ছবি আছে যেটিকে আপনি শৈল্পিক রূপ দিতে চান।
  • আপনি জেমিনির ইমেজ-টু-ইমেজ রূপান্তরের সক্ষমতাগুলো অন্বেষণ করতে চান।

এটি কীভাবে কাজ করে

শুধুমাত্র পাঠ্য বিবরণ থেকে একটি চরিত্র তৈরি করার পরিবর্তে, আপনি একটি ছবি দেন এবং জেমিনিকে ব্যক্তিটির সাদৃশ্য অক্ষুণ্ণ রেখে সেটিকে রূপান্তর করতে বলেন:

ফটো-থেকে-অবতার প্রবাহ

আপনার ছবি আপলোড করুন

প্রথমে, ক্লাউড শেলে একটি ছবি আপলোড করুন:

  1. ক্লাউড শেলে, টার্মিনাল টুলবারে থাকা তিন-বিন্দু মেনুতে (⋮) ক্লিক করুন।
  2. আপলোড নির্বাচন করুন
  3. একটি স্পষ্ট মুখের ছবি (JPEG বা PNG) বেছে নিন।
  4. আপলোড করা পাথটি নোট করুন (যেমন, /home/your-username/my_photo.jpg )

জেনারেটরটি পরিবর্তন করুন

ছবি ব্যবহার করতে হলে, আপনাকে generator.py ফাইলের পোর্ট্রেট তৈরির ধাপটি পরিবর্তন করতে হবে। শুধুমাত্র টেক্সট-ভিত্তিক প্রম্পটটির পরিবর্তে আপনার ছবিসহ একটি মাল্টিমোডাল প্রম্পট ব্যবহার করুন:

    # MODULE_5_STEP_2_GENERATE_PORTRAIT (Photo-based version)
    
    # Load your photo
    photo_path = "/home/your-username/my_photo.jpg"  # Update this path!
    user_photo = Image.open(photo_path)
    
    # Convert photo to bytes for the API
    photo_buffer = io.BytesIO()
    user_photo.save(photo_buffer, format="JPEG")
    photo_bytes = photo_buffer.getvalue()
    
    portrait_prompt = f"""Transform this person into a stylized space explorer portrait.

PRESERVE from the original photo:
- The person's facial features, face shape, and likeness
- Their general expression and personality
- Any distinctive features (glasses, facial hair, etc.)

TRANSFORM with this style:
- Digital illustration style, clean lines, vibrant saturated colors
- Add a futuristic space suit with the name "{USERNAME}" on a shoulder patch
- Suit color: {SUIT_COLOR}
- Background: Pure solid white (#FFFFFF) - no gradients or elements
- Frame: Head and shoulders, 3/4 view
- Lighting: Soft diffused studio lighting
- Art style: Modern animated movie character (Pixar/Dreamworks aesthetic)

The result should be clearly recognizable as THIS specific person, but illustrated as a heroic space explorer."""

    print("🎨 Transforming your photo into an explorer portrait...")
    
    # Send both the prompt AND the image
    portrait_response = chat.send_message([
        portrait_prompt,
        types.Part.from_bytes(data=photo_bytes, mime_type="image/jpeg")
    ])
    
    # Rest of the extraction code stays the same...

একাধিক পালায় সামঞ্জস্যতা এখনও কাজ করে

ফটো-ভিত্তিক জেনারেশনের ক্ষেত্রেও মাল্টি-টার্ন অ্যাপ্রোচ একইভাবে কাজ করে:

  • পালা ১ : ছবি + নির্দেশনা → শৈল্পিক প্রতিকৃতি (আপনার প্রতিচ্ছবি, চিত্রিত)
  • পালা ২ : "এই একই চরিত্রের আইকন তৈরি করুন" → সামঞ্জস্যপূর্ণ আইকন

যেহেতু চ্যাট সেশনটি তার তৈরি করা শৈল্পিক সংস্করণটি মনে রাখে (মূল ছবিটি নয়), তাই আইকনটি রূপান্তরিত প্রতিকৃতিটির সাথে পুরোপুরি মিলে যাবে।

গোপনীয়তা সংক্রান্ত বিবেচনা

ভার্টেক্স এআই স্টুডিওতে এটি চেষ্টা করে দেখুন

কোড লেখার আগে আপনি গুগল ক্লাউড কনসোলে ইন্টারেক্টিভভাবে ফটো ট্রান্সফরমেশন নিয়ে পরীক্ষা-নিরীক্ষাও করতে পারেন:

  1. ভার্টেক্স এআই স্টুডিওতে যান
  2. ছবি তোলার সুবিধাসহ একটি জেমিনি মডেল নির্বাচন করুন
  3. অ্যাটাচমেন্ট বাটন ব্যবহার করে আপনার ছবি আপলোড করুন।
  4. রূপান্তর প্রম্পট প্রবেশ করান
  5. ফলাফল সন্তোষজনক না হওয়া পর্যন্ত শৈলীটি পরিমার্জন করতে থাকুন।

কোড চূড়ান্ত করার আগে বিভিন্ন প্রম্পট নিয়ে পরীক্ষা-নিরীক্ষা করতে এবং রিয়েল-টাইমে ফলাফল দেখতে এই ইন্টারেক্টিভ পদ্ধতিটি চমৎকার!

আপনি যা শিখেছেন (বোনাস)

✓ জেমিনি দিয়ে কীভাবে ইমেজ-টু-ইমেজ ট্রান্সফরমেশন ব্যবহার করবেন
✓ একটি মেসেজে একাধিক মাধ্যমের কন্টেন্ট (টেক্সট + ছবি) পাঠানো
✓ শৈল্পিক স্টাইল ট্রান্সফার প্রয়োগ করার সময় সাদৃশ্য বজায় রাখা
✓ ছবি-ভিত্তিক এআই তৈরির ক্ষেত্রে গোপনীয়তার বিবেচ্য বিষয়সমূহ