đŸŽŦ Gemini, Veo āĻāĻŦāĻ‚ Cloud Run āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻāĻ•āϟāĻŋ AI āĻŽā§‹āĻļāύ āĻ˛ā§āϝāĻžāĻŦ āϤ⧈āϰāĻŋ āĻ“ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰ⧁āύ

ā§§. āĻ­ā§‚āĻŽāĻŋāĻ•āĻž

āφāĻĒāύāĻŋ āϝāĻž āϤ⧈āϰāĻŋ āĻ•āϰāĻŦ⧇āύ

āĻœā§‡āĻŽāĻŋāύāĻŋ āĻŽā§‹āĻļāύ āĻ˛ā§āϝāĻžāĻŦ āĻšāϞ⧋ āĻāĻ•āϟāĻŋ āϞāĻžāχāĻ­ āĻāφāχ-āϚāĻžāϞāĻŋāϤ āĻ•āĻŋāϝāĻŧāĻ¸ā§āĻ• āĻ…āĻ­āĻŋāĻœā§āĻžāϤāĻžāĨ¤ āĻāĻ•āϜāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻāĻ•āϟāĻŋ āϏāĻ‚āĻ•ā§āώāĻŋāĻĒā§āϤ āύāĻžāϚ āĻŦāĻž āĻ—āϤāĻŋāϰ āĻ•ā§āϞāĻŋāĻĒ āϰ⧇āĻ•āĻ°ā§āĻĄ āĻ•āϰ⧇āύ āĻāĻŦāĻ‚ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽāϟāĻŋ:

  1. āĻœā§‡āĻŽāĻŋāύāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ—āϤāĻŋāĻŦāĻŋāϧāĻŋ āĻŦāĻŋāĻļā§āϞ⧇āώāĻŖ āĻ•āϰ⧇ (āĻļāϰ⧀āϰ⧇āϰ āĻ…āĻ™ā§āĻ—āĻĒā§āϰāĻ¤ā§āϝāĻ™ā§āĻ—, āĻĒāĻ°ā§āϝāĻžāϝāĻŧ, āĻ—āϤāĻŋ, āĻļāĻ•ā§āϤāĻŋ)
  2. āĻ¨ā§āϝāĻžāύ⧋ āĻŦā§āϝāĻžāύāĻžāύāĻž (āĻœā§‡āĻŽāĻŋāύāĻŋ āĻĢā§āĻ˛ā§āϝāĻžāĻļ āχāĻŽā§‡āϜ) āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻāĻ•āϟāĻŋ āĻļ⧈āϞ⧀āϝ⧁āĻ•ā§āϤ āĻ…āĻŦāϤāĻžāϰ āϚāĻŋāĻ¤ā§āϰ āϤ⧈āϰāĻŋ āĻ•āϰ⧇ āĨ¤
  3. Veo āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻāĻ•āϟāĻŋ AI āĻ­āĻŋāĻĄāĻŋāĻ“ āϤ⧈āϰāĻŋ āĻ•āϰ⧇ āϝāĻž āĻ…ā§āϝāĻžāĻ­āĻžāϟāĻžāϰ⧇āϰ āĻ—āϤāĻŋāĻŦāĻŋāϧāĻŋāϕ⧇ āĻĒ⧁āύāϰāĻžāϝāĻŧ āĻĢ⧁āϟāĻŋāϝāĻŧ⧇ āϤ⧋āϞ⧇āĨ¤
  4. āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ āĻāĻ•āϟāĻŋ āĻ­āĻŋāĻĄāĻŋāĻ“ āϤ⧈āϰāĻŋ āĻ•āϰ⧇ (āĻŽā§‚āϞ + āĻāφāχ-āύāĻŋāĻ°ā§āĻŽāĻŋāϤ)
  5. āĻŽā§‹āĻŦāĻžāχāϞ-āĻ…āĻĒā§āϟāĻŋāĻŽāĻžāχāϜāĻĄ āĻĒ⧇āĻœā§‡ āĻāĻ•āϟāĻŋ āĻ•āĻŋāωāφāϰ āϕ⧋āĻĄā§‡āϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻĢāϞāĻžāĻĢāϞ āĻļ⧇āϝāĻŧāĻžāϰ āĻ•āϰ⧇ āĨ¤

āĻāχ āϕ⧋āĻĄāĻ˛ā§āϝāĻžāĻŦāϟāĻŋ āĻļ⧇āώ āĻ•āϰāĻžāϰ āĻĒāϰ, āφāĻĒāύāĻŋ āϗ⧁āĻ—āϞ āĻ•ā§āϞāĻžāωāĻĄ āϰāĻžāύ- āĻ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻĄā§‡āĻŽā§‹āϟāĻŋ āĻĄā§‡āĻĒā§āϞāϝāĻŧ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŦ⧇āύ āĻāĻŦāĻ‚ āĻāϰ āĻĒ⧇āĻ›āύ⧇āϰ āĻāφāχ āĻĒāĻžāχāĻĒāϞāĻžāχāύāϟāĻŋ āĻŦ⧁āĻāϤ⧇ āĻĒāĻžāϰāĻŦ⧇āύāĨ¤

āĻ¸ā§āĻĨāĻžāĻĒāĻ¤ā§āϝ⧇āϰ āϏāĻ‚āĻ•ā§āώāĻŋāĻĒā§āϤ āĻŦāĻŋāĻŦāϰāĻŖ

āĻšā§‚āĻĄāĻŧāĻžāĻ¨ā§āϤ āĻĄā§‡āĻŽā§‹:

āĻ•āĻ­āĻžāϰ

āĻŽā§‚āϞ āĻĒā§āϰāϝ⧁āĻ•ā§āϤāĻŋ

āωāĻĒāĻžāĻĻāĻžāύ

āĻĒā§āϰāϝ⧁āĻ•ā§āϤāĻŋ

āωāĻĻā§āĻĻ⧇āĻļā§āϝ

āĻ—āϤāĻŋ āĻŦāĻŋāĻļā§āϞ⧇āώāĻŖ

āĻœā§‡āĻŽāĻŋāύāĻŋ āĻĢā§āĻ˛ā§āϝāĻžāĻļ

