This project generates polished "thought of the day" images for the International Consciousness Research Laboratories (ICRL).
It uses LiteLLM to:
- Turn a text thought into an image prompt
- Generate an AI image
- Blend the generated image with an overlay image
The script is exposed as a command-line tool using Typer and can be run locally or via Docker.
- Generate text-to-image prompts using LiteLLM (
completion) - Produce images using LiteLLM (
image_generation) - Blend generated images with overlay images using configurable alpha values
- Batch process multiple thoughts from CSV files
- Save:
- the final blended image
- the raw generated image (optional)
- the generated image prompt (optional)
- Easy CLI interface
- Docker support with multi-stage builds for minimal image size
pip install icrl-generatorgit clone https://github.com/HonakerM/icrl-generator.git
cd icrl-generator
pip install .Pull the pre-built image from GitHub Container Registry:
docker pull ghcr.io/honakerm/icrl-generator:latestOr build locally:
docker build -t icrl-generator .After installation, you can run the following command to generate an image.
Linux:
export OPENAI_API_KEY="<openai-api-key>"
python -m icrl_generator generate-image \
"Never assume that what you see on a person's face is what lies in their heart." \
overlay.png \
output.png \
--image-prompt-output image-prompt.txt \
--raw-image-output raw_image.png \
--log-level DEBUG \
--alpha 50Windows:
$env:OPENAI_API_KEY = "<openai-api-key>"
python -m icrl_generator generate-image `
"Never assume that what you see on a person's face is what lies in their heart." `
overlay.png `
output.png `
--image-prompt-output image-prompt.txt `
--raw-image-output raw_image.png `
--log-level DEBUG `
--alpha 50To view all options and their descriptions:
python -m icrl_generator generate-image --helpTo generate multiple images from a CSV file:
Linux:
export OPENAI_API_KEY="<openai-api-key>"
python -m icrl_generator generate-batch \
thoughts.csv \
overlay.png \
output_folder \
--include-image-prompt \
--include-raw-image \
--log-level INFO \
--alpha 50Windows:
$env:OPENAI_API_KEY = "<openai-api-key>"
python -m icrl_generator generate-batch `
thoughts.csv `
overlay.png `
output_folder `
--include-image-prompt `
--include-raw-image `
--log-level INFO `
--alpha 50The CSV file should have thoughts in column 2 (index 1) and publish dates in the second-to-last column in YYYY-MM-DD format.
To view all options:
python -m icrl_generator generate-batch --helpLinux/Mac:
docker run --rm \
-v $(pwd)/overlay.png:/app/overlays/overlay.png:ro \
-v $(pwd)/output:/app/output \
-e OPENAI_API_KEY="sk-your-api-key-here" \
ghcr.io/honakerm/icrl-generator:latest \
generate-image \
"Never assume that what you see on a person's face is what lies in their heart." \
/app/overlays/overlay.png \
/app/output/result.png \
--alpha 50 \
--log-level INFOWindows PowerShell:
docker run --rm `
-v ${PWD}/overlay.png:/app/overlays/overlay.png:ro `
-v ${PWD}/output:/app/output `
-e OPENAI_API_KEY="sk-your-api-key-here" `
ghcr.io/honakerm/icrl-generator:latest `
generate-image `
"Never assume that what you see on a person's face is what lies in their heart." `
/app/overlays/overlay.png `
/app/output/result.png `
--alpha 50 `
--log-level INFOLinux/Mac:
docker run --rm \
-v $(pwd)/thoughts.csv:/app/input/thoughts.csv:ro \
-v $(pwd)/overlay.png:/app/overlays/overlay.png:ro \
-v $(pwd)/output:/app/output \
-e OPENAI_API_KEY="sk-your-api-key-here" \
ghcr.io/honakerm/icrl-generator:latest \
generate-batch \
/app/input/thoughts.csv \
/app/overlays/overlay.png \
/app/output \
--alpha 50 \
--log-level INFOWindows PowerShell:
docker run --rm `
-v ${PWD}/thoughts.csv:/app/input/thoughts.csv:ro `
-v ${PWD}/overlay.png:/app/overlays/overlay.png:ro `
-v ${PWD}/output:/app/output `
-e OPENAI_API_KEY="sk-your-api-key-here" `
ghcr.io/honakerm/icrl-generator:latest `
generate-batch `
/app/input/thoughts.csv `
/app/overlays/overlay.png `
/app/output `
--alpha 50 `
--log-level INFOIf you want to call it from Python directly:
from pathlib import Path
from icrl_generator import generate_image
generate_image(
thought="Reality responds to our expectations.",
overlay=Path("overlay.png"),
output=Path("out.png"),
image_prompt_output=Path("prompt.txt"),
raw_image_output=Path("raw.png"),
alpha=50
)The --alpha parameter controls the blend between the generated image and the overlay:
0: Fully generated image (no overlay)50: Equal blend (default)100: Fully overlay image (no generated image visible)
When using Docker, you need to mount directories and files:
| Mount | Purpose | Read/Write |
|---|---|---|
-v $(pwd)/overlay.png:/app/overlays/overlay.png:ro |
Input overlay image | Read-only |
-v $(pwd)/thoughts.csv:/app/input/thoughts.csv:ro |
Input CSV file for batch | Read-only |
-v $(pwd)/output:/app/output |
Output directory for generated images | Read-write |
Before running Docker commands:
- Create the output directory:
mkdir -p output - Place your
overlay.pngin the current directory - For batch processing, place your
thoughts.csvin the current directory
- Python 3.10+
- LiteLLM API keys properly configured (
export OPENAI_API_KEY=...) - Pillow
- Typer
- tqdm (for batch processing progress bars)
Generate a single image with overlay blending.
Arguments:
THOUGHT: The thought text to generate an image forOVERLAY: Path to overlay image to blend with generated imageOUTPUT: Path to save the final blended image
Options:
--image-prompt-output PATH: Save the generated image prompt--raw-image-output PATH: Save the raw image before blending--log-level: Set logging level (default: INFO)--prompt-gen-model TEXT: LLM model for prompt generation (default: gpt-4o-mini)--image-gen-model TEXT: Image generation model (default: gpt-image-1-mini)--alpha INTEGER: Blend alpha value 0-100 (default: 50)
Generate multiple images from a CSV file.
Arguments:
INPUT: Path to CSV file with thoughts and publish datesOVERLAY: Path to overlay image to blend with all generated imagesOUTPUT_FOLDER: Folder to save generated images
Options:
--include-image-prompt/--no-include-image-prompt: Save image prompts (default: no)--include-raw-image/--no-include-raw-image: Save raw images (default: no)--log-level: Set logging level (default: INFO)--prompt-gen-model TEXT: LLM model for prompt generation (default: gpt-4o-mini)--image-gen-model TEXT: Image generation model (default: gpt-image-1-mini)--alpha INTEGER: Blend alpha value 0-100 (default: 50)
docker build -t icrl-generator .The Dockerfile uses multi-stage builds to create a minimal runtime image by:
- Building dependencies in a builder stage with compilation tools
- Copying only the runtime files to a slim final image
- Excluding build tools to minimize image size
This project uses GitHub Actions to automatically build and publish Docker images to GitHub Container Registry (GHCR) on:
- Pushes to
mainordevelopbranches - Version tags (e.g.,
v1.0.0) - Pull requests (build only, no push)
Images are published to: ghcr.io/honakerm/icrl-generator