Adds SeedVR2 as a new upscale mode alongside HiRes Fix, Model Upscale,
and Model+HiRes. Requires ComfyUI-SeedVR2_VideoUpscaler to be installed
as a dependency — the plugin calls its nodes programmatically.
Data Model:
- New seedvr2 options object on each upscale step with all SeedVR2
parameters: dit_model, resolution, max_resolution, seed,
color_correction, batch_size, noise scales, blocks_to_swap,
attention_mode, offload_device, cache_model, VAE tiling options
- _defaultSeedVR2Options() / createDefaultSeedVR2Options() helpers
- Migration: ensureStepFields adds seedvr2 defaults to existing configs
Builder UI (conf-builder-config-management.js):
- "SeedVR2 Upscale" added to mode dropdown
- When selected, shows full SeedVR2 settings: DiT model selection
(10 variants: 3B/7B x fp16/fp8/GGUF/sharp), resolution, seed,
color correction, noise scales, batch size, VRAM optimization
(blocks_to_swap, attention_mode, offload), VAE tiling with
conditional encode/decode tile size and overlap fields
Dashboard (logic_upscale_modal.js):
- Same SeedVR2 mode and fields in renderPipelineEditor via _renderStep
- All fields use existing _makeSelect/_makeNumber/_makeCheckbox helpers
Python Execution (image_generation.py):
- New seedvr2_upscale(pil_image, seedvr2_config) function
- Imports SeedVR2 nodes from NODE_CLASS_MAPPINGS at runtime
- Calls SeedVR2LoadDiTModel → SeedVR2LoadVAEModel → SeedVR2VideoUpscaler
- Converts PIL→tensor→SeedVR2→tensor→PIL
- Clear error if SeedVR2 not installed
Pipeline Integration (generation_orchestrator.py):
- Inline upscale path: mode=="seedvr2" branch decodes current latent
to PIL, calls seedvr2_upscale, saves result, updates manifest
- Supports chained steps: non-final SeedVR2 steps re-encode to latent
for the next step in the pipeline
Preset compatible: seedvr2 config serializes naturally as JSON, saved
and loaded with upscale presets without any special handling.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
When toggling fullscreen, the iframe reload was reading the session name
from the node's widget (default "my_session") instead of the session
the user had actually selected in the Dashboard picker.
Now the Dashboard sends its current session name in the fullscreen
postMessage, and the handler prefers that over the widget default.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add rerenderConfigSection(node, arrayIdx) that rebuilds only one config
array section instead of the entire UI. debouncedRenderUI now accepts
optional arrayIdx parameter — when provided, uses partial re-render.
This avoids the full DOM rebuild (7k+ nodes) when making changes within
a single config section (add/remove model/lora, toggle settings). Falls
back to full renderUI if the target section isn't found in the DOM.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Performance improvements for Builder UI model/LoRA loading:
localStorage persistent cache:
- Model lists cached to localStorage on first fetch
- On page reload, cached data renders instantly (no network wait)
- Cache expires after 24 hours, cleared on explicit Refresh Models
- Saves all categories: checkpoints, diffusion, GGUF, text encoders,
VAEs, upscale models, samplers, schedulers, clip types
Background count polling:
- New /configbuilder/model_counts endpoint returns file counts per
category (fast — uses folder_paths internal stat-based cache)
- Frontend polls every 30s, compares counts to last known values
- On change: auto-refreshes model lists and re-renders UI
- No manual Refresh Models needed when adding new models
Deduplicated /object_info:
- Shared _getObjectInfo() cache ensures the expensive /object_info
endpoint is called at most once per session (was called 2-3x)
- getAvailableLoras() and getAvailableModels() share the cached response
Polling lifecycle:
- Starts after initial render, stops when node is removed
- Only active while ConfigBuilder node exists on canvas
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Limit dropdown to first 50 options (was creating ALL options as DOM
nodes — 500+ for LoRAs, 100+ for models — on every focus/keystroke)
- Show "... N more — type to filter" message when truncated
- Use event delegation (single onmouseover/onmouseout/onclick on parent)
instead of per-option event handlers
- Replace document.addEventListener("click") with input.onblur to close
dropdown (was leaking global click listeners that accumulated on every
re-render — 50+ listeners after a few refreshes)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Prompt editor JSON/Visual mode now persists in node.uiState.promptRawMode
across Refresh Models and other re-renders (was a local variable, always
reset to Visual)
- Added promptRawMode:{} to uiState initialization
- createPromptGroupEditor accepts optional {rawModeKey, uiState} to persist
- Positive prompt groups sections now have max-height: 1000px with overflow
scroll, preventing long prompt lists from pushing everything down
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace the simplified single-step config editor with renderPipelineEditor(),
a full pipeline/step UI matching the Builder UI feature set:
- Multiple pipelines with add/remove, active toggle, name, collapsible
- Multiple steps per pipeline with all settings (mode, resize, ratio,
denoise, hires steps, tiled sampling, tiled VAE, repeat)
- Multi-model selector with searchable dropdown and chips
- HiRes prompt adjustment section
- Iteration count display per step
Also fixes:
- Preset double-entry bug: save now deduplicates by name in both
Builder UI and dashboard modal
- Builder UI hires_force_uniform_tiles checkbox: || true -> !== false
(was always displaying as checked regardless of stored value)
- Model list fetch: GET instead of POST (matching the endpoint)
- Modal size: 600px wide, 90vh tall for better fit
- Cancel button: sends cancel request to server during active upscale
instead of just closing the modal
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
presetSelect._presets was undefined if save was clicked before the
async fetch completed. Now initialized to [] immediately. Added
console logging to debug preset save/load flow.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New preset system for config arrays: save/load all samplers,
schedulers, steps, CFG, models, LoRAs, VAEs, prompts, and all
other settings as reusable presets. Stored in USCG-config-section-presets.json.
Preset dropdown with Load/Save/Delete in the Config Arrays header bar.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New "+ Compare Strengths" button next to each LoRA's Model Strength
slider. Enter comma-separated values (e.g., 0.5, 0.8, 1.0) to grid
search different LoRA strengths. Outputs bracket notation in the
config JSON (e.g., lora.safetensors:[0.5, 0.8, 1.0]:1.0) which the
existing Python expansion code handles as Cartesian products.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Preset dropdown with Load/Save buttons at the top of the upscale
settings section. Loads preset pipelines + hires prompt config and
re-renders the section. Saves current config to shared presets file.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New 'Run Settings' section in Builder UI with a job number input.
When set > 0, the generation loop skips all jobs before that number.
Useful for resuming at a specific point without relying on
auto-detection. Flows through session settings to the orchestrator.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
CASE 2 auto-load now only triggers when no session is loaded yet,
not when the user is manually browsing a different session. Prevents
a running generation in one tab from hijacking the dashboard in
another tab.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Added to JS convertStateToConfigs() and Python generate_config()
session settings dict.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New checkbox with description and warning text. Defaults to off.
Migration ensures existing configs get the new field.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace flat upscale configs with pipeline/steps/repeat architecture:
- Pipelines run independently from base image
- Steps chain sequentially within a pipeline
- Steps support repeat count for iterative refinement
Add "Save Pre-Upscaled Output" option to also keep the base image.
Add "Adjust Prompt During HiRes Fix" with prepend/append/replace
behaviors. HiRes-adjusted prompts are batch pre-encoded for efficiency.
Results written to manifest metadata and exposed as label overlays.
Fix fmtVal scoping error in buildLabelOverlay (was referenced outside
the upscale block where it was defined).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New nodes now show the session landing page instead of auto-loading
"my_session". Uses _configured_from_workflow flag to distinguish fresh
nodes from saved workflows. Also fixes session cards Y-axis overflow.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Seed: expanded per-gen behavior + new full run seed behavior (random/increment/decrement before/after entire run)
- Canvas: fix flicker during simultaneous pan+zoom via requestAnimationFrame batching
- Upscaling: 3 session-level modes (HiRes fix, model upscale, model+HiRes) with tiled VAE support
- Cooldown: configurable GPU breaks between generations with optional VRAM clearing
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Removed standalone edit button (editor accessible via dropdown menu)
- Dropdown and Clear on their own row, custom WxH inputs on a second row
- Custom resolutions file moved to benchmarks/USCG-custom-resolutions.json
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Removed max-height and overflow-y:auto from all submenu levels so
nested menus can extend freely without being clipped by parent containers.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Replaced tiny native <select> with large custom dropdown button
- 3-level nested submenu: Model Type > Orientation (Landscape/Portrait/Square) > Sizes
- Massively expanded built-in presets: SD1.5, SDXL, Illustrious/Pony, Flux, Wan/Video, HiRes/Upscale
- Custom Resolutions Editor modal for creating persistent user-defined resolutions
organized into named categories
- Custom resolutions saved to ComfyUI output/USCG-custom-resolutions.json
- Custom category always appears first in the dropdown menu
- Edit button (pencil emoji) for quick access to the custom editor
- Backend: GET/POST /configbuilder/custom_resolutions endpoints
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Three bugs fixed:
1. Global Prompt data was incorrectly loaded into Custom Prompts when
loading a session. Added _prompt_source flag ("global"/"custom") to
configs so the round-trip loader can distinguish between them and
restore global prompts to the correct section.
2. Checkbox toggle was not visually broken but appeared non-functional
because bug #1 caused global prompts to populate custom prompt fields,
making the state confusing. Now correctly separated.
3. Prompt combination count in the section header was only computed at
render time and never updated when groups changed. Added live update
via updatePromptCountDisplay() in the onChange callback.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds HTML5 drag-and-drop reordering within each list in the Config
Builder UI. Drag the ⠿ handle on any card header to change run order.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix Python 3.10 SyntaxError: extract backslash replace() out of f-string
expression in config_builder_node.py (issue #12)
- Fix dashboard iframe stealing focus from ComfyUI on every live update
by removing viewport.focus() from render/update paths in logic_virtual.js
- Intercept Ctrl+S in dashboard iframe and forward to ComfyUI parent
window so workflow save works instead of triggering browser Save As dialog
- Config Builder VAE settings now override sampler node's remote_vae_endpoint
via config_overrides_vae flag in generation_orchestrator.py flush logic
- Fix Shift+1-9 column hotkeys: use e.code instead of e.key since Shift
produces symbols (!@#$) not digits for e.key on standard keyboards
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Root cause: Two issues prevented the landing page from showing.
1. __init__.py get_session_html endpoint returned 404 when session
didn't exist, so the iframe never received any content. Now returns
full template with empty manifest so landing page JS can display
available sessions.
2. web/dashboard.js never auto-loaded on node creation - the iframe
started empty (black box). Now auto-calls forceLoadSession after
node creation so the dashboard immediately shows either the session
grid or the landing page with session cards.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Distribution Settings section:
- Always visible at top with On/Off toggle
- Settings collapse when toggled off, expand when on
- No longer conditionally rendered
Distribution config output/input removal (clean break):
- Config Builder: RETURN_TYPES reduced from 3 to 2 outputs
- distribution_config embedded in configs_json as _distribution key
- Output format: {"configs": [...], "_distribution": {...}}
- Sampler node: Removed distribution_config optional input
- Sampler extracts _distribution from configs_json automatically
- Backward compatible: plain array configs_json still works
- JSON Preview shows full output including _distribution when enabled
- Session loader handles both old array and new object formats
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Double prompt JSON editor min-height from 80px to 160px
- Sidebar config sub-icons always visible (removed hover-expand)
- Config icons now show cogwheel + number (e.g. ⚙️1)
- Text Encoders icon changed to 🔣, LoRAs to 🔮
- Dashboard: Shift+1-9 sets column count, Shift+0 resets to auto
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New toggle in Distribution Settings section. Flag flows through
distribution_config JSON as sync_models_to_workers boolean.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Task 2: Backend compares fresh CivitAI trainedWords with stored
loras_tags.json on force_refresh. Frontend shows diff banner with
Update/Keep buttons in the LoRA metadata modal.
Task 4: Per-config sidebar navigation — numbered cog icons per config
array with hover-expandable sub-section icons (Models, TE, VAE, LoRAs).
Section IDs added to all sub-sections for scroll targeting.
Task 5: Distribution Settings moved to top of layout. Extra Model &
Sampling Options moved inside Models as sub-section. TE header upgraded
to match section toggle style with brighter color. VAE header lightened
(#444 bg, #cc66ff text). LoRAs header brightened (#4499ff).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When Remote URL type is selected in VAE element, show a presets
dropdown with known HuggingFace VAE endpoints (SD, SDXL, Flux,
HunyuanVideo). Selecting a preset auto-fills the URL input.
Custom option allows manual URL entry.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
All four bypass toggle onclick handlers (model, LoRA, TE, VAE) called
node.saveState() but never updatePreview(node), causing the JSON Preview
panel to show stale data when items were toggled off/on. Added the
missing updatePreview(node) call after saveState() in each handler.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replaces the 3-section top row with a compact sticky top bar containing session
name input and settings dropdown (Load Session, Load Config, Save Config, toggles
for Auto-Save, Distribution, Label Mode, Include None/Default, and Refresh Models).
Adds left sidebar with navigation icons (scroll to Global Prompts, Config Arrays,
Distribution, JSON Preview) and quick action buttons (Add Config, Refresh Models).
Sidebar highlights active section via scroll spy.
All section headers now use uniform styling: 16px bold white text on a subtle
gradient bar with colored left accent stripe. Distribution settings render as a
standalone full-width section when enabled.
Improved dark mode contrast: brighter labels (#ccc), brighter input borders (#555),
brighter button text (#e0e0e0), brighter primary buttons (#0077dd).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Each config array can now have its own resolution list displayed as chips with
categorized preset dropdown (SD 1.5/SDXL/Flux × Square/Portrait/Landscape) plus
custom W×H input. Resolutions flow through configs_json, expand in the Cartesian
product, and override the sampler's global resolutions_json on a per-config basis.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>