āĻļāĻžāϰ⧀āϰāĻŋāĻ• āĻ…āĻ™ā§āĻ—āĻ­āĻ™ā§āĻ—āĻŋ, āĻĒāĻ°ā§āϝāĻžāϝāĻŧ āĻāĻŦāĻ‚ āĻļ⧈āϞ⧀ āĻŦā§‹āĻāĻžāϰ āϜāĻ¨ā§āϝ āĻ­āĻŋāĻĄāĻŋāĻ“āϟāĻŋ āĻŦāĻŋāĻļā§āϞ⧇āώāĻŖ āĻ•āϰ⧁āύāĨ¤

āĻ…āĻŦāϤāĻžāϰ āĻĒā§āϰāϜāĻ¨ā§āĻŽ

āĻœā§‡āĻŽāĻŋāύāĻŋ āĻĢā§āĻ˛ā§āϝāĻžāĻļ āχāĻŽā§‡āϜ (āĻ¨ā§āϝāĻžāύ⧋ āĻ•āϞāĻž)

āĻāĻ•āϟāĻŋ āϕ⧀ āĻĢā§āϰ⧇āĻŽ āĻĨ⧇āϕ⧇ āĻāĻ•āϟāĻŋ āĻļ⧈āĻ˛ā§āĻĒāĻŋāĻ• ā§§ā§Ļ⧍ā§ĒÃ—ā§§ā§Ļ⧍ā§Ē āĻ…ā§āϝāĻžāĻ­āĻžāϟāĻžāϰ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ

āĻ­āĻŋāĻĄāĻŋāĻ“ āĻœā§‡āύāĻžāϰ⧇āĻļāύ

Veo 3.1

āĻ…ā§āϝāĻžāĻ­āĻžāϟāĻžāϰ āĻ“ āĻŽā§‹āĻļāύ āĻĒā§āϰāĻŽā§āĻĒāϟ āĻĨ⧇āϕ⧇ āĻāĻ•āϟāĻŋ āĻāφāχ āĻ­āĻŋāĻĄāĻŋāĻ“ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ

āĻŦā§āϝāĻžāĻ•āĻāĻ¨ā§āĻĄ

āĻĢāĻžāĻ¸ā§āϟāĻāĻĒāĻŋāφāχ + āĻĒāĻžāχāĻĨāύ ā§Š.ā§§ā§§

āĻ…ā§āϝāĻžāϏāĻŋāĻ™ā§āĻ• āĻĒāĻžāχāĻĒāϞāĻžāχāύ āĻ…āĻ°ā§āϕ⧇āĻ¸ā§āĻŸā§āϰ⧇āĻļāύ āϏāĻš āĻāĻĒāĻŋāφāχ āϏāĻžāĻ°ā§āĻ­āĻžāϰ

āĻĢā§āϰāĻ¨ā§āϟāĻāĻ¨ā§āĻĄ

āϰāĻŋāĻ…ā§āϝāĻžāĻ•ā§āϟ + āĻ­āĻžāχāϟ + āϟāĻžāχāĻĒāĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ

āĻ•ā§āϝāĻžāĻŽā§‡āϰāĻž āϰ⧇āĻ•āĻ°ā§āĻĄāĻŋāĻ‚ āĻāĻŦāĻ‚ āϞāĻžāχāĻ­ āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ āϏāĻš āĻ•āĻŋāϝāĻŧāĻ¸ā§āĻ• UI

āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚

āĻ•ā§āϞāĻžāωāĻĄ āϰāĻžāύ

āϏāĻžāĻ°ā§āĻ­āĻžāϰāĻŦāĻŋāĻšā§€āύ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰāĻžāχāϜāĻĄ āĻĄā§‡āĻĒā§āϞāϝāĻŧāĻŽā§‡āĻ¨ā§āϟ

āĻ¸ā§āĻŸā§‹āϰ⧇āϜ

āϗ⧁āĻ—āϞ āĻ•ā§āϞāĻžāωāĻĄ āĻ¸ā§āĻŸā§‹āϰ⧇āϜ

āĻ­āĻŋāĻĄāĻŋāĻ“ āφāĻĒāϞ⧋āĻĄ, āĻĢā§āϰ⧇āĻŽ, āĻ›āĻžāρāϟāĻžāχ āĻ•āϰāĻž āĻāĻŦāĻ‚ āĻ•āĻŽā§āĻĒā§‹āϜ āĻ•āϰāĻž āφāωāϟāĻĒ⧁āϟ

⧍. đŸ“Ļ āϰāĻŋāĻĒā§‹āϜāĻŋāϟāϰāĻŋāϟāĻŋ āĻ•ā§āϞ⧋āύ āĻ•āϰ⧁āύ

ā§§. āĻ•ā§āϞāĻžāωāĻĄ āĻļ⧇āϞ āĻāĻĄāĻŋāϟāϰ āϖ⧁āϞ⧁āύ

👉 āφāĻĒāύāĻžāϰ āĻŦā§āϰāĻžāωāϜāĻžāϰ⧇ āĻ•ā§āϞāĻžāωāĻĄ āĻļ⧇āϞ āĻāĻĄāĻŋāϟāϰ āϖ⧁āϞ⧁āύāĨ¤

āϝāĻĻāĻŋ āϟāĻžāĻ°ā§āĻŽāĻŋāύāĻžāϞāϟāĻŋ āĻ¸ā§āĻ•ā§āϰāĻŋāύ⧇āϰ āύ⧀āĻšā§‡ āĻĒā§āϰāĻĻāĻ°ā§āĻļāĻŋāϤ āύāĻž āĻšāϝāĻŧ:

  • āĻ­āĻŋāω āĻ•ā§āϞāĻŋāĻ• āĻ•āϰ⧁āύ
  • āϟāĻžāĻ°ā§āĻŽāĻŋāύāĻžāϞ⧇ āĻ•ā§āϞāĻŋāĻ• āĻ•āϰ⧁āύ

⧍. āϕ⧋āĻĄāϟāĻŋ āĻ•ā§āϞ⧋āύ āĻ•āϰ⧁āύ

👉đŸ’ģ āϟāĻžāĻ°ā§āĻŽāĻŋāύāĻžāϞ⧇ āϰāĻŋāĻĒā§‹āϜāĻŋāϟāϰāĻŋāϟāĻŋ āĻ•ā§āϞ⧋āύ āĻ•āϰ⧁āύ:

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

ā§Š. āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇āϰ āĻ•āĻžāĻ āĻžāĻŽā§‹ āĻ…āĻ¨ā§āĻŦ⧇āώāĻŖ āĻ•āϰ⧁āύ

āϰāĻŋāĻĒā§‹āϜāĻŋāϟāϰāĻŋ āϞ⧇āφāωāϟāϟāĻŋ āĻĻā§āϰ⧁āϤ āĻĻ⧇āϖ⧇ āύāĻŋāύ:

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

