diff --git a/CLAUDE.md b/CLAUDE.md index d465298..63d403a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4,214 +4,315 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co ## Project Overview -This is a full-stack web application for integrating Google's Veo 3.0 video generation model. The project consists of: +Full-stack web application integrating Google's **Veo 3.1 video generation models only**. The system provides text-to-video and image-to-video generation with advanced features like frame interpolation and reference images. -- **Backend**: Flask REST API that interfaces with Google's Gen AI SDK (v1.17.0) for Veo 3.0 video generation -- **Frontend**: React single-page application with Material-UI components and MSAL authentication -- **Storage**: Google Cloud Storage for temporary video and image file storage -- **Deployment**: Production-ready with systemd service and Apache reverse proxy configuration +**Stack:** +- Backend: Flask 3.0 + Google Gen AI SDK 1.47.0 +- Frontend: React 18 + Vite + Material-UI 5 +- Storage: Google Cloud Storage +- Auth: Azure AD SSO (MSAL) with dev mode bypass +- Deployment: systemd service + Apache reverse proxy -### Key Features -- Text-to-video and image-to-video generation -- Dual model support (Veo 3.0 and Veo 3.0 Fast) -- Multi-process job queue system (max 2 concurrent jobs per instance) -- Real-time progress tracking with job status polling -- Azure AD SSO authentication (with dev mode bypass) -- Automatic file cleanup and download management -- Usage tracking via webhook integration +**Note:** This application exclusively uses Veo 3.1 models (Standard and Fast variants). Veo 3.0 models are not supported. ## Common Commands ### Development ```bash -# Start both frontend and backend in development mode +# Start both frontend and backend ./run-dev.sh -# Start backend only -cd backend && python app.py +# Backend only (from backend/) +python app.py -# Start frontend only -cd frontend && npm run dev +# Frontend only (from frontend/) +npm run dev # Build frontend for production cd frontend && npm run build - -# Frontend linting -cd frontend && npm run lint ``` -### Backend Commands -```bash -# Install Python dependencies -cd backend && pip install -r requirements.txt - -# Create virtual environment -python -m venv venv && source venv/bin/activate # Linux/Mac -python -m venv venv && venv\Scripts\activate # Windows - -# Run backend in debug mode -cd backend && FLASK_DEBUG=True python app.py -``` - -### Production Deployment -```bash -# Backend systemd service management -sudo systemctl start veo-video-generator -sudo systemctl stop veo-video-generator -sudo systemctl restart veo-video-generator -sudo systemctl status veo-video-generator - -# View service logs -sudo journalctl -u veo-video-generator -f -``` - -## Project Structure - -``` -veo3_poc/ -├── backend/ # Flask backend application -│ ├── routes/ # API routes (api.py, health.py) -│ ├── utils/ # Utilities (auth.py, storage.py) -│ ├── app.py # Flask app initialization -│ ├── config.py # Configuration management -│ ├── video_generator.py # Core Veo 3.0 integration -│ └── requirements.txt # Python dependencies -├── frontend/ # React frontend application -│ ├── src/ -│ │ ├── components/ # React components (VideoForm, ProgressIndicator, etc.) -│ │ ├── services/ # API service layer -│ │ └── config/ # MSAL configuration -│ └── package.json # Node.js dependencies -└── service-account.json # Google Cloud service account key -``` - -## Configuration Requirements - -### Backend Configuration (`backend/.env`) - -The backend uses environment-specific files: -- **`.env.development`**: Local development with debug mode and localhost CORS -- **`.env.production`**: Production deployment with strict CORS and optimized settings - -Key environment variables: -- `PROJECT_ID`: Google Cloud project ID -- `OUTPUT_GCS_BUCKET_NAME`: GCS bucket for temporary storage -- `REGION`: Google Cloud region (us-central1) -- `MODEL_ID`: Veo model identifier (veo-3.0-generate-preview) -- `MODEL_FAST_ID`: Veo Fast model identifier (veo-3.0-fast-generate-preview) -- `SERVICE_ACCOUNT_KEY_PATH`: Path to service account JSON (../service-account.json) -- `PORT`: Backend server port (7394) -- `FRONTEND_URL`: Frontend URL for CORS configuration - -### Frontend Configuration (`frontend/.env`) - -Environment-specific files: -- **`.env.development`**: Localhost API, auth bypass enabled (`VITE_DEV_MODE=true`) -- **`.env.production`**: Production API, MSAL authentication enabled - -Key environment variables: -- `VITE_API_BASE_URL`: Backend API URL -- `VITE_DEV_MODE`: Enable/disable auth bypass -- `VITE_MSAL_CLIENT_ID`: Azure AD client ID -- `VITE_MSAL_AUTHORITY`: Azure AD authority URL -- `VITE_MSAL_REDIRECT_URI`: Authentication redirect URI - -## Running the Application - -### Quick Start (Development) - -```bash -# Run both frontend and backend with one command -./run-dev.sh - -# Access: -# Frontend: http://localhost:3000 -# Backend API: http://localhost:7394 -``` - -### Manual Start - -**Backend:** +### Backend Setup ```bash cd backend +python -m venv venv +source venv/bin/activate # Linux/Mac +venv\Scripts\activate # Windows +pip install -r requirements.txt cp .env.development .env python app.py ``` -**Frontend:** +### Frontend Setup ```bash cd frontend -npm install # first time only +npm install +cp .env.development .env npm run dev ``` -### Production Deployment +### Production Service Management +```bash +# systemd service control +sudo systemctl start veo-video-generator +sudo systemctl stop veo-video-generator +sudo systemctl restart veo-video-generator +sudo systemctl status veo-video-generator -1. Build frontend: `cd frontend && npm run build` -2. Copy `dist/` contents to Apache web root -3. Configure systemd service: `veo-video-generator.service` -4. Configure Apache: `apache.conf` and `apache-htaccess.txt` +# View logs +sudo journalctl -u veo-video-generator -f +``` -## Key Dependencies - -### Backend -- `flask==3.0.0` - Web framework -- `google-genai==1.17.0` - Google Gen AI SDK for Veo 3.0 (replaces deprecated google-generativeai) -- `google-cloud-storage==2.12.0` - GCS operations -- `Pillow==10.1.0` - Image processing - -### Frontend -- `react==18.2.0` - UI framework -- `@mui/material==5.15.1` - Material-UI components -- `@azure/msal-react==2.0.7` - Microsoft authentication -- `vite==5.0.8` - Build tool - -## Core Architecture +## Architecture ### Job Queue System -The application implements a multi-process job queue system in `backend/video_generator.py`: -- **Global queue**: `job_queue` array stores pending job IDs -- **Processing jobs**: `processing_jobs` tracks active jobs (max 2 concurrent via `CONCURRENT_JOB_LIMIT`) -- **User limits**: `user_job_counts` enforces max 4 jobs per user (`MAX_QUEUE_SIZE_PER_USER`) -- **Job status**: In-memory `job_status` dictionary tracks all job states (consider Redis for production scaling) +The core of the application is a multi-process job queue system implemented in `backend/video_generator.py`: -### Backend Request Flow -1. **Job creation**: `generate_video_task()` validates input, creates UUID, queues job -2. **Queue processing**: `process_job_queue()` thread picks jobs from queue -3. **Video generation**: `generate_video()` calls Google Gen AI SDK with threading -4. **Status updates**: Jobs transition through: queued → processing → polling → completed/failed -5. **File management**: Videos downloaded to `temp_downloads/`, cleaned up after user download +**Key Data Structures:** +- `job_status`: In-memory dict tracking all job states (consider Redis for production scaling) +- `job_queue`: Global FIFO array of pending job IDs +- `processing_jobs`: Array of currently active jobs (max 2 concurrent via `CONCURRENT_JOB_LIMIT`) +- `user_job_counts`: Per-user job count tracking (no limits, but tracked for monitoring) -### Authentication Architecture -- **Production**: Azure AD SSO via MSAL (`@azure/msal-react`) -- **Development**: Auth bypass when `VITE_DEV_MODE=true` -- **Backend validation**: No auth validation on backend (frontend-only) +**Queue Processing Flow:** +1. Jobs are created with UUID and added to `job_queue` via `add_to_queue()` +2. Background thread in `start_next_job()` picks jobs when `len(processing_jobs) < CONCURRENT_JOB_LIMIT` +3. `process_video_generation()` handles the actual generation in a separate thread +4. `complete_job()` removes from `processing_jobs` and triggers next job + +**Job Lifecycle States:** +- `queued` → `processing` → `generating` → `downloading` → `completed` +- OR: `failed`, `cancelled`, `retry_1_of_3`, etc. + +### Video Generation Pipeline + +**Request Flow (backend/routes/api.py → video_generator.py):** +1. **POST /api/generate**: Multipart form data with prompt, images, parameters +2. **Job creation**: `generate_video_async()` creates UUID, validates inputs +3. **Image processing**: If images provided, validate → convert to JPEG → upload to GCS `temp_images/` +4. **API calls**: Multiple threaded calls to Google Gen AI SDK (1 call per requested video) +5. **Polling**: Backend polls operations every 30s, frontend polls status every 2s +6. **Download**: Videos downloaded from GCS to `temp_downloads/job_{job_id}/` +7. **Packaging**: Multiple videos + images packaged into zip if needed +8. **Cleanup**: Auto-delete 5 seconds after successful download + +**Key Functions:** +- `generate_video_async()`: Queue job, return job ID immediately +- `process_video_generation()`: Main processing function (runs in thread) +- `start_next_job()`: Queue processor that maintains concurrent limit +- `complete_job()`: Cleanup and start next queued job + +### Model Support (Veo 3.1 Only) + +Two models defined in `backend/config.py` → `SUPPORTED_MODELS`: +- **veo-3.1-generate-preview** (Veo 3.1 Standard): High-quality with reference images + frame interpolation ($0.40/sec) +- **veo-3.1-fast-generate-preview** (Veo 3.1 Fast): Optimized speed with frame interpolation only ($0.15/sec) + +**Veo 3.1 Feature Constraints (enforced in `process_video_generation()`):** +- **Frame interpolation (last frame)**: Requires 8-second duration, available on BOTH models +- **Reference images**: Requires 8-second duration + 16:9 aspect ratio, Standard model ONLY (NOT available in Fast) + +### Authentication Flow + +**Production:** Azure AD SSO via `@azure/msal-react` +- Frontend wraps app in `` component +- Backend has NO auth validation (frontend-only) + +**Development:** Auth bypass when `VITE_DEV_MODE=true` +- `` component bypasses MSAL +- Shows "Dev User" in UI header ### Storage Architecture -- **Temporary images**: Uploaded to GCS `temp_images/` bucket path, cleaned up after processing -- **Generated videos**: Downloaded from GCS to local `temp_downloads/` directory -- **Automatic cleanup**: Configurable delays (15s small files, 30s large files) -## Video Generation Flow +**Local Storage:** +- `backend/temp_downloads/job_{job_id}/`: Per-job folder for videos and images +- Files deleted automatically 5 seconds after download +- Entire job folder removed with `shutil.rmtree()` for efficiency -1. **User submits request** via React frontend (prompt + optional image + parameters) -2. **Job queuing**: Backend creates job with UUID, adds to global queue, enforces user limits -3. **Queue processing**: Background thread picks next job when slot available -4. **Image processing** (if provided): validate, convert to JPEG, upload to GCS -5. **API call to Google**: Gen AI SDK call with Veo 3.0 model in separate thread -6. **Backend polling**: Long-running operation polled every 30 seconds -7. **Frontend polling**: Status endpoint polled every 2 seconds for progress updates -8. **Video download**: Completed video downloaded from GCS to local temp storage -9. **User download**: Video served to user and temp files cleaned up automatically +**GCS Storage:** +- Temp images: `gs://{bucket}/temp_images/` (cleaned up after processing) +- Generated videos: `gs://{bucket}/veo_outputs/{prompt}_{timestamp}/` (cleaned up after download) +- Cleanup happens in `cleanup_image_files()` and `delete_blob()` from `utils/storage.py` -## Important Implementation Details +**Download Strategy (backend/routes/api.py:download_video):** +- Single video + no image → Direct MP4 download +- Multiple videos OR image included → ZIP file download +- ZIP created in `process_video_generation()` and stored in job folder -- **Concurrent processing**: Max 2 simultaneous video generations per backend instance -- **Queue management**: FIFO queue with per-user limits to prevent abuse -- **Error handling**: Max 3 retries per job with exponential backoff -- **File cleanup**: Automatic deletion after download, configurable cleanup endpoint -- **CORS**: Development allows localhost, production restricts to specific domain -- **Image formats**: All Pillow-supported formats accepted, automatically converted to JPEG -- **Model selection**: UI allows choosing between Veo 3.0 (high-quality) and Veo 3.0 Fast (optimized) -- **Usage tracking**: Optional webhook integration sends generation data to external endpoint -- **Threading**: Job processing and GCS operations use threading for non-blocking execution \ No newline at end of file +## Project Structure + +``` +backend/ +├── routes/ +│ ├── api.py # Main API routes (generate, status, download, cancel, retry, delete) +│ └── health.py # Health check endpoints +├── utils/ +│ ├── auth.py # Google Cloud credentials +│ └── storage.py # GCS operations, image validation/conversion +├── app.py # Flask app initialization, CORS setup +├── config.py # Config class with model definitions, env vars +├── video_generator.py # Core logic: queue system, job processing, Gen AI SDK calls +├── requirements.txt +├── .env.development # Dev config (localhost CORS, debug mode) +└── .env.production # Prod config (strict CORS, optimized) + +frontend/ +├── src/ +│ ├── components/ +│ │ ├── VideoForm.jsx # Main form with conditional Veo 3.1 features +│ │ ├── VideoGenerator.jsx # Top-level container +│ │ ├── ProgressIndicator.jsx # Job status display +│ │ ├── QueueManager.jsx # Queue visualization (3 sections) +│ │ ├── Layout.jsx # App layout wrapper +│ │ ├── AuthGuard.jsx # MSAL authentication wrapper +│ │ └── DevAuthWrapper.jsx # Dev mode auth bypass +│ ├── services/ +│ │ └── api.js # Axios API client +│ ├── hooks/ +│ │ └── useVideoGeneration.js # Custom hook for video generation logic +│ ├── config/ +│ │ └── msalConfig.js # MSAL configuration +│ └── App.jsx # Main app component +├── .env.development # Dev config (localhost API, VITE_DEV_MODE=true) +└── .env.production # Prod config (production API, MSAL enabled) +``` + +## Configuration + +### Backend Environment Variables (.env.development vs .env.production) + +**Critical differences:** +- `FLASK_ENV`: `development` vs `production` +- `FLASK_DEBUG`: `True` vs `False` +- `FRONTEND_URL`: `http://localhost:3000` vs production URL +- CORS: Development allows `localhost:3000`, `127.0.0.1:3000` + configured URL + +**Key variables (backend/config.py):** +- `PROJECT_ID`, `REGION`, `OUTPUT_GCS_BUCKET_NAME`: GCP configuration +- `SERVICE_ACCOUNT_KEY_PATH`: Path to service account JSON (default: `../service-account.json`) +- `MODEL_ID`, `MODEL_FAST_ID`: Default model identifiers (overridable per request) +- `WEBHOOK_URL`, `WEBHOOK_ENABLED`: Usage tracking webhook integration +- `TEMP_DOWNLOAD_PATH`: Local storage path (`./temp_downloads/`) +- `MAX_IMAGE_SIZE`: 10MB upload limit +- `MIN_IMAGE_RESOLUTION`: (720, 720) minimum + +### Frontend Environment Variables + +**Critical differences:** +- `VITE_DEV_MODE`: `true` (bypasses auth) vs `false` (enables MSAL) +- `VITE_API_BASE_URL`: `http://localhost:7394` vs production API URL + +**Key variables:** +- `VITE_MSAL_CLIENT_ID`, `VITE_MSAL_AUTHORITY`, `VITE_MSAL_REDIRECT_URI`: Azure AD config + +## API Endpoints + +### Main Routes (backend/routes/api.py) + +**Job Management:** +- `POST /api/generate`: Start video generation (multipart form data) +- `GET /api/status/`: Get job status with queue position +- `GET /api/download/`: Download video/zip (auto-deletes job after 5s) +- `GET /api/download//video/`: Download individual video +- `GET /api/user-jobs?user_email=`: Get all user jobs +- `GET /api/queue-status`: Get queue status (length, processing jobs, concurrent limit) + +**Job Actions:** +- `POST /api/cancel/`: Cancel queued/processing job +- `POST /api/retry/`: Retry failed/cancelled job +- `DELETE /api/delete/`: Completely delete job and files +- `DELETE /api/cleanup/`: Manual cleanup (full GCS cleanup) +- `DELETE /api/cleanup//local`: Fast local-only cleanup + +**Health:** +- `GET /health`: Detailed health check with config info +- `GET /ping`: Simple ping response + +## Key Implementation Details + +### Multi-Video Generation +- Frontend sends `sampleCount` (1-4 videos per request) +- Backend makes N API calls to ensure N videos (1 call per video) +- Operations polled in parallel, results collected in `all_generated_videos` +- Exact count selected: `generated_videos = all_generated_videos[:sample_count]` + +### Image Processing Pipeline (utils/storage.py) +1. **Validation**: Check format, resolution, file size +2. **Conversion**: All formats → JPEG (Pillow supported formats accepted) +3. **Aspect ratio detection**: Auto-detect 16:9 or 9:16 +4. **Cropping**: Auto-crop to target aspect ratio if needed +5. **Upload**: To GCS `temp_images/` with unique blob name +6. **Cleanup**: Delete from GCS after video generation completes + +### Error Handling & Retries +- Automatic retry for network errors: 503, 500, timeout, connection errors +- Max 3 retries with exponential backoff (30s, 60s, 120s) +- Retry count tracked in `job_status[job_id]['retry_count']` +- Job status shows `retry_1_of_3`, `retry_2_of_3`, etc. +- Final failure after max retries updates status to `failed` + +### File Cleanup Strategy +- **Auto-cleanup**: Triggered 5 seconds after successful download +- **Complete deletion**: `delete_job_completely()` removes from queue, job_status, local files, GCS files +- **Efficient folder cleanup**: Uses `shutil.rmtree()` instead of individual file deletion +- **GCS cleanup**: Optional in `cleanup_job_files(cleanup_gcs=True/False)` for performance + +### Content Safety Filtering +- Handled in `process_video_generation()` after operation completion +- Checks `response.rai_media_filtered_count` and `rai_media_filtered_reasons` +- Returns user-friendly error message with filter reason + +### Usage Tracking +- Webhook integration sends data to configured endpoint +- Payload includes: user email, prompt, model, timestamp +- Non-blocking: Failures don't interrupt main flow +- Disable with `WEBHOOK_ENABLED=false` + +## Development Workflow + +**Quick start:** Run `./run-dev.sh` from project root + +**Manual start:** +1. Backend: `cd backend && python app.py` (port 7394) +2. Frontend: `cd frontend && npm run dev` (port 3000) + +**Development features:** +- Hot reload on both frontend and backend +- Auth bypass enabled (no Azure AD needed) +- Verbose logging with DEBUG statements +- CORS configured for localhost + +**Environment setup:** +- Script automatically copies `.env.development` to `.env` for both frontend and backend +- Virtual environment required for backend (must be created manually first) +- Frontend dependencies installed automatically if missing + +## Production Deployment + +**Backend:** +1. Copy `veo-video-generator.service` to `/etc/systemd/system/` +2. Update paths in service file +3. Enable and start: `sudo systemctl enable veo-video-generator && sudo systemctl start veo-video-generator` + +**Frontend:** +1. Build: `cd frontend && npm run build` +2. Copy `dist/*` to Apache web root +3. Copy `apache-htaccess.txt` to web root as `.htaccess` + +**Apache configuration:** +- Main config in `apache.conf` (reverse proxy to backend) +- Required modules: `proxy`, `proxy_http`, `rewrite`, `headers`, `expires` +- Backend proxied at `/api` endpoint +- Frontend served as static files with SPA routing support + +## Important Notes + +- **Veo 3.1 Only**: Application exclusively uses Veo 3.1 models. Veo 3.0 is not supported. +- **In-memory job tracking**: `job_status` dict is NOT persisted. Consider Redis for production scaling. +- **No queue limits**: Unlimited submissions allowed per user (removed MAX_QUEUE_SIZE_PER_USER) +- **Concurrent processing**: Hard limit of 2 jobs (`CONCURRENT_JOB_LIMIT`) +- **Service account required**: Must have GCS permissions for bucket operations +- **SDK version**: Requires `google-genai>=1.47.0` for Veo 3.1 features +- **Image formats**: All Pillow formats accepted, automatically converted to JPEG +- **Auto-deletion**: Jobs automatically deleted 5 seconds after download (no user action needed) +- **Frontend validation**: No backend auth validation - security relies on frontend MSAL diff --git a/backend/.env.development b/backend/.env.development index 7c0b270..379645a 100644 --- a/backend/.env.development +++ b/backend/.env.development @@ -1,7 +1,7 @@ # Google Cloud Configuration PROJECT_ID=optical-414516 REGION=us-central1 -MODEL_ID=veo-3.0-generate-preview +MODEL_ID=veo-3.1-generate-preview OUTPUT_GCS_BUCKET_NAME=optical-veo3-test SERVICE_ACCOUNT_KEY_PATH=./service-account.json diff --git a/backend/.env.example b/backend/.env.example index f3f57a3..ef92c22 100644 --- a/backend/.env.example +++ b/backend/.env.example @@ -1,7 +1,7 @@ # Google Cloud Configuration PROJECT_ID=your-project-id REGION=us-central1 -MODEL_ID=veo-3.0-generate-preview +MODEL_ID=veo-3.1-generate-preview OUTPUT_GCS_BUCKET_NAME=your-bucket-name SERVICE_ACCOUNT_KEY_PATH=../service-account.json diff --git a/backend/.env.production b/backend/.env.production index 2d28ce0..c5041d6 100644 --- a/backend/.env.production +++ b/backend/.env.production @@ -1,7 +1,7 @@ # Google Cloud Configuration PROJECT_ID=optical-414516 REGION=us-central1 -MODEL_ID=veo-3.0-generate-preview +MODEL_ID=veo-3.1-generate-preview OUTPUT_GCS_BUCKET_NAME=optical-veo3-test SERVICE_ACCOUNT_KEY_PATH=./service-account.json diff --git a/backend/config.py b/backend/config.py index d93fc61..7d07ca1 100644 --- a/backend/config.py +++ b/backend/config.py @@ -7,36 +7,16 @@ class Config: # Google Cloud Configuration PROJECT_ID = os.getenv('PROJECT_ID', 'optical-414516') REGION = os.getenv('REGION', 'us-central1') - MODEL_ID = os.getenv('MODEL_ID', 'veo-3.0-generate-preview') - MODEL_FAST_ID = os.getenv('MODEL_FAST_ID', 'veo-3.0-fast-generate-preview') + MODEL_ID = os.getenv('MODEL_ID', 'veo-3.1-generate-preview') + MODEL_FAST_ID = os.getenv('MODEL_FAST_ID', 'veo-3.1-fast-generate-preview') OUTPUT_GCS_BUCKET_NAME = os.getenv('OUTPUT_GCS_BUCKET_NAME', 'optical-veo3-test') SERVICE_ACCOUNT_KEY_PATH = os.getenv('SERVICE_ACCOUNT_KEY_PATH', '../service-account.json') - # Model configurations + # Model configurations - Veo 3.1 Only SUPPORTED_MODELS = { - # Veo 3.0 Models - 'veo-3.0-generate-preview': { - 'name': 'Veo 3.0', - 'description': 'High-quality video generation', - 'price_per_second': 0.40, - 'speed': 'Standard', - 'supports_reference_images': False, - 'supports_last_frame': False, - 'supports_video_extension': False - }, - 'veo-3.0-fast-generate-preview': { - 'name': 'Veo 3.0 Fast', - 'description': 'Optimized for speed and cost', - 'price_per_second': 0.15, - 'speed': 'Fast', - 'supports_reference_images': False, - 'supports_last_frame': False, - 'supports_video_extension': False - }, - # Veo 3.1 Models 'veo-3.1-generate-preview': { - 'name': 'Veo 3.1', - 'description': 'Next-gen with reference images & frame interpolation', + 'name': 'Veo 3.1 Standard', + 'description': 'High-quality with reference images & frame interpolation', 'price_per_second': 0.40, 'speed': 'Standard', 'supports_reference_images': True, @@ -45,7 +25,7 @@ class Config: }, 'veo-3.1-fast-generate-preview': { 'name': 'Veo 3.1 Fast', - 'description': 'Optimized Veo 3.1 with last frame interpolation (no reference images)', + 'description': 'Optimized speed with frame interpolation', 'price_per_second': 0.15, 'speed': 'Fast', 'supports_reference_images': False, # Reference images NOT supported in Fast model diff --git a/backend/temp_downloads/job_10167a5d-8ce0-4403-91f8-a6c746c80b46/generated_video_1.mp4 b/backend/temp_downloads/job_10167a5d-8ce0-4403-91f8-a6c746c80b46/generated_video_1.mp4 deleted file mode 100644 index b1d2b71..0000000 Binary files a/backend/temp_downloads/job_10167a5d-8ce0-4403-91f8-a6c746c80b46/generated_video_1.mp4 and /dev/null differ diff --git a/backend/temp_downloads/job_2fbd536e-6909-4b5d-8baf-1acbeee8ae91/generated_video_1.mp4 b/backend/temp_downloads/job_2fbd536e-6909-4b5d-8baf-1acbeee8ae91/generated_video_1.mp4 deleted file mode 100644 index 9cb5aaf..0000000 Binary files a/backend/temp_downloads/job_2fbd536e-6909-4b5d-8baf-1acbeee8ae91/generated_video_1.mp4 and /dev/null differ diff --git a/backend/temp_downloads/job_322a0809-59d7-48a8-b11e-45781839049b/stickman_running.jpg b/backend/temp_downloads/job_322a0809-59d7-48a8-b11e-45781839049b/stickman_running.jpg deleted file mode 100644 index 3e08c52..0000000 Binary files a/backend/temp_downloads/job_322a0809-59d7-48a8-b11e-45781839049b/stickman_running.jpg and /dev/null differ diff --git a/backend/temp_downloads/job_3a76d267-b814-4740-9a36-24cc7774211d/stickman_running.jpg b/backend/temp_downloads/job_3a76d267-b814-4740-9a36-24cc7774211d/stickman_running.jpg deleted file mode 100644 index 3e08c52..0000000 Binary files a/backend/temp_downloads/job_3a76d267-b814-4740-9a36-24cc7774211d/stickman_running.jpg and /dev/null differ diff --git a/backend/temp_downloads/job_53062d5e-69eb-4772-ab60-d727c858288d/generated_video_1.mp4 b/backend/temp_downloads/job_53062d5e-69eb-4772-ab60-d727c858288d/generated_video_1.mp4 deleted file mode 100644 index bd1d1ad..0000000 Binary files a/backend/temp_downloads/job_53062d5e-69eb-4772-ab60-d727c858288d/generated_video_1.mp4 and /dev/null differ diff --git a/backend/temp_downloads/job_5bc3436a-f729-4976-8415-84f945ead761/stickman_running.jpg b/backend/temp_downloads/job_5bc3436a-f729-4976-8415-84f945ead761/stickman_running.jpg deleted file mode 100644 index 3e08c52..0000000 Binary files a/backend/temp_downloads/job_5bc3436a-f729-4976-8415-84f945ead761/stickman_running.jpg and /dev/null differ diff --git a/backend/temp_downloads/job_c94bcd60-db65-456e-8093-1f1ded9cc10f/stickman_running.jpg b/backend/temp_downloads/job_c94bcd60-db65-456e-8093-1f1ded9cc10f/stickman_running.jpg deleted file mode 100644 index 3e08c52..0000000 Binary files a/backend/temp_downloads/job_c94bcd60-db65-456e-8093-1f1ded9cc10f/stickman_running.jpg and /dev/null differ diff --git a/backend/temp_downloads/job_d2574dad-353b-40c9-9565-f95b7d19859e/stickman_running.jpg b/backend/temp_downloads/job_d2574dad-353b-40c9-9565-f95b7d19859e/stickman_running.jpg deleted file mode 100644 index 3e08c52..0000000 Binary files a/backend/temp_downloads/job_d2574dad-353b-40c9-9565-f95b7d19859e/stickman_running.jpg and /dev/null differ diff --git a/backend/temp_downloads/job_e7e57f00-aa8c-4d42-a9c4-d2df0ac84dec/stickman_running.jpg b/backend/temp_downloads/job_e7e57f00-aa8c-4d42-a9c4-d2df0ac84dec/stickman_running.jpg deleted file mode 100644 index 3e08c52..0000000 Binary files a/backend/temp_downloads/job_e7e57f00-aa8c-4d42-a9c4-d2df0ac84dec/stickman_running.jpg and /dev/null differ diff --git a/backend/temp_downloads/veo_img_1762178595_9530.jpg b/backend/temp_downloads/veo_img_1762178595_9530.jpg deleted file mode 100644 index a560393..0000000 Binary files a/backend/temp_downloads/veo_img_1762178595_9530.jpg and /dev/null differ diff --git a/backend/temp_downloads/veo_img_1762178710_9530.jpg b/backend/temp_downloads/veo_img_1762178710_9530.jpg deleted file mode 100644 index a560393..0000000 Binary files a/backend/temp_downloads/veo_img_1762178710_9530.jpg and /dev/null differ diff --git a/backend/temp_downloads/veo_img_1762180768_13778.jpg b/backend/temp_downloads/veo_img_1762180768_13778.jpg deleted file mode 100644 index 082d949..0000000 Binary files a/backend/temp_downloads/veo_img_1762180768_13778.jpg and /dev/null differ diff --git a/backend/temp_downloads/veo_img_1762197238_15165.jpg b/backend/temp_downloads/veo_img_1762197238_15165.jpg deleted file mode 100644 index 082d949..0000000 Binary files a/backend/temp_downloads/veo_img_1762197238_15165.jpg and /dev/null differ diff --git a/frontend/src/utils/constants.js b/frontend/src/utils/constants.js index 7319f81..eff12f8 100644 --- a/frontend/src/utils/constants.js +++ b/frontend/src/utils/constants.js @@ -7,34 +7,11 @@ export const VIDEO_GENERATION_OPTIONS = { { value: '9:16', label: '9:16 (Portrait)' } ], models: [ - // Veo 3.0 Models - { - value: 'veo-3.0-generate-preview', - label: 'Veo 3.0', - description: 'High-quality video generation', - pricePerSecond: 0.40, - speed: 'Standard', - recommended: false, - supportsReferenceImages: false, - supportsLastFrame: false, - supportsVideoExtension: false - }, - { - value: 'veo-3.0-fast-generate-preview', - label: 'Veo 3.0 Fast', - description: 'Optimized for speed and cost', - pricePerSecond: 0.15, - speed: 'Fast', - recommended: false, - supportsReferenceImages: false, - supportsLastFrame: false, - supportsVideoExtension: false - }, - // Veo 3.1 Models + // Veo 3.1 Models Only { value: 'veo-3.1-generate-preview', - label: 'Veo 3.1', - description: 'Next-gen with reference images & frame interpolation', + label: 'Veo 3.1 Standard', + description: 'High-quality with reference images & frame interpolation', pricePerSecond: 0.40, speed: 'Standard', recommended: true, @@ -45,7 +22,7 @@ export const VIDEO_GENERATION_OPTIONS = { { value: 'veo-3.1-fast-generate-preview', label: 'Veo 3.1 Fast', - description: 'Optimized Veo 3.1 with last frame interpolation (no reference images)', + description: 'Optimized speed with frame interpolation', pricePerSecond: 0.15, speed: 'Fast', recommended: false,