ЁЯОм Gemini, Veo, рдФрд░ Cloud Run рдХреА рдорджрдж рд╕реЗ, рдПрдЖрдИ рдореЛрд╢рди рд▓реИрдм рдмрдирд╛рдирд╛ рдФрд░ рдЙрд╕реЗ рдбрд┐рдкреНрд▓реЙрдп рдХрд░рдирд╛

1. рдкрд░рд┐рдЪрдп

рдЖрдкрдХреЛ рдХреНрдпрд╛ рдмрдирд╛рдирд╛ рд╣реИ

Gemini Motion Lab, рдПрдЖрдИ рдХреА рдорджрдж рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдХрд┐рдпреЙрд╕реНрдХ рд╣реИ. рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛, рдбрд╛рдВрд╕ рдпрд╛ рдореЛрд╢рди рдХреА рдЫреЛрдЯреА рдХреНрд▓рд┐рдк рд░рд┐рдХреЙрд░реНрдб рдХрд░рддрд╛ рд╣реИ. рдЗрд╕рдХреЗ рдмрд╛рдж, рд╕рд┐рд╕реНрдЯрдо:

  1. Gemini рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ, рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддрд╛ рд╣реИ (рд╢рд░реАрд░ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ, рдлрд╝реЗрдЬрд╝, рдЯреЗрдВрдкреЛ, рдПрдирд░реНрдЬреА)
  2. Nano Banana (Gemini Flash Image) рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ, рд╕реНрдЯрд╛рдЗрд▓ рд╡рд╛рд▓реА рдЕрд╡рддрд╛рд░ рдЗрдореЗрдЬ рдЬрдирд░реЗрдЯ рдХрд░рддрд╛ рд╣реИ
  3. Veo рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ, рдПрдЖрдИ рд╡реАрдбрд┐рдпреЛ рдмрдирд╛рддрд╛ рд╣реИ. рдЗрд╕рдореЗрдВ рдЕрд╡рддрд╛рд░ рдХреЗ рд╕рд╛рде рдореЛрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
  4. рдпрд╣ рд╕реБрд╡рд┐рдзрд╛, рдмрдирд╛рддреА рд╣реИ. рдЗрд╕рдореЗрдВ рдУрд░рд┐рдЬрдирд▓ рд╡реАрдбрд┐рдпреЛ рдФрд░ рдПрдЖрдИ рд╕реЗ рдЬрдирд░реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╡реАрдбрд┐рдпреЛ, рджреЛрдиреЛрдВ рдХреЛ рд╕рд╛рде-рд╕рд╛рде рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
  5. рд╢реЗрдпрд░ рдХрд░реЗрдВ: рдпрд╣ рд╡рд┐рдХрд▓реНрдк, рдореЛрдмрд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд┐рдП рдЧрдП рдкреЗрдЬ рдкрд░ рдХреНрдпреВрдЖрд░ рдХреЛрдб рдХреЗ рдЬрд╝рд░рд┐рдП рдирддреАрдЬреЗ рд╢реЗрдпрд░ рдХрд░рддрд╛ рд╣реИ

рдЗрд╕ рдХреЛрдбрд▓реИрдм рдХреЗ рдЖрдЦрд┐рд░ рддрдХ, рдЖрдкрдХреЗ рдкрд╛рд╕ Google Cloud Run рдкрд░ рдбрд┐рдкреНрд▓реЙрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкреВрд░рд╛ рдбреЗрдореЛ рд╣реЛрдЧрд╛. рд╕рд╛рде рд╣реА, рдЖрдкрдХреЛ рдЗрд╕реЗ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рд╡рд╛рд▓реА рдПрдЖрдИ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдЧреА.

рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЦрд╛рд╕ рдЬрд╛рдирдХрд╛рд░реА

рдлрд╝рд╛рдЗрдирд▓ рдбреЗрдореЛ:

рдХрд╡рд░

рдореБрдЦреНрдп рдЯреЗрдХреНрдиреЛрд▓реЙрдЬреА

рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ

рдЯреЗрдХреНрдиреЛрд▓реЙрдЬреА

рдордХрд╕рдж

рдореЛрд╢рди рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг

Gemini Flash

рд╢рд░реАрд░ рдХреЗ рдореВрд╡рдореЗрдВрдЯ, рдлрд╝реЗрдЬрд╝, рдФрд░ рд╕реНрдЯрд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рд╡реАрдбрд┐рдпреЛ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛

рдЕрд╡рддрд╛рд░ рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛

Gemini Flash Image (Nano Banana)

рдХрд┐рд╕реА рдореБрдЦреНрдп рдлрд╝реНрд░реЗрдо рд╕реЗ, рд╕реНрдЯрд╛рдЗрд▓ рд╡рд╛рд▓рд╛ 1024├Ч1024 рдЕрд╡рддрд╛рд░ рдЬрдирд░реЗрдЯ рдХрд░рдирд╛

рд╡реАрдбрд┐рдпреЛ рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛

Veo 3.1

рдЕрд╡рддрд╛рд░ + рдореЛрд╢рди рдкреНрд░реЙрдореНрдкреНрдЯ рдХреА рдорджрдж рд╕реЗ рдПрдЖрдИ рд╡реАрдбрд┐рдпреЛ рдмрдирд╛рдирд╛

рдмреИрдХрдПрдВрдб

FastAPI + Python 3.11

рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдСрд░реНрдХреЗрд╕реНрдЯреНрд░реЗрд╢рди рд╡рд╛рд▓рд╛ рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░

рдлрд╝реНрд░рдВрдЯрдПрдВрдб

React + Vite + TypeScript

рдХреИрдорд░рд╛ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдФрд░ рд▓рд╛рдЗрд╡ рд╕реНрдЯреЗрдЯрд╕ рдХреЗ рд╕рд╛рде рдХрд┐рдСрд╕реНрдХ рдпреВрдЬрд╝рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдпреВрдЖрдИ)

рд╣реЛрд╕реНрдЯрд┐рдВрдЧ

Cloud Run

рд╕рд░реНрд╡рд░рд▓реЗрд╕ рдХрдВрдЯреЗрдирд░ рд╡рд╛рд▓рд╛ рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ

рдбрд┐рд╡рд╛рдЗрд╕ рдХрд╛ рд╕реНрдЯреЛрд░реЗрдЬ

Google Cloud Storage

