Way Back Home - Level 0: Identify Yourself


O pedido de ajuda

Duração: 1 min

Cabeçalho

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.

arquitetura

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.
Assista ao vĂ­deo

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.

Cloud Shell

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
    project id

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

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 :wq e 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:

exemplo de retrato Ă­cone de exemplo

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

Exemplo de avatar no mapa

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


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:

fluxo de foto para avatar

Enviar sua foto

Primeiro, faça upload de uma foto para o Cloud Shell:

  1. No Cloud Shell, clique no menu de trĂȘs pontos (⋼) na barra de ferramentas do terminal.
  2. Selecione Fazer upload.
  3. Escolha uma foto nĂ­tida do rosto (JPEG ou PNG)
  4. 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:

  1. Acesse o Vertex AI Studio.
  2. Selecionar um modelo do Gemini com recursos de imagem
  3. Envie sua foto usando o botĂŁo de anexo
  4. Insira o comando de transformação
  5. Itere no estilo até ficar satisfeito com o resultado.
  6. Faça o download do resultado e salve-o como outputs/portrait.png
  7. 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