Way Back Home - Level 0: Identify Yourself


Signal de détresse

Durée : 1 minute

En-tĂȘte

Votre capsule de sauvetage traverse l'atmosphÚre d'un monde inconnu. Des voyants d'avertissement clignotent sur chaque panneau. Le systÚme de navigation est hors service. Les communications sont interrompues. Alors que les protocoles d'urgence de la capsule se mettent en place, l'assistant IA se réveille :

"Survivant détecté. L'atterrissage d'urgence a réussi. Lancement du protocole de balise de détresse
"

"AVERTISSEMENT : La validation de l'identité est requise. Le réseau de sauvetage galactique ne peut pas localiser les explorateurs non enregistrés. Veuillez valider votre identité pour activer votre balise."

Vous regardez par le viewport. Un paysage extraterrestre s'étend à l'horizon : d'étranges formations rocheuses, une végétation inconnue, un ciel aux couleurs étranges. D'autres survivants de votre mission sont dispersés à la surface de cette planÚte.

Mais tout d'abord, vous devez exister dans le systĂšme.

Objectifs de l'atelier

Dans ce niveau, vous allez crĂ©er votre propre identitĂ© d'explorateur spatial Ă  l'aide de la gĂ©nĂ©ration d'images en plusieurs Ă©tapes avec les modĂšles de gĂ©nĂ©ration d'images Gemini de Google (Ă©galement appelĂ©s Nano Banana 🍌). Votre avatar apparaĂźtra sur la carte mondiale des opĂ©rations de sauvetage, visible par tous les autres survivants lors de votre atelier.

architecture

Ce que vous allez apprendre

Concept Description
Génération d'images multitour Maintenir la cohérence des personnages sur plusieurs générations d'images à l'aide de sessions de chat
Prompt engineering pour les images RĂ©diger des requĂȘtes efficaces pour obtenir des rĂ©sultats stylisĂ©s et cohĂ©rents avec des contraintes spĂ©cifiques
API Gemini Image (Nano Banana) Utiliser les fonctionnalités de génération d'images natives de Gemini via le SDK Python
Sessions de chat Exploiter le contexte de la conversation pour affiner de maniÚre itérative et assurer la cohérence des personnages

À la fin de ce niveau, vous aurez :

✅ Vous avez gĂ©nĂ©rĂ© un portrait de votre explorateur Ă  l'aide de l'IA de conversion de texte en image.
✅ Vous avez créé une icĂŽne de carte cohĂ©rente Ă  l'aide d'une conversation multitours.
✅ Vous avez enregistrĂ© votre identitĂ© auprĂšs du rĂ©seau de secours.
✅ Vous ĂȘtes apparu sur la carte du monde en direct aux cĂŽtĂ©s d'autres explorateurs.

Ajoutons-vous à la carte ! 📍

Préparer votre environnement

Durée : 2 min

Accéder à Cloud Shell

Nous allons commencer par ouvrir Cloud Shell, un terminal basé sur navigateur avec le SDK Google Cloud et d'autres outils essentiels préinstallés.

Vous avez besoin de crédits Google Cloud ?

‱ Si vous participez à un atelier avec formateur : votre formateur vous fournira un code promotionnel. Veuillez utiliser celui qu'ils vous fournissent.
‱ Si vous suivez cet atelier de programmation par vous-mĂȘme : vous pouvez bĂ©nĂ©ficier d'un crĂ©dit Google Cloud sans frais pour couvrir les frais de l'atelier. Cliquez sur ce lien pour obtenir un avoir et suivez la procĂ©dure dĂ©crite dans le guide vidĂ©o ci-dessous pour l'appliquer Ă  votre compte.
Regarder la vidéo

Cliquez sur Activer Cloud Shell en haut de la console Google Cloud (icÎne de terminal dans la barre de navigation en haut à droite).

Cloud Shell

Trouvez votre ID de projet Google Cloud :

  • Ouvrez la console Google Cloud : https://console.cloud.google.com.
  • SĂ©lectionnez le projet que vous souhaitez utiliser pour cet atelier dans le menu dĂ©roulant en haut de la page.
  • L'ID de votre projet est affichĂ© dans la fiche "Informations sur le projet" du tableau de bord
    project id