рд╡реАрдбрд┐рдпреЛ рдЕрдкрд▓реЛрдб, рдлрд╝реНрд░реЗрдо, рдХрд╛рдЯреЗ рдЧрдП рд╡реАрдбрд┐рдпреЛ, рдФрд░ рдХрдВрдкреЛрдЬрд╝ рдХрд┐рдП рдЧрдП рдЖрдЙрдЯрдкреБрдЯ

2. ЁЯУж рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА рдХреНрд▓реЛрди рдХрд░рдирд╛

1. Cloud Shell Editor рдЦреЛрд▓реЗрдВ

ЁЯСЙ рдЕрдкрдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ Cloud Shell Editor рдЦреЛрд▓реЗрдВ.

рдЕрдЧрд░ рдЯрд░реНрдорд┐рдирд▓, рд╕реНрдХреНрд░реАрди рдкрд░ рд╕рдмрд╕реЗ рдиреАрдЪреЗ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ, рддреЛ:

  • рджреЗрдЦреЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ
  • рдЯрд░реНрдорд┐рдирд▓ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ

2. рдХреЛрдб рдХреНрд▓реЛрди рдХрд░рдирд╛

ЁЯСЙЁЯТ╗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА рдХреЛ рдХреНрд▓реЛрди рдХрд░реЗрдВ:

cd ~
git clone https://github.com/cuppibla/gemini-motion-lab-starter.git
cd gemini-motion-lab-starter

3. рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдПрдХреНрд╕рдкреНрд▓реЛрд░ рдХрд░рдирд╛

рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА рдХреЗ рд▓реЗрдЖрдЙрдЯ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:

gemini-motion-lab-starter/
тФЬтФАтФА backend/                     # FastAPI backend (Python 3.11)
тФВ   тФЬтФАтФА app/
тФВ   тФВ   тФЬтФАтФА main.py              # FastAPI app entry point
тФВ   тФВ   тФЬтФАтФА config.py            # Environment-based settings
тФВ   тФВ   тФЬтФАтФА routers/             # API endpoints (upload, analyze, generate, share...)
тФВ   тФВ   тФЬтФАтФА services/            # Business logic (Gemini, Veo, storage, pipeline...)
тФВ   тФВ   тФФтФАтФА prompts/             # AI prompt templates
тФВ   тФЬтФАтФА Dockerfile
тФВ   тФФтФАтФА pyproject.toml
тФЬтФАтФА frontend/                    # React + Vite + TypeScript
тФВ   тФЬтФАтФА src/                     # React components
тФВ   тФЬтФАтФА public/                  # Static assets
тФВ   тФЬтФАтФА Dockerfile
тФВ   тФФтФАтФА nginx.conf
тФЬтФАтФА init.sh                      # Create GCP project & link billing
тФЬтФАтФА billing-enablement.py        # Auto-link billing account
тФЬтФАтФА setup.sh                     # Create GCS bucket, service account, .env
тФФтФАтФА scripts/                     # Utility scripts

3. ЁЯЫая╕П рдХреНрд░реЗрдбрд┐рдЯ рдХрд╛ рджрд╛рд╡рд╛ рдХрд░рдирд╛ рдФрд░ GCP рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛

рдкрд╣рд▓рд╛ рд╣рд┐рд╕реНрд╕рд╛: рдмрд┐рд▓рд┐рдВрдЧ рдХреНрд░реЗрдбрд┐рдЯ рдкрд░ рджрд╛рд╡рд╛ рдХрд░рдирд╛

ЁЯСЙ рдЕрдкрдиреЗ Gmail рдЦрд╛рддреЗ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ, рдмрд┐рд▓рд┐рдВрдЧ рдЦрд╛рддреЗ рдХреЗ рдХреНрд░реЗрдбрд┐рдЯ рдкрд░ рджрд╛рд╡рд╛ рдХрд░реЗрдВ.

рджреВрд╕рд░рд╛ рд╣рд┐рд╕реНрд╕рд╛: рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛

ЁЯСЙЁЯТ╗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, init рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдПрдХреНрдЬрд╝реАрдХреНрдпреВрдЯреЗрдмрд▓ рдмрдирд╛рдПрдВ рдФрд░ рдЙрд╕реЗ рдЪрд▓рд╛рдПрдВ:

cd ~/gemini-motion-lab-starter
chmod +x init.sh
./init.sh

init.sh рд╕реНрдХреНрд░рд┐рдкреНрдЯ:

  1. gemini-motion-lab рдкреНрд░реАрдлрд╝рд┐рдХреНрд╕ рд╡рд╛рд▓рд╛ рдирдпрд╛ GCP рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ
  2. рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЖрдИрдбреА рдХреЛ ~/project_id.txt рдореЗрдВ рд╕реЗрд╡ рдХрд░реЗрдВ
  3. рдмрд┐рд▓рд┐рдВрдЧ рдХреА рдЬрд╝рд░реВрд░реА рд╢рд░реНрддреЗрдВ рдкреВрд░реА рдХрд░рдирд╛ рдФрд░ рдмрд┐рд▓рд┐рдВрдЧ рдЦрд╛рддреЗ рдХреЛ рдЕрдкрдиреЗ-рдЖрдк рд▓рд┐рдВрдХ рдХрд░рдирд╛

рддреАрд╕рд░рд╛ рдЪрд░рдг: рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рдФрд░ рдПрдкреАрдЖрдИ рдЪрд╛рд▓реВ рдХрд░рдирд╛

ЁЯСЙЁЯТ╗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рдЕрдкрдирд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЖрдИрдбреА рд╕реЗрдЯ рдХрд░реЗрдВ:

gcloud config set project $(cat ~/project_id.txt) --quiet

ЁЯСЙЁЯТ╗ рдЗрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдЬрд╝рд░реВрд░реА Google Cloud API рдЪрд╛рд▓реВ рдХрд░реЗрдВ. рдЗрд╕рдореЗрдВ ~1 рд╕реЗ 2 рдорд┐рдирдЯ рд▓рдЧрддреЗ рд╣реИрдВ:

gcloud services enable \
    run.googleapis.com \
    cloudbuild.googleapis.com \
    aiplatform.googleapis.com \
    storage.googleapis.com \
    artifactregistry.googleapis.com

4. ЁЯза [READ ONLY] Understanding the Architecture

