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 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
f0f121ddf2
commit
e0e1830b83
+6
-7
@@ -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, ""
|
||||
|
||||
|
||||
@@ -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`.
|
||||
|
||||
Reference in New Issue
Block a user