Tín hiệu cầu cứu
Thời lượng: 1 phút

Khoang thoát hiểm của bạn xuyên qua bầu khí quyển của một thế giới xa lạ. Đèn cảnh báo nhấp nháy trên mọi bảng điều khiển. Hệ thống định vị bị hỏng. Mất liên lạc. Khi các quy trình khẩn cấp của khoang kích hoạt, trợ lý AI bắt đầu hoạt động:
"Đã phát hiện thấy người sống sót. Hạ cánh khẩn cấp thành công. Đang bắt đầu giao thức đèn hiệu cứu hộ..."
"CẢNH BÁO: Bạn phải xác minh danh tính. Mạng lưới cứu hộ thiên hà không thể xác định vị trí của những nhà thám hiểm chưa đăng ký. Vui lòng xác nhận danh tính của bạn để kích hoạt thiết bị báo hiệu."
Bạn nhìn ra ngoài khung nhìn. Một cảnh quan ngoài hành tinh trải dài đến tận chân trời – những khối đá kỳ lạ, thảm thực vật xa lạ, bầu trời có màu sắc kỳ quái. Ở đâu đó ngoài kia, những người sống sót khác trong nhiệm vụ của bạn đang rải rác trên bề mặt hành tinh này.
Nhưng trước tiên, bạn cần phải có trong hệ thống.
Sản phẩm bạn sẽ tạo ra
Ở cấp độ này, bạn sẽ tạo danh tính riêng cho nhà thám hiểm không gian bằng cách sử dụng tính năng tạo ảnh nhiều lượt với các mô hình tạo ảnh của Gemini của Google (còn gọi là Nano Banana 🍌). Hình đại diện của bạn sẽ xuất hiện trên bản đồ cứu hộ toàn cầu, mọi người sống sót khác tại sự kiện workshop của bạn đều có thể nhìn thấy.

Kiến thức bạn sẽ học được
| Khái niệm | Mô tả |
|---|---|
| Tạo hình ảnh nhiều lượt | Cách duy trì tính nhất quán của nhân vật trong nhiều hình ảnh được tạo bằng cách sử dụng các phiên trò chuyện |
| Thiết kế câu lệnh cho hình ảnh | Tạo câu lệnh hiệu quả để có kết quả nhất quán, cách điệu với các điều kiện ràng buộc cụ thể |
| Gemini Image API (Nano Banana) | Sử dụng các chức năng tạo hình ảnh gốc của Gemini thông qua Python SDK |
| Phiên trò chuyện | Tận dụng ngữ cảnh trò chuyện để tinh chỉnh lặp đi lặp lại và đảm bảo tính nhất quán của nhân vật |
Khi kết thúc cấp độ này, bạn sẽ có:
✅ Tạo chân dung cho nhà thám hiểm bằng AI chuyển văn bản sang hình ảnh
✅ Tạo biểu tượng bản đồ nhất quán bằng tính năng trò chuyện nhiều lượt
✅ Đăng ký danh tính của bạn với mạng lưới cứu hộ
✅ Xuất hiện trên bản đồ thế giới trực tiếp cùng với những nhà thám hiểm khác
Hãy đưa bạn lên bản đồ! 📍
Chuẩn bị môi trường
Thời lượng: 2 phút
Truy cập Cloud Shell
Trước tiên, chúng ta sẽ mở Cloud Shell. Đây là một cửa sổ dòng lệnh dựa trên trình duyệt có Google Cloud SDK và các công cụ thiết yếu khác được cài đặt sẵn.
Bạn cần tín dụng Google Cloud?
• Nếu bạn tham gia một hội thảo có người hướng dẫn: Người hướng dẫn sẽ cung cấp cho bạn một mã tín dụng. Vui lòng sử dụng mã mà họ cung cấp.
• Nếu đang tự học lớp học lập trình này: Bạn có thể sử dụng một khoản tín dụng miễn phí của Google Cloud để thanh toán chi phí của hội thảo. Vui lòng nhấp vào đường liên kết này để nhận tín dụng và làm theo các bước trong video hướng dẫn bên dưới để áp dụng tín dụng vào tài khoản của bạn.
![]()
Nhấp vào Kích hoạt Cloud Shell ở đầu Bảng điều khiển Google Cloud (đó là biểu tượng thiết bị đầu cuối trong thanh điều hướng trên cùng bên phải).