рдЗрд╕ рд╕реЗрдХреНрд╢рди рдореЗрдВ, рдПрдЖрдИ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рдПрдВрдб-рдЯреВ-рдПрдВрдб рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ. рдХреЛрдИ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдЬрд╝рд░реВрд░реА рдирд╣реАрдВ рд╣реИ тАФ рдмрд╕ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЗрд╕реЗ рд╕рдордЭ рд▓реЗрдВ.

рдПрдЖрдИ рдкрд╛рдЗрдкрд▓рд╛рдЗрди

рдЬрдм рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреАрдСрд╕реНрдХ рдкрд░ рдореЛрд╢рди рдХреНрд▓рд┐рдк рд░рд┐рдХреЙрд░реНрдб рдХрд░рддрд╛ рд╣реИ, рддреЛ рдкрд╛рдВрдЪ рдЪрд░рдг рдХреНрд░рдо рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ:

рдкрд╣рд▓рд╛ рдЪрд░рдг: рд╡реАрдбрд┐рдпреЛ рдЕрдкрд▓реЛрдб рдХрд░рдирд╛

рдлрд╝реНрд░рдВрдЯрдПрдВрдб, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдХреИрдорд░реЗ рд╕реЗ рдкрд╛рдВрдЪ рд╕реЗрдХрдВрдб рдХрд╛ WebM рдХреНрд▓рд┐рдк рд░рд┐рдХреЙрд░реНрдб рдХрд░рддрд╛ рд╣реИ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдЗрд╕реЗ рдмреИрдХрдПрдВрдб рдХреЗ /api/upload рдПрдВрдбрдкреЙрдЗрдВрдЯ рдХреЗ рдЬрд╝рд░рд┐рдП Google Cloud Storage рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░рддрд╛ рд╣реИ.

POST /api/upload/{video_id}  тЖТ  gs://BUCKET/uploads/{video_id}.webm

рджреВрд╕рд░рд╛ рдЪрд░рдг: Gemini рдХреА рдорджрдж рд╕реЗ рдореЛрд╢рди рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛

рдмреИрдХрдПрдВрдб, рдЕрдкрд▓реЛрдб рдХрд┐рдП рдЧрдП рд╡реАрдбрд┐рдпреЛ рдХреЛ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП Gemini Flash (gemini-3-flash-preview) рдХреЛ рднреЗрдЬрддрд╛ рд╣реИ.

рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ (backend/app/services/gemini_service.py):

рдпрд╣ рд╕реЗрд╡рд╛, Vertex AI SDK рдХреЗ client.models.generate_content() рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреА рд╣реИ. рдЗрд╕рдореЗрдВ рд╡реАрдбрд┐рдпреЛ рдХреЛ Part.from_uri рдЗрдирдкреБрдЯ рдФрд░ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрдб рдкреНрд░реЙрдореНрдкреНрдЯ рдХреЗ рддреМрд░ рдкрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ. response_mime_type="application/json" рд╕реЗ рдпрд╣ рдкрдХреНрдХрд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ Gemini, рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓рд╛ JSON рджрд┐рдЦрд╛рддрд╛ рд╣реИ. рдпрд╣ рдореЙрдбрд▓, рдореЛрд╢рди рдлрд╝реЗрдЬрд╝ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рддрд░реНрдХ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, ThinkingConfig(thinking_budget=1024) рдХрд╛ рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддрд╛ рд╣реИ.

# Simplified from gemini_service.py
response = client.models.generate_content(
    model="gemini-3-flash-preview",
    contents=[
        types.Part.from_uri(file_uri=gcs_uri, mime_type="video/webm"),
        MOTION_ANALYSIS_PROMPT,  # detailed prompt template
    ],
    config=types.GenerateContentConfig(
        response_mime_type="application/json",
        thinking_config=types.ThinkingConfig(thinking_budget=1024),
    ),
)
analysis = json.loads(response.text)

рддреАрд╕рд░рд╛ рдЪрд░рдг: Nano Banana рдХреА рдорджрдж рд╕реЗ рдЕрд╡рддрд╛рд░ рдЬрдирд░реЗрдЯ рдХрд░рдирд╛

рд╡реАрдбрд┐рдпреЛ рд╕реЗ рдирд┐рдХрд╛рд▓реЗ рдЧрдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рдлрд╝реНрд░реЗрдо рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ, Gemini Flash Image (gemini-3.1-flash-image-preview) 1024├Ч1024 рд╕рд╛рдЗрдЬрд╝ рдХрд╛ рд╕реНрдЯрд╛рдЗрд▓рд┐рд╢ рдЕрд╡рддрд╛рд░ рдЬрдирд░реЗрдЯ рдХрд░рддрд╛ рд╣реИ.

рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ (backend/app/services/nano_banana_service.py):

# Simplified from nano_banana_service.py
response = client.models.generate_content(
    model="gemini-3.1-flash-image-preview",
    contents=[
        types.Content(role="user", parts=[
            types.Part.from_bytes(data=frame_bytes, mime_type="image/png"),
            types.Part.from_text(text=avatar_prompt),
        ])
    ],
    config=types.GenerateContentConfig(
        response_modalities=["IMAGE"],
        image_config=types.ImageConfig(
            aspect_ratio="1:1",
            output_mime_type="image/png",
        ),
    ),
)

рдЬрдирд░реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЕрд╡рддрд╛рд░ PNG, GCS рдкрд░ рдЕрдкрд▓реЛрдб рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЕрдЧрд▓реЗ рдЪрд░рдг рдкрд░ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ.

рдЪреМрдерд╛ рдЪрд░рдг: Veo рдХреА рдорджрдж рд╕реЗ рд╡реАрдбрд┐рдпреЛ рдЬрдирд░реЗрдЯ рдХрд░рдирд╛

рдЕрд╡рддрд╛рд░ рдХреА рдЗрдореЗрдЬ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓, Veo 3.1 (veo-3.1-fast-generate-001) рдХреЗ рд▓рд┐рдП рд░реЗрдлрд╝рд░рдВрд╕ рдРрд╕реЗрдЯ рдХреЗ рддреМрд░ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ. рдЗрд╕рд╕реЗ рдЖрда рд╕реЗрдХрдВрдб рдХрд╛ рдПрдЖрдИ рд╡реАрдбрд┐рдпреЛ рдЬрдирд░реЗрдЯ рд╣реЛрддрд╛ рд╣реИ.

рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ (backend/app/services/veo_service.py):

