7.8 KiB
Updated Project File Structure
ComfyUI-Ultimate-Sampler-Grid/
├── __init__.py # Server Routes & Node Mappings
├── sampler_node.py # Main "Sampler Grid" Node
├── dashboard_node.py # "Dashboard Viewer" Node
├── config_builder_node.py # "Config Builder" Node
├── json_text_node.py # "Smart JSON" Node
│
├── generation_orchestrator.py # The "Conductor" (Loop Logic)
├── image_generation.py # KSampler & VAE Wrappers
├── model_loader.py # Checkpoint/LoRA Loading Logic
├── model_cache.py # 3-Tier Model Caching System
├── remote_vae.py # Remote VAE Offloading
│
├── lora_utils.py # LoRA Searching & Validation
├── trigger_words.py # CivitAI Trigger Word Fetching
├── html_generator.py # Reads /resources/ to build the Dashboard HTML
│
├── web/ # [ComfyUI Integration Layer]
│ ├── dashboard.js # Registers Dashboard Node & Message Handling
│ ├── config_builder.js # Registers Builder Node & Custom UI Widget
│ └── smart_json_text.js # Registers JSON Node & Syntax Highlighting
│
└── resources/ # [The Dashboard SPA Core]
├── template.html # HTML Skeleton for the generated report
├── report.css # Styling (Infinite Canvas, Cards, Modals)
├── logic_init.js # Bootstrapper (Load JSON, Init State)
├── logic_state.js # State Store (Redux-style: filters, favorites)
├── logic_pipeline.js # Data Processing (Filter -> Sort -> Layout)
├── logic_virtual.js # Virtual DOM / Infinite Scroller Engine
├── logic_ui.js # UI Renderer (DOM creation, Modal handling)
├── logic_events.js # Interaction Handler (Hotkeys, API calls)
└── logic_utils.js # Helpers (Debounce, Formatters)
Project Architecture Overview
ComfyUI-Ultimate-Sampler-Grid is a hybrid application.
- The Backend (Python): Runs inside ComfyUI. It orchestrates the grid generation, manages resources (caching/loading), and serves the API.
- The Frontend Bridge (JS): Runs in the ComfyUI browser tab. It registers the custom nodes and widgets.
- The Dashboard SPA (HTML/JS/CSS): A standalone, virtualized "IDE" for viewing results. It is generated by the backend but runs entirely in the client's browser, communicating back to the server only when saving changes.
1. The Backend: Core Logic & Orchestration
Located in the root directory.
-
sampler_node.py(The Interface) -
Role: The primary ComfyUI node. Validates inputs and passes control to the orchestrator.
-
Key Logic: Disables caching features if "Optional" inputs are connected (since external changes can't be tracked).
-
generation_orchestrator.py(The Conductor) -
Role: Manages the generation loop.
-
Key Logic:
-
Smart Skip: Checks
manifest.jsonto skip existing images. -
Lookahead: Triggers background loading for the next job while the current one runs.
-
Interrupts: Catches cancel signals to save the manifest before stopping.
-
image_generation.py(The Worker) -
Role: Wraps KSampler and VAE Decode.
-
Key Logic: Implements
flush_batch_with_vaeto save images and update the manifest in chunks (preventing VRAM overflow). -
html_generator.py(The Builder) -
Role: Compiles the SPA.
-
Key Logic: Reads all files from
/resources/, injects them intotemplate.html, and embeds themanifest.jsondata as a JavaScript variable (fullManifest), allowing the dashboard to load instantly without an initial API call.
2. The Backend: Resource Management
Located in the root directory.
-
model_cache.py(The 3-Tier Cache) -
Role: Thread-safe resource manager.
-
Tiers: 1. Raw Files (RAM), 2. Incremental States (Partial LoRA stacks), 3. Final Results (Patched Models).
-
conditioning_cache.py(The Prompt Cache) -
Role: Caches CLIP text encodings to disk.
-
Key Logic: Hashes
(Prompt + CLIP State + LoRA Config)to ensure validity. -
batch_encoding.py(The Accelerator) -
Role: Bulk prompt encoder.
-
Key Logic: Scans the grid for all prompts using the current model and encodes them in one massive GPU batch.
3. The Frontend: ComfyUI Integration
Located in /web/.
-
dashboard.js -
Role: Registers the Dashboard node. Listens for server events to update the iframe.
-
config_builder.js -
Role: Registers the Builder node. Provides the complex UI for creating JSON configs.
-
smart_json_text.js -
Role: Registers the JSON node. Adds syntax highlighting and validation.
4. The Frontend: The Dashboard SPA
Located in /resources/. This is the "App" users interact with.
-
logic_init.js(The Bootstrapper) -
Role: Main Entry Point.
-
Key Logic:
-
initDashboard(): The first function called. -
Data Injection: detects if
fullManifestexists (injected by Python). If not, it attempts to fetch it (View Mode). -
Lifecycle: Calls
initLogicState()->applyPipeline()->initVirtualScroller()->initGlobalEvents(). -
logic_state.js(The Brain) -
Role: Central State Store (Redux-style).
-
Key Logic:
-
StateObject: Holdsitems(all images),filteredItems(visible),selection(active card), andfavorites. -
Triple JSON Lists: Manages the logic for the "Accepted", "Favorites", and "Rejected" JSON bars at the bottom of the UI.
-
Persistence: Saves user preferences (Sort Order, Column Count) to
localStorageso they persist across reloads. -
logic_events.js(The Handler) -
Role: Interaction & API Bridge.
-
Key Logic:
-
Keyboard Shortcuts: Maps
Arrow Keys(Pan),Space(Scroll),+/-(Zoom),F(Fit). -
API Calls: Uses
fetchto hit endpoints like/config_tester/save_manifest(when you star/reject an image) and/config_tester/delete_session. -
Live Updates: Listens for the
executedevent from ComfyUI to trigger a soft-refresh of the image list. -
logic_virtual.js(The Engine) -
Role: Virtual Scroller.
-
Key Logic: Calculates viewport geometry to render only the ~20 visible cards out of thousands, enabling high performance.
-
logic_pipeline.js(The Processor) -
Role: Filtering & Sorting.
-
Key Logic: Transforms the raw item list based on active filters (Model, Sampler, etc.) before passing it to the virtual scroller.
-
logic_ui.js(The Renderer) -
Role: DOM Manipulation.
-
Key Logic: Generates the HTML for individual cards and the "Revise" modal.
-
logic_utils.js(The Helpers) -
Role: Utilities.
-
Key Logic: Debouncers, formatters, and helper functions.
Summary of Data Flow
- User Config: You set parameters in the Sampler Node (Python).
- Expansion:
generation_orchestrator.pyexpands this into a list of jobs. - Generation: The backend loops through jobs, using ModelCache and ConditioningCache for speed.
- Storage: Images are saved to disk; metadata is appended to
manifest.json. - Compilation:
html_generator.pyreads themanifest.jsonand all.jsfiles in/resources/, baking them into a singledashboard_htmlstring. - Display: The Dashboard Node (JS) renders this HTML in an iframe.
- Boot:
logic_init.jswakes up, loads the data intologic_state.js, andlogic_virtual.jsstarts rendering cards. - Interaction: You click "Favorite" in the UI ->
logic_events.jssends an API request to__init__.py-> Python updatesmanifest.jsonon disk.