O pedido de ajuda
Duração: 1 min

Sua cĂĄpsula de fuga atravessa a atmosfera de um mundo desconhecido. Luzes de alerta piscam em todos os painĂ©is. O sistema de navegação estĂĄ queimado. As comunicaçÔes estĂŁo inativas. Ă medida que os protocolos de emergĂȘncia do pod sĂŁo ativados, o assistente de IA ganha vida:
"Sobrevivente detectado. Pouso de emergĂȘncia bem-sucedido. Iniciando o protocolo de beacon de resgate..."
"AVISO: Ă© necessĂĄrio confirmar sua identidade. A rede de resgate galĂĄctica nĂŁo consegue localizar exploradores nĂŁo registrados. Confirme sua identidade para ativar o beacon."
VocĂȘ olha pela janela de visualização. Uma paisagem alienĂgena se estende atĂ© o horizonte: formaçÔes rochosas estranhas, vegetação desconhecida, um cĂ©u de cor esquisita. Em algum lugar, outros sobreviventes da sua missĂŁo estĂŁo espalhados pela superfĂcie do planeta.
Mas primeiro: vocĂȘ precisa existir no sistema.
O que vocĂȘ criarĂĄ
Neste nĂvel, vocĂȘ vai criar sua identidade exclusiva de explorador espacial usando a geração de imagens em vĂĄrias etapas com os modelos de geração de imagens do Gemini do Google (tambĂ©m conhecidos como Nano Banana đ). Seu avatar vai aparecer no mapa global de resgate, visĂvel para todos os outros sobreviventes no evento da oficina.

O que vocĂȘ vai aprender
| Conceito | Descrição |
|---|---|
| Geração de imagens multiturno | Como manter a consistĂȘncia dos personagens em vĂĄrias geraçÔes de imagens usando sessĂ”es de chat |
| Engenharia de comando para imagens | Criar comandos eficazes para saĂdas estilizadas e consistentes com restriçÔes especĂficas |
| API Gemini Image (Nano Banana) | Usar os recursos nativos de geração de imagens do Gemini com o SDK do Python |
| SessĂ”es de chat | Aproveitar o contexto da conversa para refinamento iterativo e consistĂȘncia de personagens |
Ao final deste nĂvel, vocĂȘ terĂĄ:
â
Gerou um retrato do seu explorador usando a IA de texto para imagem
â
Criou um Ăcone de mapa consistente usando uma conversa de vĂĄrias rodadas
â
Registrou sua identidade na rede de resgate
â
Apareceu no mapa mundial em tempo real ao lado de outros exploradores
Vamos marcar sua presença no mapa! đ
Prepare o ambiente
Duração: 2 minutos
Acessar o Cloud Shell
Primeiro, vamos abrir o Cloud Shell, que é um terminal baseado em navegador com o SDK do Google Cloud e outras ferramentas essenciais pré-instaladas.
Precisa de créditos do Google Cloud?
âą Se vocĂȘ estiver participando de um workshop com instrutor: o instrutor vai fornecer um cĂłdigo de crĂ©dito. Use o que eles fornecerem.
âą Se vocĂȘ estiver seguindo este codelab por conta prĂłpria: Ă© possĂvel resgatar um crĂ©dito sem custo financeiro do Google Cloud para cobrir os custos do workshop. Clique neste link para receber um crĂ©dito e siga as etapas no guia em vĂdeo abaixo para aplicĂĄ-lo Ă sua conta.
![]()
Clique em Ativar o Cloud Shell na parte de cima do console do Google Cloud. Ă o Ăcone de terminal na barra de navegação no canto superior direito.

Encontre o ID do projeto do Google Cloud:
- Abra o console do Google Cloud: https://console.cloud.google.com
- Selecione o projeto que vocĂȘ quer usar neste workshop no menu suspenso na parte de cima da pĂĄgina.
- O ID do projeto é exibido no card "InformaçÔes do projeto" no painel