Une fois Cloud Shell ouvert, vĂ©rifiez que vous ĂȘtes authentifié :

# Check that you are logged in
gcloud auth list

Votre compte devrait ĂȘtre listĂ© comme (ACTIVE).

Configurer votre projet

Vérifiez que votre projet est correctement défini :

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

Si aucun projet n'est défini ou si vous devez le modifier :

gcloud config set project YOUR_PROJECT_ID

Activer les API requises

Activez l'API Vertex AI pour la génération d'images :

gcloud services enable aiplatform.googleapis.com

Cloner le dépÎt

Clonez le dépÎt Way Back Home et accédez au projet :

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

Installer des dépendances

Accédez au niveau 0 et installez les packages Python requis :

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

Voici les principales dépendances :

Package Objectif
google-genai Client de l'API Gemini pour la génération d'images
requests Client HTTP pour les appels d'API à Mission Control
Pillow Traitement des images et gestion des fichiers

Vérifier la configuration

Effectuez une validation rapide pour vous assurer que tout est correctement configuré :

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

Vous devriez obtenir le résultat suivant :

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

Ce que vous venez de faire

✅ Vous avez ouvert Cloud Shell
✅ Vous avez configurĂ© votre projet Google Cloud
✅ Vous avez activĂ© les API Vertex AI
✅ Vous avez clonĂ© le dĂ©pĂŽt de l'atelier de programmation
✅ Vous avez installĂ© les dĂ©pendances Python
✅ Vous avez vĂ©rifiĂ© votre configuration

Étape suivante : Connectez-vous à Mission Control et revendiquez votre nom d'explorateur.

Se connecter à Mission Control

Durée : 2 min

Exécuter le script d'installation

Le script de configuration vous connecte au réseau de secours Way Back Home et réserve votre identité d'explorateur. Exécutez-le à partir de la racine du projet :

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

Vous serez invité à fournir deux informations.

Saisissez votre code d'événement

Le code d'événement identifie l'événement de l'atelier auquel vous participez.

Si vous participez à un atelier : saisissez le code de l'événement à partir du code QR, de la diapositive ou de votre instructeur.

🚀 Welcome to Way Back Home!

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

Si vous apprenez seul : saisissez sandbox pour rejoindre l'environnement d'apprentissage public.

🚀 Welcome to Way Back Home!

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

Choisir votre nom d'explorateur

Choisissez un nom unique pour votre explorateur. Voici comment vous apparaĂźtrez sur la carte du monde et dans le classement.

Choose your explorer name: AstroAyo
✓ Username available!

Si le nom que vous avez choisi est dĂ©jĂ  utilisĂ© par un autre participant au mĂȘme Ă©vĂ©nement :

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

Configuration terminée

Une fois l'opération terminée, un message de confirmation s'affiche :

Initializing your explorer profile...

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

Next: cd level_0 && python customize.py

Accédez maintenant au répertoire de niveau 0 (vos dépendances sont déjà installées depuis le module 2) :

cd level_0

Examiner votre configuration

Examinez ce qui a été enregistré (config.json se trouve à la racine du projet) :

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

Ce fichier de configuration sera utilisé par les scripts suivants pour vous identifier auprÚs du réseau Rescue.

Ce que vous venez de faire

✓ ConnectĂ© Ă  l'API Mission Control
✓ Nom d'explorateur unique rĂ©servĂ©
✓ ID de participant et coordonnĂ©es de dĂ©part reçus
✓ Configuration enregistrĂ©e pour les Ă©tapes suivantes

Suivant : Personnalisez l'apparence de l'explorateur.

Personnaliser l'explorateur

Durée : 1 minute

Exécuter le script de personnalisation

Avant de générer votre avatar, vous devez faire quelques choix concernant l'apparence de votre explorateur :

python customize.py

Sélectionner la couleur de votre costume

Choisissez une couleur pour la combinaison spatiale de votre explorateur :

🎹 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

Décrivez votre explorateur (facultatif)

Vous pouvez fournir une brÚve description de l'apparence de votre explorateur ou appuyer sur Entrée pour une attribution aléatoire :

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

✓ Preferences saved!

