Way Back Home - Level 0: Identify Yourself

1. O pedido de ajuda

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

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! 📍

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.
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 aparece 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).

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

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

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 expressionPreferences 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 :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 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:

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? 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 ["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/
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. 🚀

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:

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

  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.

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