Путь домой — Уровень 0: Представьтесь


Сигнал бедствия

Продолжительность: 1 мин.

Заголовок

Ваша спасательная капсула прорывается сквозь атмосферу неизвестного мира. На каждом экране мигают предупреждающие огни. Навигационная система вышла из строя. Связь прервана. Когда активируются аварийные протоколы капсулы, оживает искусственный интеллект-помощник:

«Выживший обнаружен. Аварийная посадка прошла успешно. Запускается протокол спасательного маяка...»

«ВНИМАНИЕ: Требуется подтверждение личности. Галактическая спасательная сеть не может обнаружить незарегистрированных исследователей. Пожалуйста, подтвердите свою личность, чтобы активировать маяк».

Вы смотрите в иллюминатор. Инопланетный пейзаж простирается до самого горизонта — странные скальные образования, незнакомая растительность, небо необычного цвета. Где-то там, на поверхности этой планеты, разбросаны другие выжившие из вашей миссии.

Но начнём с самого главного: вы должны существовать в этой системе.

Что вы построите

На этом уровне вы создадите свой уникальный образ космического исследователя, используя многоэтапную генерацию изображений с помощью моделей генерации изображений Google Gemini (также известных как Nano Banana 🍌). Ваш аватар появится на глобальной карте спасения и будет виден всем остальным выжившим на вашем мероприятии.

архитектура

Что вы узнаете

Концепция Описание
Многооборотное формирование изображения Как обеспечить единообразие символов в разных поколениях изображений с помощью чат-сессий
Оперативное проектирование изображений Разработка эффективных подсказок для получения стилизованных, единообразных результатов с учетом заданных ограничений.
Gemini Image API (Nano Banana) Использование встроенных возможностей Gemini по генерации изображений через Python SDK
Чат-сессии Использование контекста разговора для итеративного уточнения и обеспечения согласованности характеров персонажей.

К концу этого уровня вы получите:

✅ Сгенерирован портрет вашего исследователя с помощью искусственного интеллекта, преобразующего текст в изображение.
✅ Создан единообразный значок на карте с использованием многоходового диалога
✅ Зарегистрируйте свою личность в сети спасательных служб
✅ Отобразился на интерактивной карте мира вместе с другими исследователями.

Давайте выявим вас на карте! 📍

Подготовьте окружающую среду

Продолжительность: 2 мин.

Доступ к Cloud Shell

Сначала откроем Cloud Shell — браузерный терминал с предустановленным Google Cloud SDK и другими необходимыми инструментами.

Нужны облачные кредиты Google?

Если вы посещаете семинар под руководством инструктора : Ваш инструктор предоставит вам код для получения зачета. Пожалуйста, используйте тот код, который он вам предоставит.
Если вы проходите этот Codelab самостоятельно : вы можете получить бесплатный кредит Google Cloud для покрытия расходов на семинар. Пожалуйста, перейдите по этой ссылке , чтобы получить кредит, и следуйте инструкциям в видеоруководстве ниже, чтобы применить его к своему аккаунту.
Посмотрите видео

Нажмите кнопку «Активировать Cloud Shell» в верхней части консоли Google Cloud (это значок терминала в правом верхнем углу панели навигации).

облачная оболочка

Найдите идентификатор своего проекта Google Cloud:

  • Откройте консоль Google Cloud: https://console.cloud.google.com
  • Выберите проект, который вы хотите использовать для этого мастер-класса, из выпадающего списка проектов в верхней части страницы.
  • Идентификатор вашего проекта отображается в карточке с информацией о проекте на панели управления.
    идентификатор проекта

После открытия Cloud Shell убедитесь, что вы прошли аутентификацию:

# Check that you are logged in
gcloud auth list

Ваш аккаунт должен отображаться как (ACTIVE) .

Настройте свой проект

Убедитесь, что ваш проект настроен правильно:

export PROJECT_ID=$(gcloud config get-value project)
echo "Using project: $PROJECT_ID"

