Way Back Home - Level 0: Identify Yourself


The Distress Signal

Süre: 1 dakika

Başlık

Kaçış kapsülünüz, bilinmeyen bir dünyanın atmosferini yarıyor. Uyarı ışıkları her panelde yanıp söner. Navigasyon sistemi bozuldu. İletişim kesintisi yaşanıyor. Pod'un acil durum protokolleri devreye girerken yapay zeka asistanı şu şekilde yanıt veriyor:

"Survivor detected. Acil iniş başarılı. Kurtarma sinyali protokolü başlatılıyor..."

"UYARI: Kimlik doğrulama gerekiyor. Galaktik kurtarma ağı, kayıtlı olmayan kaşifleri bulamaz. Beacon'unuzu etkinleştirmek için lütfen kimliğinizi doğrulayın."

Görüntü alanından dışarı bakarsınız. Ufka kadar uzanan bir uzaylı manzarası: garip kaya oluşumları, bilinmedik bitki örtüsü ve tuhaf renkli bir gökyüzü. Bir yerlerde, görevinizden hayatta kalan diğer kişiler bu gezegenin yüzeyine dağılmış durumda.

Ancak öncelikle sistemde yer almanız gerekir.

Ne Oluşturacaksınız?

Bu seviyede, Google'ın Gemini görüntü üretme modelleri (Nano Banana 🍌 olarak da bilinir) ile çok turlu görüntü üretme özelliğini kullanarak benzersiz uzay kaşifi kimliğinizi oluşturacaksınız. Avatarınız, atölye etkinliğinizdeki diğer tüm katılımcıların görebileceği şekilde küresel kurtarma haritasında görünecek.

mimari

Neler Öğreneceksiniz?

Kavram Açıklama
Çok turlu görüntü üretme Sohbet oturumlarını kullanarak birden fazla görüntü oluşturma işleminde karakter tutarlılığını koruma
Görüntüler İçin İstem Mühendisliği Belirli kısıtlamalara sahip, stilize edilmiş ve tutarlı çıktılar için etkili istemler oluşturma
Gemini Image API (Nano Banana) Python SDK aracılığıyla Gemini'ın yerel görüntü üretme özelliklerini kullanma
Sohbet Oturumları Tekrarlı iyileştirme ve karakter tutarlılığı için ileti dizisi bağlamından yararlanma

Bu seviyenin sonunda:

✅ Metinden görüntüye yapay zeka kullanarak kaşifinizin portresini oluşturduysanız
✅ Çok turlu sohbeti kullanarak tutarlı bir harita simgesi oluşturduysanız
✅ Kimliğinizi kurtarma ağına kaydettiyseniz
✅ Diğer kaşiflerle birlikte canlı dünya haritasında görünüyorsanız

Haritada yerinizi alalım. 📍

Ortamınızı Hazırlama

Süre: 2 dakika

Cloud Shell'e erişme

Öncelikle, Google Cloud SDK ve diğer temel araçların önceden yüklendiği tarayıcı tabanlı bir terminal olan Cloud Shell'i açacağız.

Google Cloud kredisine mi ihtiyacınız var?

Eğitmen tarafından yönetilen bir atölyeye katılıyorsanız: Eğitmeniniz size kredi kodu sağlar. Lütfen sağladıkları kodu kullanın.
Bu Codelab'i kendi başınıza tamamlıyorsanız: Atölye çalışması maliyetlerini karşılamak için ücretsiz Google Cloud kredisi kullanabilirsiniz. Kredi almak için lütfen bu bağlantıyı tıklayın ve krediyi hesabınıza uygulamak için aşağıdaki video kılavuzundaki adımları uygulayın.
Videoyu izleyin

Google Cloud Console'un üst kısmında Cloud Shell'i etkinleştir'i (sağ üst gezinme çubuğundaki terminal simgesi) tıklayın.

cloud shell

Google Cloud proje kimliğinizi bulma:

  • Google Cloud Console'u açın: https://console.cloud.google.com
  • Sayfanın üst kısmındaki proje açılır listesinden bu atölye çalışması için kullanmak istediğiniz projeyi seçin.
  • Proje kimliğiniz, Kontrol Paneli'ndeki Proje bilgileri kartında gösterilir.
    proje kimliği

Cloud Shell açıldıktan sonra kimliğinizin doğrulandığını onaylayın:

# Check that you are logged in
gcloud auth list

Hesabınız (ACTIVE) olarak listelenir.

Projenizi Yapılandırma