ā§Š. đŸ› ī¸ āĻ•ā§āϰ⧇āĻĄāĻŋāϟ āĻĻāĻžāĻŦāĻŋ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ 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

👉đŸ’ģ āĻāχ āĻĒā§āϰ⧋āĻœā§‡āĻ•ā§āĻŸā§‡āϰ āϜāĻ¨ā§āϝ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧ āϗ⧁āĻ—āϞ āĻ•ā§āϞāĻžāωāĻĄ āĻāĻĒāĻŋāφāχāϗ⧁āϞ⧋ āϏāĻ•ā§āϰāĻŋāϝāĻŧ āĻ•āϰ⧁āύ (āĻāϤ⧇ āĻĒā§āϰāĻžāϝāĻŧ ā§§-⧍ āĻŽāĻŋāύāĻŋāϟ āϏāĻŽāϝāĻŧ āϞāĻžāĻ—āĻŦ⧇):

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

ā§Ē. 🧠 [āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻĒāĻžāϠ⧇āϰ āϜāĻ¨ā§āϝ] āĻ¸ā§āĻĨāĻžāĻĒāĻ¤ā§āϝ āĻŦā§‹āĻāĻž

āĻāχ āĻ…āĻ‚āĻļ⧇ āĻāφāχ āĻĒāĻžāχāĻĒāϞāĻžāχāύāϟāĻŋ āĻļ⧁āϰ⧁ āĻĨ⧇āϕ⧇ āĻļ⧇āώ āĻĒāĻ°ā§āϝāĻ¨ā§āϤ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇ āϤāĻž āĻŦā§āϝāĻžāĻ–ā§āϝāĻž āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇āĨ¤ āϕ⧋āύ⧋ āĻĒāĻĻāĻ•ā§āώ⧇āĻĒ āύ⧇āĻ“āϝāĻŧāĻžāϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āύ⧇āχ — āĻĄā§‡āĻĒā§āϞāϝāĻŧ āĻ•āϰāĻžāϰ āφāϗ⧇ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽāϟāĻŋ āĻŦā§‹āĻāĻžāϰ āϜāĻ¨ā§āϝ āĻļ⧁āϧ⧁ āĻĒāĻĄāĻŧ⧁āύāĨ¤

āĻāφāχ āĻĒāĻžāχāĻĒāϞāĻžāχāύ

āϝāĻ–āύ āϕ⧋āύ⧋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻ•āĻŋāϝāĻŧāĻ¸ā§āϕ⧇ āĻāĻ•āϟāĻŋ āĻŽā§‹āĻļāύ āĻ•ā§āϞāĻŋāĻĒ āϰ⧇āĻ•āĻ°ā§āĻĄ āĻ•āϰ⧇āύ, āϤāĻ–āύ āĻĒāĻžāρāϚāϟāĻŋ āĻĒāĻ°ā§āϝāĻžāϝāĻŧ āĻ•ā§āϰāĻŽāĻžāύ⧁āϏāĻžāϰ⧇ āϚāϞ⧇:

āĻĒāĻ°ā§āϝāĻžāϝāĻŧ ā§§: āĻ­āĻŋāĻĄāĻŋāĻ“ āφāĻĒāϞ⧋āĻĄ

āĻĢā§āϰāĻ¨ā§āϟāĻāĻ¨ā§āĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻ•ā§āϝāĻžāĻŽā§‡āϰāĻž āĻĨ⧇āϕ⧇ āĻāĻ•āϟāĻŋ ā§Ģ-āϏ⧇āϕ⧇āĻ¨ā§āĻĄā§‡āϰ WebM āĻ•ā§āϞāĻŋāĻĒ āϰ⧇āĻ•āĻ°ā§āĻĄ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āĻŦā§āϝāĻžāĻ•āĻāĻ¨ā§āĻĄā§‡āϰ /api/upload āĻāĻ¨ā§āĻĄāĻĒāϝāĻŧ⧇āĻ¨ā§āĻŸā§‡āϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āϏ⧇āϟāĻŋ āϗ⧁āĻ—āϞ āĻ•ā§āϞāĻžāωāĻĄ āĻ¸ā§āĻŸā§‹āϰ⧇āĻœā§‡ āφāĻĒāϞ⧋āĻĄ āĻ•āϰ⧇āĨ¤

POST /api/upload/{video_id}  →  gs://BUCKET/uploads/{video_id}.webm

āĻĒāĻ°ā§āϝāĻžāϝāĻŧ ⧍: āĻŽāĻŋāĻĨ⧁āύ āϰāĻžāĻļāĻŋāϰ āĻ—āϤāĻŋ āĻŦāĻŋāĻļā§āϞ⧇āώāĻŖ

āĻŦā§āϝāĻžāĻ•āĻāĻ¨ā§āĻĄ āφāĻĒāϞ⧋āĻĄ āĻ•āϰāĻž āĻ­āĻŋāĻĄāĻŋāĻ“āϟāĻŋāϕ⧇ āĻ•āĻžāĻ āĻžāĻŽā§‹āĻ—āϤ āĻŦāĻŋāĻļā§āϞ⧇āώāϪ⧇āϰ āϜāĻ¨ā§āϝ āĻœā§‡āĻŽāĻŋāύāĻŋ āĻĢā§āĻ˛ā§āϝāĻžāĻļ⧇ ( 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)

āĻĒāĻ°ā§āϝāĻžāϝāĻŧ ā§Š: āĻ¨ā§āϝāĻžāύ⧋ āĻ•āϞāĻž āĻ…āĻŦāϤāĻžāϰ āϤ⧈āϰāĻŋ

āĻ­āĻŋāĻĄāĻŋāĻ“ āĻĨ⧇āϕ⧇ āύ⧇āĻ“āϝāĻŧāĻž āϏ⧇āϰāĻž āĻĢā§āϰ⧇āĻŽāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇, āĻœā§‡āĻŽāĻŋāύāĻŋ āĻĢā§āĻ˛ā§āϝāĻžāĻļ āχāĻŽā§‡āϜ ( gemini-3.1-flash-image-preview ) āĻāĻ•āϟāĻŋ ā§§ā§Ļ⧍ā§ĒÃ—ā§§ā§Ļ⧍ā§Ē āĻ¸ā§āϟāĻžāχāϞāĻžāχāϜāĻĄ āĻ…ā§āϝāĻžāĻ­āĻžāϟāĻžāϰ āϤ⧈āϰāĻŋ āĻ•āϰ⧇āĨ¤