Si vous appuyez sur Entrée sans rien saisir, des traits aléatoires seront générés :

> 
✓ Random traits: confident expression, short styled hair

Configuration mise Ă  jour

Vos préférences sont désormais enregistrées :

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

Vérifiez la configuration mise à jour :

cat ../config.json

Vos préférences s'affichent :

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

Ce que vous venez de faire

✓ Vous avez sĂ©lectionnĂ© la couleur de votre combinaison
✓ Vous avez dĂ©fini l'apparence de votre explorateur
✓ Configuration prĂȘte pour la gĂ©nĂ©ration d'images

Suivant : l'événement principal : écrire le code de génération d'images !

Créer le générateur d'avatars

Durée : 4 min

Il s'agit du module d'apprentissage principal. Vous allez écrire du code Python qui génÚre votre propre avatar d'explorateur à l'aide des fonctionnalités de génération d'images en plusieurs tours de Gemini (Nano Banana).

Ouvrir le fichier du générateur

Ouvrez le générateur d'avatars dans l'éditeur Cloud Shell :

cloudshell edit generator.py

Vous pouvez également cliquer sur Ouvrir l'éditeur dans Cloud Shell et accéder à generator.py dans le dossier level_0.

Comprendre la structure des fichiers

Le fichier contient un code de démarrage et trois sections d'espace réservé dans lesquelles vous ajouterez votre implémentation :