Projenizin doğru şekilde ayarlandığını doğrulayın:

export PROJECT_ID=$(gcloud config get-value project)
echo "Using project: $PROJECT_ID"

Proje ayarlanmamışsa veya projeyi değiştirmeniz gerekiyorsa:

gcloud config set project YOUR_PROJECT_ID

Gerekli API'leri etkinleştirme

Görüntü oluşturma için Vertex AI API'yi etkinleştirin:

gcloud services enable aiplatform.googleapis.com

Depoyu Klonlama

Way Back Home deposunu klonlayın ve projeye gidin:

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

Bağımlılıkları yükleme

0. düzeye gidin ve gerekli Python paketlerini yükleyin:

cd level_0
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

Temel bağımlılıklar şunlardır:

Paket Amaç
google-genai Görüntü üretme için Gemini API istemcisi
requests Mission Control'e yapılan API çağrıları için HTTP istemcisi
Pillow Görüntü işleme ve dosya işleme

Kurulumu Doğrulama

Her şeyin doğru şekilde yapılandırıldığından emin olmak için hızlı bir doğrulama yapın:

cd ~/way-back-home
python scripts/verify_setup.py

Aşağıdaki bilgileri görürsünüz:

✓ Google Cloud project configured: your-project-id
✓ Vertex AI API enabled
✓ Dependencies installed
✓ Ready to proceed!

Az Önce Tamamladığınız

✅ Cloud Shell'i açtıysanız
✅ Google Cloud projenizi yapılandırdıysanız
✅ Vertex AI API'lerini etkinleştirdiyseniz
✅ Codelab deposunu klonladıysanız
✅ Python bağımlılıklarını yüklediyseniz
✅ Kurulumunuzu doğruladıysanız

Sonraki: Görev Kontrolü'ne bağlanın ve kaşif adınızı talep edin.

Görev Kontrolü'ne bağlanma

Süre: 2 dakika

Kurulum komut dosyasını çalıştırma

Kurulum komut dosyası sizi Way Back Home kurtarma ağına bağlar ve kaşif kimliğinizi ayırır. Proje kökünden çalıştırın:

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

İki bilgi girmeniz istenir.

Etkinlik kodunuzu girin

Etkinlik kodu, hangi atölye etkinliğine katıldığınızı tanımlar.

Bir atölye çalışmasındaysanız: QR kodundaki, slayttaki veya atölye çalışması eğitmeninizden aldığınız etkinlik kodunu girin.

🚀 Welcome to Way Back Home!

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

Kendi kendinize öğreniyorsanız: Herkese açık öğrenme ortamına katılmak için sandbox girin.

🚀 Welcome to Way Back Home!

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

Kaşif Adınızı Seçme

Kaşifiniz için benzersiz bir ad seçin. Dünya haritasında ve skor tablosunda bu şekilde görünürsünüz.

Choose your explorer name: AstroAyo
✓ Username available!

Seçtiğiniz ad aynı etkinlikteki başka bir katılımcı tarafından zaten kullanılıyorsa:

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

Kurulum Tamamlandı

İşlem tamamlandığında onay mesajı gösterilir:

Initializing your explorer profile...

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

Next: cd level_0 && python customize.py

Şimdi Level 0 dizinine gidin (bağımlılıklarınız Module 2'den zaten yüklenmiştir):

cd level_0

Yapılandırmanızı İnceleme

Kaydedilenlere göz atın (config.json, proje kök dizinindedir):

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"
}

Bu yapılandırma dosyası, sonraki komut dosyaları tarafından sizi kurtarma ağına tanıtmak için kullanılır.

Az Önce Tamamladığınız

✓ Mission Control API'ye bağlandı
✓ Benzersiz kaşif adınızı ayırttınız
✓ Katılımcı kimliğinizi ve başlangıç koordinatlarınızı aldınız
✓ Sonraki adımlar için yapılandırma kaydedildi

Sonraki: Gezgininizin görünümünü özelleştirin.

Gezgininizi Özelleştirme

Süre: 1 dakika

Özelleştirme komut dosyasını çalıştırın

Avatarınızı oluşturmadan önce, kaşifinizin görünümüyle ilgili birkaç seçim yaparsınız:

python customize.py

Elbise Renginizi Seçme

Kaşifinizin uzay giysisi için bir renk seçin:

🎨 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

Explorer'ınızı açıklayın (isteğe bağlı)

Kaşifinizin görünümüyle ilgili kısa bir açıklama girebilir veya rastgele bir atama için Enter tuşuna basabilirsiniz:

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

