# Web UI — developer guide Setup, run, deploy (FastAPI + React). Product scope: **[SPEC_WEB_UI.md](./SPEC_WEB_UI.md)**. **Imports:** Code under `VideoGeneration-release/web/`. Run Python with cwd **`VideoGeneration-release`** and **`PYTHONPATH=.`** (not `web/` alone). ## Prerequisites Python 3.10+, Node 18+, npm, **ffmpeg** on `PATH`. ## Python venv ```bash cd /path/to/VideoGeneration-release python3 -m venv .venv source .venv/bin/activate # Windows: .venv\Scripts\activate pip install -r web/requirements.txt ``` ## Environment variables Do not commit secrets. | Variable | Purpose | |----------|---------| | `GEMINI_API_KEY` | Server-side API key. | | `WEB_UI_PASSWORD` | Login password. | | `SESSION_SECRET` | Session signing, e.g. `openssl rand -hex 32`. | | `GENERATION_OPTIONS_PATH` | Optional; overrides default `web/config/generation_options.json`. | | `SESSION_COOKIE_SECURE` | Optional. `1`/`true`/`yes` for HTTPS-only cookies (e.g. Hugging Face). Unset for local `http://127.0.0.1`. Proxy must send `X-Forwarded-Proto` (see Hugging Face / Docker below). | ```bash export GEMINI_API_KEY="your_key" export WEB_UI_PASSWORD="password" export SESSION_SECRET="$(openssl rand -hex 32)" ``` ## `generation_options.json` Edit **`web/config/generation_options.json`** (or path from `GENERATION_OPTIONS_PATH`). UI loads it via **`GET /api/config/generation-options`** after login. JSON-only changes need no frontend rebuild. - **`image`**: `models`, `aspect_ratios`, `resolutions`. - **`video`** / **`video_frames`**: `models`, `aspect_ratios`, `resolutions`, `durations_seconds`. On **`video`**, **`supports_reference_images: false`** disables reference images for that model (e.g. Veo 3 / Veo 3 Fast — prompt-only; Veo 3.1 Lite — also no reference images). With reference images, duration is **8s**. **首尾帧** route is always **8s**. On **`video_frames`**, **`supports_end_frame: false`** (e.g. Veo 3 / Veo 3 Fast) means only the start frame is used; end-frame UI and last-frame conditioning are omitted. ## Build frontend ```bash cd web/frontend npm install npm run build ``` Output: **`web/backend/static/`**. Without it, root URL returns 503. ## Run server ```bash cd /path/to/VideoGeneration-release PYTHONPATH=. uvicorn web.backend.main:app --host 127.0.0.1 --port 8000 ``` LAN: `--host 0.0.0.0`. Dev: `--reload`. ## Dev (hot reload) **API:** `PYTHONPATH=. uvicorn web.backend.main:app --reload --host 127.0.0.1 --port 8000` from repo root. **Vite:** `cd web/frontend && npm run dev` — proxies `/api` to 8000; open the printed URL (e.g. `http://127.0.0.1:5173`). ## Stable URL Use your own DNS/domain, static IP, reverse proxy, or tunnel — no hostname is baked into the app. ## Checklist - [ ] `ffmpeg -version` - [ ] `pip install -r web/requirements.txt` - [ ] `npm run build` in `web/frontend` at least once - [ ] `GEMINI_API_KEY`, `WEB_UI_PASSWORD`, `SESSION_SECRET` set - [ ] Uvicorn from repo root with `PYTHONPATH=.` ## Hugging Face Spaces (Docker) Use **Docker** Space (`sdk: docker`). **`Dockerfile`** at repo root beside `web/` and `assets/`. ### Create & upload [Hugging Face](https://huggingface.co/) → New Space → **SDK: Docker**. Root **`README.md`** YAML must validate (`sdk: docker`; **`colorFrom`** / **`colorTo`** each one of: `red`, `yellow`, `green`, `blue`, `indigo`, `purple`, `pink`, `gray`). **Upload** from **`VideoGeneration-release`** (contains `Dockerfile`, `web/`, `assets/`): ```bash pip install -U huggingface_hub huggingface-cli login cd /path/to/VideoGeneration-release hf upload YOUR_USERNAME/YOUR_SPACE_NAME . . --repo-type space ``` Or add git remote `https://huggingface.co/spaces/USER/SPACE` and push. ### Secrets **Settings → Variables and secrets** — same names as the env table above (case-sensitive). Optional: `GENERATION_OPTIONS_PATH`. Saving restarts the Space. ### Runtime (Dockerfile) Listens on **`PORT`** or **7860**. **`--forwarded-allow-ips='*'`** is required behind HF’s proxy so HTTPS and session cookies work. **ffmpeg** in image. Cold start can take minutes. ### Local Docker ```bash cd /path/to/VideoGeneration-release docker build -t gemini-studio-web . docker run --rm -p 7860:7860 \ -e GEMINI_API_KEY="your_key" \ -e WEB_UI_PASSWORD="your_password" \ -e SESSION_SECRET="$(openssl rand -hex 32)" \ gemini-studio-web ``` Open `http://127.0.0.1:7860`.