# Simplified from veo_service.py
config = GenerateVideosConfig(
    reference_images=[
        VideoGenerationReferenceImage(
            image=Image(gcs_uri=avatar_gcs_uri, mime_type="image/png"),
            reference_type="ASSET",
        )
    ],
    aspect_ratio="16:9",
    duration_seconds=8,
    output_gcs_uri=f"gs://{BUCKET}/output/{video_id}/",
)
operation = client.models.generate_videos(
    model="veo-3.1-fast-generate-001",
    prompt=veo_prompt,
    config=config,
)

Veo рдЬрдирд░реЗрд╢рди рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╣реИ. рдпрд╣ рддреБрд░рдВрдд рдСрдкрд░реЗрд╢рди рдЖрдИрдбреА рджрд┐рдЦрд╛рддрд╛ рд╣реИ. рдмреИрдХрдПрдВрдб, рдСрдкрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рддрдХ (10 рдорд┐рдирдЯ рддрдХ) рдкреЛрд▓ рдХрд░рддрд╛ рд╣реИ.

рдкрд╛рдВрдЪрд╡рд╛рдВ рдЪрд░рдг: рдкреЛрд╕реНрдЯ-рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдкрд╛рдЗрдкрд▓рд╛рдЗрди

Veo рдХреЗ рдкреНрд░реЛрд╕реЗрд╕ рдкреВрд░реА рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдкрд╛рдЗрдкрд▓рд╛рдЗрди (backend/app/services/pipeline.py) рдЕрдкрдиреЗ-рдЖрдк рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддреА рд╣реИ:

  1. Veo рдХреЗ 8 рд╕реЗрдХрдВрдб рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ 3 рд╕реЗрдХрдВрдб рддрдХ рдХрд╛рдЯ-рдЫрд╛рдВрдЯ рдХрд░реЛ
  2. рд╕рд╛рдЗрдб-рдмрд╛рдп-рд╕рд╛рдЗрдб рд╡реАрдбрд┐рдпреЛ рдХрдВрдкреЛрдЬрд╝ рдХрд░реЗрдВ (рдмрд╛рдПрдВ рдУрд░ рдУрд░рд┐рдЬрдирд▓ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдФрд░ рджрд╛рдИрдВ рдУрд░ рдПрдЖрдИ рд╡реАрдбрд┐рдпреЛ)
  3. рдХрдВрдкреЛрдЬрд╝ рдХрд┐рдП рдЧрдП рд╡реАрдбрд┐рдпреЛ рдХреЛ GCS рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ
  4. рдХрддрд╛рд░ рдореЗрдВ рдореМрдЬреВрдж рд╕реНрд▓реЙрдЯ рдХреЛ рд░рд┐рд▓реАрдЬрд╝ рдХрд░реЗрдВ

рдпрд╣ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдореЗрдВ рдЪрд▓рддреА рд╣реИ asyncio.Task тАФ рдХреАрдСрд╕реНрдХ рдХреЗ рдлрд╝реНрд░рдВрдЯрдПрдВрдб рдХреЛ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реЛрддреА.

рдХрддрд╛рд░ рд╡рд╛рд▓рд╛ рд╕рд┐рд╕реНрдЯрдо

Veo рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрд╝реНрдпрд╛рджрд╛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реЛрддреА рд╣реИ. рдЗрд╕рд▓рд┐рдП, рд╕рд┐рд╕реНрдЯрдо рдПрдХ рд╕рд╛рде рдЬрд╝реНрдпрд╛рджрд╛ рд╕реЗ рдЬрд╝реНрдпрд╛рджрд╛ рддреАрди рдЯрд╛рд╕реНрдХ рдкреВрд░реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

# backend/app/routers/queue.py
MAX_CONCURRENT_JOBS = 3

@router.get("/queue/status")
async def queue_status():
    return {
        "active_jobs": len(_active_jobs),
        "max_jobs": MAX_CONCURRENT_JOBS,
        "available": len(_active_jobs) < MAX_CONCURRENT_JOBS,
    }

рдлрд╝реНрд░рдВрдЯрдПрдВрдб, рдирдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реЗрд╢рди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ GET /api/queue/status рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ. рдЬрдм рдХреЛрдИ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдкреВрд░реА рд╣реЛ рдЬрд╛рддреА рд╣реИ рдФрд░ complete(video_id) рдХреЛ рдХреЙрд▓ рдХрд░рддреА рд╣реИ, рддреЛ рдЕрдЧрд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рд╕реНрд▓реЙрдЯ рдЦреБрд▓ рдЬрд╛рддрд╛ рд╣реИ.

Cloud Run тАФ рдмрд┐рдирд╛ рд╕рд░реНрд╡рд░ рд╡рд╛рд▓реЗ рдХрдВрдЯреЗрдирд░

рдмреИрдХрдПрдВрдб рдФрд░ рдлрд╝реНрд░рдВрдЯрдПрдВрдб, рджреЛрдиреЛрдВ рдХреЛ Cloud Run рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рддреМрд░ рдкрд░ рдбрд┐рдкреНрд▓реЙрдп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

рд╕реЗрд╡рд╛

рдордХрд╕рдж

рдХреБрдВрдЬреА рдХрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди

рдмреИрдХрдПрдВрдб

FastAPI API рд╕рд░реНрд╡рд░

2 рдЬреАрдмреА рдореЗрдореЛрд░реА (ffmpeg рдХреЗ рдЬрд╝рд░рд┐рдП рд╡реАрдбрд┐рдпреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)

реЮреНрд░рдВрдЯрдПрдВрдб

Nginx рд╕реЗ рд╕реНрдЯреИрдЯрд┐рдХ React рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдореЗрдореЛрд░реА

5. тЪЩя╕П рд╕реЗрдЯрдЕрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдирд╛

1. рдСрдЯреЛрдореЗрдЯреЗрдб рд╕реЗрдЯрдЕрдк рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛

setup.sh рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдЬрд╝рд░реВрд░реА рдХреНрд▓рд╛рдЙрдб рд╕рдВрд╕рд╛рдзрди рдмрдирд╛рддреА рд╣реИ рдФрд░ рдЖрдкрдХреА .env рдлрд╝рд╛рдЗрд▓ рдЬрдирд░реЗрдЯ рдХрд░рддреА рд╣реИ.

ЁЯСЙЁЯТ╗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдПрдХреНрдЬрд╝реАрдХреНрдпреВрдЯреЗрдмрд▓ рдмрдирд╛рдПрдВ рдФрд░ рдЙрд╕реЗ рдЪрд▓рд╛рдПрдВ:

cd ~/gemini-motion-lab-starter
chmod +x setup.sh
./setup.sh

2. рдЖрдИрдПрдПрдо рдХреА рднреВрдорд┐рдХрд╛рдПрдВ рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛

рдЕрдм рд╕реЗрд╡рд╛ рдЦрд╛рддреЗ рдХреЛ рдЬрд╝рд░реВрд░реА рдЕрдиреБрдорддрд┐рдпрд╛рдВ рджреЗрдВ.

ЁЯСЙЁЯТ╗ рдЕрдкрдирд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЖрдИрдбреА рд╕реЗрдЯ рдХрд░рдиреЗ рдФрд░ рддреАрдиреЛрдВ рднреВрдорд┐рдХрд╛рдПрдВ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпреЗ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВ:

export PROJECT_ID=$(cat ~/project_id.txt)

# 1. Storage Admin тАФ upload/download videos and frames
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:gemini-motion-lab-sa@${PROJECT_ID}.iam.gserviceaccount.com" \
  --role="roles/storage.admin"

# 2. Vertex AI User тАФ call Gemini and Veo models
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:gemini-motion-lab-sa@${PROJECT_ID}.iam.gserviceaccount.com" \
  --role="roles/aiplatform.user"

# 3. Service Account Token Creator тАФ generate signed URLs for GCS
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")
COMPUTE_SA="${PROJECT_NUMBER}-compute@developer.gserviceaccount.com"

gcloud iam service-accounts add-iam-policy-binding \
  gemini-motion-lab-sa@${PROJECT_ID}.iam.gserviceaccount.com \
  --project=$PROJECT_ID \
  --member="serviceAccount:${COMPUTE_SA}" \
  --role="roles/iam.serviceAccountTokenCreator"

3. рдЕрдкрдиреА .env рдлрд╝рд╛рдЗрд▓ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдирд╛

ЁЯСЙЁЯТ╗ рдЬрдирд░реЗрдЯ рдХреА рдЧрдИ .env рдлрд╝рд╛рдЗрд▓ рджреЗрдЦреЗрдВ:

cat .env

рдЖрдкрдХреЛ рдпрд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:

GOOGLE_CLOUD_PROJECT=your-project-id
GOOGLE_CLOUD_LOCATION=us-central1
GCS_BUCKET=gemini-motion-lab-your-project-id
GCS_SIGNING_SA=gemini-motion-lab-sa@your-project-id.iam.gserviceaccount.com
GOOGLE_GENAI_USE_VERTEXAI=true
MOCK_AI=false

6. ЁЯЪА рдмреИрдХрдПрдВрдб рдбрд┐рдкреНрд▓реЙрдп рдХрд░рдирд╛

1. рдмреИрдХрдПрдВрдб Dockerfile рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА

рдбрдкреНрд▓реЙрдп рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХрдВрдЯреЗрдирд░ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:

# backend/Dockerfile
FROM python:3.11-slim                           # Python base image
RUN apt-get update && apt-get install -y \
    ffmpeg libgl1 libglib2.0-0 \                # ffmpeg for video processing
    && rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY pyproject.toml .
RUN pip install --no-cache-dir .                # Install Python dependencies
COPY app/ ./app/                                # Copy application code
EXPOSE 8080
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8080"]

2. Cloud Run рдкрд░ рдбрд┐рдкреНрд▓реЙрдп рдХрд░рдирд╛

ЁЯСЙЁЯТ╗ рдЕрдкрдиреЗ рдПрдирд╡рд╛рдпрд░рдореЗрдВрдЯ рд╡реИрд░рд┐рдПрдмрд▓ рд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдбрд┐рдкреНрд▓реЙрдп рдХрд░реЗрдВ:

source .env

cd ~/gemini-motion-lab-starter/backend

gcloud run deploy gemini-motion-lab-backend \
  --source . \
  --region us-central1 \
  --allow-unauthenticated \
  --min-instances 1 \
  --max-instances 3 \
  --memory 2Gi \
  --port 8080 \
  --project $GOOGLE_CLOUD_PROJECT \
  --set-env-vars "GOOGLE_CLOUD_PROJECT=$GOOGLE_CLOUD_PROJECT,GOOGLE_CLOUD_LOCATION=$GOOGLE_CLOUD_LOCATION,GCS_BUCKET=$GCS_BUCKET,GCS_SIGNING_SA=$GCS_SIGNING_SA,GOOGLE_GENAI_USE_VERTEXAI=$GOOGLE_GENAI_USE_VERTEXAI,MOCK_AI=$MOCK_AI"

рдЗрд╕рдореЗрдВ рдХрд░реАрдм рддреАрди рд╕реЗ рдкрд╛рдВрдЪ рдорд┐рдирдЯ рд▓рдЧрддреЗ рд╣реИрдВ. Cloud Build рдпреЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛:

  1. рдЕрдкрдирд╛ рд╕реЛрд░реНрд╕ рдХреЛрдб рдЕрдкрд▓реЛрдб рдХрд░рдирд╛
  2. Docker рдЗрдореЗрдЬ рдмрдирд╛рдирд╛
  3. рдЗрд╕реЗ Artifact Registry рдореЗрдВ рдкреБрд╢ рдХрд░реЗрдВ
  4. рдЗрд╕реЗ Cloud Run рдкрд░ рдбрд┐рдкреНрд▓реЙрдп рдХрд░реЗрдВ

3. рдмреИрдХрдПрдВрдб рдпреВрдЖрд░рдПрд▓ рд╕реЗрд╡ рдХрд░рдирд╛

ЁЯСЙЁЯТ╗ рдбрд┐рдкреНрд▓реЙрдп рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдмреИрдХрдПрдВрдб рдпреВрдЖрд░рдПрд▓ рд╕реЗрд╡ рдХрд░реЗрдВ:

BACKEND_URL=$(gcloud run services describe gemini-motion-lab-backend \
  --region us-central1 \
  --format="value(status.url)" \
  --project $GOOGLE_CLOUD_PROJECT)

echo "Backend URL: $BACKEND_URL"

4. рдмреИрдХрдПрдВрдб рд╢реЗрдпрд░ рдпреВрдЖрд░рдПрд▓ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛

рдмреИрдХрдПрдВрдб, рдХреНрдпреВрдЖрд░ рдХреЛрдб рдЬрдирд░реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рд▓реЛрдЧ рдЕрдкрдиреЗ рд╡реАрдбрд┐рдпреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХреЗрдВ. рдЗрд╕рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдЕрдкрдиреЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдпреВрдЖрд░рдПрд▓ рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП.