"""
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']}")

Vous remplacerez les trois sections TODO par votre implémentation.

Étape 1 : CrĂ©ez la session de chat

Recherchez l'espace réservé MODULE_5_STEP_1_CREATE_CHAT_SESSION et remplacez la ligne chat = None # Replace this line par :

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

Étape 2 : GĂ©nĂ©rer le portrait

Recherchez MODULE_5_STEP_2_GENERATE_PORTRAIT et remplacez portrait_image = None # Replace this section par le code suivant :

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

Étape 3 : GĂ©nĂ©rer l'icĂŽne de carte

Recherchez MODULE_5_STEP_3_GENERATE_ICON et remplacez icon_image = None # Replace this section par :

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

Votre code terminé

Une fois les trois sections ajoutées, votre fonction generate_explorer_avatar() devrait se présenter comme suit :

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

Enregistrer votre fichier

Veillez à enregistrer generator.py :

  • Éditeur Cloud Shell : Ctrl+S (Windows/Linux) ou Cmd+S (Mac)
  • vim : appuyez sur Échap, puis saisissez :wq et appuyez sur EntrĂ©e.

Ce que vous venez de créer

✓ CrĂ©ation d'une session de chat pour la gĂ©nĂ©ration d'images en plusieurs Ă©tapes
✓ Élaboration d'une requĂȘte dĂ©taillĂ©e pour la gĂ©nĂ©ration de portraits avec des contraintes de style
✓ GĂ©nĂ©ration d'une icĂŽne de carte cohĂ©rente Ă  l'aide du contexte de la conversation
✓ Apprentissage de l'analyse des donnĂ©es d'image Ă  partir des rĂ©ponses de Gemini

Concepts clés maßtrisés :

Concept Ce que vous avez appris
Sessions de chat client.chats.create() conserve le contexte sur plusieurs tours.
Modalités de réponse ["TEXT", "IMAGE"] permet de générer des images dans les réponses.
Structure des requĂȘtes Sujet → Variables → Style → Contraintes techniques
CohĂ©rence des personnages MĂȘme session de chat = mĂȘme personnage dans les images
Analyse de la réponse Extraire des images de inline_data dans les parties de réponse

Suivant : Exécutez votre code et voyez-vous sur la carte !

Générer et enregistrer

Durée : 2 min

Définir l'ID de votre projet

Assurez-vous que l'ID de votre projet est disponible en tant que variable d'environnement :

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

Exécuter Identity Creator

Exécutez maintenant le script principal qui orchestre la génération, l'importation et l'enregistrement :

python create_identity.py

La progression de la génération s'affiche en temps réel :

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

Afficher votre avatar généré

Consultez vos images générées en local :

# List the generated files
ls -la outputs/

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

Vous pouvez également les afficher directement dans l'éditeur Cloud Shell en accédant au dossier outputs/ et en cliquant sur les fichiers image.

Le portrait et l'icÎne générés ressembleront à ces images :

exemple de portrait icĂŽne d'exemple

Visualisez votre position sur la carte !

Ouvrez l'URL de la carte du monde affichée dans le résultat :

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

Par exemple : https://waybackhome.dev/e/devfest-nyc-26

Trouvez votre avatar sur la carte ! Cette page vous indique les informations suivantes :

  • Votre icĂŽne indiquant votre position Ă  la surface de la planĂšte
  • Votre nom d'explorateur sous forme de libellĂ© sous votre icĂŽne
  • Une balise attĂ©nuĂ©e qui clignote lentement autour de votre repĂšre

Exemple d'avatar sur une carte

Cliquez sur votre repĂšre pour afficher votre portrait complet dans la fiche d'informations.

Votre avatar ne vous plaßt pas ? Regénérer !

Si vous souhaitez un autre avatar, vous pouvez le regénérer :

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

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

Chaque fois que vous exécutez create_identity.py, un avatar entiÚrement nouveau est généré (nouvelle session de chat = nouveau personnage) et votre inscription est mise à jour. N'hésitez pas à recommencer jusqu'à ce que le résultat vous convienne.

Dépannage

Ce que vous venez de faire

✓ Vous avez gĂ©nĂ©rĂ© votre portrait d'explorateur unique.
✓ Vous avez créé une icĂŽne de carte cohĂ©rente.
✓ Vous avez importĂ© des Ă©lĂ©ments dans Mission Control.
✓ Vous avez enregistrĂ© votre identitĂ© auprĂšs du rĂ©seau de sauvetage.
✓ Vous ĂȘtes apparu sur la carte du monde en direct.

Félicitations, explorateur ! Vous faites désormais partie du réseau de dépannage. Votre balise est active (mais faiblement lumineuse) et les autres survivants peuvent vous voir sur la carte.

Conclusion

Durée : 1 minute

Ce que vous avez créé

En seulement 10 minutes, vous avez créé un systÚme complet de génération d'avatars à l'aide de la génération d'images par IA multitours :

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

Points clés à retenir

Leçon Pourquoi est-ce important ?
Les sessions de chat conservent le contexte Essentiel pour générer des personnages cohérents dans plusieurs images sans dérive de variation
La structure des requĂȘtes est importante Des contraintes claires (fond blanc, style spĂ©cifique, cadrage) produisent des rĂ©sultats prĂ©visibles et prĂȘts pour la production.
Les conversations multitours sont plus efficaces que les appels indépendants Chaque message d'une discussion s'appuie sur le contexte précédent, ce qui permet un affinement itératif et une cohérence.
Les modalités de réponse contrÎlent la sortie Le paramÚtre ["TEXT", "IMAGE"] est obligatoire pour générer des images. Sans lui, vous n'obtiendrez que du texte.

Récapitulatif des coûts

Pour ce niveau, vous avez généré deux images à l'aide de Gemini 2.5 Flash (Nano Banana) :

ÉlĂ©ment Jetons CoĂ»t
Portrait (1 024 x 1 024) ~1 290 jetons de sortie ~0,039 $
IcÎne (1 024 x 1 024) ~1 290 jetons de sortie ~0,039 $
Total ~2 580 jetons ~ 0,08$

Le voyage continue

Votre identité d'explorateur a été confirmée, mais un problÚme est survenu : votre position n'a pas été confirmée.

Regardez la carte du monde : votre balise est faible et clignote lentement. Le rĂ©seau de secours sait que vous existez, mais pas exactement oĂč vous vous trouvez. Vous pouvez vous trouver n'importe oĂč dans une vaste rĂ©gion de la surface de la planĂšte.

Dans Niveau 1 : Déterminez votre position, vous allez :

  • CrĂ©er un systĂšme multi-agents Ă  l'aide d'Agent Development Kit (ADK) de Google
  • CrĂ©er des serveurs MCP pour les analyses gĂ©ologiques, botaniques et astronomiques
  • Traiter les entrĂ©es multimodales (images de votre site de l'accident)
  • GĂ©nĂ©rez une carte topographique de votre position confirmĂ©e Ă  l'aide de l'IA.
  • Allumez votre balise pour de vrai afin que les Ă©quipes de secours puissent vous trouver.

Le niveau 1 présente des concepts beaucoup plus avancés : l'orchestration multi-agents, le protocole MCP (Model Context Protocol) et les modÚles de déploiement en production. Vous passerez de l'utilisation d'une seule fonctionnalité de modÚle à la création d'un systÚme agentique complet.

Nettoyer (facultatif)

Si vous souhaitez nettoyer les fichiers locaux (exécutés à partir du répertoire level_0) :

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

Votre inscription au rĂ©seau de sauvetage est conservĂ©e. Vous apparaissez toujours sur la carte, mĂȘme aprĂšs avoir supprimĂ© les fichiers locaux. Les images sont stockĂ©es dans le cloud, et non localement.

Ressources


Votre balise est en attente de confirmation. À bientît au niveau 1, explorateur. 🚀

Bonus : Avatar basé sur une photo (facultatif)

Durée : 3 min

Quand utiliser la fonctionnalité Photo-to-Avatar ?

Vous pouvez préférer cette approche si :

  • Vous souhaitez que votre avatar vous ressemble vraiment.
  • Vous avez une photo spĂ©cifique que vous souhaitez styliser.
  • Vous souhaitez explorer les capacitĂ©s de transformation d'image Ă  image de Gemini.

Fonctionnement

Au lieu de générer un personnage à partir d'une description textuelle, vous fournissez une photo et demandez à Gemini de la transformer tout en préservant l'apparence de la personne :

Parcours photo vers avatar

Importer votre photo

Tout d'abord, importez une photo dans Cloud Shell :

  1. Dans Cloud Shell, cliquez sur le menu à trois points (⋼) dans la barre d'outils du terminal.
  2. Sélectionnez Importer.
  3. Choisissez un portrait photo net (au format JPEG ou PNG).
  4. Notez le chemin d'accÚs importé (par exemple, /home/your-username/my_photo.jpg)

Modifier le générateur

Pour utiliser une photo, vous devez modifier l'Ă©tape de gĂ©nĂ©ration de portrait dans generator.py. Remplacez la requĂȘte textuelle par une requĂȘte multimodale incluant votre photo :

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

La cohérence multitours fonctionne toujours

L'approche multitour fonctionne de la mĂȘme maniĂšre avec la gĂ©nĂ©ration basĂ©e sur des photos :

  • Tour 1 : photo + requĂȘte → portrait stylisĂ© (votre image, illustrĂ©e)
  • Tour 2 : "CrĂ©e une icĂŽne de ce MÊME personnage" → IcĂŽne cohĂ©rente

Étant donnĂ© que la session de chat se souvient de la version stylisĂ©e qu'elle a créée (et non de la photo d'origine), l'icĂŽne correspondra parfaitement au portrait transformĂ©.

Considérations liées à la confidentialité

Essayer dans Vertex AI Studio

Vous pouvez également tester la transformation de photos de maniÚre interactive dans la console Google Cloud avant d'écrire du code :

  1. Accédez à Vertex AI Studio.
  2. Sélectionner un modÚle Gemini avec des fonctionnalités d'image
  3. Importez votre photo Ă  l'aide du bouton de piĂšce jointe.
  4. Saisissez le prompt de transformation
  5. Affinez le style jusqu'à obtenir le résultat souhaité.
  6. Téléchargez le résultat et enregistrez-le au format outputs/portrait.png.
  7. Exécutez python create_identity.py --skip-generation (si cet indicateur est compatible) pour importer les images générées manuellement.

Cette approche interactive est idĂ©ale pour tester des requĂȘtes et voir les rĂ©sultats en temps rĂ©el avant de s'engager dans le code.

Ce que vous avez appris (bonus)

✓ Utiliser la transformation d'image à image avec Gemini
✓ Envoyer du contenu multimodal (texte + image) dans un seul message
✓ PrĂ©server la ressemblance tout en appliquant le transfert de style artistique
✓ ConsidĂ©rations relatives Ă  la confidentialitĂ© pour la gĂ©nĂ©ration d'IA basĂ©e sur des photos