āĻāϟāĻŋ āϝ⧇āĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇ ( 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 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 āĻœā§‡āύāĻžāϰ⧇āĻļāύ āĻ…ā§āϝāĻžāϏāĻŋāĻ™ā§āĻ•ā§āϰ⧋āύāĻžāϏ — āĻāϟāĻŋ āϤāĻžā§ŽāĻ•ā§āώāĻŖāĻŋāĻ•āĻ­āĻžāĻŦ⧇ āĻāĻ•āϟāĻŋ āĻ…āĻĒāĻžāϰ⧇āĻļāύ āφāχāĻĄāĻŋ āϰāĻŋāϟāĻžāĻ°ā§āύ āĻ•āϰ⧇āĨ¤ āĻŦā§āϝāĻžāĻ•āĻāĻ¨ā§āĻĄ āĻ…āĻĒāĻžāϰ⧇āĻļāύāϟāĻŋ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āύāĻž āĻšāĻ“āϝāĻŧāĻž āĻĒāĻ°ā§āϝāĻ¨ā§āϤ (āϏāĻ°ā§āĻŦā§‹āĻšā§āϚ ā§§ā§Ļ āĻŽāĻŋāύāĻŋāϟ āĻĒāĻ°ā§āϝāĻ¨ā§āϤ) āĻĒā§‹āϞ āĻ•āϰāϤ⧇ āĻĨāĻžāϕ⧇āĨ¤

āĻĒāĻ°ā§āϝāĻžāϝāĻŧ ā§Ģ: āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻ•āϰāĻŖ-āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āĻĒāĻžāχāĻĒāϞāĻžāχāύ

Veo-āĻāϰ āĻ•āĻžāϜ āĻļ⧇āώ āĻšāϞ⧇, āĻŦā§āϝāĻžāĻ•āĻ—ā§āϰāĻžāωāĻ¨ā§āĻĄ āĻĒāĻžāχāĻĒāϞāĻžāχāύ ( backend/app/services/pipeline.py ) āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ āϚāĻžāϞ⧁ āĻšāϝāĻŧ:

  1. ā§Ž āϏ⧇āϕ⧇āĻ¨ā§āĻĄā§‡āϰ Veo āφāωāϟāĻĒ⧁āϟāϟāĻŋ āĻ•āĻŽāĻŋāϝāĻŧ⧇ ā§Š āϏ⧇āϕ⧇āĻ¨ā§āĻĄ āĻ•āϰ⧁āύāĨ¤
  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) āĻ•āϞ āĻ•āϰ⧇, āϤāĻ–āύ āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āϜāĻ¨ā§āϝ āĻ¸ā§āϞāϟāϟāĻŋ āϖ⧁āϞ⧇ āϝāĻžāϝāĻŧāĨ¤

āĻ•ā§āϞāĻžāωāĻĄ āϰāĻžāύ — āϏāĻžāĻ°ā§āĻ­āĻžāϰāĻŦāĻŋāĻšā§€āύ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ

āĻŦā§āϝāĻžāĻ•āĻāĻ¨ā§āĻĄ āĻāĻŦāĻ‚ āĻĢā§āϰāĻ¨ā§āϟāĻāĻ¨ā§āĻĄ āωāĻ­āϝāĻŧāχ āĻ•ā§āϞāĻžāωāĻĄ āϰāĻžāύ āĻĒāϰāĻŋāώ⧇āĻŦāĻž āĻšāĻŋāϏāĻžāĻŦ⧇ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇:

āĻĒāϰāĻŋāώ⧇āĻŦāĻž

āωāĻĻā§āĻĻ⧇āĻļā§āϝ

āĻŽā§‚āϞ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ

āĻŦā§āϝāĻžāĻ•āĻāĻ¨ā§āĻĄ

āĻĢāĻžāĻ¸ā§āϟāĻāĻĒāĻŋāφāχ āĻāĻĒāĻŋāφāχ āϏāĻžāĻ°ā§āĻ­āĻžāϰ

⧍ āϜāĻŋāĻŦāĻŋ āĻŽā§‡āĻŽāϰāĻŋ (ffmpeg-āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻ­āĻŋāĻĄāĻŋāĻ“ āĻĒā§āϰāϏ⧇āϏāĻŋāĻ‚āϝāĻŧ⧇āϰ āϜāĻ¨ā§āϝ)

āĻĢā§āϰāĻ¨ā§āϟāĻāĻ¨ā§āĻĄ

Nginx āĻĻā§āĻŦāĻžāϰāĻž āĻĒāϰāĻŋāĻŦ⧇āĻļāĻŋāϤ āĻ¸ā§āĻŸā§āϝāĻžāϟāĻŋāĻ• āϰāĻŋāϝāĻŧā§āϝāĻžāĻ•ā§āϟ āĻ…ā§āϝāĻžāĻĒ

āĻĄāĻŋāĻĢāĻ˛ā§āϟ āĻŽā§‡āĻŽāϰāĻŋ

ā§Ģ. âš™ī¸ āϏ⧇āϟāφāĻĒ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ āϚāĻžāϞāĻžāύ

ā§§. āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧ āϏ⧇āϟāφāĻĒāϟāĻŋ āϚāĻžāϞāĻžāύ

setup.sh āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟāϟāĻŋ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧ āĻ•ā§āϞāĻžāωāĻĄ āϰāĻŋāϏ⧋āĻ°ā§āϏ āϤ⧈āϰāĻŋ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āφāĻĒāύāĻžāϰ .env āĻĢāĻžāχāϞāϟāĻŋ āĻœā§‡āύāĻžāϰ⧇āϟ āĻ•āϰ⧇āĨ¤

👉đŸ’ģ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟāϟāĻŋāϕ⧇ āĻāĻ•ā§āϏāĻŋāĻ•āĻŋāωāĻŸā§‡āĻŦāϞ āĻ•āϰ⧇ āϚāĻžāϞāĻžāύ:

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

⧍. āφāχāĻāĻāĻŽ āĻ­ā§‚āĻŽāĻŋāĻ•āĻž āĻŽāĻžā§āϜ⧁āϰ āĻ•āϰ⧁āύ

āĻāĻ–āύ āϏāĻžāĻ°ā§āĻ­āĻŋāϏ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟāϟāĻŋāϕ⧇ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧ āĻ…āύ⧁āĻŽāϤāĻŋāϗ⧁āϞ⧋ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧁āύāĨ¤

👉đŸ’ģ āφāĻĒāύāĻžāϰ āĻĒā§āϰ⧋āĻœā§‡āĻ•ā§āϟ āφāχāĻĄāĻŋ āϏ⧇āϟ āĻ•āϰāϤ⧇ āĻāĻŦāĻ‚ āϤāĻŋāύāϟāĻŋ āϰ⧋āϞāχ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰāϤ⧇ āύāĻŋāĻšā§‡āϰ āĻ•āĻŽāĻžāĻ¨ā§āĻĄāϗ⧁āϞ⧋ āϚāĻžāϞāĻžāύ:

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"

ā§Š. āφāĻĒāύāĻžāϰ .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

ā§Ŧ. 🚀 āĻŦā§āϝāĻžāĻ•āĻāĻ¨ā§āĻĄ āĻĄāĻŋāĻĒā§āϞāϝāĻŧ āĻ•āϰ⧁āύ

ā§§. āĻŦā§āϝāĻžāĻ•āĻāĻ¨ā§āĻĄ āĻĄāĻ•āĻžāϰāĻĢāĻžāχāϞāϟāĻŋ āĻŦ⧁āĻā§āύ

āĻĄāĻŋāĻĒā§āϞāϝāĻŧ āĻ•āϰāĻžāϰ āφāϗ⧇, āϚāϞ⧁āύ āĻœā§‡āύ⧇ āύ⧇āĻ“āϝāĻŧāĻž āϝāĻžāĻ• āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰāϟāĻŋ āĻĻ⧇āĻ–āϤ⧇ āϕ⧇āĻŽāύ:

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

⧍. āĻ•ā§āϞāĻžāωāĻĄ āϰāĻžāύ⧇ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰ⧁āύ

👉đŸ’ģ āφāĻĒāύāĻžāϰ āĻāύāĻ­āĻžāϝāĻŧāϰāύāĻŽā§‡āĻ¨ā§āϟ āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞāϗ⧁āϞ⧋ āϞ⧋āĻĄ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āĻĄāĻŋāĻĒā§āϞāϝāĻŧ āĻ•āϰ⧁āύ:

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"

āĻāϤ⧇ āĻĒā§āϰāĻžāϝāĻŧ ā§Š-ā§Ģ āĻŽāĻŋāύāĻŋāϟ āϏāĻŽāϝāĻŧ āϞāĻžāϗ⧇āĨ¤ āĻ•ā§āϞāĻžāωāĻĄ āĻŦāĻŋāĻ˛ā§āĻĄ āϝāĻž āĻ•āϰāĻŦ⧇:

  1. āφāĻĒāύāĻžāϰ āϏ⧋āĻ°ā§āϏ āϕ⧋āĻĄ āφāĻĒāϞ⧋āĻĄ āĻ•āϰ⧁āύ
  2. āĻĄāĻ•āĻžāϰ āχāĻŽā§‡āϜ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ
  3. āφāĻ°ā§āϟāĻŋāĻĢā§āϝāĻžāĻ•ā§āϟ āϰ⧇āϜāĻŋāĻ¸ā§āĻŸā§āϰāĻŋ-āϤ⧇ āĻāϟāĻŋ āĻĒ⧁āĻļ āĻ•āϰ⧁āύ
  4. āĻ•ā§āϞāĻžāωāĻĄ āϰāĻžāύ⧇ āĻāϟāĻŋ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰ⧁āύ

ā§Š. āĻŦā§āϝāĻžāĻ•āĻāĻ¨ā§āĻĄ āχāωāφāϰāĻāϞāϟāĻŋ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧁āύāĨ¤

👉đŸ’ģ āĻĄā§‡āĻĒā§āϞāϝāĻŧ āĻ•āϰāĻžāϰ āĻĒāϰ, āĻŦā§āϝāĻžāĻ•āĻāĻ¨ā§āĻĄ URL-āϟāĻŋ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧁āύ:

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"

ā§Ē. āĻŦā§āϝāĻžāĻ•āĻāĻ¨ā§āĻĄ āĻļ⧇āϝāĻŧāĻžāϰ āχāωāφāϰāĻāϞ āφāĻĒāĻĄā§‡āϟ āĻ•āϰ⧁āύ

āĻŦā§āϝāĻžāĻ•āĻāĻ¨ā§āĻĄ āĻ•āĻŋāωāφāϰ āϕ⧋āĻĄ āϤ⧈āϰāĻŋ āĻ•āϰ⧇, āϝāĻžāϤ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰāĻž āϤāĻžāĻĻ⧇āϰ āĻ­āĻŋāĻĄāĻŋāĻ“ āĻĄāĻžāωāύāϞ⧋āĻĄ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āĻāχ āĻ•āĻžāϜāϟāĻŋ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻŦā§āϝāĻžāĻ•āĻāĻ¨ā§āĻĄāϟāĻŋāϰ āύāĻŋāĻœā§‡āϰ āĻĒāĻžāĻŦāϞāĻŋāĻ• āχāωāφāϰāĻāϞ āϜāĻžāύāĻž āĻĒā§āϰāϝāĻŧā§‹āϜāύāĨ¤

👉đŸ’ģ āĻŦā§āϝāĻžāĻ•āĻāĻ¨ā§āĻĄ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύāϟāĻŋ āĻāϰ āύāĻŋāϜāĻ¸ā§āĻŦ URL āĻĻāĻŋāϝāĻŧ⧇ āφāĻĒāĻĄā§‡āϟ āĻ•āϰ⧁āύ:

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

ā§Ģ. āĻŦā§āϝāĻžāĻ•āĻāĻ¨ā§āĻĄ āϝāĻžāϚāĻžāχ āĻ•āϰ⧁āύ

👉đŸ’ģ āĻ¸ā§āĻŦāĻžāĻ¸ā§āĻĨā§āϝāĻ—āϤ āĻĢāϞāĻžāĻĢāϞ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰ⧁āύ:

curl $BACKEND_URL/api/health

āĻĒā§āϰāĻ¤ā§āϝāĻžāĻļāĻŋāϤ āφāωāϟāĻĒ⧁āϟ:

{"status":"ok"}

👉đŸ’ģ āϏāĻžāϰāĻŋāϰ āĻ…āĻŦāĻ¸ā§āĻĨāĻž āĻĻ⧇āϖ⧁āύ:

curl $BACKEND_URL/api/queue/status

