The purpose of this code is to notify the backend that a specific output file has been successfully generated and uploaded. The backend (ComfyUIContentHandler) needs to know which output file this message corresponds to. The original code sent the entire final_outputs_dict. This would work, but it's inefficient and sends redundant information. If a workflow has five MediaStreamOutput nodes, each one would send a completion message containing the information for all five outputs. The backend would receive five identical messages. The new code is more precise. It filters the dictionary to include only the key-value pair for the output it just handled. This is a much cleaner and more correct approach. It ensures that each completion message is atomic and only contains the information relevant to the event that triggered it.
Nilor Nodes Documentation 👺
A collection of utility nodes for ComfyUI focusing on list manipulation, batch operations, and advanced I/O functionality.
🏭 Generators
Interpolated Float List
Generates a list of interpolated float values based on sections.
| Input | Type | Description |
|---|---|---|
| number_of_floats | INT | Total number of float values to generate |
| number_of_sections | INT | Number of sections to divide into |
| section_number | INT | Current section being processed |
| interpolation_type | ["slinear", "quadratic", "cubic"] | Type of interpolation |
| Output | Type | Description |
|---|---|---|
| floats | FLOAT | List of interpolated float values |
Notes: Creates smooth transitions between values using scipy's interpolation.
One Minus Float List
Creates an inverted list of float values (1 - x).
| Input | Type | Description |
|---|---|---|
| list_of_floats | FLOAT | Input float list |
| Output | Type | Description |
|---|---|---|
| floats | FLOAT | Inverted float values |
Notes: Simple inversion operation, useful for creating complementary values.
Remap Float List
Remaps a list of float values from one range to another.
| Input | Type | Description |
|---|---|---|
| list_of_floats | FLOAT | Input float list |
| min_input | FLOAT | Minimum input value (default: 0.0) |
| max_input | FLOAT | Maximum input value (default: 1.0) |
| min_output | FLOAT | Minimum output value (default: 0.0) |
| max_output | FLOAT | Maximum output value (default: 1.0) |
| Output | Type | Description |
|---|---|---|
| remapped_floats | FLOAT | Remapped float values |
Notes: Useful for scaling values between different ranges while preserving relationships.
Inverse Map Float List
Creates a mirror mapping of float values around their midpoint.
| Input | Type | Description |
|---|---|---|
| list_of_floats | FLOAT | Input float list |
| Output | Type | Description |
|---|---|---|
| floats | FLOAT | Inverse mapped values |
Notes: Automatically determines min/max from input list.
🛠️ Utilities
Int To List Of Bools
Converts an integer into a list of boolean values.
| Input | Type | Description |
|---|---|---|
| number_of_images | INT | Number to convert |
| Output | Type | Description |
|---|---|---|
| booleans | BOOLEAN | List of boolean values |
Notes: Creates a list where first N values are True, rest are False.
List of Ints
Generates a sequential or shuffled list of integers.
| Input | Type | Description |
|---|---|---|
| min | INT | Starting integer (default: 0) |
| max | INT | Ending integer (default: 9) |
| shuffle | BOOLEAN | Whether to randomize order |
| Output | Type | Description |
|---|---|---|
| ints | INT | List of integers |
Notes: Output is always a list, even for single values.
Select Index From List
Extracts a single item from a list at the specified index.
| Input | Type | Description |
|---|---|---|
| list_of_any | any | Input list of any type |
| index | INT | Index to select (default: 0) |
| Output | Type | Description |
|---|---|---|
| any | any | Selected item |
Notes: Uses custom AnyType to accept any input type. Handles tensor unpacking automatically.
Shuffle Image Batch
Randomly reorders images in a batch.
| Input | Type | Description |
|---|---|---|
| images | IMAGE | Batch of images |
| seed | INT | Random seed for shuffling |
| Output | Type | Description |
|---|---|---|
| images | IMAGE | Shuffled image batch |
Notes: Maintains batch dimensions while randomizing order.
💾 I/O Operations
Save Image To HF Dataset
Uploads images to a HuggingFace dataset.
| Input | Type | Description |
|---|---|---|
| image | IMAGE | Image to upload |
| repository_id | STRING | HuggingFace dataset repository |
| hf_auth_token | STRING | HuggingFace authentication token |
| filename_prefix | STRING | Prefix for saved files |
Notes: Requires HuggingFace authentication token and repository access.
Save EXR Arbitrary
Saves multi-channel data as an OpenEXR file.
| Input | Type | Description |
|---|---|---|
| channels | any | List of tensor channels |
| filename_prefix | STRING | Output filename prefix |
Notes: Supports arbitrary number of channels. Each channel must have same dimensions.
Save Video To HF Dataset
Uploads video files to a HuggingFace dataset.
| Input | Type | Description |
|---|---|---|
| filenames | VHS_FILENAMES | List of video files |
| repository_id | STRING | HuggingFace dataset repository |
| hf_auth_token | STRING | HuggingFace authentication token |
| filename_prefix | STRING | Prefix for saved files |
Notes: Handles batch upload of multiple video files.
📡 Core Nilor Services
Worker Consumer Service
The worker_consumer.py script is a background service that runs on each ComfyUI worker. It is responsible for pulling jobs from the central ElasticMQ jobs_to_process queue and submitting them to its local ComfyUI instance for processing. This service is essential for the distributed architecture of the system.
Key Responsibilities:
- Continuously polls the
jobs_to_processqueue for new jobs using long polling. - When a job is received, it extracts the workflow data and submits it to the local ComfyUI server.
- Deletes the job message from the queue upon successful submission to prevent reprocessing.
- If submission fails, the message remains on the queue to be picked up by another worker.
Environment Variables
The nilor-nodes require a .env file to be present in the ComfyUI directory to configure the connection to the core services (MinIO, ElasticMQ, and the Brain API). To set it up, create a file named .env in the root of your ComfyUI directory by copying the .env.example template.
Instructions:
- Create a new file named
.envin theComfyUIdirectory. - Copy the contents of the
.env.examplefile into your new.envfile. - Replace the placeholder values with your actual credentials and endpoint URLs for your local or production environment.