Tìm mã dự án trên Google Cloud:
- Mở Google Cloud Console: https://console.cloud.google.com
- Chọn dự án bạn muốn sử dụng cho hội thảo này trong trình đơn thả xuống dự án ở đầu trang.
- Mã dự án của bạn sẽ xuất hiện trong thẻ Thông tin dự án trên Trang tổng quan

Sau khi Cloud Shell mở, hãy xác minh rằng bạn đã được xác thực:
# Check that you are logged in
gcloud auth list
Bạn sẽ thấy tài khoản của mình được liệt kê là (ACTIVE).
Định cấu hình dự án
Xác minh rằng dự án của bạn được thiết lập chính xác:
export PROJECT_ID=$(gcloud config get-value project)
echo "Using project: $PROJECT_ID"
Nếu bạn chưa đặt dự án hoặc cần thay đổi dự án:
gcloud config set project YOUR_PROJECT_ID
Bật các API bắt buộc
Bật Vertex AI API để tạo hình ảnh:
gcloud services enable aiplatform.googleapis.com
Sao chép Kho lưu trữ
Sao chép kho lưu trữ Way Back Home và chuyển đến dự án:
git clone https://github.com/ayoisio/way-back-home.git
cd way-back-home
Cài đặt các phần phụ thuộc
Chuyển đến Cấp 0 và cài đặt các gói Python bắt buộc:
cd level_0
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
Sau đây là các phần phụ thuộc chính:
| Gói | Mục đích |
|---|---|
google-genai |
Ứng dụng Gemini API để tạo hình ảnh |
requests |
Ứng dụng HTTP cho các lệnh gọi API đến Mission Control |
Pillow |
Xử lý hình ảnh và xử lý tệp |
Xác minh chế độ thiết lập
Chạy quy trình xác minh nhanh để đảm bảo bạn đã định cấu hình mọi thứ đúng cách:
cd ~/way-back-home
python scripts/verify_setup.py
Bạn sẽ thấy:
✓ Google Cloud project configured: your-project-id
✓ Vertex AI API enabled
✓ Dependencies installed
✓ Ready to proceed!
Nội dung bạn vừa hoàn thành
✅ Mở Cloud Shell
✅ Định cấu hình dự án Google Cloud
✅ Bật API Vertex AI
✅ Sao chép kho lưu trữ codelab
✅ Cài đặt các phần phụ thuộc Python
✅ Xác minh chế độ thiết lập
Tiếp theo: Kết nối với Trung tâm điều khiển và nhận tên nhà thám hiểm.
Kết nối với Mission Control
Thời lượng: 2 phút
Chạy tập lệnh thiết lập
Tập lệnh thiết lập sẽ kết nối bạn với mạng lưới cứu hộ Way Back Home và đặt trước danh tính của bạn trong mạng lưới này. Chạy lệnh này từ thư mục gốc của dự án:
cd ~/way-back-home
chmod +x scripts/setup.sh
./scripts/setup.sh
Bạn sẽ được yêu cầu cung cấp 2 thông tin.
Nhập mã sự kiện của bạn
Mã sự kiện giúp xác định sự kiện hội thảo mà bạn đang tham gia.
Nếu bạn đang tham gia một hội thảo: Nhập mã sự kiện từ mã QR, trang trình bày hoặc người hướng dẫn hội thảo.
🚀 Welcome to Way Back Home!
Enter event code (from QR/slide): devfest-nyc-26
Validating event...
✓ Connected to: DevFest NYC 2026
Nếu bạn đang tự học: Nhập sandbox để tham gia môi trường học tập công khai.
🚀 Welcome to Way Back Home!
Enter event code (from QR/slide): sandbox
Validating event...
✓ Connected to: Way Back Home Sandbox
Chọn tên người khám phá
Chọn một tên riêng biệt cho trình khám phá của bạn. Đây là cách bạn sẽ xuất hiện trên bản đồ thế giới và bảng xếp hạng.
Choose your explorer name: AstroAyo
✓ Username available!
Nếu tên bạn chọn đã được một người tham gia khác sử dụng tại cùng một sự kiện:
Choose your explorer name: SpaceExplorer
⚠️ That name is taken. Try another.
Choose your explorer name: SpaceExplorer42
✓ Username available!
Hoàn tất thiết lập
Sau khi hoàn tất, bạn sẽ thấy thông báo xác nhận:
Initializing your explorer profile...
✓ Environment configured!
Explorer ID: a1b2c3d4
Starting coordinates: (47, 23)
Next: cd level_0 && python customize.py
Chuyển đến Cấp 0
Bây giờ, hãy chuyển đến thư mục Cấp 0 (các phần phụ thuộc của bạn đã được cài đặt từ Mô-đun 2):
cd level_0
Kiểm tra cấu hình của bạn
Hãy xem những gì đã được lưu (config.json nằm trong thư mục gốc của dự án):
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"
}
Các tập lệnh tiếp theo sẽ dùng tệp cấu hình này để xác định bạn trong mạng lưới cứu hộ.
Nội dung bạn vừa hoàn thành
✓ Đã kết nối với Mission Control API
✓ Đã đặt trước tên nhà thám hiểm riêng biệt
✓ Đã nhận được mã nhận dạng người tham gia và toạ độ bắt đầu
✓ Đã lưu cấu hình cho các bước tiếp theo
Tiếp theo: Tuỳ chỉnh giao diện của trình khám phá.
Tuỳ chỉnh Trình khám phá
Thời lượng: 1 phút
Chạy Tập lệnh tuỳ chỉnh
Trước khi tạo hình đại diện, bạn sẽ đưa ra một số lựa chọn về diện mạo của nhà thám hiểm:
python customize.py
Chọn màu áo
Chọn màu cho bộ đồ vũ trụ của nhà thám hiểm:
🎨 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
Mô tả Explorer của bạn (Không bắt buộc)
Bạn có thể mô tả ngắn gọn về diện mạo của nhà thám hiểm hoặc nhấn Enter để được chỉ định ngẫu nhiên:
Brief description of your explorer (or Enter for random):
Example: 'short dark hair, glasses, friendly smile'
> short dark hair, glasses, determined expression
✓ Preferences saved!
Nếu nhấn phím Enter mà không nhập nội dung nào, bạn sẽ nhận được các đặc điểm ngẫu nhiên:
>
✓ Random traits: confident expression, short styled hair
Đã cập nhật cấu hình
Các lựa chọn ưu tiên của bạn hiện đã được lưu:
✓ Preferences saved!
Next: Open generator.py and follow the codelab instructions
Then run: python create_identity.py
Xác minh cấu hình đã cập nhật:
cat ../config.json
Bạn sẽ thấy các lựa chọn ưu tiên đã được thêm:
{
"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"
}
Nội dung bạn vừa hoàn thành
✓ Chọn màu sắc cho bộ đồ của bạn
✓ Xác định diện mạo của nhà thám hiểm
✓ Cấu hình đã sẵn sàng để tạo hình ảnh
Tiếp theo: Sự kiện chính – viết mã tạo hình ảnh!
Xây dựng Trình tạo hình đại diện
Thời lượng: 4 phút
Đây là mô-đun học tập cốt lõi. Bạn sẽ viết mã Python để tạo hình đại diện nhà thám hiểm độc đáo của riêng mình bằng các tính năng tạo hình ảnh nhiều lượt của Gemini (Nano Banana).
Mở tệp Generator
Mở trình tạo hình đại diện trong Cloud Shell Editor:
cloudshell edit generator.py
Hoặc nhấp vào Open Editor (Mở trình chỉnh sửa) trong Cloud Shell rồi chuyển đến generator.py trong thư mục level_0.
Tìm hiểu cấu trúc tệp
Tệp này có mã khởi đầu và 3 phần giữ chỗ nơi bạn sẽ thêm quá trình triển khai:
"""
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']}")
Bạn sẽ thay thế 3 phần TODO bằng phương thức triển khai của mình.
Bước 1: Tạo phiên trò chuyện
Tìm phần giữ chỗ MODULE_5_STEP_1_CREATE_CHAT_SESSION rồi thay thế dòng chat = None # Replace this line bằng:
# 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"]
)
)
Bước 2: Tạo ảnh chân dung
Tìm MODULE_5_STEP_2_GENERATE_PORTRAIT rồi thay thế portrait_image = None # Replace this section bằng mã sau:
# 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!")
Bước 3: Tạo biểu tượng bản đồ
Tìm MODULE_5_STEP_3_GENERATE_ICON rồi thay thế icon_image = None # Replace this section bằng:
# 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!")
Mã đã hoàn tất
Sau khi thêm cả 3 phần, hàm generate_explorer_avatar() của bạn sẽ có dạng như sau:
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"
}
Lưu tệp
Hãy nhớ lưu generator.py:
- Trình chỉnh sửa Cloud Shell: Ctrl+S (Windows/Linux) hoặc Cmd+S (Mac)
- vim: Nhấn Escape, sau đó nhập
:wqrồi nhấn Enter
Sản phẩm bạn vừa tạo
✓ Tạo một phiên trò chuyện để tạo hình ảnh nhiều lượt
✓ Soạn một câu lệnh chi tiết để tạo ảnh chân dung có các ràng buộc về phong cách
✓ Tạo một biểu tượng nhất quán trên bản đồ bằng cách sử dụng ngữ cảnh trò chuyện
✓ Tìm hiểu cách phân tích cú pháp dữ liệu hình ảnh từ câu trả lời của Gemini
Các khái niệm chính đã nắm vững:
| Khái niệm | Kiến thức bạn học được |
|---|---|
| Phiên trò chuyện | client.chats.create() duy trì ngữ cảnh trong nhiều lượt tương tác |
| Phương thức phản hồi | ["TEXT", "IMAGE"] cho phép tạo hình ảnh trong câu trả lời |
| Cấu trúc câu lệnh | Chủ đề → Biến → Kiểu → Ràng buộc kỹ thuật |
| Đảm bảo tính nhất quán của nhân vật | Cùng một phiên trò chuyện = cùng một nhân vật trong các hình ảnh |
| Phân tích cú pháp phản hồi | Trích xuất hình ảnh từ inline_data trong các phần phản hồi |
Tiếp theo: Chạy mã và xem vị trí của bạn trên bản đồ!
Tạo và đăng ký
Thời lượng: 2 phút
Đặt mã dự án
Đảm bảo mã dự án của bạn có sẵn dưới dạng một biến môi trường:
export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project)
Chạy Trình tạo danh tính
Bây giờ, hãy chạy tập lệnh chính để điều phối quá trình tạo, tải lên và đăng ký:
python create_identity.py
Bạn sẽ thấy tiến trình tạo theo thời gian thực:
🚀 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! ║
║ ║
╚═══════════════════════════════════════════════════════════════╝
Xem hình đại diện bạn đã tạo
Xem hình ảnh bạn đã tạo trên thiết bị:
# List the generated files
ls -la outputs/
# Download to view on your local machine
cloudshell download outputs/portrait.png
cloudshell download outputs/icon.png
Hoặc xem trực tiếp các tệp đó trong Cloud Shell Editor bằng cách chuyển đến thư mục outputs/ rồi nhấp vào các tệp hình ảnh.
Chân dung và biểu tượng được tạo sẽ trông giống như những hình ảnh sau:
![]()
Xem vị trí của bạn trên bản đồ!
Mở URL bản đồ thế giới xuất hiện trong đầu ra của bạn:
https://waybackhome.dev/e/{your-event-code}
Ví dụ: https://waybackhome.dev/e/devfest-nyc-26
Tìm hình đại diện của bạn trên bản đồ! Bạn sẽ thấy:
- Biểu tượng đánh dấu vị trí của bạn trên bề mặt hành tinh
- Tên người dùng của bạn dưới dạng nhãn bên dưới biểu tượng
- Một đèn hiệu mờ nhấp nháy chậm xung quanh điểm đánh dấu của bạn
![]()
Nhấp vào điểm đánh dấu của bạn để xem ảnh chân dung đầy đủ của bạn trong thẻ chi tiết.
Bạn không hài lòng với hình đại diện của mình? Tạo lại!
Nếu muốn có một hình đại diện khác, bạn có thể tạo lại hình đại diện đó:
# Option 1: Change your appearance settings first
python customize.py
# Option 2: Just regenerate with current settings
python create_identity.py
Mỗi lần bạn chạy create_identity.py, ứng dụng sẽ tạo một hình đại diện hoàn toàn mới (phiên trò chuyện mới = nhân vật mới) và cập nhật thông tin đăng ký của bạn. Bạn có thể lặp lại cho đến khi hài lòng với kết quả!
Khắc phục sự cố
Nội dung bạn vừa hoàn thành
✓ Tạo chân dung nhà thám hiểm độc đáo của bạn
✓ Tạo biểu tượng nhất quán trên bản đồ
✓ Tải các thành phần lên Trung tâm kiểm soát
✓ Đăng ký danh tính của bạn với mạng lưới cứu hộ
✓ Xuất hiện trên bản đồ thế giới trực tiếp!
Xin chúc mừng, nhà thám hiểm! Bạn hiện đã có trong mạng lưới cứu hộ. Thiết bị định vị của bạn đang hoạt động (mặc dù mờ) và những người sống sót khác có thể nhìn thấy bạn trên bản đồ.
Kết luận
Thời lượng: 1 phút
Sản phẩm bạn đã tạo
Chỉ trong 10 phút, bạn đã tạo một hệ thống tạo hình đại diện hoàn chỉnh bằng cách sử dụng tính năng tạo hình ảnh bằng AI nhiều lượt:
┌─────────────────────────────────────────────────────────────┐
│ 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 │
│ │
└─────────────────────────────────────────────────────────────┘
Những điểm chính cần ghi nhớ
| Bài học | Tầm quan trọng |
|---|---|
| Các phiên trò chuyện duy trì bối cảnh | Rất cần thiết để tạo ra các nhân vật nhất quán trên nhiều hình ảnh mà không bị trôi dạt |
| Cấu trúc câu lệnh có vai trò quan trọng | Các ràng buộc rõ ràng (nền trắng, kiểu dáng cụ thể, khung hình) tạo ra kết quả có thể dự đoán được và sẵn sàng để sản xuất |
| Lệnh gọi nhiều lượt đánh bại lệnh gọi độc lập | Mỗi tin nhắn trong cuộc trò chuyện đều dựa trên ngữ cảnh trước đó, cho phép tinh chỉnh lặp đi lặp lại và đảm bảo tính nhất quán |
| Các phương thức phản hồi kiểm soát đầu ra | Bạn phải bật chế độ cài đặt ["TEXT", "IMAGE"] để tạo hình ảnh. Nếu không, bạn sẽ chỉ nhận được văn bản |
Tóm tắt về chi phí
Đối với cấp độ này, bạn đã tạo 2 hình ảnh bằng Gemini 2.5 Flash (Nano Banana):
| Mục | Mã thông báo | Chi phí |
|---|---|---|
| Dọc (1024×1024) | ~1.290 mã thông báo đầu ra | ~0,039 USD |
| Biểu tượng (1024×1024) | ~1.290 mã thông báo đầu ra | ~0,039 USD |
| Tổng cộng | ~2.580 mã thông báo | Khoảng 0,08 USD |
Hành trình vẫn tiếp diễn
Danh tính của bạn trong chế độ khám phá đã được xác nhận, nhưng có một vấn đề: vị trí của bạn chưa được xác nhận.
Nhìn vào bản đồ thế giới – đèn hiệu của bạn mờ và nhấp nháy chậm. Mạng lưới cứu hộ biết bạn đang ở đâu đó, nhưng họ không biết chính xác vị trí của bạn. Bạn có thể ở bất cứ đâu trong một khu vực rộng lớn trên bề mặt hành tinh.
Trong Cấp độ 1: Xác định vị trí của bạn, bạn sẽ:
- Xây dựng một hệ thống đa tác nhân bằng Bộ công cụ phát triển tác nhân (ADK) của Google
- Tạo máy chủ MCP để phân tích địa chất, thực vật học và thiên văn học
- Xử lý thông tin đầu vào đa phương thức (hình ảnh từ trang web gặp sự cố)
- Tạo bản đồ địa hình về vị trí đã xác nhận của bạn bằng AI
- Bật đèn hiệu để đội cứu hộ có thể tìm thấy bạn!
Cấp độ 1 giới thiệu các khái niệm nâng cao hơn đáng kể: điều phối nhiều tác nhân, Giao thức ngữ cảnh mô hình (MCP) và các mẫu triển khai sản xuất. Bạn sẽ chuyển từ việc sử dụng một tính năng mô hình duy nhất sang xây dựng một hệ thống hoàn chỉnh dựa trên tác nhân.
Dọn dẹp (Không bắt buộc)
Nếu bạn muốn dọn dẹp các tệp cục bộ (chạy từ thư mục level_0):
rm -rf outputs/
rm ../config.json
deactivate # Exit virtual environment
Thông tin đăng ký của bạn với mạng lưới cứu hộ vẫn được lưu giữ. Bạn vẫn sẽ xuất hiện trên bản đồ ngay cả sau khi xoá các tệp trên thiết bị. Các hình ảnh được lưu trữ trên đám mây, chứ không phải trên thiết bị.
Tài nguyên
- Tài liệu về tính năng tạo hình ảnh bằng Gemini
- Hướng dẫn về kỹ thuật tạo câu lệnh cho hình ảnh
- Blog thông báo của Nano Banana
- Kho lưu trữ Way Back Home
- Cấp độ 1: Xác định vị trí của bạn
Thiết bị báo hiệu của bạn đang chờ xác nhận. Hẹn gặp lại bạn ở Cấp 1, nhà thám hiểm. 🚀
Phần thưởng: Hình đại diện dựa trên ảnh (Không bắt buộc)
Thời lượng: 3 phút
Trường hợp sử dụng tính năng Ảnh thành hình đại diện
Bạn nên chọn phương pháp này nếu:
- Bạn muốn hình đại diện thực sự giống bạn
- Bạn có một bức ảnh cụ thể mà bạn muốn tạo phong cách
- Bạn muốn khám phá khả năng biến đổi hình ảnh thành hình ảnh của Gemini
Cách tính năng hoạt động
Thay vì chỉ tạo một nhân vật dựa trên nội dung mô tả bằng văn bản, bạn có thể cung cấp một bức ảnh và yêu cầu Gemini biến đổi bức ảnh đó nhưng vẫn giữ nguyên thần thái của người trong ảnh:
![]()
Tải ảnh lên
Trước tiên, hãy tải một bức ảnh lên Cloud Shell:
- Trong Cloud Shell, hãy nhấp vào trình đơn có biểu tượng ba dấu chấm (⋮) trên thanh công cụ của thiết bị đầu cuối
- Chọn Tải lên
- Chọn một bức ảnh chân dung rõ ràng (JPEG hoặc PNG)
- Ghi lại đường dẫn đã tải lên (ví dụ:
/home/your-username/my_photo.jpg)
Sửa đổi Trình tạo
Để sử dụng ảnh, bạn sẽ sửa đổi bước tạo ảnh chân dung trong generator.py. Thay thế câu lệnh chỉ có văn bản bằng một câu lệnh đa phương thức có chứa ảnh của bạn:
# 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...
Tính nhất quán trong nhiều lượt vẫn hoạt động
Phương pháp nhiều lượt tương tác cũng hoạt động theo cách tương tự với tính năng tạo ảnh:
- Lượt 1: Ảnh + câu lệnh → Ảnh chân dung cách điệu (hình minh hoạ giống bạn)
- Lượt 2: "Tạo biểu tượng cho CÙNG MỘT nhân vật này" → Biểu tượng nhất quán
Vì phiên trò chuyện ghi nhớ phiên bản cách điệu mà phiên trò chuyện đã tạo (không phải ảnh gốc), nên biểu tượng sẽ hoàn toàn khớp với ảnh chân dung đã được biến đổi.
Những điều cần cân nhắc về quyền riêng tư
Dùng thử trong Vertex AI Studio
Bạn cũng có thể thử nghiệm với tính năng biến đổi ảnh một cách tương tác trong Google Cloud Console trước khi viết mã:
- Chuyển đến Vertex AI Studio
- Chọn một mô hình Gemini có khả năng xử lý hình ảnh
- Tải ảnh lên bằng nút đính kèm
- Nhập câu lệnh biến đổi
- Lặp lại kiểu cho đến khi bạn hài lòng với kết quả
- Tải kết quả xuống và lưu dưới dạng tệp
outputs/portrait.png - Chạy:
python create_identity.py --skip-generation(nếu cờ này được hỗ trợ) để tải hình ảnh được tạo theo cách thủ công lên
Phương pháp tương tác này rất phù hợp để thử nghiệm các câu lệnh và xem kết quả theo thời gian thực trước khi chuyển sang mã!
Kiến thức bạn học được (Thưởng thêm)
✓ Cách sử dụng tính năng biến đổi hình ảnh thành hình ảnh bằng Gemini
✓ Gửi nội dung đa phương thức (văn bản + hình ảnh) trong một tin nhắn
✓ Giữ nguyên hình ảnh gốc trong khi áp dụng tính năng chuyển đổi phong cách nghệ thuật
✓ Các yếu tố cần cân nhắc về quyền riêng tư đối với tính năng tạo nội dung dựa trên ảnh bằng AI