āĻĒā§āϰāĻ¤ā§āϝāĻžāĻļāĻŋāϤ āφāωāϟāĻĒ⧁āϟ:

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

ā§­. 🎨 āĻĢā§āϰāĻ¨ā§āϟāĻāĻ¨ā§āĻĄ āĻĄāĻŋāĻĒā§āϞāϝāĻŧ āĻ•āϰ⧁āύ

ā§§. āĻĢā§āϰāĻ¨ā§āϟāĻāĻ¨ā§āĻĄ āĻĄāĻ•āĻžāϰāĻĢāĻžāχāϞāϟāĻŋ āĻŦ⧁āĻā§āύ

āĻĢā§āϰāĻ¨ā§āϟāĻāĻ¨ā§āĻĄāϟāĻŋ āĻāĻ•āϟāĻŋ āĻŦāĻšā§-āĻĒāĻ°ā§āϝāĻžāϝāĻŧ⧇āϰ āĻŦāĻŋāĻ˛ā§āĻĄ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ — āĻĒā§āϰāĻĨāĻŽā§‡ 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

⧍. āĻ•ā§āϞāĻžāωāĻĄ āϰāĻžāύ⧇ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰ⧁āύ

👉đŸ’ģ āĻĒā§āϰāĻĨāĻŽā§‡, āĻŦā§āϝāĻžāĻ•āĻāĻ¨ā§āĻĄ URL-āϟāĻŋ āĻāĻ•āϟāĻŋ .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

āĻāϤ⧇ āĻĒā§āϰāĻžāϝāĻŧ ⧍-ā§Š āĻŽāĻŋāύāĻŋāϟ āϏāĻŽāϝāĻŧ āϞāĻžāϗ⧇āĨ¤

ā§Š. āĻĢā§āϰāĻ¨ā§āϟāĻāĻ¨ā§āĻĄ āχāωāφāϰāĻāϞāϟāĻŋ āύāĻŋāύāĨ¤

👉đŸ’ģ āĻĢā§āϰāĻ¨ā§āϟāĻāĻ¨ā§āĻĄ URL-āϟāĻŋ āϏāĻ‚āĻ—ā§āϰāĻš āĻ•āϰ⧇ āϖ⧁āϞ⧁āύ:

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"

👉 āφāĻĒāύāĻžāϰ āĻŦā§āϰāĻžāωāϜāĻžāϰ⧇ URL-āϟāĻŋ āϖ⧁āϞ⧁āύ — āφāĻĒāύāĻŋ āĻœā§‡āĻŽāĻŋāύāĻŋ āĻŽā§‹āĻļāύ āĻ˛ā§āϝāĻžāĻŦ āĻ•āĻŋāϝāĻŧāĻ¸ā§āĻ• āχāĻ¨ā§āϟāĻžāϰāĻĢ⧇āϏāϟāĻŋ āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāĻŦ⧇āύ!

ā§Ž. 🎮 [āϐāĻšā§āĻ›āĻŋāĻ•] āĻĄā§‡āĻŽā§‹āϟāĻŋ āĻĻāĻŋāϝāĻŧ⧇ āϖ⧇āϞ⧁āύ

ā§§. āĻāĻ•āϟāĻŋ āĻĒā§āϰāĻ¸ā§āϤāĻžāĻŦ āύāĻĨāĻŋāϭ⧁āĻ•ā§āϤ āĻ•āϰ⧁āύ

  1. āφāĻĒāύāĻžāϰ āĻŦā§āϰāĻžāωāϜāĻžāϰ⧇ āĻĢā§āϰāĻ¨ā§āϟāĻāĻ¨ā§āĻĄ āχāωāφāϰāĻāϞāϟāĻŋ āϖ⧁āϞ⧁āύ (āϏ⧇āϰāĻž āĻ•ā§āϝāĻžāĻŽā§‡āϰāĻž āϏāĻžāĻĒā§‹āĻ°ā§āĻŸā§‡āϰ āϜāĻ¨ā§āϝ āĻ•ā§āϰ⧋āĻŽ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻļā§āϰ⧇āϝāĻŧ)āĨ¤
  2. āϰ⧇āĻ•āĻ°ā§āĻĄāĻŋāĻ‚ āĻļ⧁āϰ⧁ āĻ•āϰāϤ⧇ āĻ¸ā§āϟāĻžāĻ°ā§āϟ-āĻ āĻ•ā§āϞāĻŋāĻ• āĻ•āϰ⧁āύāĨ¤
  3. āĻĒā§āϰāĻžāϝāĻŧ ā§Ģ āϏ⧇āϕ⧇āĻ¨ā§āĻĄ āϧāϰ⧇ āύāĻžāϚ⧁āύ āĻŦāĻž āύāĻĄāĻŧāĻžāϚāĻĄāĻŧāĻž āĻ•āϰ⧁āύ — āĻāϤ⧇ āĻšāĻžāϤ⧇āϰ āĻŦāĻĄāĻŧ āĻŦāĻĄāĻŧ āύāĻĄāĻŧāĻžāϚāĻĄāĻŧāĻž āĻāĻŦāĻ‚ āĻ—āϤāĻŋāĻļā§€āϞ āĻ­āĻ™ā§āĻ—āĻŋ āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āĻ­āĻžāϞ⧋ āĻ•āĻžāϜ āĻ•āϰ⧇āĨ¤
  4. āϰ⧇āĻ•āĻ°ā§āĻĄāĻŋāĻ‚ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ āĻŦāĻ¨ā§āϧ āĻšāϝāĻŧ⧇ āφāĻĒāϞ⧋āĻĄ āĻšāĻŦ⧇āĨ¤

⧍. āĻāφāχ āĻĒāĻžāχāĻĒāϞāĻžāχāύ āĻĒāĻ°ā§āϝāĻŦ⧇āĻ•ā§āώāĻŖ āĻ•āϰ⧁āύ

āφāĻĒāϞ⧋āĻĄ āĻ•āϰāĻžāϰ āĻĒāϰ⧇, āφāĻĒāύāĻŋ āĻĒāĻžāχāĻĒāϞāĻžāχāύāϟāĻŋ āϰāĻŋāϝāĻŧ⧇āϞ āϟāĻžāχāĻŽā§‡ āϚāϞāϤ⧇ āĻĻ⧇āĻ–āĻŦ⧇āύ:

āĻĒāĻ°ā§āϝāĻžāϝāĻŧ

āϕ⧀ āϘāϟāϛ⧇

āϏāĻŽāϝāĻŧāĻ•āĻžāϞ