Если проект не задан или вам необходимо его изменить:

gcloud config set project YOUR_PROJECT_ID

Включить необходимые API

Включите API Vertex AI для генерации изображений:

gcloud services enable aiplatform.googleapis.com

Клонируйте репозиторий

Клонируйте репозиторий Way Back Home и перейдите в папку проекта:

git clone https://github.com/ayoisio/way-back-home.git
cd way-back-home

Установите зависимости

Перейдите на уровень 0 и установите необходимые пакеты Python:

cd level_0
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

Основные зависимости:

Упаковка Цель
google-genai Клиент Gemini API для генерации изображений
requests HTTP-клиент для вызовов API к Центру управления полетами
Pillow Обработка изображений и файлов

Проверка настроек

Выполните быструю проверку, чтобы убедиться в правильности настройки:

cd ~/way-back-home
python scripts/verify_setup.py

Вам следует увидеть:

✓ Google Cloud project configured: your-project-id
✓ Vertex AI API enabled
✓ Dependencies installed
✓ Ready to proceed!

Что вы только что завершили

✅ Открыта оболочка Cloud Shell
✅ Ваш проект Google Cloud настроен
✅ Включены API Vertex AI
✅ Клонирован репозиторий codelab
✅ Установлены зависимости Python
✅ Ваша конфигурация проверена

Далее: Подключитесь к Центру управления полетами и зарегистрируйте свое имя исследователя.

Подключитесь к Центру управления полетами

Продолжительность: 2 мин.

Запустите скрипт установки.

Скрипт настройки подключает вас к сети восстановления Way Back Home и резервирует вашу учетную запись исследователя. Запустите его из корневой папки проекта:

cd ~/way-back-home
chmod +x scripts/setup.sh
./scripts/setup.sh

Вам будет предложено ввести две части информации.

Введите код вашего мероприятия

Код мероприятия указывает, в каком именно семинаре вы участвуете.

Если вы участвуете в мастер-классе: введите код мероприятия с QR-кода, слайда или от преподавателя мастер-класса.

🚀 Welcome to Way Back Home!

Enter event code (from QR/slide): devfest-nyc-26
Validating event...
✓ Connected to: DevFest NYC 2026

Если вы учитесь самостоятельно: войдите в sandbox , чтобы присоединиться к общедоступной среде обучения.

🚀 Welcome to Way Back Home!

Enter event code (from QR/slide): sandbox
Validating event...
✓ Connected to: Way Back Home Sandbox

Выберите имя своего исследователя

Выберите уникальное имя для своего исследователя. Именно так вы будете отображаться на карте мира и в таблице лидеров.

Choose your explorer name: AstroAyo
✓ Username available!

Если выбранное вами имя уже занято другим участником этого же мероприятия:

Choose your explorer name: SpaceExplorer
⚠️  That name is taken. Try another.
Choose your explorer name: SpaceExplorer42
✓ Username available!

Настройка завершена.

После завершения вы увидите подтверждение:

Initializing your explorer profile...

✓ Environment configured!
  Explorer ID: a1b2c3d4
  Starting coordinates: (47, 23)

Next: cd level_0 && python customize.py

Теперь перейдите в каталог Level 0 (ваши зависимости уже установлены из модуля 2):

cd level_0

Проверьте свою конфигурацию.

Посмотрите, что было сохранено (файл config.json находится в корне проекта):

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

Этот конфигурационный файл будет использоваться последующими скриптами для вашей идентификации в сети восстановления.

Что вы только что завершили

✓ Подключено к API центра управления полетами
✓ Зарезервируйте свое уникальное имя исследователя
✓ Получены ваш идентификационный номер участника и координаты старта.
✓ Настройки сохранены для последующих шагов

Далее: Настройте внешний вид своего исследователя.

Настройте свой исследовательский центр

Продолжительность: 1 мин.

Запустите скрипт настройки

Перед созданием аватара вам предстоит выбрать несколько параметров, касающихся внешности вашего исследователя:

python customize.py

