From 1950ce7bbf195c6affa586dc825fac4fbe7991f8 Mon Sep 17 00:00:00 2001 From: Ethanfel Date: Sat, 27 Jun 2026 17:26:44 +0200 Subject: [PATCH] Keep Krea cast descriptors metadata driven --- docs/prompt-pool-routing-map.md | 4 ++-- krea_configured_cast_formatter.py | 7 +------ krea_formatter.py | 1 - tools/prompt_smoke.py | 31 +++++++++++++++++++++++++++++++ 4 files changed, 34 insertions(+), 9 deletions(-) diff --git a/docs/prompt-pool-routing-map.md b/docs/prompt-pool-routing-map.md index af39fd4..1e9d379 100644 --- a/docs/prompt-pool-routing-map.md +++ b/docs/prompt-pool-routing-map.md @@ -774,10 +774,10 @@ Krea2 field consumption: | Branch | Reads most from | Key functions | | --- | --- | --- | | Normal single/couple/generic row | `subject_type`, `item`, `pose`, `scene_text`, `expression`, `composition`, `camera_*`, style fields | `krea_normal_formatter.format_normal_row_result` | -| Normal configured cast/hardcore row | `cast_descriptor_text`, `women_count`, `men_count`, `source_role_graph`, `role_graph`, `item`, `item_axis_values`, `source_composition`, `pov_character_labels` | `krea_configured_cast_formatter.format_configured_cast_result`, `krea_actions.hardcore_action_sentence`, `krea_pov_actions.pov_action_phrase` | +| Normal configured cast/hardcore row | `cast_descriptor_text` only for cast descriptors, `women_count`, `men_count`, `source_role_graph`, `role_graph`, `item`, `item_axis_values`, `source_composition`, `pov_character_labels` | `krea_configured_cast_formatter.format_configured_cast_result`, `krea_actions.hardcore_action_sentence`, `krea_pov_actions.pov_action_phrase` | | Insta/OF pair softcore | `shared_descriptor`, `softcore_row`, `softcore_partner_styling`, options, soft camera fields | `krea_pair_formatter.format_insta_pair_result` | | Insta/OF pair hardcore | `hardcore_row`, `shared_cast_descriptors`, `hardcore_clothing_state`, `hardcore_detail_density`, hard camera fields, POV labels | `krea_pair_formatter.format_insta_pair_result`, `krea_actions.hardcore_action_sentence`, `krea_pov_actions.pov_action_phrase`, `krea_clothing.natural_clothing_state` | -| Plain text fallback | `source_text` only | `_fallback_text_to_krea` | +| Plain text fallback | `source_text` only, including raw prompt labels such as `Scene:` / `Pose:` | `_fallback_text_to_krea` | If metadata is connected and `method` says `text(fallback)`, the formatter did not parse metadata. That is a wiring/input-hint issue, not a prompt pool issue. diff --git a/krea_configured_cast_formatter.py b/krea_configured_cast_formatter.py index 58b0180..adaea68 100644 --- a/krea_configured_cast_formatter.py +++ b/krea_configured_cast_formatter.py @@ -32,7 +32,6 @@ class KreaConfiguredCastPrompt: @dataclass(frozen=True) class KreaConfiguredCastDependencies: clean: Callable[[Any], str] - prompt_field: Callable[[str, str], str] sanitize_hardcore_environment_anchors: Callable[[Any], str] sanitize_hardcore_axis_values: Callable[[Any], Any] sanitize_scene_text_for_cast: Callable[[Any, list[str]], str] @@ -64,11 +63,7 @@ def format_configured_cast_result( men_count = int(row.get("men_count") or 0) except (TypeError, ValueError): women_count = men_count = 0 - cast_descriptor_text = ( - deps.clean(row.get("cast_descriptor_text")) - or deps.prompt_field(deps.clean(row.get("prompt")), "Characters") - or deps.prompt_field(deps.clean(row.get("prompt")), "Cast descriptors") - ) + cast_descriptor_text = deps.clean(row.get("cast_descriptor_text")) pov_labels = deps.pov_labels_from_value(row.get("pov_character_labels")) camera = request.camera if pov_labels: diff --git a/krea_formatter.py b/krea_formatter.py index d0ed8f3..ba41e23 100644 --- a/krea_formatter.py +++ b/krea_formatter.py @@ -457,7 +457,6 @@ def _krea_normal_row_request_from_row( def _krea_configured_cast_dependencies() -> krea_configured_cast_formatter.KreaConfiguredCastDependencies: return krea_configured_cast_formatter.KreaConfiguredCastDependencies( clean=_clean, - prompt_field=_prompt_field, sanitize_hardcore_environment_anchors=_sanitize_hardcore_environment_anchors, sanitize_hardcore_axis_values=_sanitize_hardcore_axis_values, sanitize_scene_text_for_cast=_sanitize_scene_text_for_cast, diff --git a/tools/prompt_smoke.py b/tools/prompt_smoke.py index 73ca695..ee2bda9 100644 --- a/tools/prompt_smoke.py +++ b/tools/prompt_smoke.py @@ -1414,6 +1414,37 @@ def smoke_krea_normal_row_routes() -> None: } _expect_krea_normal_route_parity(generic, "krea_normal_generic", "metadata(generic)") + configured_with_descriptor = _fixture_hardcore_row( + prompt="Characters: stale prompt subject, stale body, stale skin, stale hair, stale eyes.", + cast_descriptor_text=( + "Woman A: 30-year-old adult woman, toned figure, fair skin, red hair, gray eyes; " + "Man A: 45-year-old adult man, average figure, tan skin, dark hair" + ), + ) + descriptor_prompt, descriptor_method = krea_formatter._normal_row_to_krea( + configured_with_descriptor, + "balanced", + "preserve", + ) + _expect(descriptor_method == "metadata(configured_cast)", "Krea configured-cast route changed method") + _expect("30-year-old adult woman" in descriptor_prompt, "Krea configured-cast route lost descriptor metadata") + _expect("toned figure" in descriptor_prompt, "Krea configured-cast route lost descriptor body metadata") + _expect("stale" not in descriptor_prompt, "Krea configured-cast route parsed stale prompt character labels") + + configured_without_descriptor = _fixture_hardcore_row( + prompt="Characters: stale prompt subject, stale body, stale skin, stale hair, stale eyes.", + cast_descriptor_text="", + cast_descriptors=[], + ) + no_descriptor_prompt, no_descriptor_method = krea_formatter._normal_row_to_krea( + configured_without_descriptor, + "balanced", + "preserve", + ) + _expect(no_descriptor_method == "metadata(configured_cast)", "Krea configured-cast no-descriptor route changed method") + _expect("stale" not in no_descriptor_prompt, "Krea configured-cast route should not parse prompt labels without metadata") + _expect("private studio room with warm light" in no_descriptor_prompt, "Krea configured-cast route lost structured scene") + def smoke_krea_action_details_policy() -> None: _expect(