দুর্দশার সংকেত
সময়কাল: ১ মিনিট

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

তুমি যা শিখবে
| ধারণা | বিবরণ |
|---|---|
| মাল্টি-টার্ন ইমেজ জেনারেশন | চ্যাট সেশন ব্যবহার করে একাধিক চিত্র প্রজন্মের মধ্যে চরিত্রের ধারাবাহিকতা কীভাবে বজায় রাখা যায় |
| ছবির জন্য প্রম্পট ইঞ্জিনিয়ারিং | নির্দিষ্ট সীমাবদ্ধতা সহ স্টাইলাইজড, সামঞ্জস্যপূর্ণ আউটপুটগুলির জন্য কার্যকর প্রম্পট তৈরি করা |
| জেমিনি ইমেজ এপিআই (ন্যানো কলা) | পাইথন SDK এর মাধ্যমে জেমিনির নেটিভ ইমেজ জেনারেশন ক্ষমতা ব্যবহার করা |
| চ্যাট সেশন | পুনরাবৃত্তিমূলক পরিমার্জন এবং চরিত্রের ধারাবাহিকতার জন্য কথোপকথনের প্রেক্ষাপটকে কাজে লাগানো |
এই স্তরের শেষে, আপনার কাছে থাকবে:
✅ টেক্সট-টু-ইমেজ এআই ব্যবহার করে আপনার এক্সপ্লোরারের একটি প্রতিকৃতি তৈরি করা হয়েছে
✅ বহু-পালা কথোপকথন ব্যবহার করে একটি সামঞ্জস্যপূর্ণ মানচিত্র আইকন তৈরি করা হয়েছে
✅ রেসকিউ নেটওয়ার্কে আপনার পরিচয় নিবন্ধিত করুন
✅ অন্যান্য অভিযাত্রীদের সাথে লাইভ ওয়ার্ল্ড ম্যাপে উপস্থিত হয়েছে
চলো তোমাকে মানচিত্রে তুলে ধরি! 📍
আপনার পরিবেশ প্রস্তুত করুন
সময়কাল: ২ মিনিট
ক্লাউড শেল অ্যাক্সেস করুন
প্রথমে, আমরা ক্লাউড শেল খুলব, যা একটি ব্রাউজার-ভিত্তিক টার্মিনাল যেখানে গুগল ক্লাউড এসডিকে এবং অন্যান্য প্রয়োজনীয় সরঞ্জামগুলি আগে থেকে ইনস্টল করা আছে।
গুগল ক্লাউড ক্রেডিট প্রয়োজন?
• যদি আপনি প্রশিক্ষকের নেতৃত্বে কর্মশালায় যোগদান করেন : আপনার প্রশিক্ষক আপনাকে একটি ক্রেডিট কোড প্রদান করবেন। অনুগ্রহ করে তাদের দেওয়া ক্রেডিট কোডটি ব্যবহার করুন।
• যদি আপনি নিজে এই কোডল্যাব ব্যবহার করে কাজ করেন : তাহলে কর্মশালার খরচ মেটাতে আপনি একটি বিনামূল্যের Google ক্লাউড ক্রেডিট রিডিম করতে পারেন। ক্রেডিট পেতে দয়া করে এই লিঙ্কে ক্লিক করুন এবং আপনার অ্যাকাউন্টে এটি প্রয়োগ করতে নীচের ভিডিও নির্দেশিকার ধাপগুলি অনুসরণ করুন।
গুগল ক্লাউড কনসোলের উপরে (এটি উপরের ডানদিকের নেভিগেশন বারের টার্মিনাল আইকন) Activate Cloud Shell- এ ক্লিক করুন।

