Signal de détresse
Durée : 1 minute

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.

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.
![]()
Cliquez sur Activer Cloud Shell en haut de la console Google Cloud (icÎne de terminal dans la barre de navigation en haut à droite).

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

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éder au niveau 0
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
:wqet 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 :
![]()
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
![]()
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
- Documentation sur la génération d'images Gemini
- Guide du prompt engineering pour les images
- Blog d'annonce de Nano Banana
- DépÎt Way Back Home
- Niveau 1 : Localisez-vous
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 :
![]()
Importer votre photo
Tout d'abord, importez une photo dans Cloud Shell :
- Dans Cloud Shell, cliquez sur le menu Ă trois points (âź) dans la barre d'outils du terminal.
- Sélectionnez Importer.
- Choisissez un portrait photo net (au format JPEG ou PNG).
- 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 :
- Accédez à Vertex AI Studio.
- Sélectionner un modÚle Gemini avec des fonctionnalités d'image
- Importez votre photo Ă l'aide du bouton de piĂšce jointe.
- Saisissez le prompt de transformation
- Affinez le style jusqu'à obtenir le résultat souhaité.
- Téléchargez le résultat et enregistrez-le au format
outputs/portrait.png. - 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