āĻŦāĻŋāĻļā§āϞ⧇āώāĻŖ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇...

āĻœā§‡āĻŽāĻŋāύāĻŋ āĻĢā§āĻ˛ā§āϝāĻžāĻļ āφāĻĒāύāĻžāϰ āĻ­āĻŋāĻĄāĻŋāĻ“āϤ⧇ āĻ—āϤāĻŋāĻŦāĻŋāϧāĻŋāϰ āϧāϰāĻŖ āĻŦāĻŋāĻļā§āϞ⧇āώāĻŖ āĻ•āϰ⧇āĨ¤

~ā§Ģ-ā§§ā§Ļ āϏ⧇āϕ⧇āĻ¨ā§āĻĄ

āĻ…āĻŦāϤāĻžāϰ āϤ⧈āϰāĻŋ āĻšāĻšā§āϛ⧇...

āĻ¨ā§āϝāĻžāύ⧋ āĻŦā§āϝāĻžāύāĻžāύāĻž āφāĻĒāύāĻžāϰ āϏ⧇āϰāĻž āĻĢā§āϰ⧇āĻŽ āĻĨ⧇āϕ⧇ āĻāĻ•āϟāĻŋ āĻ¸ā§āϟāĻžāχāϞāĻŋāĻļ āĻ…ā§āϝāĻžāĻ­āĻžāϟāĻžāϰ āϤ⧈āϰāĻŋ āĻ•āϰ⧇āĨ¤

~ā§Ž-⧧⧍ āϏ⧇āϕ⧇āĻ¨ā§āĻĄ

āĻ­āĻŋāĻĄāĻŋāĻ“ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇...

Veo 3.1 āĻ…ā§āϝāĻžāĻ­āĻžāϟāĻžāϰ āĻ“ āĻŽā§‹āĻļāύ āĻĒā§āϰāĻŽā§āĻĒāϟ āĻĨ⧇āϕ⧇ āĻāĻ•āϟāĻŋ āĻāφāχ āĻ­āĻŋāĻĄāĻŋāĻ“ āϤ⧈āϰāĻŋ āĻ•āϰ⧇āĨ¤

~ā§Ŧā§Ļ-⧧⧍ā§Ļ āϏ⧇āϕ⧇āĻ¨ā§āĻĄ

āϰāϚāύāĻž āĻ•āϰāĻž...

ffmpeg āĻ›āĻžāρāϟāĻžāχ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ āϤ⧁āϞāύāĻž āϤ⧈āϰāĻŋ āĻ•āϰ⧇āĨ¤

~ā§Ģ-ā§§ā§Ļ āϏ⧇āϕ⧇āĻ¨ā§āĻĄ

ā§Š. āφāĻĒāύāĻžāϰ āϏ⧃āĻˇā§āϟāĻŋ āĻļ⧇āϝāĻŧāĻžāϰ āĻ•āϰ⧁āύ

āĻĒāĻžāχāĻĒāϞāĻžāχāύāϟāĻŋ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻšāϞ⧇:

  1. āĻ•āĻŋāϝāĻŧāĻ¸ā§āĻ• āĻ¸ā§āĻ•ā§āϰāĻŋāύ⧇ āĻāĻ•āϟāĻŋ āĻ•āĻŋāωāφāϰ āϕ⧋āĻĄ āĻĻ⧇āĻ–āĻž āϝāĻžāϝāĻŧāĨ¤
  2. āφāĻĒāύāĻžāϰ āĻĢā§‹āύ āĻĻāĻŋāϝāĻŧ⧇ āĻ•āĻŋāωāφāϰ āϕ⧋āĻĄāϟāĻŋ āĻ¸ā§āĻ•ā§āϝāĻžāύ āĻ•āϰ⧁āύāĨ¤
  3. āφāĻĒāύāĻŋ āφāĻĒāύāĻžāϰ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻ­āĻŋāĻĄāĻŋāĻ“ āϏāĻš āĻāĻ•āϟāĻŋ āĻŽā§‹āĻŦāĻžāχāϞ-āĻ…āĻĒā§āϟāĻŋāĻŽāĻžāχāϜāĻĄ āĻļ⧇āϝāĻŧāĻžāϰ āĻĒ⧇āϜ āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāĻŦ⧇āύāĨ¤

ā§Ē. āĻŦā§āϝāĻžāĻ•āĻāĻ¨ā§āĻĄ āϞāĻ—āϗ⧁āϞ⧋ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰ⧁āύ

👉đŸ’ģ āĻĻ⧇āϖ⧁āύ āύ⧇āĻĒāĻĨā§āϝ⧇ āϕ⧀ āϘāĻŸā§‡āĻ›āĻŋāϞ:

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

ā§Ģ. āϏāĻžāϰāĻŋāϟāĻŋ āĻĒāĻ°ā§āϝāĻŦ⧇āĻ•ā§āώāĻŖ āĻ•āϰ⧁āύ

👉đŸ’ģ āĻ•āϤāϗ⧁āϞ⧋ āĻ•āĻžāϜ āϚāϞāϛ⧇ āϤāĻž āĻĻ⧇āϖ⧁āύ:

curl $BACKEND_URL/api/queue/status

āϝāĻĻāĻŋ āĻāĻ•āχ āϏāĻžāĻĨ⧇ ā§ŠāϟāĻŋ āϏ⧇āĻļāύ āϏāĻ•ā§āϰāĻŋāϝāĻŧ āĻĨāĻžāϕ⧇, āϤāĻžāĻšāϞ⧇ āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻžāϟāĻŋ āύāĻŋāĻŽā§āύāϰ⧂āĻĒ āĻšāĻŦ⧇:

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

āύāϤ⧁āύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āĻāĻ•āϟāĻŋ āĻ¸ā§āϞāϟ āĻ–āĻžāϞāĻŋ āĻšāĻ“āϝāĻŧāĻž āĻĒāĻ°ā§āϝāĻ¨ā§āϤ āĻ…āĻĒ⧇āĻ•ā§āώāĻž āĻ•āϰāϤ⧇ āĻŦāϞāĻž āĻšāĻŦ⧇āĨ¤

⧝. 🎉 āωāĻĒāϏāĻ‚āĻšāĻžāϰ

āφāĻĒāύāĻŋ āϝāĻž āϤ⧈āϰāĻŋ āĻ•āϰ⧇āϛ⧇āύ