ЁЯСЙЁЯТ╗ рдмреИрдХрдПрдВрдб рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдЙрд╕рдХреЗ рдпреВрдЖрд░рдПрд▓ рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ:

gcloud run services update gemini-motion-lab-backend \
  --region us-central1 \
  --update-env-vars PUBLIC_BASE_URL=$BACKEND_URL \
  --project $GOOGLE_CLOUD_PROJECT

5. рдмреИрдХрдПрдВрдб рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдирд╛

ЁЯСЙЁЯТ╗ рд╣реЗрд▓реНрде рдПрдВрдбрдкреЙрдЗрдВрдЯ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ:

curl $BACKEND_URL/api/health

рдЕрдиреБрдорд╛рдирд┐рдд рдЖрдЙрдЯрдкреБрдЯ:

{"status":"ok"}

ЁЯСЙЁЯТ╗ рдХрддрд╛рд░ рдХрд╛ рд╕реНрдЯреЗрдЯрд╕ рджреЗрдЦреЗрдВ:

curl $BACKEND_URL/api/queue/status

рдЕрдиреБрдорд╛рдирд┐рдд рдЖрдЙрдЯрдкреБрдЯ:

{"active_jobs":0,"max_jobs":3,"available":true}

7. ЁЯОи рдлрд╝реНрд░рдВрдЯрдПрдВрдб рдбрд┐рдкреНрд▓реЙрдп рдХрд░рдирд╛

1. рдлрд╝реНрд░рдВрдЯрдПрдВрдб Dockerfile рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА

рдлрд╝реНрд░рдВрдЯрдПрдВрдб, рдорд▓реНрдЯреА-рд╕реНрдЯреЗрдЬ рдмрд┐рд▓реНрдб рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддрд╛ рд╣реИ. рдЗрд╕рдореЗрдВ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ React рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдЙрд╕реЗ Nginx рдХреЗ рд╕рд╛рде рдкрд░реЛрд╕рд╛ рдЬрд╛рддрд╛ рд╣реИ:

# frontend/Dockerfile
FROM node:20-alpine AS builder               # Stage 1: Build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
ARG VITE_API_BASE=https://...                # Backend URL baked at build time
ENV VITE_API_BASE=$VITE_API_BASE
RUN npm run build                            # Produces static files in /app/dist

FROM nginx:alpine                            # Stage 2: Serve
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 8080

2. Cloud Run рдкрд░ рдбрд┐рдкреНрд▓реЙрдп рдХрд░рдирд╛

ЁЯСЙЁЯТ╗ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдмреИрдХрдПрдВрдб рдпреВрдЖрд░рдПрд▓ рдХреЛ .env рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦреЗрдВ, рддрд╛рдХрд┐ Vite рдЗрд╕реЗ рдмрд┐рд▓реНрдб рдЯрд╛рдЗрдо рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХреЗ:

cd ~/gemini-motion-lab-starter/frontend
echo "VITE_API_BASE=$BACKEND_URL" > .env

ЁЯСЙЁЯТ╗ рдЕрдм рдлрд╝реНрд░рдВрдЯрдПрдВрдб рдбрд┐рдкреНрд▓реЙрдп рдХрд░реЗрдВ:

gcloud run deploy gemini-motion-lab-frontend \
  --source . \
  --region us-central1 \
  --allow-unauthenticated \
  --min-instances 1 \
  --max-instances 3 \
  --port 8080 \
  --project $GOOGLE_CLOUD_PROJECT

рдЗрд╕рдореЗрдВ рдХрд░реАрдм рджреЛ рд╕реЗ рддреАрди рдорд┐рдирдЯ рд▓рдЧрддреЗ рд╣реИрдВ.

3. рдлрд╝реНрд░рдВрдЯрдПрдВрдб рдпреВрдЖрд░рдПрд▓ рдкрд╛рдирд╛

ЁЯСЙЁЯТ╗ рдлрд╝реНрд░рдВрдЯрдПрдВрдб рдпреВрдЖрд░рдПрд▓ рд╡рд╛рдкрд╕ рдкрд╛рдПрдВ рдФрд░ рдЙрд╕реЗ рдЦреЛрд▓реЗрдВ:

FRONTEND_URL=$(gcloud run services describe gemini-motion-lab-frontend \
  --region us-central1 \
  --format="value(status.url)" \
  --project $GOOGLE_CLOUD_PROJECT)

echo "ЁЯОм Your Gemini Motion Lab is live at: $FRONTEND_URL"

ЁЯСЙ рдЕрдкрдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдпреВрдЖрд░рдПрд▓ рдЦреЛрд▓реЗрдВ. рдЖрдкрдХреЛ Gemini Motion Lab рдХрд╛ рдХрд┐рдпреЙрд╕реНрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджрд┐рдЦреЗрдЧрд╛!

8. ЁЯОо [рдЬрд╝рд░реВрд░реА рдирд╣реАрдВ] рдбреЗрдореЛ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдирд╛

1. рдореЛрд╢рди рд░рд┐рдХреЙрд░реНрдб рдХрд░рдирд╛

  1. рдЕрдкрдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдлрд╝реНрд░рдВрдЯрдПрдВрдб рдпреВрдЖрд░рдПрд▓ рдЦреЛрд▓реЗрдВ. рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк Chrome рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ, рддрд╛рдХрд┐ рдХреИрдорд░реЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ
  2. рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╢реБрд░реВ рдХрд░реЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ
  3. рдХрд░реАрдм рдкрд╛рдВрдЪ рд╕реЗрдХрдВрдб рддрдХ рдирд╛рдЪреЗрдВ рдпрд╛ рд╣рд┐рд▓реЗрдВ-рдбреБрд▓реЗрдВ тАФ рд╣рд╛рде рдХреЛ рддреЗрдЬрд╝реА рд╕реЗ рдШреБрдорд╛рдиреЗ рдФрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреЛрдЬрд╝ рджреЗрдиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рдирддреАрдЬреЗ рдорд┐рд▓рддреЗ рд╣реИрдВ
  4. рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдЕрдкрдиреЗ-рдЖрдк рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧреА рдФрд░ рдЕрдкрд▓реЛрдб рд╣реЛ рдЬрд╛рдПрдЧреА

