| # LandPPT Configuration Example | |
| # Copy this file to .env and configure your settings | |
| # ============================================================================= | |
| # AI Provider Configuration | |
| # ============================================================================= | |
| # Default AI provider to use (openai, anthropic, google, azure_openai, ollama) | |
| # For production use, configure one of the real AI providers | |
| DEFAULT_AI_PROVIDER=openai | |
| # Model role overrides (optional) | |
| DEFAULT_MODEL_PROVIDER= | |
| DEFAULT_MODEL_NAME= | |
| OUTLINE_MODEL_PROVIDER= | |
| OUTLINE_MODEL_NAME= | |
| CREATIVE_MODEL_PROVIDER= | |
| CREATIVE_MODEL_NAME= | |
| IMAGE_PROMPT_MODEL_PROVIDER= | |
| IMAGE_PROMPT_MODEL_NAME= | |
| SLIDE_GENERATION_MODEL_PROVIDER= | |
| SLIDE_GENERATION_MODEL_NAME= | |
| EDITOR_ASSISTANT_MODEL_PROVIDER= | |
| EDITOR_ASSISTANT_MODEL_NAME= | |
| TEMPLATE_GENERATION_MODEL_PROVIDER= | |
| TEMPLATE_GENERATION_MODEL_NAME= | |
| POLISH_MODEL_PROVIDER= | |
| POLISH_MODEL_NAME= | |
| # OpenAI Configuration | |
| # Get your API key from: https://platform.openai.com/api-keys | |
| OPENAI_API_KEY=your_openai_api_key_here | |
| OPENAI_MODEL=gpt-3.5-turbo | |
| OPENAI_BASE_URL=https://api.openai.com/v1 | |
| OPENAI_USE_RESPONSES_API=false | |
| OPENAI_ENABLE_REASONING=false | |
| OPENAI_REASONING_EFFORT=medium | |
| # Anthropic Configuration | |
| # Get your API key from: https://console.anthropic.com/ | |
| ANTHROPIC_API_KEY=your_anthropic_api_key_here | |
| ANTHROPIC_MODEL=claude-3-haiku-20240307 | |
| # Google Gemini Configuration | |
| # Get your API key from: https://aistudio.google.com/app/apikey | |
| GOOGLE_API_KEY=your_google_api_key_here | |
| GOOGLE_BASE_URL=https://generativelanguage.googleapis.com | |
| GOOGLE_MODEL=gemini-1.5-flash | |
| # Azure OpenAI Configuration | |
| # Set up Azure OpenAI service and get your credentials | |
| AZURE_OPENAI_API_KEY=your_azure_openai_key_here | |
| AZURE_OPENAI_ENDPOINT=https://your-resource.openai.azure.com/ | |
| AZURE_OPENAI_DEPLOYMENT_NAME=your_deployment_name | |
| AZURE_OPENAI_API_VERSION=2024-02-15-preview | |
| # Ollama Configuration (for local models) | |
| # Install Ollama from: https://ollama.ai/ | |
| # Then run: ollama pull llama2 | |
| OLLAMA_BASE_URL=http://localhost:11434 | |
| OLLAMA_MODEL=llama2 | |
| # Tavily API Configuration (for research functionality) | |
| # Get your API key from: https://tavily.com/ | |
| TAVILY_API_KEY=your_tavily_api_key_here | |
| # Optional custom Tavily endpoint for proxies or private gateways | |
| # TAVILY_BASE_URL=https://gateway.example.com/tavily | |
| TAVILY_MAX_RESULTS=10 | |
| TAVILY_SEARCH_DEPTH=advanced | |
| # Optional: Comma-separated domains to include/exclude | |
| # TAVILY_INCLUDE_DOMAINS=wikipedia.org,arxiv.org | |
| # TAVILY_EXCLUDE_DOMAINS=example.com | |
| # SearXNG Configuration (for research functionality) | |
| # SearXNG instance host URL (e.g., http://localhost:8888 or https://searx.example.com) | |
| SEARXNG_HOST= | |
| SEARXNG_MAX_RESULTS=10 | |
| SEARXNG_LANGUAGE=auto | |
| SEARXNG_TIMEOUT=30 | |
| # Research Configuration | |
| # Available providers: tavily, searxng, both | |
| RESEARCH_PROVIDER=tavily | |
| # Enable deep content extraction from web pages | |
| RESEARCH_ENABLE_CONTENT_EXTRACTION=true | |
| # Maximum content length to extract from each page | |
| RESEARCH_MAX_CONTENT_LENGTH=5000 | |
| # Timeout for content extraction requests (seconds) | |
| RESEARCH_EXTRACTION_TIMEOUT=30 | |
| # PDF to PPTX Conversion Configuration | |
| # Apryse SDK License Key for PDF to PowerPoint conversion | |
| # Get your license key from: https://docs.apryse.com/ | |
| APRYSE_LICENSE_KEY=your_apryse_license_key_here | |
| # SiliconFlow API Configuration (for AI image generation) | |
| # Get your API key from: https://siliconflow.cn/ | |
| SILICONFLOW_API_KEY=your_siliconflow_api_key_here | |
| # Pixabay API Configuration (for network image search) | |
| # Get your API key from: https://pixabay.com/api/docs/ | |
| PIXABAY_API_KEY=your_pixabay_api_key_here | |
| # Unsplash API Configuration (for network image search) | |
| # Get your access key from: https://unsplash.com/developers | |
| UNSPLASH_ACCESS_KEY=your_unsplash_access_key_here | |
| # Pollinations API Configuration (for AI image generation) | |
| # Docs: https://enter.pollinations.ai/api/docs#tag/genpollinationsai/GET/image/{prompt} | |
| # Get your API key from: https://enter.pollinations.ai | |
| POLLINATIONS_API_BASE=https://gen.pollinations.ai | |
| POLLINATIONS_API_KEY=your_pollinations_api_key_here | |
| # Model selection example: flux, zimage, turbo, gptimage | |
| POLLINATIONS_MODEL=flux | |
| # Optional defaults | |
| POLLINATIONS_NEGATIVE_PROMPT=worst quality, blurry | |
| POLLINATIONS_ENHANCE=false | |
| POLLINATIONS_SAFE=false | |
| # ============================================================================= | |
| # AI Generation Parameters | |
| # ============================================================================= | |
| # Maximum tokens to generate (adjust based on your needs and costs) | |
| MAX_TOKENS=8192 | |
| # Temperature for generation (0.0 = deterministic, 1.0 = creative) | |
| TEMPERATURE=0.7 | |
| # Top-p sampling parameter (nucleus sampling) | |
| TOP_P=1.0 | |
| # Unified timeout (seconds) for LLM API requests | |
| LLM_TIMEOUT_SECONDS=600 | |
| # ============================================================================= | |
| # Application Configuration | |
| # ============================================================================= | |
| # ============================================================================= | |
| # Docker Build Configuration (optional) | |
| # ============================================================================= | |
| # | |
| # These variables are consumed by `docker compose build` via build args (see `docker-compose*.yaml`). | |
| # Use them when Debian apt downloads are slow/unreliable (e.g., behind a firewall or on unstable networks). | |
| # | |
| # Defaults (official Debian): | |
| # APT_DEBIAN_URL=http://deb.debian.org/debian | |
| # APT_SECURITY_URL=http://deb.debian.org/debian-security | |
| # | |
| # Example mirrors (Mainland China, pick one): | |
| # APT_DEBIAN_URL=http://mirrors.aliyun.com/debian | |
| # APT_SECURITY_URL=http://mirrors.aliyun.com/debian-security | |
| # APT_DEBIAN_URL=http://mirrors.tuna.tsinghua.edu.cn/debian | |
| # APT_SECURITY_URL=http://mirrors.tuna.tsinghua.edu.cn/debian-security | |
| # | |
| # Note: `fonts-noto-cjk` is installed in the image for consistent CJK subtitle rendering. | |
| # Server settings | |
| HOST=0.0.0.0 | |
| PORT=8000 | |
| DEBUG=false | |
| RELOAD=false | |
| WORKERS=2 | |
| # Note: when using `docker-compose.yml`, these values are passed into the container env. | |
| # Uvicorn multi-worker watchdog (seconds). Increase if heavy background tasks (e.g. video export) | |
| # cause workers to be considered "unresponsive" and get SIGTERM'd. | |
| UVICORN_TIMEOUT_WORKER_HEALTHCHECK=60 | |
| # Background task liveness (Valkey multi-worker) | |
| # If a RUNNING/PENDING task hasn't updated within this window, it is considered stale and released. | |
| BG_TASK_STALE_SECONDS=3600 | |
| # Heartbeat interval for RUNNING tasks (updates updated_at in Valkey to prevent stale locks). | |
| BG_TASK_HEARTBEAT_SECONDS=30 | |
| # Security settings | |
| SECRET_KEY=your-very-secure-secret-key-change-this-in-production | |
| ACCESS_TOKEN_EXPIRE_MINUTES=20160 | |
| # Machine-to-machine API auth (for n8n / automation) | |
| # Option A (single key): bind one API key to one user | |
| LANDPPT_API_KEY= | |
| LANDPPT_API_KEY_USER=admin | |
| # Option B (multiple keys): comma/semicolon/newline separated | |
| # Formats: user:key or user=key (items without user bind to LANDPPT_API_KEY_USER) | |
| # LANDPPT_API_KEYS=admin:prod-key,robot:workflow-key | |
| LANDPPT_API_KEYS= | |
| # Bootstrap admin | |
| # If no users exist, the app can create admin / admin123456 on first startup. | |
| # Change the password in the admin backend after first login; the startup password will not overwrite it. | |
| # To force a different initial admin, set enabled=true and provide username/password below. | |
| LANDPPT_BOOTSTRAP_ADMIN_ENABLED=false | |
| LANDPPT_BOOTSTRAP_ADMIN_USERNAME=admin | |
| LANDPPT_BOOTSTRAP_ADMIN_PASSWORD=admin123456 | |
| # API docs are enabled by default; set to false to disable /docs, /redoc, and /openapi.json | |
| LANDPPT_ENABLE_API_DOCS=true | |
| # Allow passing session_id via X-Session-Id header (disabled by default; prefer API keys for automation) | |
| LANDPPT_ALLOW_HEADER_SESSION_AUTH=false | |
| # File upload settings | |
| MAX_FILE_SIZE=10485760 | |
| UPLOAD_DIR=uploads | |
| # ============================================================================= | |
| # ComfyUI Configuration (optional, for narration TTS via ComfyUI API) | |
| # ============================================================================= | |
| # ComfyUI server base URL | |
| COMFYUI_BASE_URL=http://127.0.0.1:8188 | |
| # Workflow JSON template path (repository-relative inside the container) | |
| COMFYUI_TTS_WORKFLOW_PATH=tests/Qwen3-TD-TTS.json | |
| # Max wait time (seconds) for one TTS prompt | |
| COMFYUI_TTS_TIMEOUT_SECONDS=600 | |
| # ============================================================================= | |
| # Xiaomi Mimo Configuration (optional, for narration TTS voice design) | |
| # ============================================================================= | |
| MIMO_API_KEY= | |
| MIMO_BASE_URL=https://api.xiaomimimo.com/v1 | |
| MIMO_TTS_MODEL=mimo-v2.5-tts-voicedesign | |
| MIMO_TTS_CLONE_MODEL=mimo-v2.5-tts-voiceclone | |
| MIMO_TTS_VOICE_PROMPT=年轻、放松、语速偏快,像 Tom 猫那种俏皮又有点夸张的卡通感;说话轻快自然、有活力,吐字清楚,不要正式播音腔。 | |
| # Custom TTS API Configuration (GET endpoint: text/speaker/speed/novasr) | |
| CUSTOM_TTS_API_URL=http://localhost:9880/ | |
| CUSTOM_TTS_API_SPEAKER=TOM女 | |
| CUSTOM_TTS_API_SPEED=1 | |
| CUSTOM_TTS_API_NOVASR=1 | |
| # ============================================================================= | |
| # Database Configuration | |
| # ============================================================================= | |
| # SQLite (default for development) | |
| # DATABASE_URL=sqlite:///./landppt.db | |
| # PostgreSQL (recommended for production) | |
| # DATABASE_URL=postgresql://landppt:landppt@localhost:5432/landppt | |
| # For Docker: DATABASE_URL is auto-generated from POSTGRES_* variables | |
| # Startup database migrations | |
| LANDPPT_AUTO_MIGRATE_ON_STARTUP=true | |
| LANDPPT_AUTO_MIGRATE_FAIL_FAST=true | |
| LANDPPT_AUTO_MIGRATE_LOCK_TIMEOUT_SECONDS=300 | |
| LANDPPT_AUTO_MIGRATE_LOCK_STALE_SECONDS=900 | |
| # Docker PostgreSQL Configuration (used by docker-compose.yml) | |
| POSTGRES_DB=landppt | |
| POSTGRES_USER=landppt | |
| POSTGRES_PASSWORD=your-secure-postgres-password-here | |
| # ============================================================================= | |
| # Cache Configuration | |
| # ============================================================================= | |
| # Cache TTL in seconds | |
| CACHE_TTL=3600 | |
| # Cache backend: memory (default) or valkey | |
| CACHE_BACKEND=memory | |
| # Valkey URL (only used when CACHE_BACKEND=valkey) | |
| VALKEY_URL=valkey://localhost:6379 | |
| # For Docker: VALKEY_URL=valkey://valkey:6379 | |
| # Docker Valkey Configuration | |
| VALKEY_PORT=6379 | |
| # ============================================================================= | |
| # Credits System Configuration | |
| # ============================================================================= | |
| # Enable credits/points system | |
| ENABLE_CREDITS_SYSTEM=false | |
| # Default credits for new users | |
| DEFAULT_CREDITS_FOR_NEW_USERS=100 | |
| # ============================================================================= | |
| # Email SMTP Configuration | |
| # ============================================================================= | |
| # Email provider: smtp | resend | |
| EMAIL_PROVIDER=smtp | |
| # SMTP server host | |
| SMTP_HOST=smtp.example.com | |
| # SMTP server port (465 for SSL, 587 for TLS) | |
| SMTP_PORT=465 | |
| # SMTP authentication | |
| SMTP_USER=your-email@example.com | |
| SMTP_PASSWORD=your-smtp-password | |
| # Sender information | |
| SMTP_FROM_EMAIL=noreply@example.com | |
| SMTP_FROM_NAME=LandPPT | |
| # Use SSL connection (true for port 465, false for port 587) | |
| SMTP_USE_SSL=true | |
| # ============================================================================= | |
| # Resend Email Configuration (used when EMAIL_PROVIDER=resend) | |
| # ============================================================================= | |
| RESEND_API_KEY= | |
| RESEND_FROM_EMAIL= | |
| RESEND_FROM_NAME=LandPPT | |
| # ============================================================================= | |
| # User Registration Configuration | |
| # ============================================================================= | |
| # Enable user self-registration (can be toggled by admin) | |
| ENABLE_USER_REGISTRATION=true | |
| # Verification code expiration time in minutes | |
| VERIFICATION_CODE_EXPIRE_MINUTES=10 | |
| # Rate limiting for registration-related requests (per IP) | |
| REGISTRATION_IP_RATE_LIMIT_PER_HOUR=100 | |
| # Cloudflare Turnstile (anti-bot) for registration | |
| # Create a Turnstile widget at: https://dash.cloudflare.com/ | |
| # TURNSTILE_ENABLED=true | |
| # TURNSTILE_SITE_KEY=your_site_key | |
| # TURNSTILE_SECRET_KEY=your_secret_key | |
| TURNSTILE_ENABLED=false | |
| TURNSTILE_SITE_KEY= | |
| TURNSTILE_SECRET_KEY= | |
| # ============================================================================= | |
| # Feature Flags | |
| # ============================================================================= | |
| # Enable network mode for enhanced content (future feature) | |
| ENABLE_NETWORK_MODE=true | |
| # Enable local model support | |
| ENABLE_LOCAL_MODELS=false | |
| # Enable streaming responses (future feature) | |
| ENABLE_STREAMING=true | |
| # ============================================================================= | |
| # Image Service Configuration | |
| # ============================================================================= | |
| # Enable image service functionality | |
| ENABLE_IMAGE_SERVICE=false | |
| # Enable local image hosting | |
| ENABLE_LOCAL_IMAGES=false | |
| # Enable network image search | |
| ENABLE_NETWORK_SEARCH=true | |
| # Enable AI image generation | |
| ENABLE_AI_GENERATION=false | |
| # Per-user local image hosting quota (MB). Set <= 0 to disable quota. | |
| IMAGE_USER_STORAGE_QUOTA_MB=100 | |
| # Smart image selection for local images | |
| LOCAL_IMAGES_SMART_SELECTION=true | |
| # Enable smart image selection across all sources | |
| ENABLE_SMART_IMAGE_SELECTION=true | |
| # Maximum images per slide configuration | |
| MAX_LOCAL_IMAGES_PER_SLIDE=2 | |
| MAX_NETWORK_IMAGES_PER_SLIDE=1 | |
| MAX_AI_IMAGES_PER_SLIDE=2 | |
| MAX_TOTAL_IMAGES_PER_SLIDE=1 | |
| # Default providers | |
| # Available AI image providers: dalle, stable_diffusion, siliconflow, gemini, openai_image, pollinations | |
| DEFAULT_AI_IMAGE_PROVIDER=pollinations | |
| DEFAULT_NETWORK_SEARCH_PROVIDER=pixabay | |
| # SearXNG Configuration | |
| SEARXNG_HOST= | |
| # AI image generation quality (standard, high) | |
| AI_IMAGE_QUALITY=standard | |
| # Gemini image gen_generation | |
| GEMINI_IMAGE_API_KEY=your_google_api_key_here | |
| GEMINI_IMAGE_API_BASE=https://generativelanguage.googleapis.com/v1beta | |
| GEMINI_IMAGE_MODEL= | |
| # OpenAI(comptability) image generation configuration | |
| OPENAI_IMAGE_MODEL=dall-e-3 | |
| OPENAI_IMAGE_API_BASE=https://api.openai.com/v1 | |
| OPENAI_IMAGE_MODEL= | |
| OPENAI_IMAGE_QUALITY=auto | |
| OPENAI_IMAGE_API_KEY=your_openai_api_key_here | |
| # ============================================================================= | |
| # Logging Configuration | |
| # ============================================================================= | |
| # Log level (DEBUG, INFO, WARNING, ERROR) | |
| LOG_LEVEL=INFO | |
| # Log AI requests and responses (be careful with sensitive data) | |
| # Set to true only for debugging, false for production | |
| LOG_AI_REQUESTS=false | |
| # ============================================================================= | |
| # Narration Video Export (Live Rendering) | |
| # ============================================================================= | |
| # Per-slide ffmpeg transcode concurrency for live export (1/2/4...). Lower values are more stable in low-memory containers. | |
| LANDPPT_NARRATION_VIDEO_TRANSCODE_PARALLELISM=1 | |
| # Per-slide browser recording concurrency. Keep low to reduce dropped frames/stutter. | |
| LANDPPT_NARRATION_VIDEO_RECORD_PARALLELISM=1 | |
| LANDPPT_NARRATION_SCREENSHOT_DSF=2 | |
| # Live recording strategy: | |
| # - full: record the full narration duration (keeps animations), optionally starting after a delay | |
| # - pad: record a short segment then clone-pad (more stable, may lose animations after the segment) | |
| LANDPPT_NARRATION_VIDEO_RECORD_MODE=pad | |
| # Start capturing usable frames after this delay (ms) once the page is ready (e.g. 8000 to skip init). | |
| LANDPPT_NARRATION_VIDEO_RECORD_START_DELAY_MS=0 | |
| # Safety cap for full-mode per-slide recording duration (ms). | |
| LANDPPT_NARRATION_VIDEO_FULL_RECORD_MAX_MS=600000 | |
| # Extra trimming after the recorder-computed trim point (ms). Keep small (or 0) in full mode. | |
| LANDPPT_NARRATION_VIDEO_EXTRA_TRIM_MS=200 | |
| # Record a fixed usable segment per slide (ms), then clone-pad the last frame to match narration duration. | |
| LANDPPT_NARRATION_VIDEO_PAD_RECORD_MS=10000 | |
| # Cap per-slide recording duration after the slide is ready (ms). | |
| LANDPPT_NARRATION_VIDEO_MAX_RECORD_MS=10000 | |
| # Live narration recording: forcing 30fps by default for smoother results with Playwright recorder. | |
| # Set to 1 to keep 60fps (upsampled), at higher CPU cost. | |
| LANDPPT_NARRATION_LIVE_ALLOW_60FPS=0 | |
| # CPU encoder tuning (used for narration video export) | |
| # Suggested for stability: preset=ultrafast, threads=2, Docker memory >= 8GB. | |
| LANDPPT_X264_PRESET=ultrafast | |
| LANDPPT_X264_CRF=23 | |
| LANDPPT_X264_THREADS=2 | |