ppt-web / .env.example
biaoqing's picture
Update .env.example
88237a6 verified
Raw
History Blame Contribute Delete
16.4 kB
# 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