Stage 2 (1/3): remove the prompt-repair application + param

Neutralize the repair application in refine(): the intent-aligned prompt is
encoded as-is — perfect-repair phrase injection, missing-axis repair, and the
emphasis pass are gone. The advisor remains the only prompt-rewriting path, and
repair_feedback/active_repair_axes is KEPT (it's the 'what's missing' signal the
advisor still reads). Drop the prompt_repair param from refine(), INPUT_TYPES,
FunPackStudio, and both UIs (web + engine_settings).

The dead repair-only methods (_v2_repair_prompt_for_missing_axes, perfect-repair
phrases, etc.) come out in the next commit; shared helpers like
_v2_repair_intent_roots (used by intent alignment) stay.

Deleted the now-obsolete test_repair_candidates_saved_as_json_lists (tested the
removed injection). No new test failures vs dev.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
digital-garbage
2026-06-15 17:15:28 +03:00
co-authored by Claude Opus 4.8
parent 91affc5359
commit 65816e353a
4 changed files with 11 additions and 70 deletions
+10 -41
View File
@@ -6379,11 +6379,6 @@ class FunPackVideoRefinerV2(FunPackVideoRefiner):
"label": "I'm Feeling Lucky",
"tooltip": "Compose a learned prompt from V2 phrase memory, then encode it through the connected CLIP.",
}),
"prompt_repair": ("BOOLEAN", {
"default": True,
"label": "Prompt Repair",
"tooltip": "Allow V2 to append learned phrases for missing axes. Disable when not enough context has been built yet or when memory suggestions are disrupting the generation.",
}),
"advisor_thinking": ("BOOLEAN", {
"default": True,
"label": "Advisor Thinking",
@@ -11981,7 +11976,7 @@ class FunPackVideoRefinerV2(FunPackVideoRefiner):
reset_session=False, lora_stack=None, im_feeling_lucky=False, user_intent_prompt="",
refinement_key_input="", positive_conditioning=None, clip_vision_output=None,
source_image=None, model=None, mode="Refine", advisor_mode="Off", advisor_thinking=True,
advisor_clip=None, feedback_prompt="", prompt_repair=True, temporal_style="natural",
advisor_clip=None, feedback_prompt="", temporal_style="natural",
split_by_transitions=False, split_transition_placement="start", reference_injection=False,
value_guidance=True, latent=None, seed_output_connected=False,
steer_mode="relative", absolute_strength=0.6,
@@ -12313,40 +12308,16 @@ class FunPackVideoRefinerV2(FunPackVideoRefiner):
intent_phrases,
global_state,
)
if prompt_repair:
aligned_prompt, perfect_repair_status, perfect_repair_adjustments = self._v2_apply_perfect_repair_phrases(
aligned_prompt,
current_family_slot,
intent_prompt=intent_source_prompt,
intent_phrases=intent_phrases,
clip=clip,
encode_cache=encode_cache,
)
prompt_to_encode, emphasis_status = self._v2_emphasized_prompt(
aligned_prompt,
phrases,
global_state,
{**learning_profile, "missing_axes": repair_feedback.get("missing_axes", [])},
)
else:
perfect_repair_status = "Perfect repairs: disabled."
perfect_repair_adjustments = []
prompt_to_encode = aligned_prompt
emphasis_status = "Prompt emphasis: disabled."
# Prompt repair removed (Stage 2). The intent-aligned prompt is encoded as-is; the only
# remaining prompt-rewriting path is the advisor (when enabled). Perfect-repair phrase
# injection, missing-axis repair, and the emphasis pass are gone. repair_feedback /
# active_repair_axes is KEPT — it's the "what's missing" signal the advisor still reads.
perfect_repair_status = "Perfect repairs: removed."
perfect_repair_adjustments = []
prompt_to_encode = aligned_prompt
emphasis_status = "Prompt emphasis: removed."
advisor_active = advisor_mode != "Off"
if prompt_repair:
prompt_to_encode, repair_status, repair_candidates = self._v2_repair_prompt_for_missing_axes(
prompt_to_encode,
phrases,
global_state,
previous_run,
repair_feedback,
intent_phrases=intent_phrases,
intent_family_slot=current_family_slot,
apply=not advisor_active,
)
else:
repair_status = "Prompt repair: disabled."
repair_status = "Prompt repair: removed."
prompt_to_encode, wildcard_status = self._v2_resolve_scene_builder_wildcards(
prompt_to_encode,
scene_db,
@@ -14529,7 +14500,6 @@ class FunPackStudio:
mode = str(rf.get("mode", "Refine") or "Refine")
advisor_mode = str(rf.get("advisor_mode", "Off") or "Off")
advisor_thinking = bool(rf.get("advisor_thinking", True))
prompt_repair = bool(rf.get("prompt_repair", True))
im_feeling_lucky = bool(rf.get("im_feeling_lucky", False))
reset_session = bool(rf.get("reset_session", False))
temporal_style = str(rf.get("temporal_style", "natural") or "natural").strip().lower()
@@ -14688,7 +14658,6 @@ class FunPackStudio:
advisor_thinking=advisor_thinking,
advisor_clip=advisor_clip,
feedback_prompt=feedback_prompt,
prompt_repair=prompt_repair,
temporal_style=temporal_style,
split_by_transitions=split_by_transitions,
split_transition_placement=split_transition_placement,
-1
View File
@@ -66,7 +66,6 @@
const STUDIO_REFINER_ESSENTIALS = [
{ name: "vision_conditioning", label: "Vision conditioning", default: true },
{ name: "reference_injection", label: "Reference injection", default: false },
{ name: "prompt_repair", label: "Prompt repair", default: false },
];
const STUDIO_REFINER_ADVANCED = [
{ name: "value_guidance", label: "Value guidance", kind: "bool", default: true },
-23
View File
@@ -2177,29 +2177,6 @@ def test_phrase_clusters_train_more_strongly_than_ngrams_and_tokens():
assert phrase_score > ngram_score > token_score
def test_repair_candidates_saved_as_json_lists(tmp_path):
refiner = FunPackVideoRefinerV2()
state_path = tmp_path / "state.json"
refiner._v2_state_path = lambda refinement_key: str(state_path)
rich_prompt = "woman, walking, reaching hand, tiny particles, rain reflections"
refiner.refine_v2(rich_prompt, FakeClip(), "Perfect", "json-repair-test")
refiner.refine_v2(rich_prompt, FakeClip(), "Perfect", "json-repair-test")
refiner.refine_v2(
"woman, rain",
FakeClip(),
"Missing details + action",
"json-repair-test",
user_intent_prompt=rich_prompt,
)
state = json.loads(state_path.read_text(encoding="utf-8"))
candidates = state["last_run"]["repair_candidates"]
assert candidates
assert isinstance(candidates[0]["axes"], list)
assert "walking" in state["last_run"]["encoded_prompt"]
def test_wrong_action_rating_preserves_quality_but_marks_action_wrong():
refiner = FunPackVideoRefinerV2()
global_state = {"phrase_memory": {}, "preferred_context_memory": {}}
+1 -5
View File
@@ -69,7 +69,7 @@ function defaultSettings() {
refinement_key: "",
overrides: { refinement_key: false, feedback_prompt: false, user_intent_prompt: false, negative_prompt: false },
scene_builder: { mode: "Pass-through", scene: NONE_SENTINEL, scene_name: "", aliases: "", scene_positive: "", scene_negative: "" },
refiner: { mode: "Refine", advisor_mode: "Off", advisor_thinking: true, prompt_repair: true, im_feeling_lucky: false, reset_session: false, feedback_prompt: "", user_intent_prompt_override: "", negative_prompt: "", temporal_style: "natural", split_by_transitions: false, split_transition_placement: "start", reference_injection: false, vision_conditioning: true, value_guidance: true, steer_mode: "relative", absolute_strength: 0.6 },
refiner: { mode: "Refine", advisor_mode: "Off", advisor_thinking: true, im_feeling_lucky: false, reset_session: false, feedback_prompt: "", user_intent_prompt_override: "", negative_prompt: "", temporal_style: "natural", split_by_transitions: false, split_transition_placement: "start", reference_injection: false, vision_conditioning: true, value_guidance: true, steer_mode: "relative", absolute_strength: 0.6 },
advisor_llm: { enabled: false, model_path: "huihui-ai/Huihui-Qwen3-8B-abliterated-v2", dtype: "bfloat16" },
loras: [],
loras_config: { mode: "ltx2", per_block: false },
@@ -1188,10 +1188,6 @@ function openPanel(node) {
thinkToggle.inp.addEventListener("change", () => { settings.refiner.advisor_thinking = thinkToggle.inp.checked; });
body.append(row("Thinking", thinkToggle.wrap));
const repairToggle = toggleEl(settings.refiner.prompt_repair, "Prompt repair");
repairToggle.inp.addEventListener("change", () => { settings.refiner.prompt_repair = repairToggle.inp.checked; });
body.append(row("Prompt repair", repairToggle.wrap));
const luckyToggle = toggleEl(settings.refiner.im_feeling_lucky, "I'm Feeling Lucky");
luckyToggle.inp.addEventListener("change", () => { settings.refiner.im_feeling_lucky = luckyToggle.inp.checked; });
body.append(row("Lucky", luckyToggle.wrap));