dall-e-2/dall-e-3 retired May 12 2026 and gpt-image-1 deprecates Oct 23 2026, so move every OpenAI default (config.py, both provider classes, both compose files, .env.example, the in-app provider-settings dropdown, README) to gpt-image-2 for both generation and edits. Also fix response parsing in ai_provider.py's OpenAIProvider, which never sent a model param and assumed a url response — gpt-image-1/2 only return b64_json. Separately, .env.example shipped AI_PROVIDER=replicate by default, but replicate has no driver in remote_provider.py, so following the documented "cp .env.example .env" setup silently broke every AI call and defeated the GPU quick-start (an explicit non-empty .env value overrides docker-compose.gpu.yml's own local_gpu fallback). Default to local_gpu instead, mark replicate/stability as not-yet-implemented, and recommend Lykon/dreamshaper-8-inpainting as a hands/face-tuned HF_MODEL_INPAINT override for 4-6GB cards (Quadro P2200, GTX 1060/1660). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Nb2vJ8W7bHKx1JXVvpCraH
223 lines
13 KiB
Bash
223 lines
13 KiB
Bash
# =============================================================================
|
||
# AI Photo Edit - Environment Configuration
|
||
# =============================================================================
|
||
#
|
||
# SETUP INSTRUCTIONS:
|
||
# 1. Copy this file to .env: cp .env.example .env
|
||
# 2. Get API key from Replicate (see below)
|
||
# 3. Paste your key in the REPLICATE_API_KEY line
|
||
# 4. Rebuild: docker-compose up -d --build
|
||
#
|
||
# =============================================================================
|
||
|
||
|
||
# =============================================================================
|
||
# STEP 1: Choose AI Provider
|
||
# =============================================================================
|
||
# Options: local_gpu, mock, openai, stability, replicate, invokeai, comfyui
|
||
#
|
||
# local_gpu = FREE, runs on YOUR GPU — best option if you have an NVIDIA card
|
||
# (use docker-compose.gpu.yml — models auto-download on first use)
|
||
# mock = Free, returns original image unchanged (UI testing only)
|
||
# openai = gpt-image-2 generation + edits (~$0.006-0.21/image, see below)
|
||
# stability = NOT IMPLEMENTED YET — config field exists but no driver in
|
||
# remote_provider.py; setting this breaks every AI call
|
||
# replicate = NOT IMPLEMENTED YET — same as above (Replicate IS used for
|
||
# Smart Select's SAM fallback, but that's a separate code path)
|
||
# invokeai = Self-hosted InvokeAI running on another machine
|
||
# comfyui = Self-hosted ComfyUI running on another machine
|
||
#
|
||
# GPU QUICK-START:
|
||
# docker compose -f docker-compose.gpu.yml up --build
|
||
# (AI_PROVIDER defaults to local_gpu in that compose file — but only if this
|
||
# var is unset/blank; since AI_PROVIDER=local_gpu is set explicitly below,
|
||
# that's what you get either way)
|
||
# =============================================================================
|
||
|
||
AI_PROVIDER=local_gpu
|
||
|
||
# ── Local GPU settings (only relevant when AI_PROVIDER=local_gpu) ────────────
|
||
# Auto-download HuggingFace models on first request (true/false)
|
||
AUTO_DOWNLOAD_MODELS=true
|
||
# Max diffusion pipelines to keep loaded in GPU memory (each is 2–7 GB)
|
||
LOCAL_GPU_MAX_PIPELINES=2
|
||
# HuggingFace token — only needed for gated/private models
|
||
#HF_TOKEN=hf_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||
# Override auto-selected model for any operation (leave blank = auto by VRAM tier)
|
||
# On 4-6GB cards (Quadro P2200, GTX 1060/1660, etc.) the auto-tier picks either
|
||
# slow SDXL+CPU-offload or a generic (not hand/face-tuned) SD checkpoint.
|
||
# Lykon/dreamshaper-8-inpainting is SD1.5-based (1.7GB, fast, no offload needed)
|
||
# and noticeably better on hands/faces — worth forcing on small cards:
|
||
#HF_MODEL_INPAINT=Lykon/dreamshaper-8-inpainting
|
||
#HF_MODEL_TXT2IMG=your-org/your-txt2img-model
|
||
#HF_MODEL_IMG2IMG=your-org/your-img2img-model
|
||
# ─────────────────────────────────────────────────────────────────────────────
|
||
|
||
# Per-operation provider overrides (optional — blank means use AI_PROVIDER above)
|
||
# Example: use OpenAI for text-to-image (best quality) but InvokeAI for everything else
|
||
#AI_PROVIDER_TXT2IMG=openai
|
||
#AI_PROVIDER_INPAINT=invokeai
|
||
#AI_PROVIDER_IMG2IMG=invokeai
|
||
#AI_PROVIDER_OUTPAINT=invokeai
|
||
|
||
|
||
# =============================================================================
|
||
# STEP 2: Get Your API Key
|
||
# =============================================================================
|
||
#
|
||
# ╔═══════════════════════════════════════════════════════════════════════════╗
|
||
# ║ REPLICATE (RECOMMENDED) ║
|
||
# ╠═══════════════════════════════════════════════════════════════════════════╣
|
||
# ║ ║
|
||
# ║ 1. Go to: https://replicate.com ║
|
||
# ║ 2. Click "Sign in" (use GitHub, Google, or email) ║
|
||
# ║ 3. Go to: https://replicate.com/account/api-tokens ║
|
||
# ║ 4. Click "Create token" ║
|
||
# ║ 5. Copy the token (starts with "r8_") ║
|
||
# ║ 6. Paste it below after REPLICATE_API_KEY= ║
|
||
# ║ ║
|
||
# ║ FREE TIER: New accounts get some free credits to try models! ║
|
||
# ║ PRICING: ~$0.002-0.03 per image depending on model ║
|
||
# ║ ║
|
||
# ╚═══════════════════════════════════════════════════════════════════════════╝
|
||
|
||
REPLICATE_API_KEY=r8_PASTE_YOUR_KEY_HERE
|
||
|
||
# ───────────────────────────────────────────────────────────────────────────
|
||
# OPENAI (cloud, gpt-image-2)
|
||
# Get key at: https://platform.openai.com/api-keys
|
||
# AI_PROVIDER=openai
|
||
# ───────────────────────────────────────────────────────────────────────────
|
||
# dall-e-2 and dall-e-3 were retired May 12, 2026; gpt-image-1 deprecates
|
||
# Oct 23, 2026. gpt-image-2 is the current model and handles both
|
||
# generation and masked edits (inpaint/img2img/outpaint) — no org
|
||
# verification step needed, unlike gpt-image-1.
|
||
# Pricing (1024x1024): ~$0.006 low / $0.053 medium / $0.211 high quality.
|
||
#OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||
#OPENAI_MODEL=gpt-image-2
|
||
# Model for inpaint/img2img/outpaint (the /v1/images/edits endpoint).
|
||
#OPENAI_EDIT_MODEL=gpt-image-2
|
||
|
||
# ───────────────────────────────────────────────────────────────────────────
|
||
# INVOKEAI (self-hosted, best for Flux/SDXL)
|
||
# Run InvokeAI on your local machine or NAS, point URL here.
|
||
# AI_PROVIDER=invokeai
|
||
# ───────────────────────────────────────────────────────────────────────────
|
||
#INVOKEAI_URL=http://192.168.1.x:9090
|
||
#INVOKEAI_DEFAULT_MODEL=flux-dev
|
||
|
||
# ───────────────────────────────────────────────────────────────────────────
|
||
# COMFYUI (self-hosted, workflow JSON API)
|
||
# AI_PROVIDER=comfyui
|
||
# ───────────────────────────────────────────────────────────────────────────
|
||
#COMFYUI_URL=http://192.168.1.x:8188
|
||
#COMFYUI_DEFAULT_MODEL=v1-5-pruned-emaonly.ckpt
|
||
|
||
# ───────────────────────────────────────────────────────────────────────────
|
||
# STABILITY AI (Alternative)
|
||
# Get key at: https://platform.stability.ai/account/keys
|
||
# ───────────────────────────────────────────────────────────────────────────
|
||
#STABILITY_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||
|
||
|
||
# =============================================================================
|
||
# STEP 3: Model Selection (OPTIONAL - for advanced users)
|
||
# =============================================================================
|
||
#
|
||
# By default, the system AUTO-SELECTS the best model based on your prompt:
|
||
# - Prompt contains "remove/erase/delete" → Uses LaMa (fast removal)
|
||
# - Prompt contains "face/hands/person" → Uses Realistic Vision
|
||
# - Everything else → Uses SDXL Inpaint
|
||
#
|
||
# To FORCE a specific model, uncomment ONE line below:
|
||
# ───────────────────────────────────────────────────────────────────────────
|
||
|
||
# REPLICATE_MODEL=sdxl-inpaint # General purpose, good quality (~$0.01)
|
||
# REPLICATE_MODEL=lama # Object removal ONLY (~$0.002, fastest)
|
||
# REPLICATE_MODEL=realistic-vision # Faces, hands, skin (~$0.02)
|
||
|
||
# ───────────────────────────────────────────────────────────────────────────
|
||
# IMPORTANT: About Flux and other text-to-image models
|
||
# ───────────────────────────────────────────────────────────────────────────
|
||
#
|
||
# Models like "black-forest-labs/flux-kontext-pro" are TEXT-TO-IMAGE models.
|
||
# They generate NEW images from text, they DON'T edit existing images.
|
||
#
|
||
# For EDITING (inpainting), you need models that accept:
|
||
# - An existing image
|
||
# - A mask showing what to change
|
||
# - A prompt describing the change
|
||
#
|
||
# WORKS for editing: DOESN'T work for editing:
|
||
# ✓ sdxl-inpaint ✗ flux-kontext-pro (text-to-image)
|
||
# ✓ lama ✗ flux-dev (text-to-image)
|
||
# ✓ realistic-vision ✗ ideogram (text-to-image)
|
||
#
|
||
# ───────────────────────────────────────────────────────────────────────────
|
||
|
||
# Stability AI model selection (if using AI_PROVIDER=stability)
|
||
#STABILITY_MODEL=sdxl # Options: sdxl, sd15, sd21
|
||
|
||
|
||
# =============================================================================
|
||
# SECURITY (Change this in production!)
|
||
# =============================================================================
|
||
|
||
SECRET_KEY=change-this-to-a-long-random-string-in-production
|
||
|
||
|
||
# =============================================================================
|
||
# ADVANCED SETTINGS (Usually don't need to change)
|
||
# =============================================================================
|
||
|
||
# CORS origins (comma-separated)
|
||
CORS_ORIGINS=http://localhost:5173,http://localhost:3000,http://localhost:3080,http://localhost
|
||
|
||
# Database path
|
||
DATABASE_URL=sqlite:///./data/ai_photo_edit.db
|
||
|
||
# Auto-download SAM model on startup (true/false)
|
||
# When true (default): Downloads SAM model (~375MB) on first startup for offline Smart Select
|
||
# When false: Skips download, Smart Select uses Replicate API (requires REPLICATE_API_KEY)
|
||
AUTO_DOWNLOAD_SAM=true
|
||
|
||
# Auto-download U2Net model on startup (true/false)
|
||
# When true (default): Downloads U2Net model (~176MB) on first startup for offline Remove Background
|
||
# When false: Skips download, Remove Background falls back to rembg (if installed)
|
||
AUTO_DOWNLOAD_U2NET=true
|
||
|
||
# Background removal model (Remove Background tool) — used when request.model="auto"
|
||
# Options: ben2 (default — best for clean cutouts, hair/edges), birefnet-hr
|
||
# (best for high-res/print work, slower), u2net (lightweight, always-on fallback)
|
||
# ben2 and birefnet-hr download weights from HuggingFace on first use (GPU image only).
|
||
BG_REMOVAL_MODEL=ben2
|
||
|
||
# Allow users to select model per-edit
|
||
ALLOW_MODEL_OVERRIDE=true
|
||
|
||
|
||
# =============================================================================
|
||
# TROUBLESHOOTING
|
||
# =============================================================================
|
||
#
|
||
# PROBLEM: "405 Method Not Allowed" errors
|
||
# FIX: Rebuild container: docker-compose build --no-cache && docker-compose up -d
|
||
#
|
||
# PROBLEM: "REPLICATE_API_KEY not configured"
|
||
# FIX: 1. Make sure .env file exists (not just .env.example)
|
||
# 2. Make sure REPLICATE_API_KEY has your actual key
|
||
# 3. Restart: docker-compose down && docker-compose up -d
|
||
#
|
||
# PROBLEM: Edits don't change the image
|
||
# FIX: Check AI_PROVIDER isn't set to "mock"
|
||
#
|
||
# PROBLEM: "rembg not installed"
|
||
# FIX: Rebuild: docker-compose build --no-cache backend
|
||
#
|
||
# PROBLEM: Smart Select uses flood-fill instead of AI
|
||
# FIX: Smart Select needs REPLICATE_API_KEY for SAM model
|
||
#
|
||
# CHECK LOGS: docker-compose logs -f backend
|
||
#
|
||
# =============================================================================
|