From e0e1830b832e093af49a9c6935e34ecd1cdff60c Mon Sep 17 00:00:00 2001 From: digital-garbage <133010426+digital-garbage@users.noreply.github.com> Date: Sat, 16 May 2026 14:34:44 +0300 Subject: [PATCH] Remove Perfect-rating advisor gate: user feedback overrides any rating Perfect is not a ceiling. If the user has an active advisor mode and provides feedback_prompt, the advisor must honor it regardless of the rating. Two guards were blocking this: - Analysis pass (pass 1): was skipped when is_perfect=True even with no feedback, so Full/Only-diagnostics mode produced no analysis for Perfect runs. Removed the not-is_perfect restriction so analysis runs whenever mode requires it and no explicit feedback was given. - Repair guard (pass 2): had an explicit is_perfect-and-not-has_feedback branch that silently blocked repair for every Perfect run with no user text. Removed it entirely. The only remaining guard is the existing allow_prompt_change check (Learning mode / advisor mode Off). Now for Perfect + user feedback: advisor honors the feedback fully. For Perfect + no feedback + Full mode: analysis runs, repair runs. Co-Authored-By: Claude Sonnet 4.6 --- conditioning.py | 13 ++++---- docs/FunPackHybridEuler2SSampler.md | 46 ++++++++++------------------- 2 files changed, 22 insertions(+), 37 deletions(-) diff --git a/conditioning.py b/conditioning.py index 56fe6544..40bf979b 100644 --- a/conditioning.py +++ b/conditioning.py @@ -9464,11 +9464,11 @@ class FunPackVideoRefinerV2(FunPackVideoRefiner): if mode in {"Only prompt", "Full"} and not repair_signal and not is_perfect and not has_feedback: return current_prompt, "Advisor: skipped; no repair signal and no user feedback.", "", False, "" - # Pass 1: analysis — runs for Full and Only diagnostics, but skipped when: - # - user provided explicit feedback (they already said what's wrong), or - # - rating is Perfect with no feedback (nothing to analyse; repair will be blocked anyway). + # Pass 1: analysis — runs for Full and Only diagnostics when no explicit feedback was given + # (explicit feedback already tells the advisor what to do; analysis is for when it needs to + # figure out what's wrong on its own). analysis = "" - if mode in {"Full", "Only diagnostics"} and not has_feedback and not is_perfect: + if mode in {"Full", "Only diagnostics"} and not has_feedback: analysis_system, analysis_user = self._v2_advisor_analysis_prompt( current_prompt, intent_prompt, @@ -9489,9 +9489,8 @@ class FunPackVideoRefinerV2(FunPackVideoRefiner): return current_prompt, f"Advisor: diagnostics only. {analysis or 'No analysis returned.'}", analysis, False, "" # Guard checks before pass 2. - if (not allow_prompt_change and not has_feedback) or (is_perfect and not has_feedback): - reason = "perfect rating — analysis only" if is_perfect else "prompt changes disabled" - return current_prompt, f"Advisor: {reason}. {analysis}".strip(), analysis, False, "" + if not allow_prompt_change and not has_feedback: + return current_prompt, f"Advisor: prompt changes disabled. {analysis}".strip(), analysis, False, "" if intent_changed and not has_feedback: return current_prompt, f"Advisor: intent changed; repair skipped. {analysis}".strip(), analysis, False, "" diff --git a/docs/FunPackHybridEuler2SSampler.md b/docs/FunPackHybridEuler2SSampler.md index 4008225d..c74bcec7 100644 --- a/docs/FunPackHybridEuler2SSampler.md +++ b/docs/FunPackHybridEuler2SSampler.md @@ -1,6 +1,6 @@ # FunPack Hybrid Euler 2S Sampler -This node outputs a ComfyUI `SAMPLER` and can also take optional `SIGMAS` input and output modified `SIGMAS` for use with `CustomSamplerAdvanced` / `SamplerCustomAdvanced`. +This node outputs a ComfyUI `SAMPLER` and can also take optional `SIGMAS` input and output modified `SIGMAS` for use with `SamplerCustomAdvanced` / `CustomSamplerAdvanced`. ## Purpose @@ -13,10 +13,6 @@ This sampler keeps classic Euler ancestral for the early "structure building" st It can also apply optional early/mid **motion pulses** for single-clip image-to-video workflows. These pulses add monotonic noise kicks at selected normal denoise steps instead of inserting upward sigma jumps. This is intended to push LTX2.3 away from stale frame-1 reference stiffness while avoiding the audio damage caused by Restart replay. -Restart replay has been removed because upward sigma replay can break LTX audio generation. - -For hard viewpoint or scene-context resets, use `FunPack Context Transition Windows` before sampling. That node changes which frames the model can see in each denoise evaluation; this sampler only changes the denoise trajectory. - ## Recommended wiring Use this node with `SamplerCustomAdvanced` or `CustomSamplerAdvanced`: @@ -25,18 +21,17 @@ Use this node with `SamplerCustomAdvanced` or `CustomSamplerAdvanced`: - connect this node's `sampler` output into the sampler input - connect this node's `sigmas` output into the sigmas input -This node is not intended for `KSampler`. - ## Parameters -**eta**: Ancestral stochasticity. `1.0` keeps normal ancestral behavior. +**eta**: Ancestral stochasticity at the start of sampling. `1.0` keeps normal ancestral behaviour. + +**eta_final**: Eta value at the quality phase boundary. When set below `eta`, ancestral noise strength decays linearly toward this value as sigma approaches the quality phase. Lower values give a cleaner hand-off into deterministic refinement. Set equal to `eta` to disable decay. **s_noise**: Noise multiplier for ancestral noise injection. -**high_quality_pct**: Fraction of the *late* denoise steps that switch from Euler ancestral into deterministic quality refinement. -Example: `0.35` means only the last 35% of steps use the ODE refinement path. +**high_quality_pct**: Fraction of the *late* denoise steps that switch from Euler ancestral into deterministic quality refinement. Example: `0.35` means the last 35% of steps use the ODE refinement path. -**correction_blend**: Blend between late-step Euler ODE and late-step 2S correction. +**correction_blend**: Blend between late-step Euler ODE and late-step 2S correction for the second half of quality-phase steps. - `0.0` = pure late-step Euler ODE - `1.0` = full late-step DPM++(2S)-style correction @@ -56,12 +51,7 @@ Example: `0.35` means only the last 35% of steps use the ODE refinement path. **motion_pulse_strength**: Strength of the monotonic noise kick. Higher values push harder against stale image references, with more drift risk. -**velocity_bias_mode**: Experimental early velocity steering mode: - -- `off`: preserve legacy sampler behavior. -- `capture`: save averaged early velocity directions around normalized sigma `0.9` and `0.8`. -- `apply`: apply a previously captured matching bias. -- `capture_and_apply`: do both in one run. +**velocity_bias_mode**: Experimental early velocity steering mode. **velocity_bias_strength**: Strength for applying captured early velocity bias. Keep this low; `0.0` disables the applied delta. @@ -69,18 +59,20 @@ Example: `0.35` means only the last 35% of steps use the ODE refinement path. **velocity_aspect_bucket**: Optional grouping value such as `landscape`, `portrait`, `square`, `ultrawide`, or `vertical`. -**sigmas**: Optional incoming sigma schedule. If connected, the node returns the same monotonic schedule plus sampler-side metadata for motion pulses. If not connected, the sampler computes pulse positions from the runtime schedule. +**sigmas**: Optional incoming sigma schedule. If connected, the node returns the same schedule plus sampler-side metadata for motion pulses. ## Recommended starting values -- `eta = 1.0` +- `eta = 1.0`, `eta_final = 1.0` - `s_noise = 1.0` - `high_quality_pct = 0.30` to `0.40` - `correction_blend = 1.0` - `motion_pulse_mode = off` for baseline testing -- `velocity_bias_mode = off` unless you are deliberately testing captured good-run steering +- `velocity_bias_mode = off` -For an aggressive LTX2.3 image-to-video motion test, try: +To smooth the transition into the quality phase, try `eta_final = 0.5`. This decays ancestral noise from `1.0` at the start toward `0.5` as sigma approaches the quality boundary. + +For an aggressive LTX2.3 image-to-video motion test: - `high_quality_pct = 0.35` - `correction_blend = 1.0` @@ -90,8 +82,6 @@ For an aggressive LTX2.3 image-to-video motion test, try: - `motion_pulse_spacing_pct = 0.22` - `motion_pulse_strength = 0.85` -Keep the prompt/refiner conditioning explicit about both action and camera change, for example `orbiting camera`, `dolly in`, `zoom out`, `new side angle`, `turning`, or `dynamic pose change`. - ## Expected behavior Compared to plain `euler_ancestral`, this sampler should usually: @@ -101,14 +91,10 @@ Compared to plain `euler_ancestral`, this sampler should usually: - keep the early motion/anatomy formation more lively - cost less than running a heavier deterministic solver for the whole schedule -With motion pulses enabled, it should more strongly encourage action, camera movement, and viewpoint changes inside a single clip. Stronger settings can increase subject drift or visual instability. +The early phase uses a second-order denoised extrapolation (Adams-Bashforth 2-step) that reuses the previous step's denoised estimate to improve the score direction at no extra model-call cost. The quality phase uses progressive correction blending: the first half of quality steps use single-eval Euler ODE, the second half use the full configured 2S correction, concentrating the expensive second model call where sigma is lowest. + +Motion pulse state resets after any pulse fires because the pulse modifies the latent and invalidates the previous denoised estimate. The outgoing `SIGMAS` remain monotonic. Motion pulses happen inside the sampler at selected denoise steps rather than by expanding the schedule. -Velocity bias memory is process-local and experimental. Capture only runs you consider good references, then apply with the same refinement key, aspect bucket, and latent shape. Incompatible shapes are ignored. - If you need the model to stop carrying the previous segment's temporal context forward, add `FunPack Context Transition Windows`. It is the stronger transition tool and should be preferred for multi-view or "scene reset" testing. - -## Limitation - -This node improves the **sampler-side quality/speed tradeoff**. It does **not** reduce the underlying cost of CFG++ guidance itself. If the goal becomes specifically "CFG++ quality at lower guidance cost", that likely requires a custom `GUIDER`, not just a custom `SAMPLER`.