download_sam_model.py crashed with an uncaught PermissionError when data/models/ is root-owned (common after a prior Docker run) and a non-root host user tries to recreate the convenience sam_model.pth symlink — observed in the wild, and it aborted the whole prefetch run before U2Net/BEN2/BiRefNet-HR were ever attempted. Worse, the same unguarded symlink call sat inside the post-download try/except, so a successful download could get deleted just because the symlink step failed afterward. Wrapped symlink creation in a shared helper that warns and continues instead of raising — the real model file already satisfies entrypoint.sh's checks regardless of the symlink. prefetch-models.sh now treats SAM, U2Net, and the HuggingFace models as independent steps (one failing no longer aborts the rest) and prints a summary of which steps failed, so a single run gives full diagnostic signal instead of stopping at the first error.
Classic Eyes Scripts
This directory contains scripts for generating and importing classic eye images into the AI Photo Edit patch library.
Overview
The scripts generate a variety of classic eye styles that can be used as reusable patches for photo editing:
- Realistic eyes - Detailed eyes with gradient irises and realistic highlights
- Anime eyes - Large, expressive eyes in anime style with prominent highlights
- Cartoon eyes - Simple, bold cartoon-style eyes
Each style is available in multiple iris colors: blue, green, brown, hazel, grey, and amber.
Scripts
1. generate_classic_eyes_ppm.py
Generates classic eye images using only the Python standard library (no dependencies required).
python scripts/generate_classic_eyes_ppm.py
This creates PPM format images in data/classic_eyes_ppm/. PPM is a simple image format that can be converted to PNG later.
2. download_classic_eyes.py
Full-featured script that generates eyes and imports them directly into the patch library. Requires PIL/Pillow.
# Run inside the backend container
docker exec -it ai-photo-edit-backend python /app/../scripts/download_classic_eyes.py
# Or with the API running
python scripts/download_classic_eyes.py --api --base-url http://localhost:8101
# Or save to a directory for later import
python scripts/download_classic_eyes.py --output-dir ./my_eyes
3. startup_import_eyes.py
Converts PPM files to PNG and imports them into the patch library. Run this inside the backend container.
docker exec -it ai-photo-edit-backend python /app/../scripts/startup_import_eyes.py
4. import_saved_eyes.py
Import previously saved eye images from a directory.
python scripts/import_saved_eyes.py /path/to/saved/eyes
Quick Start
-
Generate the eye images (no dependencies needed):
python scripts/generate_classic_eyes_ppm.py -
Start the application:
docker compose up -d -
Import the eyes:
docker exec -it ai-photo-edit-backend python /scripts/startup_import_eyes.py -
Verify in the app: Open the patch library in the UI to see the imported classic eyes.
Generated Eyes
| Style | Colors Available | Size |
|---|---|---|
| Realistic | Blue, Green, Brown, Hazel, Grey, Amber | 200x200 |
| Anime | Blue, Green, Brown, Hazel, Grey, Amber | 200x200 |
| Cartoon | Blue, Green, Brown, Hazel, Grey, Amber | 200x200 |
Total: 18 unique eye variants
Extending
To add more eye styles or colors, edit the generate_classic_eyes_ppm.py or download_classic_eyes.py scripts:
# Add new color
colors["purple"] = (128, 0, 128)
# Add new style in create_classic_eye() function
elif style == "fantasy":
# Your custom eye drawing code
pass
File Formats
- PPM: Portable Pixmap format - simple, universal, generated without dependencies
- PNG: Preferred format for the patch library - converted from PPM using PIL
License
The generated eye images are created programmatically and are free to use without restrictions.