266 Commits
Author SHA1 Message Date
Alexopus dbf9457169 Civitai resources: always write modelVersionId, add type, rename to modelVersionName (#140) v1.26.1 2026-09-26 13:41:24 +02:00
Alexopus b4b349e553 Add TimeStringGenerator node v1.26.0 2026-09-06 22:58:43 +02:00
Alexopus 49da13c7b5 VAEEncodeIndividualImages->VAEForceIndividualImages 2026-09-06 22:12:48 +02:00
Alexopus 50f87d00d0 changelog and version 2026-09-06 22:03:56 +02:00
Alexopus fc748aef24 VAEEncodeIndividualImages: image only 2026-09-06 22:03:14 +02:00
Alexopus 710802e7cc Add VAEEncodeIndividualImages and %label input v1.25.0 2026-09-06 21:48:50 +02:00
Alexopus 1d2df13cfc bump changelog and pyproject v1.24.1 2026-08-27 20:55:31 +02:00
Alexopus bc798df250 Fix path traversal in ImageSaver output path/filename handling
`path` and `filename` are free-form strings that can come from a
workflow's JSON, not just a person typing into the local UI. Only the
final path segment was ever sanitized (make_pathname/sanitize_filename),
so a value like `../../../etc` or an absolute path could make
ImageSaver.save_images() create directories and write the image/JSON
sidecar outside ComfyUI's output directory (CWE-22/CWE-73). This is
what caused v1.24.0 to be banned on the Comfy Registry
(Comfy-Org/registry-backend#206).

Add utils.resolve_within_output(), which joins path pieces onto
folder_paths.output_directory, resolves symlinks, and rejects the
result if it escapes that directory. Apply it everywhere
ImageSaver.save_images() turns `path`/`filename` into a filesystem
path: the output directory itself, the final image target, and the
optional workflow-JSON sidecar. Nested relative subfolders (e.g.
`portraits/2026-08-27`) still work; `..`, absolute paths, and
symlink escapes are now rejected before anything is created.

Covered by a new tests/ suite (tests/test_paths.py), since exercising
nodes.py requires stubbing ComfyUI's runtime (see tests/conftest.py).

Fixes alexopus/ComfyUI-Image-Saver#138
2026-08-27 20:52:13 +02:00
Alexopus 205d66a9d8 bump version and changelog v1.24.0 2026-07-13 16:26:58 +02:00
Alexopus d47ff20275 Add EmptyLatent node 2026-07-13 16:25:47 +02:00
Alexopus 92305d2e42 style 2026-06-07 11:53:32 +02:00
Alexopus a3c58a26b5 rng pickers: add filter option 2026-06-07 11:26:42 +02:00
Alexopus 99c41d0784 rng pickers: add tooltips 2026-06-07 10:53:30 +02:00
Alexopus 1c452a683c rng pickers: add exclude option 2026-06-07 10:48:40 +02:00
Alexopus c3cd218225 rng pickers: add optional weighting by count 2026-06-07 10:14:01 +02:00
Alexopus 6af1fc977f rng artist: prefix option 2026-06-07 08:02:06 +02:00
Alexopus c29e16bdcb Add random char/artist picker 2026-06-07 07:30:02 +02:00
Alexopus 2ba0f2bc4e bump version and changelog v1.23.0 2026-05-21 22:04:53 +02:00
AdiosF6F e4e27808fa docs: document pipe architecture, new examples, and counter padding
Update project documentation to reflect the newly introduced Pipe
architecture and improve overall clarity regarding workflow orchestration.

- `README.md`: Add a new "Optional: Pipe Integration" section explaining
  when to use the pipe system, emphasizing its role in managing complex,
  multi-stage workflows with deferred execution. Clarify the distinction
  and compatibility boundaries between standard and pipe nodes.
- `README.md`: Document the `%counter<padding>` filename template variable.
- `CLAUDE.md`: Update the core architecture map to include `nodes_pipe.py`
  and list the new configuration, modification, and terminal nodes.
- `examples/`: Introduce a dedicated examples directory. Move the standard
  `example-workflow.json` into this folder and add the new
  `image_saver_pipe_workflow.json` to demonstrate advanced orchestration.
- `examples/README.md`: Add a descriptive index detailing the differences
  between the standard workflow and the advanced pipe orchestration example.
2026-05-21 21:54:11 +02:00
AdiosF6F 4af6182d57 feat(nodes): implement deferred execution pipe architecture
Introduce an optional Pipe architecture to streamline metadata management
and reduce wire clutter in complex, multi-stage workflows.

This new system utilizes deferred execution (lazy evaluation), passing
metadata and configuration state as raw dictionaries through the pipe.
Expensive operations, such as checkpoint hashing and Civitai API lookups,
are now deferred until the final image save execution. This approach
prevents premature data mutation and significantly reduces execution
overhead during workflow design and routing.

To maintain architectural cleanliness and follow existing module patterns,
these nodes are housed in a dedicated `nodes_pipe.py` file. The pipe
configuration uses dynamic dictionary composition to inherit UI definitions
safely without inheriting incorrect base execution logic.

Key additions:
- `MakeImageSaverSimpleConfig` & `MakeImageSaverMetadataConfig`: Provide
  standalone input configurations.
- `MakeImageSaverPipe`: Bundles configurations into a single connection.
- `EditImageSaverPipe`: Enables non-destructive branching and overrides.
- `ReadImageSaverPipe`: Allows extraction of pipe data for external use.
- `ImageSaverFromPipe`: Triggers disk/network actions.
2026-05-21 21:54:11 +02:00
AdiosF6F b8e2050b3e feat(nodes): support zero-padded counter format
Add `apply_custom_counter_format` to support `%counter<padding>`
syntax in filenames (e.g., `%counter<03>` yields `001`). This
enhances customization across all image saver nodes.
2026-05-14 09:44:14 +02:00
Alexopus 1a472c2dff bump project version and changelog v1.22.0 2026-04-21 18:29:00 +02:00
ComplexRobot 4c39b6bd02 Change steps minimum to zero so Civitai skips it. 2026-04-21 18:11:36 +02:00
Alexopus 4b8a4c09e5 add random tag picker 2026-02-25 20:38:28 +01:00
Alexopus a7c3d37664 Cleaner naming for batch saves 2 2026-01-24 17:36:02 +01:00
Alexopus 3f32da2306 Bump version and changelog v1.21.0 2026-01-20 18:49:35 +01:00
Alexopus b659c2df77 Cleaner naming for batch saves 2026-01-20 18:47:54 +01:00
CyrixJD115 e1bb22e918 Allow custom time_format via prompt parameters in image saver 2026-01-20 18:47:12 +01:00
Alexopus 3e5de68401 Bump version and changelog v1.20.0 2025-12-23 17:54:30 +01:00
Alexopus bca4306bcb Add RandomShapeGenerator 2025-12-23 17:32:49 +01:00
Alexopus a165bc158f Bump version and changelog v1.19.0 2025-12-19 08:11:44 +01:00
Alexopus bc8b08c95a Bring back selector nodes for backwards-compatibility 2025-12-19 08:06:51 +01:00
Alexopus 68d44c2c67 Bump version and changelog v1.18.0 2025-12-17 16:03:50 +01:00
Alexopus 6834fc8f76 Add WorkflowInputValue node 2025-12-17 16:03:50 +01:00
Alexopus 49f082a014 Update README.md 2025-12-17 15:04:48 +01:00
Alexopus 72300bd038 Bump version and changelog v1.17.0 2025-12-17 14:59:36 +01:00
Alexopus 1809260beb Add AnyToString to handle sampler/schedulers. Remove sampler/scheduler loaders. 2025-12-17 14:49:18 +01:00
AlexopusandClaude 81e938ab9c Bump version to 1.16.0
Updates for Civitai Hash Fetcher improvements, file matching refactor,
and GGUF model support.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
v1.16.0
2025-10-19 15:01:39 +02:00
AlexopusandClaude b7c7b07c9f Fix caching bug in CivitaiHashFetcher
Changed `self.cached_hash` to `self.last_hash` on line 129 to match
the variable name used in __init__ (line 13) and the cache check (line 39).

Previously, the cache would save to the wrong variable name, causing
subsequent calls with the same parameters to return None instead of
the cached hash value.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-19 14:57:34 +02:00
User 6c4a3622cf Apply CodeRabbit suggestions: add timeouts and fix f-string 2025-10-19 14:54:59 +02:00
User ed3acb439d Fix Civitai Hash Fetcher search issues
- Increase API result limit from 1 to 20 to work around Civitai's ranking issues
- Add nsfw parameter to include NSFW models in search results
- Add fallback to fetch all user models when search query returns no results
- Implement smart client-side matching for partial and exact name matches

Fixes issues where models weren't found due to:
1. Civitai API not returning model as top result with limit=1
2. NSFW models being filtered out by default
3. API search query parameter failing for certain model names
2025-10-19 14:54:59 +02:00
ComplexRobot 980c80d24c Full refactor of file matching. Code consolidation into core functions. 2025-08-27 18:36:08 +02:00
ComplexRobot 3d9f98609d Add fallbacks to just name checks. 2025-08-27 18:36:08 +02:00
ComplexRobot edea2dd52b Fix endswith filename collision error. 2025-08-27 18:36:08 +02:00
Alexopus 26ed991d0b Skip resources with missing hashes; avoid empty name entries and shadowing built-in hash 2025-08-24 17:39:28 +02:00
Alexopus 6b6789e84a Case-insensitive extension check for checkpoints 2025-08-24 17:39:28 +02:00
Alexopus f367d2860b Consider gguf model and locations when hashing models 2025-08-24 17:39:28 +02:00
Alexopus 8dde8bbd4f fix include 2025-08-24 17:39:28 +02:00
Alexopus ff42545fa7 changelog and version bump v1.15.2 2025-08-17 18:50:42 +02:00
Alexopus d0716e3520 Sanitize filename only, without the path 2025-08-17 18:48:48 +02:00