1. O pedido de ajuda

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 acionados, 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! 📍
2. Prepare o ambiente
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 aparece 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).
Clone o repositório
Clone o repositório Way Back Home e navegue até o projeto:
git clone https://github.com/google-americas/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
uv sync
As principais dependências são:
Pacote | Finalidade |
| Cliente da API Gemini para geração de imagens |
| Cliente HTTP para chamadas de API ao Mission Control. |
| Processamento de imagens e tratamento de arquivos |
Verificar configuração
Faça uma verificação rápida para garantir que tudo esteja configurado corretamente:
uv run python ../scripts/verify_setup.py
Você verá:
✓ Authenticated as: your-email@google.com
✓ Python environment ready (uv)
✓ Ready to proceed!
O que você acabou de concluir
✓ Abriu o Cloud Shell
✓ Fez a autenticação com o Google Cloud
✓ Clonou o repositório do codelab
✓ Instalou as dependências do Python com uv
✓ Verificou a configuração
Próxima etapa:conecte-se ao Mission Control. O script de configuração vai configurar seu projeto e as APIs do Google Cloud automaticamente.
3. Conectar-se à Central de controle
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 $HOME/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 no QR code, no slide ou com o instrutor do workshop.
🚀 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.
4. Personalizar o User Explorer
Executar o script de personalização
Antes de gerar seu avatar, você vai fazer algumas escolhas sobre a aparência do seu explorador:
uv run 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
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.
5. Criar o gerador de avatares
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 |
Modalidades de resposta | O |
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 |
Próxima etapa:execute o código e confira sua localização no mapa.
6. Gerar e registrar
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:
uv run python create_identity.py
Você vai acompanhar o progresso da geração em tempo real:
Observação: pode levar até 5 segundos para seu avatar aparecer no mapa em tempo real. Atualize a página se você não se encontrar imediatamente.
🚀 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? Gere de novo!
Se quiser outro avatar, gere novamente:
# Option 1: Change your appearance settings first
uv run python customize.py
# Option 2: Just regenerate with current settings
uv run python create_identity.py
Cada vez que você executa create_identity.py, um avatar totalmente novo é gerado (nova sessão de chat = novo personagem) e seu registro é atualizado. Você pode repetir o processo até ficar satisfeito com o resultado.
Solução de problemas
O que você acabou de concluir
✓ Gerou seu retrato de explorador exclusivo
✓ 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.
7. Conclusão
O que você criou
Em apenas 10 minutos, você criou um sistema completo de geração de avatares usando a geração de imagens de 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 |
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/
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. 🚀
8. Bônus: avatar com base em foto (opcional)
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 interações 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 DESTE MESMO personagem" → Ícone consistente
Como a sessão de chat lembra a versão estilizada criada (e 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.
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