আপনার Google Cloud Project ID খুঁজুন:
- গুগল ক্লাউড কনসোল খুলুন: https://console.cloud.google.com
- পৃষ্ঠার উপরে থাকা প্রকল্পের ড্রপডাউন থেকে এই কর্মশালার জন্য আপনি যে প্রকল্পটি ব্যবহার করতে চান তা নির্বাচন করুন।
- আপনার প্রজেক্ট আইডি ড্যাশবোর্ডের প্রজেক্ট তথ্য কার্ডে প্রদর্শিত হবে।

ক্লাউড শেল খোলার পরে, যাচাই করুন যে আপনি প্রমাণীকরণ করেছেন:
# Check that you are logged in
gcloud auth list
আপনার অ্যাকাউন্টটি (ACTIVE) হিসেবে তালিকাভুক্ত দেখতে হবে।
আপনার প্রকল্প কনফিগার করুন
আপনার প্রকল্পটি সঠিকভাবে সেট করা আছে কিনা তা যাচাই করুন:
export PROJECT_ID=$(gcloud config get-value project)
echo "Using project: $PROJECT_ID"
যদি কোনও প্রকল্প সেট না করা থাকে অথবা আপনার এটি পরিবর্তন করার প্রয়োজন হয়:
gcloud config set project YOUR_PROJECT_ID
প্রয়োজনীয় API গুলি সক্ষম করুন
ছবি তৈরির জন্য Vertex AI API সক্ষম করুন:
gcloud services enable aiplatform.googleapis.com
রিপোজিটরি ক্লোন করুন
ওয়ে ব্যাক হোম রিপোজিটরি ক্লোন করুন এবং প্রকল্পে নেভিগেট করুন:
git clone https://github.com/ayoisio/way-back-home.git
cd way-back-home
নির্ভরতা ইনস্টল করুন
লেভেল ০ এ যান এবং প্রয়োজনীয় পাইথন প্যাকেজগুলি ইনস্টল করুন:
cd level_0
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
মূল নির্ভরতাগুলি হল:
| প্যাকেজ | উদ্দেশ্য |
|---|---|
google-genai | ইমেজ জেনারেশনের জন্য জেমিনি এপিআই ক্লায়েন্ট |
requests | মিশন কন্ট্রোলে API কলের জন্য HTTP ক্লায়েন্ট |
Pillow | চিত্র প্রক্রিয়াকরণ এবং ফাইল পরিচালনা |
সেটআপ যাচাই করুন
সবকিছু সঠিকভাবে কনফিগার করা আছে কিনা তা নিশ্চিত করতে একটি দ্রুত যাচাইকরণ চালান:
cd ~/way-back-home
python scripts/verify_setup.py
তোমার দেখা উচিত:
✓ Google Cloud project configured: your-project-id
✓ Vertex AI API enabled
✓ Dependencies installed
✓ Ready to proceed!
তুমি যা সম্পন্ন করেছো
✅ খোলা ক্লাউড শেল
✅ আপনার গুগল ক্লাউড প্রজেক্ট কনফিগার করা হয়েছে
✅ সক্ষম ভার্টেক্স এআই এপিআই
✅ কোডল্যাব রিপোজিটরি ক্লোন করা হয়েছে
✅ ইনস্টল করা পাইথন নির্ভরতা
✅ আপনার সেটআপ যাচাই করা হয়েছে
পরবর্তী: মিশন কন্ট্রোলের সাথে সংযোগ করুন এবং আপনার এক্সপ্লোরার নাম দাবি করুন।
মিশন কন্ট্রোলের সাথে সংযোগ করুন
সময়কাল: ২ মিনিট
সেটআপ স্ক্রিপ্টটি চালান
সেটআপ স্ক্রিপ্টটি আপনাকে ওয়ে ব্যাক হোম রেসকিউ নেটওয়ার্কের সাথে সংযুক্ত করে এবং আপনার এক্সপ্লোরার পরিচয় সংরক্ষণ করে। এটি প্রজেক্ট রুট থেকে চালান:
cd ~/way-back-home
chmod +x scripts/setup.sh
./scripts/setup.sh
আপনাকে দুটি তথ্যের জন্য অনুরোধ করা হবে।
আপনার ইভেন্ট কোড লিখুন
ইভেন্ট কোডটি আপনি কোন কর্মশালায় অংশগ্রহণ করছেন তা চিহ্নিত করে।
আপনি যদি কোনও কর্মশালায় থাকেন: QR কোড, স্লাইড, অথবা আপনার কর্মশালার প্রশিক্ষকের কাছ থেকে ইভেন্ট কোডটি লিখুন।
🚀 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
লেভেল ০-এ নেভিগেট করুন
এখন লেভেল 0 ডিরেক্টরিতে যান (আপনার নির্ভরতা ইতিমধ্যেই মডিউল 2 থেকে ইনস্টল করা আছে):
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"
}
এই কনফিগারেশন ফাইলটি পরবর্তী স্ক্রিপ্টগুলি আপনাকে উদ্ধার নেটওয়ার্কে সনাক্ত করতে ব্যবহার করবে।
তুমি যা সম্পন্ন করেছো
✓ মিশন কন্ট্রোল API এর সাথে সংযুক্ত
✓ আপনার অনন্য এক্সপ্লোরার নাম সংরক্ষিত
✓ আপনার অংশগ্রহণকারী আইডি এবং শুরুর স্থানাঙ্ক পেয়েছেন
✓ পরবর্তী ধাপগুলির জন্য কনফিগারেশন সংরক্ষিত হয়েছে
পরবর্তী: আপনার এক্সপ্লোরারের চেহারা কাস্টমাইজ করুন।
আপনার এক্সপ্লোরার কাস্টমাইজ করুন
সময়কাল: ১ মিনিট
কাস্টমাইজেশন স্ক্রিপ্টটি চালান
আপনার অবতার তৈরি করার আগে, আপনাকে আপনার এক্সপ্লোরারের চেহারা সম্পর্কে কয়েকটি পছন্দ করতে হবে:
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
Then run: python create_identity.py
আপডেট করা কনফিগারেশন যাচাই করুন:
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টাইপ করুন এবং এন্টার দিন।
তুমি যা তৈরি করেছো
✓ মাল্টি-টার্ন ইমেজ জেনারেশনের জন্য একটি চ্যাট সেশন তৈরি করা হয়েছে
✓ স্টাইল সীমাবদ্ধতা সহ পোর্ট্রেট তৈরির জন্য একটি বিস্তারিত প্রম্পট তৈরি করা হয়েছে
✓ কথোপকথনের প্রেক্ষাপট ব্যবহার করে একটি সামঞ্জস্যপূর্ণ মানচিত্র আইকন তৈরি করা হয়েছে
✓ জেমিনি প্রতিক্রিয়া থেকে ছবির ডেটা পার্স করতে শিখেছি
মূল ধারণাগুলি আয়ত্ত করা হয়েছে:
| ধারণা | তুমি যা শিখেছো |
|---|---|
| চ্যাট সেশন | client.chats.create() একাধিক পালা জুড়ে প্রসঙ্গ বজায় রাখে |
| প্রতিক্রিয়া পদ্ধতি | ["TEXT", "IMAGE"] প্রতিক্রিয়াগুলিতে চিত্র তৈরি করতে সক্ষম করে |
| প্রম্পট স্ট্রাকচার | বিষয় → চলক → শৈলী → প্রযুক্তিগত সীমাবদ্ধতা |
| চরিত্রের ধারাবাহিকতা | একই চ্যাট সেশন = ছবিতে একই অক্ষর |
| প্রতিক্রিয়া পার্সিং | প্রতিক্রিয়া অংশে inline_data থেকে ছবিগুলি বের করা হচ্ছে |
পরবর্তী: আপনার কোডটি চালান এবং মানচিত্রে নিজেকে দেখুন!
তৈরি করুন এবং নিবন্ধন করুন
সময়কাল: ২ মিনিট
আপনার প্রজেক্ট আইডি সেট করুন
নিশ্চিত করুন যে আপনার প্রকল্প আইডি একটি পরিবেশ পরিবর্তনশীল হিসাবে উপলব্ধ:
export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project)
আইডেন্টিটি ক্রিয়েটর চালান
এখন মূল স্ক্রিপ্টটি চালান যা জেনারেশন, আপলোড এবং রেজিস্ট্রেশন পরিচালনা করে:
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/{আপনার-ইভেন্ট-কোড}
উদাহরণস্বরূপ: https://waybackhome.dev/e/devfest-nyc-26
ম্যাপে আপনার অবতার খুঁজুন! আপনি দেখতে পাবেন:
- গ্রহের পৃষ্ঠে আপনার অবস্থান চিহ্নিতকারী আপনার আইকন
- আপনার আইকনের নিচে লেবেল হিসেবে আপনার এক্সপ্লোরারের নাম
- তোমার মার্কার ঘিরে ধীরে ধীরে স্পন্দিত হচ্ছে একটি আবছা আলোর বাতি
![]()
বিস্তারিত কার্ডে আপনার সম্পূর্ণ প্রতিকৃতি দেখতে আপনার মার্কারে ক্লিক করুন।
তোমার অবতার নিয়ে খুশি নও? পুনর্জন্ম!
যদি আপনি একটি ভিন্ন অবতার চান, তাহলে আপনি এটি পুনরায় তৈরি করতে পারেন:
# Option 1: Change your appearance settings first
python customize.py
# Option 2: Just regenerate with current settings
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 │
│ │
└─────────────────────────────────────────────────────────────┘
কী Takeaways
| পাঠ | কেন এটা গুরুত্বপূর্ণ |
|---|---|
| চ্যাট সেশনগুলি প্রেক্ষাপট বজায় রাখে | বিভিন্ন চিত্রের মধ্যে কোনও পরিবর্তন ছাড়াই ধারাবাহিক অক্ষর তৈরির জন্য অপরিহার্য |
| তাৎক্ষণিক কাঠামো গুরুত্বপূর্ণ | স্পষ্ট সীমাবদ্ধতা (সাদা পটভূমি, নির্দিষ্ট শৈলী, ফ্রেমিং) অনুমানযোগ্য, উৎপাদন-প্রস্তুত ফলাফল তৈরি করে |
| মাল্টি-টার্ন স্বাধীন কলকে হার মানায় | চ্যাটের প্রতিটি বার্তা পূর্ববর্তী প্রসঙ্গের উপর ভিত্তি করে তৈরি হয়, যা পুনরাবৃত্তিমূলক পরিমার্জন এবং ধারাবাহিকতা সক্ষম করে। |
| প্রতিক্রিয়া পদ্ধতি নিয়ন্ত্রণ আউটপুট | ছবি তৈরির জন্য ["TEXT", "IMAGE"] সেটিং প্রয়োজন—এটি ছাড়া, আপনি কেবল টেক্সট পাবেন |
খরচের সারাংশ
এই স্তরের জন্য, আপনি জেমিনি 2.5 ফ্ল্যাশ (ন্যানো কলা) ব্যবহার করে 2টি ছবি তৈরি করেছেন:
| আইটেম | টোকেন | খরচ |
|---|---|---|
| প্রতিকৃতি (১০২৪×১০২৪) | ~১,২৯০ আউটপুট টোকেন | ~$০.০৩৯ |
| আইকন (১০২৪×১০২৪) | ~১,২৯০ আউটপুট টোকেন | ~$০.০৩৯ |
| মোট | ~২,৫৮০ টোকেন | ~$০.০৮ |
যাত্রা অব্যাহত
আপনার অভিযাত্রীর পরিচয় নিশ্চিত করা হয়েছে, কিন্তু একটি সমস্যা আছে: আপনার অবস্থান নিশ্চিত করা হয়নি।
পৃথিবীর মানচিত্রের দিকে তাকাও—তোমার আলোর আলো ম্লান, ধীরে ধীরে স্পন্দিত হচ্ছে। উদ্ধারকারী বাহিনী জানে তুমি আছো, কিন্তু তারা ঠিক জানে না তুমি কোথায় আছো। তুমি গ্রহের পৃষ্ঠের বিশাল অঞ্চলের যেকোনো জায়গায় থাকতে পারো।
লেভেল ১: আপনার অবস্থান চিহ্নিত করুন -এ আপনি:
- গুগলের এজেন্ট ডেভেলপমেন্ট কিট (ADK) ব্যবহার করে একটি মাল্টি-এজেন্ট সিস্টেম তৈরি করুন
- ভূতাত্ত্বিক, উদ্ভিদবিদ্যা এবং জ্যোতির্বিদ্যা বিশ্লেষণের জন্য MCP সার্ভার তৈরি করুন
- মাল্টিমোডাল ইনপুট প্রক্রিয়া করুন (আপনার ক্র্যাশ সাইট থেকে ছবি)
- AI ব্যবহার করে আপনার নিশ্চিত অবস্থানের একটি ভূ-প্রকৃতির মানচিত্র তৈরি করুন
- তোমার বাতিঘরটা সত্যিকার অর্থে জ্বালাও — যাতে উদ্ধারকারী দল তোমাকে খুঁজে পেতে পারে!
লেভেল ১ উল্লেখযোগ্যভাবে আরও উন্নত ধারণাগুলি উপস্থাপন করে: মাল্টি-এজেন্ট অর্কেস্ট্রেশন, মডেল কনটেক্সট প্রোটোকল (MCP), এবং উৎপাদন স্থাপনের ধরণ। আপনি একটি একক মডেল বৈশিষ্ট্য ব্যবহার থেকে শুরু করে একটি সম্পূর্ণ এজেন্টিক সিস্টেম তৈরিতে এগিয়ে যাবেন।
পরিষ্কার করা (ঐচ্ছিক)
যদি আপনি স্থানীয় ফাইলগুলি পরিষ্কার করতে চান ( level_0 ডিরেক্টরি থেকে চালান):
rm -rf outputs/
rm ../config.json
deactivate # Exit virtual environment
রেসকিউ নেটওয়ার্কে আপনার নিবন্ধন বহাল থাকবে—স্থানীয় ফাইল মুছে ফেলার পরেও আপনি মানচিত্রে উপস্থিত থাকবেন। ছবিগুলি স্থানীয়ভাবে নয়, ক্লাউডে সংরক্ষণ করা হয়।
রিসোর্স
- জেমিনি ইমেজ জেনারেশন ডকুমেন্টেশন
- ছবির জন্য প্রম্পট ইঞ্জিনিয়ারিং গাইড
- ন্যানো কলা ঘোষণা ব্লগ
- ওয়ে ব্যাক হোম রিপোজিটরি
- স্তর ১: আপনার অবস্থান চিহ্নিত করুন
তোমার বীকন নিশ্চিতকরণের অপেক্ষায় আছে। লেভেল ১-এ দেখা হবে, এক্সপ্লোরার। 🚀
বোনাস: ছবি-ভিত্তিক অবতার (ঐচ্ছিক)
সময়কাল: ৩ মিনিট
কখন ফটো-টু-অ্যাভাটার ব্যবহার করবেন
আপনি এই পদ্ধতিটি পছন্দ করতে পারেন যদি:
- তুমি চাও তোমার অবতারটা আসলে তোমার মতো হোক
- তোমার একটা নির্দিষ্ট ছবি আছে যা তুমি স্টাইলাইজ করতে চাও।
- আপনি জেমিনির ইমেজ-টু-ইমেজ রূপান্তর ক্ষমতা অন্বেষণ করতে চান
কিভাবে এটা কাজ করে
শুধুমাত্র টেক্সট বর্ণনা থেকে একটি চরিত্র তৈরি করার পরিবর্তে, আপনি একটি ছবি প্রদান করেন এবং মিথুনকে ব্যক্তির সাদৃশ্য সংরক্ষণ করে এটি রূপান্তর করতে বলেন:
![]()
তোমার ছবি আপলোড করো
প্রথমে, ক্লাউড শেলে একটি ছবি আপলোড করুন:
- ক্লাউড শেলে, টার্মিনাল টুলবারে তিন-বিন্দু মেনু (⋮) এ ক্লিক করুন।
- আপলোড নির্বাচন করুন
- একটি পরিষ্কার হেডশট ছবি (JPEG অথবা PNG) বেছে নিন
- আপলোড করা পাথটি লক্ষ্য করুন (যেমন,
/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...
মাল্টি-টার্ন কনসিস্টেন্সি এখনও কাজ করে
মাল্টি-টার্ন পদ্ধতিটি ফটো-ভিত্তিক জেনারেশনের ক্ষেত্রে একইভাবে কাজ করে:
- ১ম পালা : ছবি + প্রম্পট → স্টাইলাইজড পোর্ট্রেট (আপনার প্রতিকৃতি, চিত্রিত)
- দ্বিতীয় পালা : "এই একই অক্ষরের আইকন তৈরি করুন" → ধারাবাহিক আইকন
যেহেতু চ্যাট সেশনটি তৈরি করা স্টাইলাইজড সংস্করণটি মনে রাখে (মূল ছবি নয়), আইকনটি রূপান্তরিত প্রতিকৃতির সাথে পুরোপুরি মিলবে।
গোপনীয়তা বিবেচনা
ভার্টেক্স এআই স্টুডিওতে এটি ব্যবহার করে দেখুন
কোড লেখার আগে আপনি গুগল ক্লাউড কনসোলে ইন্টারেক্টিভভাবে ফটো ট্রান্সফর্মেশন নিয়ে পরীক্ষা-নিরীক্ষা করতে পারেন:
- ভার্টেক্স এআই স্টুডিওতে নেভিগেট করুন
- ছবির ক্ষমতা সম্পন্ন একটি জেমিনি মডেল নির্বাচন করুন
- সংযুক্তি বোতামটি ব্যবহার করে আপনার ছবি আপলোড করুন
- রূপান্তর প্রম্পট লিখুন
- ফলাফলে খুশি না হওয়া পর্যন্ত স্টাইলটি পুনরাবৃত্তি করুন।
- ফলাফলটি ডাউনলোড করুন এবং
outputs/portrait.pngহিসেবে সংরক্ষণ করুন। - ম্যানুয়ালি তৈরি করা ছবি আপলোড করতে
python create_identity.py --skip-generation(যদি এই পতাকাটি সমর্থিত হয়) চালান।
কোডিংয়ের আগে রিয়েল-টাইমে প্রম্পট নিয়ে পরীক্ষা-নিরীক্ষা এবং ফলাফল দেখার জন্য এই ইন্টারেক্টিভ পদ্ধতিটি দুর্দান্ত!
তুমি যা শিখেছো (বোনাস)
✓ জেমিনি দিয়ে ইমেজ-টু-ইমেজ ট্রান্সফর্মেশন কীভাবে ব্যবহার করবেন
✓ একটি বার্তায় মাল্টিমোডাল কন্টেন্ট (টেক্সট + ছবি) পাঠানো
✓ শৈল্পিক শৈলী স্থানান্তর প্রয়োগ করার সময় সাদৃশ্য সংরক্ষণ করা
✓ ছবি-ভিত্তিক এআই প্রজন্মের জন্য গোপনীয়তা বিবেচনা