2. рдПрдЖрдИ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рджреЗрдЦрдирд╛

рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рд░реАрдпрд▓ рдЯрд╛рдЗрдо рдореЗрдВ рдЪрд▓рдиреЗ рдХреА рдЬрд╛рдирдХрд╛рд░реА рджрд┐рдЦреЗрдЧреА:

рдлрд╝реЗрдЬрд╝ (рдЪрд░рдг)

рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ

рдХреБрд▓ рд╕рдордп

рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ...

Gemini Flash, рд╡реАрдбрд┐рдпреЛ рдореЗрдВ рдореМрдЬреВрдж рдЪреАрдЬрд╝реЛрдВ рдХреА рдЧрддрд┐рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдкреИрдЯрд░реНрди рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддрд╛ рд╣реИ

~5-10 рд╕реЗрдХрдВрдб

рдЕрд╡рддрд╛рд░ рдЬрдирд░реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ...

Nano Banana, рдЖрдкрдХреЗ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рдлрд╝реНрд░реЗрдо рд╕реЗ рд╕реНрдЯрд╛рдЗрд▓ рд╡рд╛рд▓рд╛ рдЕрд╡рддрд╛рд░ рдмрдирд╛рддрд╛ рд╣реИ

~8-12 рд╕реЗ┬░

рд╡реАрдбрд┐рдпреЛ рдмрдирд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ...

Veo 3.1, рдЕрд╡рддрд╛рд░ рдФрд░ рдореЛрд╢рди рдкреНрд░реЙрдореНрдкреНрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдЖрдИ рд╡реАрдбрд┐рдпреЛ рдЬрдирд░реЗрдЯ рдХрд░рддрд╛ рд╣реИ

~60 рд╕реЗ 120 рд╕реЗрдХрдВрдб

рд▓рд┐рдЦрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ...

ffmpeg, рд╡реАрдбрд┐рдпреЛ рдХреЛ рдЯреНрд░рд┐рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдЧрд▓-рдмрдЧрд▓ рдореЗрдВ рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рджреЗрддрд╛ рд╣реИ

~5-10 рд╕реЗрдХрдВрдб

3. рдЕрдкрдиреА рдмрдирд╛рдИ рдЧрдИ рдЗрдореЗрдЬ рд╢реЗрдпрд░ рдХрд░рдирд╛

рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдкреВрд░реА рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж:

  1. рдХрд┐рдпреЛрд╕реНрдХ рдХреА рд╕реНрдХреНрд░реАрди рдкрд░ рдХреНрдпреВрдЖрд░ рдХреЛрдб рджрд┐рдЦрддрд╛ рд╣реИ
  2. рдЕрдкрдиреЗ рдлрд╝реЛрди рд╕реЗ рдХреНрдпреВрдЖрд░ рдХреЛрдб рд╕реНрдХреИрди рдХрд░реЗрдВ
  3. рдЖрдкрдХреЛ рдореЛрдмрд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╢реЗрдпрд░ рдкреЗрдЬ рджрд┐рдЦреЗрдЧрд╛. рдЗрд╕ рдкрд░ рдЖрдкрдХрд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╡реАрдбрд┐рдпреЛ рд╣реЛрдЧрд╛

4. рдмреИрдХрдПрдВрдб рд▓реЙрдЧ рджреЗрдЦрдирд╛

ЁЯСЙЁЯТ╗ рдкрд░реНрджреЗ рдХреЗ рдкреАрдЫреЗ рдХреА рдЧрддрд┐рд╡рд┐рдзрд┐рдпрд╛рдВ рджреЗрдЦреЗрдВ:

gcloud logging read \
  "resource.type=cloud_run_revision AND resource.labels.service_name=gemini-motion-lab-backend" \
  --limit=30 \
  --project $GOOGLE_CLOUD_PROJECT \
  --format="value(timestamp,textPayload)" \
  --freshness=10m

рдЖрдкрдХреЛ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЛ рдЯреНрд░реЗрд╕ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд▓реЙрдЧ рд▓рд╛рдЗрдиреЗрдВ рджрд┐рдЦреЗрдВрдЧреА:

Pipeline started for video_id=abc123
Gemini model used: gemini-3-flash-preview
Avatar generated: style=pixel-hero size=450KB time=8.2s
Veo model used: veo-3.1-fast-generate-001
Pipeline: Veo complete for video_id=abc123
Pipeline: trimmed video uploaded
Pipeline: composed video uploaded
Pipeline complete for video_id=abc123

5. рдХрддрд╛рд░ рдХреЛ рдореЙрдирд┐рдЯрд░ рдХрд░рдирд╛

ЁЯСЙЁЯТ╗ рджреЗрдЦреЗрдВ рдХрд┐ рдХрд┐рддрдиреЗ рдЬреЙрдм рдЪрд▓ рд░рд╣реЗ рд╣реИрдВ:

curl $BACKEND_URL/api/queue/status

рдЕрдЧрд░ рддреАрди рд╕реЗрд╢рди рдПрдХ рд╕рд╛рде рдЪрд╛рд▓реВ рд╣реИрдВ, рддреЛ рдЬрд╡рд╛рдм рдореЗрдВ рдпрд╣ рджрд┐рдЦреЗрдЧрд╛:

{"active_jobs":3,"max_jobs":3,"available":false}

рдирдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рддрдм рддрдХ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛, рдЬрдм рддрдХ рдХреЛрдИ рд╕реНрд▓реЙрдЯ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛.

9. ЁЯОЙ рдирд┐рд╖реНрдХрд░реНрд╖

рдЖрдкрдиреЗ рдХреНрдпрд╛ рдмрдирд╛рдпрд╛ рд╣реИ

тЬЕ рдПрдЖрдИ рдХреА рдорджрдж рд╕реЗ рдореЛрд╢рди рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ тАФ Gemini Flash, рд╡реАрдбрд┐рдпреЛ рдореЗрдВ рдореМрдЬреВрдж рдореЛрд╢рди, рдЯреЗрдВрдкреЛ, рдФрд░ рд╕реНрдЯрд╛рдЗрд▓ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддрд╛ рд╣реИ

тЬЕ рдЕрд╡рддрд╛рд░ рдЬрдирд░реЗрдЯ рдХрд░рдирд╛ тАФ Nano Banana, рд╡реАрдбрд┐рдпреЛ рдлрд╝реНрд░реЗрдо рд╕реЗ рд╕реНрдЯрд╛рдЗрд▓ рд╡рд╛рд▓реЗ рдЕрд╡рддрд╛рд░ рдЬрдирд░реЗрдЯ рдХрд░рддрд╛ рд╣реИ

