Files
malkuthro-ComfyUI-Koolook/README.md
T
malkuthro 9069560379 docs+chore: README sync, sibling-projects pattern, skill, and path-leak cleanup (#27)
Squash of 4 commits from docs/readme-sync-current-nodes. Out of scope (tracked in #28): de-vendor upstream copies under upscaler_FIX/ and nuke_CAM_exporter/.
2026-05-01 10:59:42 +02:00

256 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ComfyUI-Koolook-Nodes
This repository provides custom nodes for ComfyUI tailored for VFX and AI image/video generation workflows.
For change history see [`CHANGELOG.md`](CHANGELOG.md). For workflow conventions and naming see [`CLAUDE.md`](CLAUDE.md) and [`Glossary.md`](Glossary.md).
### Koolook nodes (root package)
| Node | Display name | Category | Source |
|------|--------------|----------|--------|
| `Easy_Version` | Easy Version | `VFX/Utils` | `k_easy_version.py` |
| `EasyWan22Prompt` | Wan 2.2 Easy Prompt | `Koolook/Wan_Video` | `k_easy_wan22_prompt.py` |
| `EasyResize` | Easy Resize | `Koolook/Image` | `k_easy_resize.py` |
| `EasyAIPipeline` | Easy AI Pipeline | `Koolook/VFX` | `k_ai_pipeline.py` |
| `easy_ImageBatch` | Easy Image Batch | `Koolook/VFX` | `k_easy_image_batch.py` |
| `KoolookLoadCameraPosesAbsolute` | Koolook Load Camera Poses (Absolute Path) | `Koolook/Camera` | `k_easy_track.py` |
Brief descriptions:
- **Easy Version**: Generates a padded version string like `v001` from an integer. Ideal for naming renders, sequences, or iterations in VFX pipelines.
- **Wan 2.2 Easy Prompt**: Dynamic prompt builder driven by `config.json` (light source, lighting type, time of day, etc.). Outputs a comma-separated prompt string and optional CLIP conditioning.
- **Easy Resize**: Aspect-aware image resize that enforces divisibility (e.g., `32`) for model compatibility. Modes: stretch, letterbox, pillarbox; padding and cropping supported. Inspired by the Resize Image V2 node from [ComfyUI-KJNodes](https://github.com/kijai/ComfyUI-KJNodes).
- **Easy AI Pipeline**: Aggregates VFX shot parameters (shot duration, seed, base path, shot name, AI method, version) into a fully formatted output file path with overwrite protection. For organized writes from Save EXR / Save Image.
- **Easy Image Batch**: Builds an `IMAGE` + `MASK` batch of length `total_frames` from 1–4 keyframe images placed at explicit frame indices (with `start_frame` offset). Empty frames are filled with black/gray and the mask marks empty=white / occupied=black. Useful for sparse keyframe control with Wan-style video models.
- **Koolook Load Camera Poses (Absolute Path)**: Loads RealEstate10k-style `CAMERACTRL_POSES` from any absolute path (no ComfyUI path stripping), with overrideable pose width/height. Pairs with AnimateDiff CameraCtrl downstream.
### Radiance Koolook nodes (forked, namespaced)
These come from [`forks/radiance_koolook/versions/v1_0_1/`](forks/radiance_koolook/versions/v1_0_1) and load through the root `__init__.py`. All IDs are namespaced with the suffix `__koolook_v1_0_1` (display suffix `(Koolook v1.0.1)`) to avoid collisions with upstream Radiance.
- HDR / EXR / color: `ImageToFloat32`, `Float32ColorCorrect`, `HDRExpandDynamicRange`, `HDRToneMap`, `ColorSpaceConvert`, `SaveImageEXR`, `LoadImageEXR`, `LoadImageEXRSequence`, `SaveImage16bit`, `HDRHistogram`, `LogCurveEncode`, `LogCurveDecode`
- OCIO: `RadianceOCIOColorTransformV2` (also exposed under the compact ID `k_easy_OCIO_v101`), `RadianceLogCurveDecode`
See [`forks/README.md`](forks/README.md) for the full fork workflow.
## Features
- **Dynamic Inputs for Prompts**: Fields and dropdowns in Wan 2.2 Easy Prompt are defined in `config.json`, allowing easy customization without code changes—great for VFX artists iterating on lighting or camera parameters.
- **Image Resizing with Aspect Control**: Easy Resize ensures precise resolutions for AI models, with options for keep_proportion preservation, padding colors, and device selection (CPU/CUDA). Supports masks for compositing in VFX.
- **Pipeline Path Generation**: Easy AI Pipeline assembles VFX-style output paths and filenames from shot/version inputs, with optional version disabling and overwrite protection.
- **Sparse Keyframe Batches**: Easy Image Batch constructs aligned `IMAGE` + `MASK` batches from up to four keyframe images, ready for sparse video-model control.
- **Camera Pose Loading**: Koolook Load Camera Poses (Absolute Path) reads RealEstate10k pose TXT files from any disk location and emits `CAMERACTRL_POSES`.
- **Startup Loading**: Nodes load configurations at ComfyUI launch; edit `config.json` and restart to update.
- **Output Formatting**: Wan 2.2 Easy Prompt outputs comma-separated strings (skipping "none"), compatible with prompt builders. Easy Resize outputs resized images, masks, and width/height integers. Easy Version provides padded strings for filename appending.
- **Error Handling**: Fallbacks for missing/invalid JSON in Wan 2.2 Easy Prompt; validation for aspect ratios and divisibility in Easy Resize.
- **Compatibility**: Works with ComfyUI-Manager for easy installation via Git URL. The Koolook root nodes have no extra Python dependencies; the Radiance Koolook nodes optionally use `OpenEXR`, `Imath`, `PyOpenColorIO`, `colour`, `opencv-python`, and `imageio` (imports are guarded — if a dep is missing, the affected Radiance node is unavailable but the rest of the package still loads).
## RunPod
RunPod management has been moved to a separate private repository for active operations and iteration.
- Runtime/deployment scaffolding is no longer maintained in this public repo.
- This public repo remains focused on the ComfyUI nodes/plugin code.
## Release & Stability
For production usage, install a pinned stable tag/commit instead of following moving branch heads.
- Release workflow: `forks/README.md`
- Change history: `CHANGELOG.md`
- Fork tracking: `forks/THIRD_PARTY.md`, `forks/forks_manifest.yaml`
- Fork workflow guide: `forks/README.md`
### Tagging Policy (from now on)
- Repo releases: `vMAJOR.MINOR.PATCH` (example: `v0.2.0`).
- Fork code versions in paths use underscore format: `v1_0_1`, `v2_3_3`.
- Comfy node ID namespace suffixes match fork version paths: `__koolook_v1_0_1`.
- External raw checkout naming:
- pinned: `<repo>-v<version>-koolook`
- rolling upstream: `<repo>-main-upstream`
## Sibling Projects
Some related work lives in **sibling folders/repositories** outside MAIN. They are *consulted* (read-only knowledge sources, references, etc.) but never imported by MAIN at runtime. To keep the public repo free of machine-specific absolute paths, every sibling is referenced through an environment variable.
### Conventions
- Variable prefix: `KOLOOK_*` (matches the existing `KOLOOK_FORKS_DIR`).
- Real paths live in a local, gitignored `.env` file. The committed `.env.example` declares the variable names with placeholder values.
- Public docs and committed code reference siblings only via the env var name (and an optional portable relative default like `../<folder>`). Never hardcode an absolute path with a username.
- A sibling project is a *runtime-optional* reference. If the variable is unset and no default is documented, agents/code must treat the sibling as unavailable and continue gracefully.
### Registered siblings
| Role | Env var | Portable default | Status |
|------|---------|------------------|--------|
| External forks root (raw upstream clones) | `KOLOOK_FORKS_DIR` | `../ComfyUI-Forks` | documented in `forks/forks_manifest.yaml` |
| ComfyUI knowledge database | `KOLOOK_COMFYUI_KB_DIR` | `../ComfyUI_knowledge___DB` | read-only knowledge source |
| Personal knowledge database | `KOLOOK_PERSONAL_KB_DIR` | *(no default — user-specific)* | optional |
### Local setup
```bash
cp .env.example .env
# Edit .env to point at the real paths on your machine.
```
Do **not** commit `.env`. The default `.gitignore` already excludes `.env`, `.env.local`, and `.env.*.local`.
## External Fork Workflow (No Vendoring in MAIN)
This repository is the MAIN control repo. Large third-party repositories must stay outside MAIN.
- Default external forks root (relative): `../ComfyUI-Forks`
- MAIN stores only:
- wrappers under `forks/`
- provenance/tracking under `forks/`
- MAIN does not store full external trees (no vendored copies).
### Radiance Koolook Version Layout
- Package entry path: `forks/radiance_koolook/__init__.py`
- Version path (current): `forks/radiance_koolook/versions/v1_0_1/`
- Modified node source is local and tracked in MAIN:
- `forks/radiance_koolook/versions/v1_0_1/nodes_hdr.py`
- `forks/radiance_koolook/versions/v1_0_1/nodes_color_management.py`
- `forks/radiance_koolook/versions/v1_0_1/nodes_dna.py`
- External checkout is reference-only raw upstream:
- default location: `../ComfyUI-Forks/radiance-v1.0.1-koolook`
- baseline used for comparison: upstream `comfyui` tag (`f1b8ae330848fa08aba24c9d3e355cb432d3515b`) because `v1.0.1` tag is not published upstream
- Node IDs are namespaced with version suffixes (current: `__koolook_v1_0_1`) to avoid collisions.
- Each version folder should include `UPSTREAM_PIN.yaml` to keep parity with external pinned references.
### Version Pinning (Portable Across PCs/macOS)
- Track every external repo in `forks/forks_manifest.yaml` with:
- `source_ref` (tag/version)
- `pinned_commit` (exact hash used in production)
- `external_checkout.relative_path_from_forks_root`
- Keep checkout folder names versioned, e.g.:
- `radiance-v1.0.1-koolook`
- `radiance-v2.3.3-koolook`
### Machine Setup Example
From the parent directory that contains `ComfyUI-Koolook`:
```bash
mkdir -p ../ComfyUI-Forks
cd ../ComfyUI-Forks
git clone https://github.com/fxtdstudios/radiance.git radiance-v1.0.1-koolook
cd radiance-v1.0.1-koolook
git checkout f1b8ae330848fa08aba24c9d3e355cb432d3515b
```
This external folder is for upstream comparison/sync work only.
## Installation
### Via ComfyUI-Manager (Recommended)
1. Open ComfyUI and access the Manager interface.
2. Go to "Install Custom Nodes" > "Install via Git URL".
3. Paste the repository URL: `https://github.com/malkuthro/ComfyUI-Koolook.git`.
4. Install and restart ComfyUI.
5. Nodes appear under these categories in the node search:
- `VFX/Utils` — Easy Version
- `Koolook/Wan_Video` — Wan 2.2 Easy Prompt
- `Koolook/Image` — Easy Resize
- `Koolook/VFX` — Easy AI Pipeline, Easy Image Batch
- `Koolook/Camera` — Koolook Load Camera Poses (Absolute Path)
- Radiance categories (set by upstream Radiance) for the namespaced `(Koolook v1.0.1)` nodes
### Manual Installation
1. Clone this repository into your `ComfyUI/custom_nodes/` directory:
```
git clone https://github.com/malkuthro/ComfyUI-Koolook.git
```
2. Ensure `__init__.py` and `config.json` are in the cloned folder.
3. Restart ComfyUI.
The root Koolook nodes have no additional Python dependencies. To enable the Radiance Koolook v1.0.1 nodes that handle EXR / OCIO / HDR work, install the optional packages: `OpenEXR`, `Imath`, `PyOpenColorIO`, `colour-science`, `opencv-python`, and `imageio`.
## Usage
### Easy Version
1. Add the "Easy Version" node to your workflow under "VFX/Utils".
2. Connect an INT input (e.g., from a Constant node) to the "version" slot.
3. Output is a STRING like "v001" for input 1, "v011" for 11—use for appending to filenames in Save Image nodes or VFX render queues.
### Wan 2.2 Easy Prompt
1. Add the "Wan 2.2 Easy Prompt" node to your workflow under "Koolook/Wan_Video".
2. Select options from the dropdowns (e.g., Light Source: "Sunny lighting", Lighting Type: "Soft lighting").
3. Add custom text in the "body" field for main prompt content.
4. Optionally connect a CLIP for conditioning output.
5. Connect the STRING outputs (combined_prompt or fields_only) to a prompt input, such as the "prompt" slot in the PromptJSON node (from [NeuralSamurAI/ComfyUI-PromptJSON](https://github.com/NeuralSamurAI/ComfyUI-PromptJSON)).
6. To customize fields:
- Edit `config.json` (see example below).
- Restart ComfyUI to apply changes.
7. VFX Tip: Use for generating consistent lighting/shot descriptions in video generation workflows, like with AnimateDiff or SVD.
#### Example config.json
This is the default configuration based on Wan 2.2 parameters:
```json
{
"category": "Koolook/Wan_Video",
"node_name": "Wan_2.2",
"fields": [
{
"name": "light_source",
"type": "combo",
"options": ["none", "Sunny lighting", "Artificial lighting", "Moonlighting", "Practical lighting", "Firelighting", "Fluorescent lighting", "Overcast lighting", "Mixed lighting"],
"default": "none"
},
{
"name": "lighting_type",
"type": "combo",
"options": ["none", "Soft lighting", "Hard lighting", "Top lighting", "Side lighting", "Underlighting", "Edge lighting", "Silhouette lighting", "Low contrast lighting", "High contrast lighting"],
"default": "none"
},
// ... (additional fields like time_of_day, shot_size, etc.)
],
"output_type": "STRING"
}
```
### Easy Resize
1. Add the "Easy Resize" node to your workflow under "Koolook/Image".
2. Connect an IMAGE (and optional MASK) input.
3. Set the base dimension (Width or Height), base size, aspect ratio (e.g., "16:9" for landscape, "9:16" for portrait), and other options like keep_proportion (stretch, letterbox, pillarbox), pad_color (e.g., "0, 0, 0" for black), crop_position, divisible_by, and device.
4. Connect the outputs: IMAGE and MASK for further processing, INT width/height for resolution-aware nodes like samplers or upscalers.
5. VFX Tip: Use for preprocessing footage in multi-resolution pipelines, ensuring divisibility for efficient GPU processing in tools like IPAdapter or ControlNet.
## Node Code Overview
The core logic is split across files for modularity:
Root Koolook nodes:
- **k_easy_version.py** — `Easy_Version` class for padded version-string formatting.
- **k_easy_wan22_prompt.py** — loads `config.json` at import time, builds inputs dynamically (combos for dropdowns, strings for text), and formats selections into prompt strings with optional CLIP conditioning.
- **k_easy_resize.py** — parses aspect ratios, computes divisible dimensions, resizes with `common_upscale`, and handles padding/cropping. Inspired by Resize Image V2 from ComfyUI-KJNodes.
- **k_ai_pipeline.py** — `EasyAIPipeline` builds VFX output paths/filenames from shot/version inputs and creates the output directory.
- **k_easy_image_batch.py** — `easy_ImageBatch` builds aligned `IMAGE`+`MASK` keyframe batches with placeholder fill.
- **k_easy_track.py** — `KoolookLoadCameraPosesAbsolute` loads RealEstate10k pose TXT files from any path.
Forked/wrapped nodes:
- **forks/radiance_koolook/** — version-namespaced wrapper for the Radiance fork. Currently exposes the `v1_0_1` set; modified node sources live in `forks/radiance_koolook/versions/v1_0_1/{nodes_hdr,nodes_color_management,nodes_dna}.py`. The wrapper applies the `__koolook_v1_0_1` ID suffix and the optional short ID `k_easy_OCIO_v101`.
- **forks/forks_manifest.yaml**, **forks/THIRD_PARTY.md**, **forks/README.md** — fork tracking metadata.
Glue and frontend:
- **__init__.py** — imports all node packages, merges `NODE_CLASS_MAPPINGS` / `NODE_DISPLAY_NAME_MAPPINGS`, and exposes `WEB_DIRECTORY = "./web"`.
- **web/** — JavaScript extensions loaded by ComfyUI for the Koolook nodes (e.g., `ai_pipeline.js`).
For advanced customizations (e.g., different output formats or additional resize modes), modify the `execute` or `adjust_to_aspect` methods in the respective files.
## Troubleshooting
- **ComfyUI Won't Start**: Check console logs for errors (run `python main.py`). Common: Missing `config.json` or invalid JSON—use a validator like jsonlint.com.
- **No Fields Visible in Wan 2.2 Easy Prompt**: Indicates JSON load failure; the node falls back to empty inputs.
- **Errors in Easy Resize**: Ensure aspect ratio is "w:h" format, divisible_by >=1, and pad_color is "r, g, b" floats (0.0-1.0).
- **Updates**: Pull latest from GitHub and restart.
## Credits
- Based on ComfyUI custom node examples.
- Parameters for Wan 2.2 Easy Prompt derived from Wan 2.2 docs (https://alidocs.dingtalk.com/i/nodes/EpGBa2Lm8aZxe5myC99MelA2WgN7R35y).
- Easy Resize inspired by ComfyUI-KJNodes (https://github.com/kijai/ComfyUI-KJNodes), specifically the Resize Image V2 node in image_nodes.py.
- Compatible with nodes like PromptJSON for LLM workflows.
## License
MIT License. Feel free to use, modify, and distribute.