Quando o Cloud Shell abrir, verifique se vocĂȘ estĂĄ autenticado:
# Check that you are logged in
gcloud auth list
Sua conta vai aparecer como (ACTIVE).
Configurar seu projeto
Verifique se o projeto estĂĄ configurado corretamente:
export PROJECT_ID=$(gcloud config get-value project)
echo "Using project: $PROJECT_ID"
Se nenhum projeto estiver definido ou se vocĂȘ precisar mudar:
gcloud config set project YOUR_PROJECT_ID
Ativar APIs obrigatĂłrias
Ative a API Vertex AI para geração de imagens:
gcloud services enable aiplatform.googleapis.com
Clone o repositĂłrio
Clone o repositório Way Back Home e navegue até o projeto:
git clone https://github.com/ayoisio/way-back-home.git
cd way-back-home
Instalar dependĂȘncias
Navegue atĂ© o nĂvel 0 e instale os pacotes Python necessĂĄrios:
cd level_0
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
As principais dependĂȘncias sĂŁo:
| Pacote | Finalidade |
|---|---|
google-genai |
Cliente da API Gemini para geração de imagens |
requests |
Cliente HTTP para chamadas de API ao Mission Control. |
Pillow |
Processamento de imagens e gerenciamento de arquivos |
Verificar configuração
Faça uma verificação råpida para garantir que tudo esteja configurado corretamente:
cd ~/way-back-home
python scripts/verify_setup.py
VocĂȘ verĂĄ:
â Google Cloud project configured: your-project-id
â Vertex AI API enabled
â Dependencies installed
â Ready to proceed!
O que vocĂȘ acabou de concluir
â
Abriu o Cloud Shell
â
Configurou seu projeto do Google Cloud
â
Ativou as APIs da Vertex AI
â
Clonou o repositĂłrio do codelab
â
Instalou as dependĂȘncias do Python
â
Verificou sua configuração
PrĂłxima etapa:conecte-se Ă Central de MissĂŁo e reivindique seu nome de explorador.
Conectar-se Ă Central de controle
Duração: 2 minutos
Executar o script de configuração
O script de configuração conecta vocĂȘ Ă rede de resgate Way Back Home e reserva sua identidade de explorador. Execute na raiz do projeto:
cd ~/way-back-home
chmod +x scripts/setup.sh
./scripts/setup.sh
VocĂȘ precisarĂĄ informar duas coisas.
Insira o cĂłdigo do evento
O cĂłdigo do evento identifica o evento do workshop de que vocĂȘ estĂĄ participando.
Se vocĂȘ estiver em um workshop:digite o cĂłdigo do evento que estĂĄ no QR code, no slide ou que foi informado pelo instrutor.
đ Welcome to Way Back Home!
Enter event code (from QR/slide): devfest-nyc-26
Validating event...
â Connected to: DevFest NYC 2026
Se vocĂȘ estiver aprendendo por conta prĂłpria:digite sandbox para entrar no ambiente de aprendizado pĂșblico.
đ Welcome to Way Back Home!
Enter event code (from QR/slide): sandbox
Validating event...
â Connected to: Way Back Home Sandbox
Escolha o nome do seu Explorer
Escolha um nome exclusivo para o explorador. Ă assim que vocĂȘ vai aparecer no mapa-mĂșndi e no ranking.
Choose your explorer name: AstroAyo
â Username available!
Se o nome escolhido jĂĄ estiver sendo usado por outro participante no mesmo evento:
Choose your explorer name: SpaceExplorer
â ïž That name is taken. Try another.
Choose your explorer name: SpaceExplorer42
â Username available!
Configuração concluĂda
Quando a ação for concluĂda, vocĂȘ vai receber uma confirmação:
Initializing your explorer profile...
â Environment configured!
Explorer ID: a1b2c3d4
Starting coordinates: (47, 23)
Next: cd level_0 && python customize.py
Navegar atĂ© o nĂvel 0
Agora, navegue atĂ© o diretĂłrio de nĂvel 0. As dependĂȘncias jĂĄ estĂŁo instaladas do mĂłdulo 2:
cd level_0
Examinar sua configuração
Confira o que foi salvo (config.json estĂĄ na raiz do projeto):
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"
}
Esse arquivo de configuração serĂĄ usado por scripts subsequentes para identificar vocĂȘ na rede de resgate.
O que vocĂȘ acabou de concluir
â Conectado Ă API Mission Control
â Reservou seu nome de explorador exclusivo
â Recebeu seu ID de participante e coordenadas iniciais
â Configuração salva para as prĂłximas etapas
PrĂłxima etapa:personalize a aparĂȘncia do seu explorador.
Personalizar o User Explorer
Duração: 1 min
Executar o script de personalização
Antes de gerar seu avatar, vocĂȘ vai fazer algumas escolhas sobre a aparĂȘncia do seu explorador:
python customize.py
Selecione a cor do terno
Escolha uma cor para o traje espacial do explorador:
đš 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
Descreva seu Explorer (opcional)
VocĂȘ pode fornecer uma breve descrição da aparĂȘncia do explorador ou pressionar "Enter" para uma atribuição aleatĂłria:
Brief description of your explorer (or Enter for random):
Example: 'short dark hair, glasses, friendly smile'
> short dark hair, glasses, determined expression
â Preferences saved!
Se vocĂȘ pressionar "Enter" sem digitar nada, vai receber caracterĂsticas aleatĂłrias:
>
â Random traits: confident expression, short styled hair
Configuração atualizada
Suas preferĂȘncias foram salvas:
â Preferences saved!
Next: Open generator.py and follow the codelab instructions
Then run: python create_identity.py
Verifique a configuração atualizada:
cat ../config.json
Suas preferĂȘncias vĂŁo aparecer adicionadas:
{
"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"
}
O que vocĂȘ acabou de concluir
â Selecionou a cor do traje
â Definiu a aparĂȘncia do explorador
â Configuração pronta para geração de imagens
Próxima etapa:o evento principal, ou seja, escrever o código de geração de imagens.
Criar o gerador de avatares
Duração: 4 minutos
Este Ă© o mĂłdulo principal de aprendizado. VocĂȘ vai escrever um cĂłdigo em Python que gera seu avatar de explorador exclusivo usando os recursos de geração de imagens em vĂĄrias etapas do Gemini (Nano Banana).
Abra o arquivo do gerador
Abra o gerador de avatares no editor do Cloud Shell:
cloudshell edit generator.py
Ou clique em Abrir editor no Cloud Shell e navegue até generator.py na pasta level_0.
Como entender a estrutura de arquivos
O arquivo tem um cĂłdigo inicial e trĂȘs seçÔes de marcador de posição em que vocĂȘ vai adicionar sua implementação:
"""
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']}")
Substitua as trĂȘs seçÔes TODO pela sua implementação.
Etapa 1: criar a sessĂŁo de chat
Encontre o marcador de posição MODULE_5_STEP_1_CREATE_CHAT_SESSION e substitua a linha chat = None # Replace this line por:
# 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"]
)
)
Etapa 2: gerar o retrato
Encontre MODULE_5_STEP_2_GENERATE_PORTRAIT e substitua portrait_image = None # Replace this section pelo cĂłdigo a seguir:
# 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!")
Etapa 3: gerar o Ăcone do mapa
Encontre MODULE_5_STEP_3_GENERATE_ICON e substitua icon_image = None # Replace this section por:
# 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!")
Seu cĂłdigo concluĂdo
Depois de adicionar todas as trĂȘs seçÔes, a função generate_explorer_avatar() vai ficar assim:
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"
}
Salvar o arquivo
Não se esqueça de salvar generator.py:
- Editor do Cloud Shell:Ctrl+S (Windows/Linux) ou Cmd+S (Mac)
- vim:pressione Escape, digite
:wqe pressione Enter.
O que vocĂȘ acabou de criar
â Criou uma sessĂŁo de chat para geração de imagens em vĂĄrios turnos
â Elaborou um comando detalhado para geração de retratos com restriçÔes de estilo
â Gerou um Ăcone de mapa consistente usando o contexto da conversa
â Aprendeu a analisar dados de imagem das respostas do Gemini
Principais conceitos aprendidos:
| Conceito | O que vocĂȘ aprendeu |
|---|---|
| SessÔes de chat | O client.chats.create() mantém o contexto em vårios turnos |
| Modalidades de resposta | O ["TEXT", "IMAGE"] permite a geração de imagens nas respostas |
| Estrutura do comando | Assunto â VariĂĄveis â Estilo â RestriçÔes tĂ©cnicas |
| ConsistĂȘncia de personagens | Mesma sessĂŁo de chat = mesmo personagem em todas as imagens |
| AnĂĄlise da resposta | Extrair imagens de inline_data em partes da resposta |
Próxima etapa:execute o código e veja sua localização no mapa.
Gerar e registrar
Duração: 2 minutos
Definir o ID do projeto
Verifique se o ID do projeto estĂĄ disponĂvel como uma variĂĄvel de ambiente:
export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project)
Executar o criador de identidades
Agora execute o script principal que orquestra a geração, o upload e o registro:
python create_identity.py
VocĂȘ vai acompanhar o progresso da geração em tempo real:
đ 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! â
â â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
Ver seu avatar gerado
Confira as imagens geradas localmente:
# List the generated files
ls -la outputs/
# Download to view on your local machine
cloudshell download outputs/portrait.png
cloudshell download outputs/icon.png
Ou navegue até a pasta outputs/ e clique nos arquivos de imagem para visualizå-los diretamente no editor do Cloud Shell.
O retrato e o Ăcone gerados vĂŁo ficar parecidos com estas imagens:
![]()
Apareça no mapa!
Abra o URL do mapa-mĂșndi mostrado na sua saĂda:
https://waybackhome.dev/e/{your-event-code}
Por exemplo: https://waybackhome.dev/e/devfest-nyc-26
Encontre seu avatar no mapa! VocĂȘ vai ver:
- Seu Ăcone marcando sua posição na superfĂcie do planeta
- Seu nome de explorador como um rĂłtulo abaixo do Ăcone
- Um farol esmaecido pulsando lentamente ao redor do seu marcador
![]()
Clique no marcador para ver o retrato completo no card de detalhes.
NĂŁo gostou do seu avatar? Gerar novamente!
Se quiser outro avatar, gere novamente:
# Option 1: Change your appearance settings first
python customize.py
# Option 2: Just regenerate with current settings
python create_identity.py
Cada vez que vocĂȘ executa create_identity.py, ele gera um avatar totalmente novo (nova sessĂŁo de chat = novo personagem) e atualiza seu registro. VocĂȘ pode repetir o processo atĂ© ficar satisfeito com o resultado.
Solução de problemas
O que vocĂȘ acabou de concluir
â Gerou seu retrato exclusivo de explorador
â Criou um Ăcone de mapa consistente
â Enviou recursos para a Sala de Comando
â Registrou sua identidade na rede de resgate
â Apareceu no mapa mundial em tempo real!
ParabĂ©ns, explorador! Agora vocĂȘ faz parte da rede de resgate. Seu farol estĂĄ ativo (embora fraco), e outros sobreviventes podem ver vocĂȘ no mapa.
ConclusĂŁo
Duração: 1 min
O que vocĂȘ criou
Em apenas 10 minutos, vocĂȘ criou um sistema completo de geração de avatares usando a geração de imagens com IA em vĂĄrias etapas:
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â 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 â
â â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
Pontos-chave
| Aula | Por que isso Ă© importante |
|---|---|
| As sessĂ”es de chat mantĂȘm o contexto | Essencial para gerar personagens consistentes em vĂĄrias imagens sem variação |
| A estrutura do comando Ă© importante | RestriçÔes claras (fundo branco, estilo especĂfico, enquadramento) produzem resultados previsĂveis e prontos para produção |
| O multiturno supera as chamadas independentes | Cada mensagem em um chat se baseia no contexto anterior, permitindo refinamento e consistĂȘncia iterativos. |
| As modalidades de resposta controlam a saĂda | A definição de ["TEXT", "IMAGE"] Ă© obrigatĂłria para a geração de imagens. Sem ela, vocĂȘ sĂł recebe texto. |
Resumo de custos
Neste nĂvel, vocĂȘ gerou duas imagens usando o Gemini 2.5 Flash (Nano Banana):
| Item | Tokens | Custo |
|---|---|---|
| Retrato (1024Ă1024) | ~1.290 tokens de saĂda | ~US$0,039 |
| Ăcone (1024 Ă 1024) | ~1.290 tokens de saĂda | ~US$0,039 |
| Total | ~2.580 tokens | ~$0,08 |
A jornada continua
Sua identidade de explorador foi confirmada, mas hĂĄ um problema: seu local nĂŁo foi confirmado.
Olhe para o mapa-mĂșndi: seu farol estĂĄ fraco, pulsando lentamente. A rede de resgate sabe que vocĂȘ existe, mas nĂŁo sabe exatamente onde vocĂȘ estĂĄ. VocĂȘ pode estar em qualquer lugar em uma vasta regiĂŁo da superfĂcie do planeta.
Em NĂvel 1: identificar sua localização, vocĂȘ vai:
- Criar um sistema multiagente usando o Kit de Desenvolvimento de Agente (ADK) do Google
- Criar servidores MCP para anĂĄlises geolĂłgicas, botĂąnicas e astronĂŽmicas
- Processar entrada multimodal (imagens do local do acidente)
- Gerar um mapa topogrĂĄfico do seu local confirmado usando a IA
- Acenda o farol de verdade para que as equipes de resgate possam encontrar vocĂȘ.
O nĂvel 1 apresenta conceitos muito mais avançados: orquestração multiagente, o protocolo de contexto de modelo (MCP) e padrĂ”es de implantação de produção. VocĂȘ vai passar de usar um Ășnico recurso de modelo para criar um sistema de agente completo.
Limpeza (opcional)
Se vocĂȘ quiser limpar os arquivos locais (execute no diretĂłrio level_0):
rm -rf outputs/
rm ../config.json
deactivate # Exit virtual environment
Seu registro na rede de resgate continua. VocĂȘ ainda vai aparecer no mapa mesmo depois de excluir os arquivos locais. As imagens sĂŁo armazenadas na nuvem, nĂŁo localmente.
Recursos
- Documentação da geração de imagens com o Gemini
- Guia de engenharia de comando para imagens
- Blog de anĂșncios do Nano Banana
- RepositĂłrio Way Back Home
- NĂvel 1: identificar sua localização
Seu beacon aguarda confirmação. AtĂ© o nĂvel 1, explorador. đ
BĂŽnus: avatar com base em foto (opcional)
Duração: 3 minutos
Quando usar a opção "Foto para avatar"
VocĂȘ pode preferir essa abordagem se:
- VocĂȘ quer que o avatar se pareça com vocĂȘ
- VocĂȘ tem uma foto especĂfica que quer estilizar
- VocĂȘ quer conhecer os recursos de transformação de imagem em imagem do Gemini
Como funciona
Em vez de gerar um personagem apenas com uma descrição de texto, envie uma foto e peça para o Gemini transformar a imagem, preservando a aparĂȘncia da pessoa:
![]()
Enviar sua foto
Primeiro, faça upload de uma foto para o Cloud Shell:
- No Cloud Shell, clique no menu de trĂȘs pontos (âź) na barra de ferramentas do terminal.
- Selecione Fazer upload.
- Escolha uma foto nĂtida do rosto (JPEG ou PNG)
- Anote o caminho enviado (por exemplo,
/home/your-username/my_photo.jpg)
Modificar o gerador
Para usar uma foto, modifique a etapa de geração de retrato em generator.py. Substitua o comando somente de texto por um comando multimodal que inclua sua foto:
# 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...
A consistĂȘncia em vĂĄrias interaçÔes ainda funciona
A abordagem de vårias rodadas funciona da mesma forma com a geração baseada em fotos:
- Turno 1: foto + comando â retrato estilizado (sua semelhança, ilustrada)
- Turno 2: "Crie um Ăcone do MESMO personagem" â Ăcone consistente
Como a sessĂŁo de chat lembra a versĂŁo estilizada criada (nĂŁo a foto original), o Ăcone vai corresponder perfeitamente ao retrato transformado.
ConsideraçÔes sobre privacidade
Teste no Vertex AI Studio
VocĂȘ tambĂ©m pode testar a transformação de fotos de forma interativa no console do Google Cloud antes de escrever o cĂłdigo:
- Acesse o Vertex AI Studio.
- Selecionar um modelo do Gemini com recursos de imagem
- Envie sua foto usando o botĂŁo de anexo
- Insira o comando de transformação
- Itere no estilo até ficar satisfeito com o resultado.
- Faça o download do resultado e salve-o como
outputs/portrait.png - Execute:
python create_identity.py --skip-generation(se essa flag for compatĂvel) para fazer upload de imagens geradas manualmente.
Essa abordagem interativa Ă© Ăłtima para testar comandos e ver os resultados em tempo real antes de confirmar o cĂłdigo.
O que vocĂȘ aprendeu (bĂŽnus)
â Como usar a transformação de imagem para imagem com o Gemini
â Enviar conteĂșdo multimodal (texto + imagem) em uma Ășnica mensagem
â Preservar a semelhança ao aplicar a transferĂȘncia de estilo artĂstico
â ConsideraçÔes de privacidade para geração de IA com base em fotos