Выберите цвет костюма

Выберите цвет для скафандра вашего исследователя:

🎨 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

Опишите своего исследователя (необязательно)

Вы можете дать краткое описание внешности вашего исследователя или нажать Enter для случайного назначения:

Brief description of your explorer (or Enter for random):
Example: 'short dark hair, glasses, friendly smile'
> short dark hair, glasses, determined expressionPreferences saved!

Если нажать Enter, ничего не вводя, вы получите случайные характеристики:

> 
✓ Random traits: confident expression, short styled hair

Конфигурация обновлена.

Ваши настройки сохранены:

✓ Preferences saved!
Next: Open generator.py and follow the codelab instructions
Then run: python create_identity.py

Проверьте обновленную конфигурацию:

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",
    "suit_color": "deep blue with silver accents",
    "appearance": "short dark hair, glasses, determined expression"
}

Что вы только что завершили

✓ Выберите цвет костюма
✓ Определите внешний вид вашего исследователя
✓ Конфигурация готова для генерации образа

Далее: главное событие — написание кода для генерации изображений!

Создайте генератор аватаров

Продолжительность: 4 мин.

Это основной учебный модуль. Вы напишете код на Python, который сгенерирует ваш уникальный аватар исследователя, используя возможности многошаговой генерации изображений Gemini (Nano Banana).

Откройте файл генератора

Откройте генератор аватаров в редакторе Cloud Shell:

cloudshell edit generator.py

Или нажмите «Открыть редактор» в Cloud Shell и перейдите к generator.py в папке level_0 .

Понимание структуры файлов

В файле содержится начальный код и три раздела-заполнителя, куда вы добавите свою реализацию:

