Remove dead "Seed" field from Easy Gen settings; bump to 3.4.0

The Generation panel's Seed field was bound to Project.seed, a legacy field
(movie_editor/backend/timeline.py:562) that nothing in generation reads —
the real seed resolution (server.py's _resolve_run_seed) only ever reads
sampler_inputs.seed, which already defaults to random when unset. The field
always showed "1" and editing it had zero effect, reading as "seed is
stuck, not randomized" when generation was in fact already randomizing
correctly via the real (and already-present) Seed control under Engine ▸
Timing & Seed. Removed the dead field; the settings hint now points there.

Also bumps pyproject.toml to 3.4.0 and adds the CHANGELOG entry for this
session's Easy Gen work (shortcut/transition import, Engine settings, Save/
Gallery/Export buttons, continuity pin, and the bypass/state-sync/
autoplay/filename fixes), ahead of tagging the release on main.
This commit is contained in:
digital-garbage
2026-07-24 12:19:49 +03:00
parent fadfc9626d
commit f1a376e286
3 changed files with 61 additions and 11 deletions
+54
View File
@@ -2,6 +2,23 @@
## [Unreleased]
## [3.4.0] - 2026-07-24
### Added
- **Easy Gen** (the simplified single-scene UI) reaches near feature-parity with the Cutting
Room for the workflows it's meant for:
- Shortcut/transition JSON library **import & export** in Settings ▸ Shortcuts (merge or
replace) — Easy Gen previously had no way to load a shortcut/transition library at all.
- The full **Engine settings** panel (Studio refinement/adjustments/sampler algorithm,
Chain Sampler continuity/timing/guidance/decode/experimental, Best-FaceID identity
transfer) — restored via the same shared frontend module the Cutting Room uses.
- A **Log** button (ComfyUI backend log, same as the Cutting Room's).
- An explicit **Save** button, and a **Gallery** picker to reuse already-uploaded media as
the i2v anchor without re-uploading — with a one-click **continuity identity pin**
button right on each thumbnail, mirroring the Cutting Room's Media Bin.
- An **Export…** button to download the project as a `.funpack_project.json` file (e.g. to
move a project off a rental GPU box) — the backend route already existed but had no UI.
### Changed
- **Loop temporal style now works alongside guides.** Scenes carrying appended guide frames
(carry-i2v-guides, mid-scene guide, JoyAI memory, custom guide stacks) no longer disable
@@ -9,6 +26,43 @@
memory tail) stays canonical, so guides keep informing every position of the cycle without
ever being rendered into it. The i2v anchor was always supported - it rides the denoise
mask, which rolls in step with the latent.
- **Easy Gen's Studio always runs in Prompt-only mode.** Easy Gen has no rating UI, so every
Engine setting that's a no-op without a trained refinement key/rated history (refinement
key, value guidance, steer mode, reference injection, embed/score/output guidance, taste
retrieval, DynaShift, sampler-panel velocity bias/rescue) is hidden there and enforced at
the pipeline level, not just the UI — every Easy Gen generate call forces Studio's `mode`
to "Prompt only" and the rating-gated Chain Sampler knobs off via node overrides, so a
project configured with these on in the Cutting Room still generates plainly from Easy
Gen. A note points to the Cutting Room or the ComfyUI graph for the full learned refiner.
- The "expose to editor" eye buttons in Models & Pipeline are hidden under Easy Gen — there's
no per-scene inspector for an exposed control to ever surface in, so they were inert
clutter that could look actionable and silently do nothing.
### Fixed
- The shortcut autocomplete menu could open off-screen below the prompt field (Easy Gen's
prompt box sits in a footer bar at the bottom of the viewport) with no way to see or click
a suggestion. Now flips above the field when there isn't room below.
- A node's **bypass** toggle could silently do nothing: when the pass-through mapping was
ambiguous, or the bypassed node's own matching input wasn't wired to anything, the failure
was only ever recorded in a report field no frontend code read or displayed — the node
stayed fully active with no visible error. Generation now blocks with a clear reason
instead of a silent no-op.
- Easy Gen could silently revert Models & Pipeline edits (bypass, exposed widgets, LoRA
settings): any later project save sent a stale in-memory copy of the models config back to
the server, clobbering whatever was just changed there independently.
- Easy Gen's preview restarted playback (ignoring a pause) on every background health poll
or prompt keystroke, since each one rebuilt the video element from scratch.
- A "fetching process...aborted by the user agent" unhandled-rejection error banner could
appear when switching between Gallery/generated media in Easy Gen.
- Downloaded generation results always suggested "result.mp4" as the filename regardless of
the actual render (no `Content-Disposition` on the `/result` route) — the underlying file
was already uniquely named per run and already lived in ComfyUI's temp dir, just wasn't
surfaced to the browser's save dialog.
- Easy Gen's Generation settings showed a "Seed" field always reading "1" and looking fixed.
It was bound to the Project's legacy `seed` field, which nothing in generation has ever
read (the real seed resolution only reads `sampler_inputs.seed`, already correctly random
when unset) — removed the dead field in favor of the working one under Engine ▸ Timing &
Seed, which already says so.
## [3.3.0] - 2026-07-15
+6 -10
View File
@@ -67,15 +67,11 @@
"Passed to the negative conditioning for every run."));
wrap.append(pr);
wrap.append(el("div", "sw-rows-label", "Seed"));
const sd = el("div", "sw-rows");
sd.append(field("Seed", numberInput(p.seed, (v) => commit((proj) => proj.seed = v), { min: 0 }),
"Fixed seed for this project's runs."));
wrap.append(sd);
wrap.append(el("div", "sw-hint",
"Studio/Chain Sampler/continuity controls live under Engine. Studio always runs in "
+ "Prompt-only mode here — no refinement key, since Easy Gen has no rating UI to train "
+ "one. For the full learned refiner, use the Cutting Room or the ComfyUI node graph."));
"Studio/Chain Sampler/continuity controls, including Seed, live under Engine ▸ Timing "
+ "& Seed (empty = a new random seed every Generate). Studio always runs in Prompt-only "
+ "mode here — no refinement key, since Easy Gen has no rating UI to train one. For the "
+ "full learned refiner, use the Cutting Room or the ComfyUI node graph."));
}
const unsub = S.subscribe(render);
@@ -85,8 +81,8 @@
window.SettingsWindow.register({
id: "generation", group: "Generation", order: 1, title: "Generation",
subtitle: "Output size, length, seed, and refinement key for this project.",
keywords: "width height frames frame rate seed negative prompt refinement key generation",
subtitle: "Output size, length, and negative prompt for this project.",
keywords: "width height frames frame rate negative prompt generation seed engine",
iconBg: "linear-gradient(180deg,#ffb64d,#e07f1f)",
icon: '<svg viewBox="0 0 16 16" width="13" height="13"><path d="M9.2 1.3 3 9h4.1l-1 5.7L12.9 7H8.5l.7-5.7z" fill="#fff"/></svg>',
mount,
+1 -1
View File
@@ -2,7 +2,7 @@
[project]
name = "ComfyUI-FunPack" # Unique identifier for your node. Immutable after creation.
description = "An AI movie studio inside ComfyUI: the Cutting Room browser-based video editor with timeline, per-scene prompts and one-click montage generation, plus a self-improving engine that learns from your ratings. Includes the full node stack (Studio, Refiner V2, LTXAV Scene Chain Sampler) for classic graph workflows."
version = "3.3.0" # Custom Node version. Must be semantically versioned.
version = "3.4.0" # Custom Node version. Must be semantically versioned.
license = { text = "GNU GPL v3" }
dependencies = [] # Filled in from requirements.txt