Five review findings of the P3 phase, each fixed at its root:
1. (medium) The P3.7 metadata test imported `tomllib` at module level: the
**3.10 CI job** (the declared `requires-python >=3.10` minimum) died
during collection, so the registry-metadata assertions never ran on 3.10.
The parser import is now guarded (`tomllib` -> `tomli`, the package the
3.10 job installs); without any parser the module *skips* instead of
dying. `pyproject.toml` gained the test extra
`tomli>=2.0; python_version < '3.11'`.
Proof: a 3.10 simulation (the stdlib `tomllib` refused for the test
module, `tomli` on sys.path) -> 6 passed; the control without `tomli`
-> 6 skipped (no collection error).
2. (medium) The P3.5 "primary-root-first multi-root" resolution was not
wired into the production load path: `resolve_model_file` (the only
`get_full_path_or_raise` caller) was used by tests only, so a weight in
a secondary model root was downloaded into the primary root again.
`src/keep_paths.py` now has `find_model_file()` (the multi-root lookup
through `folder_paths.get_full_path_or_raise`) and `resolve_model_root()`
(the root the weights really live in); `load_file_from_url_comfy()` - the
production path of `src/keep_model_loader.py:107` - uses the lookup, and
the facelib root follows the weights (the facelib helper builds its
paths from a single root). New tests prove that the production path
uses a weight of an extra model root and that the primary root wins.
The `models_dir` grep guard is no longer a blanket exemption: only the
registration in `src/keep_paths.py` may use the attribute.
3. (low) `[tool.comfy].Icon` was an empty string and the test only checked
that the key exists. The preview asset **is** committed
(`git cat-file -s HEAD:assets/keep-preview.png` -> 93279 bytes); only the
working copy was missing (an uncommitted local deletion, restored from
HEAD - no asset change is in this commit). The key now points at
`assets/keep-preview.png` and the test asserts that the value is not
empty and names a file that is really in the repository.
4. (low) `tests/test_package_entrypoint.py` hard-coded the V1 state and
would have gone red (not xfail) when P4.4 flips the root `__init__.py`
to `comfy_entrypoint`. The assertions now follow the entry point that is
really there: exactly **one** mapping style (V1 XOR V3). The mocked
smoke test of `tests/test_package_import.py` got the same treatment; the
headless variant is P4.4's job (its test list names it).
5. (low) The plan's §3 rule ("`comfy.*` imports inside `src/` are lazy
(function-level) so the pack imports without a ComfyUI server") was
violated and unguarded. The `comfy` imports of `src/keep_model_loader.py`
and `src/keep_processor.py` are function-level now; the vendored facelib
helper (which imports `comfy` itself) is imported lazily through a module
`__getattr__` (PEP 562), so `loader.FaceRestoreHelper` still resolves to
the vendored class. Structure **guard (f)** (`tests/test_structure.py`)
forbids a module-level `comfy`/`comfy_api` import in `src/**` (with the
self-test the guards file demands), and the new
`tests/test_lazy_imports.py` proves at runtime that the engines import
while every `comfy` import is blocked.
Gate after the commit:
python.exe -m pytest -q tests -m "unit or mock_integration"
-> 153 passed, 1 skipped, 5 deselected, 3 xfailed
COMFYUI_ROOT=C:/_Dev/ComfyUI_dev/ComfyUI-source/ComfyUI python.exe
-m pytest -q tests -m "unit or mock_integration or headless"
-> 158 passed, 1 skipped, 3 xfailed
Details: docs/2026-10-23-p3-review-findings.md
Update
- 2025-07-03:
- Standard ComfyUI
Upscale Modelinputs instead of a hardcoded Real-ESRGAN - Added
final_upscale_factorfor precise output scaling.
- Standard ComfyUI
- 2025-05-20: Initial commit
About ComfyUI-KEEP
This repository provides custom nodes for ComfyUI that implement the KEEP algorithm for face super-resolution. KEEP is designed for robust video face super-resolution, and these nodes adapt its capabilities for use within the ComfyUI framework.
You can enhance faces in:
- Single images
- Sequences of images (video frames)
The nodes leverage the core architecture and pre-trained models from the original KEEP project.
Features
- High-Quality Face Restoration: Utilizes the core KEEP model for detailed face enhancement.
- Flexible Upscaling Integration:
- Connect any ComfyUI-compatible upscale model (from
Upscale Model Loader) for both background and face upscaling. - Use different models for background and face enhancement within the same workflow.
- Full control over the final output size with a
final_upscale_factor.
- Connect any ComfyUI-compatible upscale model (from
- Single Image & Sequence Processing: Enhance faces in individual images or entire video frame sequences.
- Choice of Detection Models: Supports various face detection backbones (RetinaFace, YOLOv5).
Nodes
This package includes the following custom nodes:
1. Load KEEP Models
Loads the core KEEP model and face detection models. It now accepts UPSCALE_MODEL inputs, allowing you to connect any upscaler loaded via a standard Upscale Model Loader.
model: Choose between "KEEP" (general) or "Asian".detection_model: Face detection model to use (e.g.,retinaface_resnet50).bg_upscale_model(optional): Connect anUPSCALE_MODELhere to enhance the background.face_upscale_model(optional): Connect anUPSCALE_MODELhere to further enhance the quality of the restored face patch.
2. KEEP Single Image
Restores and enhances faces in a single input image.
image: The input image.keep_model: The model pack from theLoad KEEP Modelsnode.final_upscale_factor: The final scaling factor for the output image. For example, if your BG upscale model is 4x but you only want a 2x final output, set this to2.0. If you want the original size, set this to1.0.has_aligned_face: Set toTrueif the input is an already aligned 512x512 face.only_center_face: If multiple faces are detected, process only the one closest to the center.draw_bounding_box: Draws a box around the detected face.
3. KEEP Image Sequence
Restores and enhances faces in a sequence of input images (e.g., frames from a video).
images: A batch of images representing video frames.keep_model: The model pack from theLoad KEEP Modelsnode.final_upscale_factor: The final scaling factor for the output frames.max_clip_length: Maximum number of frames to process in one go by the KEEP network (for VRAM management).
Installation
-
Clone this repository:
git clone https://github.com/wildminder/ComfyUI-KEEP.gitPlace it into your
ComfyUI/custom_nodes/directory. -
Install Dependencies: The core KEEP model has several dependencies
cd ComfyUI/custom_nodes/ComfyUI-KEEP pip install -r requirements.txt -
Download Pre-trained Models: The nodes will attempt to download the required models automatically during the first run. Models will be saved into standard ComfyUI model directories:
- KEEP models (
KEEP-b76feb75.pth):ComfyUI/models/keep_models/KEEP/ - Face detection/parsing models (e.g.,
detection_Resnet50_Final.pth):ComfyUI/models/facedetection/ - Upscale Models: Place any upscaler models (like Real-ESRGAN, SwinIR, etc.) in
ComfyUI/models/upscale_models/.
If automatic download fails for the KEEP or face models, you can manually download them from the original KEEP Releases V1.0.0 and place them in the corresponding ComfyUI subdirectories mentioned above.
- KEEP models (
-
Restart ComfyUI.
Citation for Original KEEP
If you use the core KEEP algorithm or models in your research, please cite the original paper:
@InProceedings{feng2024keep,
title = {Kalman-Inspired FEaturE Propagation for Video Face Super-Resolution},
author = {Feng, Ruicheng and Li, Chongyi and Loy, Chen Change},
booktitle = {European Conference on Computer Vision (ECCV)},
year = {2024}
}