"""
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']}")

Вам нужно заменить три раздела TODO своей реализацией.

Шаг 1: Создание сеанса чата

Найдите заполнитель MODULE_5_STEP_1_CREATE_CHAT_SESSION и замените строку chat = None # Replace this line на:

    # 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"]
        )
    )

Шаг 2: Создайте портрет

Найдите MODULE_5_STEP_2_GENERATE_PORTRAIT и замените portrait_image = None # Replace this section следующим кодом:

    # 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!")

Шаг 3: Создайте значок карты

Найдите MODULE_5_STEP_3_GENERATE_ICON и замените icon_image = None # Replace this section на:

    # 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!")

Ваш завершенный код

После добавления всех трех разделов ваша функция generate_explorer_avatar() должна выглядеть следующим образом:

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

Сохраните файл

Обязательно сохраните файл generator.py :

  • Редактор Cloud Shell: Ctrl+S (Windows/Linux) или Cmd+S (Mac)
  • vim: Нажмите Escape, затем введите :wq и Enter.

То, что вы только что построили

✓ Создана сессия чата для генерации изображений в несколько этапов
✓ Разработан подробный шаблон для создания портретов с учетом стилистических ограничений.
✓ Создан единообразный значок карты с использованием контекста разговора
✓ Научился анализировать данные изображений из ответов Gemini.

Освоенные ключевые понятия:

Концепция Что вы узнали
Чат-сессии client.chats.create() сохраняет контекст на протяжении нескольких ходов
Способы реагирования ["TEXT", "IMAGE"] позволяет генерировать изображения в ответах.
Подсказка по структуре Тема → Переменные → Стиль → Технические ограничения
Последовательность характеров Одна и та же сессия чата = один и тот же персонаж на всех изображениях
Анализ ответа Извлечение изображений из inline_data в частях ответа.

Далее: Запустите свой код и посмотрите, как вы будете выглядеть на карте!

Сгенерировать и зарегистрировать

Продолжительность: 2 мин.

Укажите идентификатор вашего проекта.

Убедитесь, что идентификатор вашего проекта доступен в качестве переменной среды:

export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project)

Запустите программу создания учетных записей.

Теперь запустите основной скрипт, который управляет генерацией, загрузкой и регистрацией:

python create_identity.py

Вы сможете наблюдать за процессом генерации в режиме реального времени:

🚀 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!   
                                                               
╚═══════════════════════════════════════════════════════════════╝

Посмотреть созданный вами аватар

Просмотрите сгенерированные изображения локально:

# List the generated files
ls -la outputs/

# Download to view on your local machine
cloudshell download outputs/portrait.png
cloudshell download outputs/icon.png

Или просмотрите их непосредственно в редакторе Cloud Shell, перейдя в папку outputs/ и щелкнув по файлам изображений.

Сгенерированный портрет и иконка будут выглядеть примерно так:

пример портретапример значка

Увидь себя на карте!

Откройте URL-адрес карты мира, указанный в результатах поиска:

https://waybackhome.dev/e/{your-event-code}

Например: https://waybackhome.dev/e/devfest-nyc-26

Найдите свой аватар на карте! Вы увидите:

  • Ваш значок , указывающий ваше местоположение на поверхности планеты.
  • Ваше имя исследователя будет отображаться в виде подписи под вашей иконкой.
  • Приглушенный маяк медленно пульсирует вокруг вашей метки.

пример аватара на карте

Нажмите на свой маркер, чтобы увидеть свой портрет целиком на карточке с подробными деталями.

Недоволен своим аватаром? Обновите его!

Если вы хотите другой аватар, вы можете его сгенерировать заново:

# Option 1: Change your appearance settings first
python customize.py

# Option 2: Just regenerate with current settings
python create_identity.py

При каждом запуске скрипта create_identity.py генерируется совершенно новый аватар (новая сессия чата = новый персонаж) и обновляется ваша регистрация. Можете экспериментировать, пока не будете довольны результатом!

Поиск неисправностей

Что вы только что завершили

✓ Создайте свой уникальный портрет исследователя
✓ Создан единый значок на карте
✓ Ресурсы загружены в Центр управления полетами
✓ Зарегистрируйте свою личность в сети спасательных служб
✓ Отобразилось на интерактивной карте мира!

Поздравляем, исследователь! Теперь вы находитесь в сети спасения. Ваш маяк активен (хотя и тусклый), и другие выжившие могут видеть вас на карте.

Заключение

Продолжительность: 1 мин.

Что ты построил

Всего за 10 минут вы создали полноценную систему генерации аватаров, используя многоэтапную генерацию изображений с помощью ИИ:

┌─────────────────────────────────────────────────────────────┐
                     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                  
                                                              
└─────────────────────────────────────────────────────────────┘

Основные выводы

Урок Почему это важно
В чат-сессиях сохраняется контекст. Это крайне важно для получения единообразных символов на нескольких изображениях без смещения в сторону вариаций.
Оперативное структурирование имеет значение. Четкие ограничения (белый фон, определенный стиль, кадрирование) обеспечивают предсказуемый результат, готовый к производству.
Многоэтапные прогнозы превосходят независимые прогнозы. Каждое сообщение в чате основывается на предыдущем контексте, что позволяет итеративно уточнять и обеспечивать согласованность.
Способы реагирования управляют выходными данными Для генерации изображения необходимо задать параметры ["TEXT", "IMAGE"] — без них вы получите только текст.

Сводка затрат

Для этого уровня вам нужно было создать 2 изображения с помощью Gemini 2.5 Flash (Nano Banana):

Элемент Токены Расходы
Портрет (1024×1024) ~1290 выходных токенов ~0,039 долл.
Иконка (1024×1024) ~1290 выходных токенов ~0,039 долл.
Общий ~2580 токенов ~0,08 долл.

Путешествие продолжается

Ваша личность исследователя подтверждена, но есть проблема: ваше местоположение не подтверждено.

Взгляните на карту мира — ваш маяк тускло светит, медленно пульсируя. Спасательная сеть знает о вашем существовании, но точно не знает, где вы находитесь. Вы можете быть где угодно в пределах обширного региона на поверхности планеты.

На первом уровне: Определение местоположения , вы:

  • Создайте многоагентную систему , используя комплект разработки агентов Google (ADK).
  • Создание MCP-серверов для геологического, ботанического и астрономического анализа.
  • Обработайте мультимодальные входные данные (изображения с места крушения).
  • Создайте топографическую карту вашего подтвержденного местоположения с помощью ИИ.
  • Light up your beacon for real — so rescue teams can find you!

На первом уровне изучаются значительно более сложные концепты: оркестровка нескольких агентов, протокол контекста модели (MCP) и шаблоны развертывания в производственной среде. Вы перейдете от использования одной функции модели к созданию полноценной агентной системы.

Уборка (необязательно)

Если вы хотите очистить локальные файлы (запустите программу из каталога level_0 ):

rm -rf outputs/
rm ../config.json
deactivate  # Exit virtual environment

Ваша регистрация в спасательной сети сохраняется — вы по-прежнему будете отображаться на карте даже после удаления локальных файлов. Изображения хранятся в облаке, а не локально.

Ресурсы


Ваш маяк ожидает подтверждения. Увидимся на 1-м уровне, исследователь! 🚀

Бонус: Аватар на основе фотографии (по желанию)

Продолжительность: 3 мин.

Когда использовать функцию преобразования фотографии в аватар?

Этот подход может быть предпочтительнее, если:

  • Вы хотите, чтобы ваш аватар действительно был похож на вас?
  • У вас есть конкретная фотография, которую вы хотели бы стилизовать.
  • Вы хотите изучить возможности Gemini по преобразованию изображений в изображения.

Как это работает

Вместо того чтобы создавать персонажа исключительно на основе текстового описания, вы предоставляете фотографию и просите Gemini преобразовать её, сохранив при этом сходство с человеком:

поток от фотографии к аватару

Загрузите свою фотографию

Сначала загрузите фотографию в Cloud Shell:

  1. В Cloud Shell нажмите на значок меню с тремя точками (⋮) на панели инструментов терминала.
  2. Выберите «Загрузить»
  3. Выберите четкое фото лица (в формате JPEG или PNG).
  4. Обратите внимание на путь к загруженному файлу (например, /home/your-username/my_photo.jpg ).

Измените генератор

Чтобы использовать фотографию, вам нужно изменить шаг генерации портрета в generator.py . Замените текстовое поле запроса на многомодальное поле запроса, включающее вашу фотографию:

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

Постоянство многооборотной работы по-прежнему работает.

Многооборотный подход работает аналогично и при генерации на основе фотографий:

  • Первый ход : Фото + подсказка → Стилизованный портрет (ваше изображение, нарисованное)
  • Ход 2 : «Создайте иконку этого ЖЕ персонажа» → Единая иконка

Поскольку в чате запоминается созданная стилизованная версия (а не исходное фото), значок будет идеально соответствовать преобразованному портрету.

Вопросы конфиденциальности

Попробуйте в Vertex AI Studio

Вы также можете поэкспериментировать с преобразованием фотографий в интерактивном режиме в консоли Google Cloud, прежде чем писать код:

  1. Перейдите в Vertex AI Studio
  2. Выберите модель Gemini с возможностями обработки изображений.
  3. Загрузите свою фотографию, используя кнопку «Вложение».
  4. Введите запрос на преобразование
  5. Дорабатывайте стиль, пока не будете довольны результатом.
  6. Скачайте результат и сохраните его как outputs/portrait.png
  7. Запустите: python create_identity.py --skip-generation (если этот флаг поддерживается), чтобы загрузить изображения, сгенерированные вручную.

Этот интерактивный подход отлично подходит для экспериментов с подсказками и наблюдения за результатами в режиме реального времени, прежде чем приступать к написанию кода!

Что вы узнали (бонус)

✓ Как использовать преобразование изображения в изображение с помощью Gemini
✓ Отправка мультимодального контента (текст + изображение) в одном сообщении
✓ Сохранение сходства при переносе художественного стиля
✓ Вопросы конфиденциальности при генерации изображений с помощью ИИ