✅ āĻāφāχ āĻŽā§‹āĻļāύ āĻ…ā§āϝāĻžāύāĻžāϞāĻžāχāϏāĻŋāϏ — āĻœā§‡āĻŽāĻŋāύāĻŋ āĻĢā§āĻ˛ā§āϝāĻžāĻļ āĻ­āĻŋāĻĄāĻŋāĻ“āϰ āĻ—āϤāĻŋ, āĻ›āĻ¨ā§āĻĻ āĻāĻŦāĻ‚ āĻļ⧈āϞ⧀ āĻŦāĻŋāĻļā§āϞ⧇āώāĻŖ āĻ•āϰ⧇āĨ¤

✅ āĻ…ā§āϝāĻžāĻ­āĻžāϟāĻžāϰ āϤ⧈āϰāĻŋ — āĻ¨ā§āϝāĻžāύ⧋ āĻŦā§āϝāĻžāύāĻžāύāĻž āĻ­āĻŋāĻĄāĻŋāĻ“ āĻĢā§āϰ⧇āĻŽ āĻĨ⧇āϕ⧇ āĻ¸ā§āϟāĻžāχāϞāĻŋāĻļ āĻ…ā§āϝāĻžāĻ­āĻžāϟāĻžāϰ āϤ⧈āϰāĻŋ āĻ•āϰ⧇

✅ āĻāφāχ āĻ­āĻŋāĻĄāĻŋāĻ“ āϤ⧈āϰāĻŋ — Veo 3.1 āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻ—āϤāĻŋāĻŦāĻŋāϧāĻŋāϰ āϏāĻžāĻĨ⧇ āĻŽāĻŋāϞāĻŋāϝāĻŧ⧇ āύāϤ⧁āύ āĻ­āĻŋāĻĄāĻŋāĻ“ āϤ⧈āϰāĻŋ āĻ•āϰ⧇āĨ¤

✅ āĻ…ā§āϝāĻžāϏāĻŋāĻ™ā§āĻ• āĻĒāĻžāχāĻĒāϞāĻžāχāύ — āĻ•āĻŋāω āĻŽā§āϝāĻžāύ⧇āϜāĻŽā§‡āĻ¨ā§āϟ āϏāĻš āĻŦā§āϝāĻžāĻ•āĻ—ā§āϰāĻžāωāĻ¨ā§āĻĄ āĻĒā§āϰāϏ⧇āϏāĻŋāĻ‚ (āĻāĻ•āϏāĻžāĻĨ⧇ āϏāĻ°ā§āĻŦā§‹āĻšā§āϚ ā§ŠāϟāĻŋ)

✅ āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ āĻ•āĻŽā§āĻĒā§‹āϜāĻŋāĻļāύ — āĻāĻĢāĻāĻĢāĻāĻŽāĻĒāĻŋāχāϜāĻŋ-āϚāĻžāϞāĻŋāϤ āĻ­āĻŋāĻĄāĻŋāĻ“ āĻ•āĻŽā§āĻĒā§‹āϜāĻŋāϟāĻŋāĻ‚

✅ āĻ•ā§āϞāĻžāωāĻĄ āϰāĻžāύ āĻĄā§‡āĻĒā§āϞāϝāĻŧāĻŽā§‡āĻ¨ā§āϟ — āϏāĻžāĻ°ā§āĻ­āĻžāϰāĻŦāĻŋāĻšā§€āύ, āĻ…āĻŸā§‹-āĻ¸ā§āϕ⧇āϞāĻŋāĻ‚, āϕ⧋āύ⧋ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻŦā§āϝāĻŦāĻ¸ā§āĻĨāĻžāĻĒāύāĻžāϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āύ⧇āχ

āφāĻĒāύāĻŋ āϝ⧇ āĻŽā§‚āϞ āϧāĻžāϰāĻŖāĻžāϗ⧁āϞ⧋ āĻļāĻŋāϖ⧇āϛ⧇āύ

  1. āĻœā§‡āĻŽāĻŋāύāĻŋ āĻŽāĻžāĻ˛ā§āϟāĻŋāĻŽā§‹āĻĄāĻžāϞ — āχāύāĻĒ⧁āϟ āĻšāĻŋāϏāĻžāĻŦ⧇ āĻ­āĻŋāĻĄāĻŋāĻ“ āĻĒā§āϰ⧇āϰāĻŖ āĻāĻŦāĻ‚ āĻ•āĻžāĻ āĻžāĻŽā§‹āĻ—āϤ JSON āĻŦāĻŋāĻļā§āϞ⧇āώāĻŖ āĻ—ā§āϰāĻšāĻŖ
  2. āĻ¨ā§āϝāĻžāύ⧋ āĻŦāĻžāύāĻžāύāĻž (āĻœā§‡āĻŽāĻŋāύāĻŋ āχāĻŽā§‡āϜ āĻœā§‡āύāĻžāϰ⧇āĻļāύ) — āϰ⧇āĻĢāĻžāϰ⧇āĻ¨ā§āϏ āχāĻŽā§‡āϜ āĻ“ āĻ¸ā§āϟāĻžāχāϞ āĻĒā§āϰāĻŽā§āĻĒāϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ…ā§āϝāĻžāĻ­āĻžāϟāĻžāϰ āϤ⧈āϰāĻŋ āĻ•āϰāĻž
  3. Veo 3.1 — āϰ⧇āĻĢāĻžāϰ⧇āĻ¨ā§āϏ āĻ…ā§āϝāĻžāϏ⧇āϟ āĻāĻŦāĻ‚ āĻŸā§‡āĻ•ā§āϏāϟ āĻĒā§āϰāĻŽā§āĻĒāϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ…ā§āϝāĻžāϏāĻŋāĻ™ā§āĻ•ā§āϰ⧋āύāĻžāϏ āĻ­āĻŋāĻĄāĻŋāĻ“ āϤ⧈āϰāĻŋ
  4. āĻ•ā§āϞāĻžāωāĻĄ āϰāĻžāύ — āĻāύāĻ­āĻžāϝāĻŧāϰāύāĻŽā§‡āĻ¨ā§āϟ āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞ āĻāĻŦāĻ‚ āĻ…āĻŸā§‹-āĻ¸ā§āϕ⧇āϞāĻŋāĻ‚ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ āĻĄā§‡āĻĒā§āϞāϝāĻŧ āĻ•āϰāĻž
  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 āĻŦ⧃āĻĻā§āϧāĻŋ āĻ•āϰ⧁āύāĨ¤

āϏāĻŽā§āĻĒāĻĻ