тЬЕ рдПрдЖрдИ рд╕реЗ рд╡реАрдбрд┐рдпреЛ рдЬрдирд░реЗрдЯ рдХрд░рдирд╛ тАФ Veo 3.1, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдЧрддрд┐ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рдирдП рд╡реАрдбрд┐рдпреЛ рдЬрдирд░реЗрдЯ рдХрд░рддрд╛ рд╣реИ

тЬЕ рдПрд╕рд┐рдВрдХ рдкрд╛рдЗрдкрд▓рд╛рдЗрди тАФ рдЗрд╕рдореЗрдВ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдФрд░ рдХреНрдпреВ рдореИрдиреЗрдЬрдореЗрдВрдЯ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдорд┐рд▓рддреА рд╣реИ. рдПрдХ рд╕рд╛рде рдЬрд╝реНрдпрд╛рджрд╛ рд╕реЗ рдЬрд╝реНрдпрд╛рджрд╛ рддреАрди рдкреНрд░реЛрд╕реЗрд╕ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ

тЬЕ рд╕рд╛рдЗрдб-рдмрд╛рдп-рд╕рд╛рдЗрдб рдХрдВрдкреЛрдЬрд╝рд┐рд╢рди тАФ ffmpeg рдХреА рдорджрдж рд╕реЗ рд╡реАрдбрд┐рдпреЛ рдХрдВрдкреЛрдЬрд╝рд┐рдЯ рдХрд░рдирд╛

тЬЕ Cloud Run рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ тАФ рд╕рд░реНрд╡рд░рд▓реЗрд╕, рдСрдЯреЛ-рд╕реНрдХреЗрд▓рд┐рдВрдЧ, рд╕рд░реНрд╡рд░ рдореИрдиреЗрдЬрдореЗрдВрдЯ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ

рдЖрдкрдиреЗ рдЬреЛ рдореБрдЦреНрдп рдХреЙрдиреНрд╕реЗрдкреНрдЯ рд╕реАрдЦреЗ

  1. Gemini Multimodal тАФ рд╡реАрдбрд┐рдпреЛ рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рддреМрд░ рдкрд░ рднреЗрдЬрдирд╛ рдФрд░ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрдб JSON рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкрд╛рдирд╛
  2. Nano Banana (Gemini рдХреА рдЗрдореЗрдЬ рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛) тАФ рдЕрд╡рддрд╛рд░ рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд░реЗрдлрд╝рд░рдВрд╕ рдЗрдореЗрдЬ рдФрд░ рд╕реНрдЯрд╛рдЗрд▓ рдкреНрд░реЙрдореНрдкреНрдЯ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛
  3. Veo 3.1 тАФ рдЗрд╕рдореЗрдВ рд░реЗрдлрд╝рд░рдВрд╕ рдРрд╕реЗрдЯ рдФрд░ рдЯреЗрдХреНрд╕реНрдЯ рдкреНрд░реЙрдореНрдкреНрдЯ рдХреА рдорджрдж рд╕реЗ, рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рддрд░реАрдХреЗ рд╕реЗ рд╡реАрдбрд┐рдпреЛ рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдорд┐рд▓рддреА рд╣реИ
  4. Cloud Run тАФ рдПрдирд╡рд╛рдпрд░рдореЗрдВрдЯ рд╡реИрд░рд┐рдПрдмрд▓ рдФрд░ рдЕрдкрдиреЗ-рдЖрдк рд╕реНрдХреЗрд▓ рд╣реЛрдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рд╛рде рдХрдВрдЯреЗрдирд░ рдбрд┐рдкреНрд▓реЙрдп рдХрд░рдирд╛
  5. рдПрд╕рд┐рдВрдХ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдкреИрдЯрд░реНрди тАФ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдПрдЖрдИ рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреЗ рд▓рд┐рдП, asyncio.Task рдХреЗ рд╕рд╛рде рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдЯрд╛рд╕реНрдХ рдХреЛ рддреБрд░рдВрдд рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рднреВрд▓ рдЬрд╛рдПрдВ
  6. рдХрддрд╛рд░ рдореИрдиреЗрдЬрдореЗрдВрдЯ тАФ рдПрдЖрдИ рд╕реЗ рдЬреБрдбрд╝реЗ рдПрдХ рд╕рд╛рде рдХрдИ рдЯрд╛рд╕реНрдХ рдкреВрд░реЗ рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдкрд░ рджрд░ рд╕реАрдорд╛ рд▓рд╛рдЧреВ рдХрд░рдирд╛, рддрд╛рдХрд┐ рд▓рд╛рдЧрдд рдФрд░ рдПрдкреАрдЖрдИ рдХреЛрдЯрд╛ рдХреЛ рдХрдВрдЯреНрд░реЛрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ

рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд░реАрдХреИрдк

рдЕрдЧрд▓рд╛ рдЪрд░рдг?

  • рдЕрд╡рддрд╛рд░ рдХреА рдФрд░ рд╕реНрдЯрд╛рдЗрд▓ рдЬреЛрдбрд╝рдирд╛ тАФ рдмрджрд▓рд╛рд╡ рдХрд░реЗрдВ backend/app/prompts/avatar_generation.py
  • Veo рдХреЗ рдкреНрд░реЙрдореНрдкреНрдЯ рдХреЛ рдЕрдкрдиреА рдкрд╕рдВрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдмрдирд╛рдПрдВ тАФ рдмрджрд▓рд╛рд╡ рдХрд░реЗрдВ backend/app/prompts/video_generation.py
  • рдореЙрдХ рдореЛрдб рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рддреМрд░ рдкрд░ рдЪрд▓рд╛рдПрдВ тАФ рдПрдкреАрдЖрдИ рдХреЙрд▓ рдХреЗ рдмрд┐рдирд╛ рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП, .env рдореЗрдВ MOCK_AI=true рд╕реЗрдЯ рдХрд░реЗрдВ
  • рдЗрд╡реЗрдВрдЯ рдХреЗ рд▓рд┐рдП рд╕реНрдХреЗрд▓ рдХрд░реЗрдВ тАФ --max-instances рдФрд░ MAX_CONCURRENT_JOBS рдмрдврд╝рд╛рдПрдВ

рд╕рдВрд╕рд╛рдзрди