1. рдкрд░рд┐рдЪрдп
рдЖрдкрдХреЛ рдХреНрдпрд╛ рдмрдирд╛рдирд╛ рд╣реИ
Gemini Motion Lab, рдПрдЖрдИ рдХреА рдорджрдж рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдХрд┐рдпреЙрд╕реНрдХ рд╣реИ. рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛, рдбрд╛рдВрд╕ рдпрд╛ рдореЛрд╢рди рдХреА рдЫреЛрдЯреА рдХреНрд▓рд┐рдк рд░рд┐рдХреЙрд░реНрдб рдХрд░рддрд╛ рд╣реИ. рдЗрд╕рдХреЗ рдмрд╛рдж, рд╕рд┐рд╕реНрдЯрдо:
- Gemini рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ, рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддрд╛ рд╣реИ (рд╢рд░реАрд░ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ, рдлрд╝реЗрдЬрд╝, рдЯреЗрдВрдкреЛ, рдПрдирд░реНрдЬреА)
- Nano Banana (Gemini Flash Image) рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ, рд╕реНрдЯрд╛рдЗрд▓ рд╡рд╛рд▓реА рдЕрд╡рддрд╛рд░ рдЗрдореЗрдЬ рдЬрдирд░реЗрдЯ рдХрд░рддрд╛ рд╣реИ
- Veo рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ, рдПрдЖрдИ рд╡реАрдбрд┐рдпреЛ рдмрдирд╛рддрд╛ рд╣реИ. рдЗрд╕рдореЗрдВ рдЕрд╡рддрд╛рд░ рдХреЗ рд╕рд╛рде рдореЛрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
- рдпрд╣ рд╕реБрд╡рд┐рдзрд╛, рдмрдирд╛рддреА рд╣реИ. рдЗрд╕рдореЗрдВ рдУрд░рд┐рдЬрдирд▓ рд╡реАрдбрд┐рдпреЛ рдФрд░ рдПрдЖрдИ рд╕реЗ рдЬрдирд░реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╡реАрдбрд┐рдпреЛ, рджреЛрдиреЛрдВ рдХреЛ рд╕рд╛рде-рд╕рд╛рде рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
- рд╢реЗрдпрд░ рдХрд░реЗрдВ: рдпрд╣ рд╡рд┐рдХрд▓реНрдк, рдореЛрдмрд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд┐рдП рдЧрдП рдкреЗрдЬ рдкрд░ рдХреНрдпреВрдЖрд░ рдХреЛрдб рдХреЗ рдЬрд╝рд░рд┐рдП рдирддреАрдЬреЗ рд╢реЗрдпрд░ рдХрд░рддрд╛ рд╣реИ
рдЗрд╕ рдХреЛрдбрд▓реИрдм рдХреЗ рдЖрдЦрд┐рд░ рддрдХ, рдЖрдкрдХреЗ рдкрд╛рд╕ 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 рд╕реНрдХреНрд░рд┐рдкреНрдЯ:
gemini-motion-labрдкреНрд░реАрдлрд╝рд┐рдХреНрд╕ рд╡рд╛рд▓рд╛ рдирдпрд╛ GCP рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ- рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЖрдИрдбреА рдХреЛ
~/project_id.txtрдореЗрдВ рд╕реЗрд╡ рдХрд░реЗрдВ - рдмрд┐рд▓рд┐рдВрдЧ рдХреА рдЬрд╝рд░реВрд░реА рд╢рд░реНрддреЗрдВ рдкреВрд░реА рдХрд░рдирд╛ рдФрд░ рдмрд┐рд▓рд┐рдВрдЧ рдЦрд╛рддреЗ рдХреЛ рдЕрдкрдиреЗ-рдЖрдк рд▓рд┐рдВрдХ рдХрд░рдирд╛
рддреАрд╕рд░рд╛ рдЪрд░рдг: рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рдФрд░ рдПрдкреАрдЖрдИ рдЪрд╛рд▓реВ рдХрд░рдирд╛
ЁЯСЙЁЯТ╗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рдЕрдкрдирд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЖрдИрдбреА рд╕реЗрдЯ рдХрд░реЗрдВ:
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) рдЕрдкрдиреЗ-рдЖрдк рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддреА рд╣реИ:
- Veo рдХреЗ 8 рд╕реЗрдХрдВрдб рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ 3 рд╕реЗрдХрдВрдб рддрдХ рдХрд╛рдЯ-рдЫрд╛рдВрдЯ рдХрд░реЛ
- рд╕рд╛рдЗрдб-рдмрд╛рдп-рд╕рд╛рдЗрдб рд╡реАрдбрд┐рдпреЛ рдХрдВрдкреЛрдЬрд╝ рдХрд░реЗрдВ (рдмрд╛рдПрдВ рдУрд░ рдУрд░рд┐рдЬрдирд▓ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдФрд░ рджрд╛рдИрдВ рдУрд░ рдПрдЖрдИ рд╡реАрдбрд┐рдпреЛ)
- рдХрдВрдкреЛрдЬрд╝ рдХрд┐рдП рдЧрдП рд╡реАрдбрд┐рдпреЛ рдХреЛ GCS рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ
- рдХрддрд╛рд░ рдореЗрдВ рдореМрдЬреВрдж рд╕реНрд▓реЙрдЯ рдХреЛ рд░рд┐рд▓реАрдЬрд╝ рдХрд░реЗрдВ
рдпрд╣ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдореЗрдВ рдЪрд▓рддреА рд╣реИ 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 рдпреЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛:
- рдЕрдкрдирд╛ рд╕реЛрд░реНрд╕ рдХреЛрдб рдЕрдкрд▓реЛрдб рдХрд░рдирд╛
- Docker рдЗрдореЗрдЬ рдмрдирд╛рдирд╛
- рдЗрд╕реЗ Artifact Registry рдореЗрдВ рдкреБрд╢ рдХрд░реЗрдВ
- рдЗрд╕реЗ 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. рдореЛрд╢рди рд░рд┐рдХреЙрд░реНрдб рдХрд░рдирд╛
- рдЕрдкрдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдлрд╝реНрд░рдВрдЯрдПрдВрдб рдпреВрдЖрд░рдПрд▓ рдЦреЛрд▓реЗрдВ. рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк Chrome рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ, рддрд╛рдХрд┐ рдХреИрдорд░реЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ
- рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╢реБрд░реВ рдХрд░реЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ
- рдХрд░реАрдм рдкрд╛рдВрдЪ рд╕реЗрдХрдВрдб рддрдХ рдирд╛рдЪреЗрдВ рдпрд╛ рд╣рд┐рд▓реЗрдВ-рдбреБрд▓реЗрдВ тАФ рд╣рд╛рде рдХреЛ рддреЗрдЬрд╝реА рд╕реЗ рдШреБрдорд╛рдиреЗ рдФрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреЛрдЬрд╝ рджреЗрдиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рдирддреАрдЬреЗ рдорд┐рд▓рддреЗ рд╣реИрдВ
- рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдЕрдкрдиреЗ-рдЖрдк рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧреА рдФрд░ рдЕрдкрд▓реЛрдб рд╣реЛ рдЬрд╛рдПрдЧреА
2. рдПрдЖрдИ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рджреЗрдЦрдирд╛
рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рд░реАрдпрд▓ рдЯрд╛рдЗрдо рдореЗрдВ рдЪрд▓рдиреЗ рдХреА рдЬрд╛рдирдХрд╛рд░реА рджрд┐рдЦреЗрдЧреА:
рдлрд╝реЗрдЬрд╝ (рдЪрд░рдг) | рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ | рдХреБрд▓ рд╕рдордп |
рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ... | Gemini Flash, рд╡реАрдбрд┐рдпреЛ рдореЗрдВ рдореМрдЬреВрдж рдЪреАрдЬрд╝реЛрдВ рдХреА рдЧрддрд┐рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдкреИрдЯрд░реНрди рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддрд╛ рд╣реИ | ~5-10 рд╕реЗрдХрдВрдб |
рдЕрд╡рддрд╛рд░ рдЬрдирд░реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ... | Nano Banana, рдЖрдкрдХреЗ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рдлрд╝реНрд░реЗрдо рд╕реЗ рд╕реНрдЯрд╛рдЗрд▓ рд╡рд╛рд▓рд╛ рдЕрд╡рддрд╛рд░ рдмрдирд╛рддрд╛ рд╣реИ | ~8-12 рд╕реЗ┬░ |
рд╡реАрдбрд┐рдпреЛ рдмрдирд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ... | Veo 3.1, рдЕрд╡рддрд╛рд░ рдФрд░ рдореЛрд╢рди рдкреНрд░реЙрдореНрдкреНрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдЖрдИ рд╡реАрдбрд┐рдпреЛ рдЬрдирд░реЗрдЯ рдХрд░рддрд╛ рд╣реИ | ~60 рд╕реЗ 120 рд╕реЗрдХрдВрдб |
рд▓рд┐рдЦрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ... | ffmpeg, рд╡реАрдбрд┐рдпреЛ рдХреЛ рдЯреНрд░рд┐рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдЧрд▓-рдмрдЧрд▓ рдореЗрдВ рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рджреЗрддрд╛ рд╣реИ | ~5-10 рд╕реЗрдХрдВрдб |
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 рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ тАФ рд╕рд░реНрд╡рд░рд▓реЗрд╕, рдСрдЯреЛ-рд╕реНрдХреЗрд▓рд┐рдВрдЧ, рд╕рд░реНрд╡рд░ рдореИрдиреЗрдЬрдореЗрдВрдЯ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ
рдЖрдкрдиреЗ рдЬреЛ рдореБрдЦреНрдп рдХреЙрдиреНрд╕реЗрдкреНрдЯ рд╕реАрдЦреЗ
- Gemini Multimodal тАФ рд╡реАрдбрд┐рдпреЛ рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рддреМрд░ рдкрд░ рднреЗрдЬрдирд╛ рдФрд░ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрдб JSON рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкрд╛рдирд╛
- Nano Banana (Gemini рдХреА рдЗрдореЗрдЬ рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛) тАФ рдЕрд╡рддрд╛рд░ рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд░реЗрдлрд╝рд░рдВрд╕ рдЗрдореЗрдЬ рдФрд░ рд╕реНрдЯрд╛рдЗрд▓ рдкреНрд░реЙрдореНрдкреНрдЯ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛
- Veo 3.1 тАФ рдЗрд╕рдореЗрдВ рд░реЗрдлрд╝рд░рдВрд╕ рдРрд╕реЗрдЯ рдФрд░ рдЯреЗрдХреНрд╕реНрдЯ рдкреНрд░реЙрдореНрдкреНрдЯ рдХреА рдорджрдж рд╕реЗ, рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рддрд░реАрдХреЗ рд╕реЗ рд╡реАрдбрд┐рдпреЛ рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдорд┐рд▓рддреА рд╣реИ
- Cloud Run тАФ рдПрдирд╡рд╛рдпрд░рдореЗрдВрдЯ рд╡реИрд░рд┐рдПрдмрд▓ рдФрд░ рдЕрдкрдиреЗ-рдЖрдк рд╕реНрдХреЗрд▓ рд╣реЛрдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рд╛рде рдХрдВрдЯреЗрдирд░ рдбрд┐рдкреНрд▓реЙрдп рдХрд░рдирд╛
- рдПрд╕рд┐рдВрдХ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдкреИрдЯрд░реНрди тАФ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдПрдЖрдИ рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреЗ рд▓рд┐рдП,
asyncio.TaskрдХреЗ рд╕рд╛рде рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдЯрд╛рд╕реНрдХ рдХреЛ рддреБрд░рдВрдд рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рднреВрд▓ рдЬрд╛рдПрдВ - рдХрддрд╛рд░ рдореИрдиреЗрдЬрдореЗрдВрдЯ тАФ рдПрдЖрдИ рд╕реЗ рдЬреБрдбрд╝реЗ рдПрдХ рд╕рд╛рде рдХрдИ рдЯрд╛рд╕реНрдХ рдкреВрд░реЗ рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдкрд░ рджрд░ рд╕реАрдорд╛ рд▓рд╛рдЧреВ рдХрд░рдирд╛, рддрд╛рдХрд┐ рд▓рд╛рдЧрдд рдФрд░ рдПрдкреАрдЖрдИ рдХреЛрдЯрд╛ рдХреЛ рдХрдВрдЯреНрд░реЛрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ
рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд░реАрдХреИрдк

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