Hiçbir şey yazmadan Enter tuşuna basarsanız rastgele özellikler elde edersiniz:

> 
✓ Random traits: confident expression, short styled hair

Yapılandırma güncellendi

Tercihleriniz kaydedildi:

✓ Preferences saved!
Next: Open generator.py and follow the codelab instructions
Then run: python create_identity.py

Güncellenen yapılandırmayı doğrulayın:

cat ../config.json

Eklenen tercihlerinizi görürsünüz:

{
    "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"
}

Az Önce Tamamladığınız

✓ Takım elbisenizin rengini seçtiyseniz
✓ Kaşifinizin görünümünü tanımladıysanız
✓ Yapılandırma, resim oluşturmaya hazırsa

Sıradaki adım: Asıl etkinlik: Görüntü oluşturma kodunu yazma

Avatar oluşturma aracını geliştirme

Süre: 4 dakika

Bu, temel eğitim modülüdür. Gemini'ın çok turlu görüntü oluşturma özelliklerini (Nano Banana) kullanarak benzersiz kaşif avatarınızı oluşturacak Python kodu yazacaksınız.

Generator File'ı açın

Avatar oluşturucuyu Cloud Shell Düzenleyici'de açın:

cloudshell edit generator.py

Alternatif olarak Cloud Shell'de Open Editor'ı (Düzenleyiciyi Aç) tıklayın ve level_0 klasöründe generator.py'ye gidin.

Dosya Yapısını Anlama

Dosyada başlangıç kodu ve uygulamanızı ekleyeceğiniz üç yer tutucu bölüm bulunur:

"""
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 bölümünü uygulamanızla değiştireceksiniz.

1. adım: Sohbet oturumunu oluşturun

MODULE_5_STEP_1_CREATE_CHAT_SESSION yer tutucusunu bulun ve chat = None # Replace this line satırını aşağıdakilerle değiştirin:

    # 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"]
        )
    )

2. adım: Portreyi oluşturun

MODULE_5_STEP_2_GENERATE_PORTRAIT öğesini bulun ve portrait_image = None # Replace this section öğesini aşağıdaki kodla değiştirin:

    # 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!")

3. adım: Harita simgesini oluşturun

MODULE_5_STEP_3_GENERATE_ICON öğesini bulup icon_image = None # Replace this section ile değiştirin:

    # 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!")

Tamamlanmış Kodunuz

Üç bölümü de ekledikten sonra generate_explorer_avatar() işleviniz şu şekilde görünmelidir:

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"
    }

Dosyanızı Kaydetme

Şunları kaydettiğinizden emin olun generator.py:

  • Cloud Shell Düzenleyici: Ctrl+S (Windows/Linux) veya Cmd+S (Mac)
  • vim: Escape tuşuna basın, ardından :wq ve Enter tuşlarına basın.

Az Önce Oluşturduğunuz

✓ Çok turlu görüntü üretme için sohbet oturumu oluşturma
✓ Stil kısıtlamalarıyla portre üretme için ayrıntılı istem oluşturma
✓ Sohbet bağlamını kullanarak tutarlı bir harita simgesi üretme
✓ Gemini yanıtlarındaki görüntü verilerini ayrıştırmayı öğrenme

Ustalaşılan Temel Kavramlar:

Kavram Öğrendikleriniz
Sohbet Oturumları client.chats.create() Birden fazla dönüşte bağlamı korur.
Yanıt Modları ["TEXT", "IMAGE"] yanıtlar için görüntü üretmeyi etkinleştirir
İstem Yapısı Konu → Değişkenler → Stil → Teknik Kısıtlamalar
Karakter Tutarlılığı (Character Consistency) Aynı sohbet oturumu = resimlerde aynı karakter
Yanıt ayrıştırma Yanıt bölümlerinde inline_data içindeki resimleri ayıklama

Sonraki: Kodunuzu çalıştırın ve kendinizi haritada görün.

Oluşturma ve Kaydetme

Süre: 2 dakika

Proje kimliğinizi ayarlama

Proje kimliğinizin ortam değişkeni olarak kullanılabilir olduğundan emin olun:

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

Kimlik Oluşturucu'yu çalıştırma

Şimdi oluşturma, yükleme ve kaydı düzenleyen ana komut dosyasını çalıştırın:

python create_identity.py

Oluşturma işleminin ilerleme durumunu anlık olarak görürsünüz:

🚀 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!   
                                                               
╚═══════════════════════════════════════════════════════════════╝

Oluşturulan Avatarınızı Görüntüleme

Üretilen resimlerinizi yerel olarak inceleyin:

# List the generated files
ls -la outputs/

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

Alternatif olarak, outputs/ klasörüne gidip resim dosyalarını tıklayarak bunları doğrudan Cloud Shell Düzenleyici'de görüntüleyebilirsiniz.

Oluşturulan portre ve simge aşağıdaki resimlere benzer:

örnek dikey resim örnek simge

Haritada kendinizi görün

Çıkışınızda gösterilen dünya haritası URL'sini açın:

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

Örneğin: https://waybackhome.dev/e/devfest-nyc-26

Avatarınızı haritada bulma Şunları görürsünüz:

  • Gezegen yüzeyindeki konumunuzu işaretleyen simge
  • Simgenizin altındaki etiket olarak kaşif adınız
  • İşaretçinizin etrafında yavaşça yanıp sönen soluk bir işaret

Haritada örnek avatar

Ayrıntı kartında tam portrenizi görmek için işaretçinizi tıklayın.

Avatarınızdan Memnun Değil misiniz? Yeniden üret!

Farklı bir avatar istiyorsanız avatarı yeniden oluşturabilirsiniz:

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

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

create_identity.py komutunu her çalıştırdığınızda tamamen yeni bir avatar oluşturulur (yeni sohbet oturumu = yeni karakter) ve kaydınız güncellenir. Sonuçtan memnun kalana kadar yineleme yapabilirsiniz.

Sorun giderme

Az Önce Tamamladığınız

✓ Benzersiz kaşif portrenizi oluşturduysanız
✓ Tutarlı bir harita simgesi oluşturduysanız
✓ Öğeleri Görev Kontrolü'ne yüklediyseniz
✓ Kimliğinizi kurtarma ağına kaydettiyseniz
✓ Canlı dünya haritasında görünüyorsanız

Tebrikler, kaşif! Artık kurtarma ağında yer alıyorsunuz. Feneriniz etkin (ancak sönük) ve diğer kurtulanlar sizi haritada görebilir.

Sonuç

Süre: 1 dakika

Oluşturduklarınız

Çok turlu yapay zeka görüntü üretme özelliğini kullanarak yalnızca 10 dakikada eksiksiz bir avatar oluşturma sistemi oluşturdunuz:

┌─────────────────────────────────────────────────────────────┐
                     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                  
                                                              
└─────────────────────────────────────────────────────────────┘

Temel çıkarımlar

Ders Neden önemli?
Chat oturumlarında bağlam korunur Varyasyon kayması olmadan birden fazla resimde tutarlı karakterler oluşturmak için gereklidir.
İstem yapısı önemlidir Net kısıtlamalar (beyaz arka plan, belirli stil, çerçeveleme) öngörülebilir ve üretime hazır sonuçlar verir.
Çok adımlı görüşmeler, bağımsız görüşmelerden daha iyi sonuç verir Sohbetteki her mesaj, önceki bağlam üzerine kurulur. Bu sayede yinelemeli iyileştirme ve tutarlılık sağlanır.
Yanıt biçimleri çıkışı kontrol eder Resim üretimi için ["TEXT", "IMAGE"] ayarı gereklidir. Bu ayar olmadan yalnızca metin alırsınız.

Maliyet özeti

Bu seviyede, Gemini 2.5 Flash (Nano Banana) kullanarak 2 resim oluşturdunuz:

Öğe Token'lar Maliyet
Dikey (1024×1024) ~1.290 çıkış jetonu ~0,039 ABD doları
Simge (1024×1024) ~1.290 çıkış jetonu ~0,039 ABD doları
Toplam ~2.580 jeton ~$0.08

Yolculuk Devam Ediyor

Kaşif kimliğiniz onaylandı ancak konumunuz onaylanmadı.

Dünya haritasına bakın. İşaretiniz soluk ve yavaşça yanıp sönüyor. Kurtarma ağı varlığınızdan haberdardır ancak tam olarak nerede olduğunuzu bilmez. Gezegenin yüzeyindeki geniş bir bölgenin herhangi bir yerinde olabilirsiniz.

1. Seviye: Konumunuzu Belirleyin bölümünde:

  • Google'ın Agent Development Kit'ini (ADK) kullanarak çoklu aracı sistemi oluşturma
  • Jeolojik, botanik ve astronomik analiz için MCP sunucuları oluşturma
  • Çok formatlı girişi (kaza yerinizden alınan resimler) işleme
  • Yapay zekayı kullanarak onaylanmış konumunuzun topografik haritasını oluşturma
  • Kurtarma ekiplerinin sizi bulabilmesi için gerçekten sinyal verin.

1. Seviyede çok daha gelişmiş kavramlar (ör. çoklu aracı düzenleme, Model Context Protocol (MCP) ve üretime dağıtım kalıpları) tanıtılır. Tek bir model özelliği kullanmaktan eksiksiz bir aracı sistemi oluşturmaya geçiş yapacaksınız.

Temizleme (isteğe bağlı)

Yerel dosyaları temizlemek istiyorsanız (level_0 dizininden çalıştırın):

rm -rf outputs/
rm ../config.json
deactivate  # Exit virtual environment

Kurtarma ağına kaydınız devam eder. Yerel dosyaları sildikten sonra bile haritada görünmeye devam edersiniz. Görüntüler yerel olarak değil, bulutta depolanır.

Kaynaklar


İşaretçinizin onaylanması bekleniyor. 1. seviyede görüşmek üzere, kaşif. 🚀

Bonus: Fotoğrafa Dayalı Avatar (İsteğe Bağlı)

Süre: 3 dakika

Fotoğraftan Avatar Oluşturma özelliğini ne zaman kullanmalısınız?

Aşağıdaki durumlarda bu yaklaşımı tercih edebilirsiniz:

  • Avatarınızın size benzemesini istiyorsanız
  • Stilize etmek istediğiniz belirli bir fotoğrafınız varsa
  • Gemini'ın görüntüden görüntüye dönüştürme özelliklerini keşfetmek istiyorsanız

Nasıl Çalışır?

Tamamen metin açıklamasından bir karakter oluşturmak yerine fotoğraf sağlayıp Gemini'dan kişinin benzerliğini koruyarak fotoğrafı dönüştürmesini isteyin:

fotoğraftan avatar oluşturma akışı

Fotoğrafınızı Yükleme

Öncelikle Cloud Shell'e bir fotoğraf yükleyin:

  1. Cloud Shell'de, terminal araç çubuğundaki üç nokta menüsünü (⋮) tıklayın.
  2. Yükle'yi seçin.
  3. Net bir vesikalık fotoğraf seçin (JPEG veya PNG)
  4. Yüklenen yolu not edin (ör. /home/your-username/my_photo.jpg)

Jeneratörü değiştirme

Fotoğraf kullanmak için generator.py bölümünde portre oluşturma adımını değiştirirsiniz. Yalnızca metin içeren istemi, fotoğrafınızı da içeren çok formatlı bir istemle değiştirin:

    # 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...

Çok turlu tutarlılık hâlâ çalışıyor

Çok turlu yaklaşım, fotoğrafa dayalı üretimde de aynı şekilde çalışır:

  • 1. dönüşüm: Fotoğraf + istem → Stilize edilmiş portre (benzerliğiniz, resim olarak)
  • 2. adım: "Bu karakterin AYNI simgesini oluştur" → Tutarlı simge

Sohbet oturumu, oluşturduğu stilize edilmiş sürümü (orijinal fotoğrafı değil) hatırladığından simge, dönüştürülmüş portreyle mükemmel şekilde eşleşir.

Gizlilikle İlgili Hususlar

Vertex AI Studio'da Deneyin

Ayrıca, kod yazmadan önce Google Cloud Console'da fotoğraf dönüştürme ile etkileşimli olarak denemeler yapabilirsiniz:

  1. Vertex AI Studio'ya gidin.
  2. Görüntü özelliklerine sahip bir Gemini modeli seçin
  3. Ekleme düğmesini kullanarak fotoğrafınızı yükleyin
  4. Dönüşüm istemini girin
  5. Sonuçtan memnun kalana kadar stili yineleyin.
  6. Sonucu indirip outputs/portrait.png olarak kaydedin.
  7. Çalıştır: python create_identity.py --skip-generation (bu işaret destekleniyorsa) manuel olarak oluşturulan resimleri yüklemek için

Bu etkileşimli yaklaşım, kodlamaya başlamadan önce istemlerle denemeler yapmak ve sonuçları anında görmek için idealdir.

Öğrendikleriniz (Bonus)

✓ Gemini ile görüntüden görüntüye dönüştürme nasıl kullanılır?
✓ Tek bir mesajda çok formatlı içerik (metin + resim) gönderme
✓ Sanatsal stil aktarımı uygularken benzerliği koruma
✓ Fotoğrafa dayalı yapay zeka üretimiyle ilgili gizlilik hususları