Test character slot seed determinism

This commit is contained in:
2026-06-27 17:54:46 +02:00
parent 8a1a34ad08
commit 7e0c9ed13b
2 changed files with 70 additions and 0 deletions
+64
View File
@@ -7458,6 +7458,70 @@ def smoke_seed_config_policy() -> None:
deterministic_b = _prompt_row(**deterministic_kwargs)
_expect(deterministic_a == deterministic_b, "locked seed config should reproduce identical prompt row output")
slot_descriptor_keys = ("age_band", "body_phrase", "skin", "hair", "eyes", "figure")
def slot_seed_cast(slot_seed: int) -> str:
return pb.build_character_slot_json(
subject_type="woman",
label="A",
slot_seed=slot_seed,
age="random",
ethnicity="random",
figure="random",
body="random",
hair_color="random",
hair_length="random",
hair_style="random",
descriptor_detail="full",
)["character_cast"]
def slot_seed_row(character_cast: str, reroll_seed: int) -> dict[str, Any]:
return _prompt_row(
name=f"seed_config_policy_slot_seed_{reroll_seed}",
category="Casual clothes",
subcategory="Casual clothes / Streetwear",
seed=41001,
seed_config=pb.build_seed_lock_config_json(
base_seed=41001,
reroll_axis="person",
reroll_seed=reroll_seed,
),
character_cast=character_cast,
women_count=1,
men_count=0,
)
seeded_slot_cast = slot_seed_cast(50123)
seeded_slot_a = slot_seed_row(seeded_slot_cast, 60001)
seeded_slot_b = slot_seed_row(seeded_slot_cast, 60002)
_expect(
tuple(seeded_slot_a.get(key) for key in slot_descriptor_keys)
== tuple(seeded_slot_b.get(key) for key in slot_descriptor_keys),
"slot_seed should keep random character-slot descriptors stable across person-axis rerolls",
)
seeded_trace_a = seeded_slot_a.get("generation_trace") if isinstance(seeded_slot_a.get("generation_trace"), dict) else {}
seeded_trace_b = seeded_slot_b.get("generation_trace") if isinstance(seeded_slot_b.get("generation_trace"), dict) else {}
_expect(
seeded_trace_a.get("seed_axes", {}).get("person", {}).get("seed")
!= seeded_trace_b.get("seed_axes", {}).get("person", {}).get("seed"),
"slot_seed regression check should actually reroll the person axis",
)
seeded_krea_a = krea_formatter.format_krea2_prompt("", metadata_json=_json(seeded_slot_a), target="single")
seeded_krea_b = krea_formatter.format_krea2_prompt("", metadata_json=_json(seeded_slot_b), target="single")
_expect(
seeded_krea_a.get("krea_prompt") == seeded_krea_b.get("krea_prompt"),
"slot_seed should keep final Krea prompt stable across person-axis rerolls",
)
unseeded_slot_cast = slot_seed_cast(-1)
unseeded_slot_a = slot_seed_row(unseeded_slot_cast, 60001)
unseeded_slot_b = slot_seed_row(unseeded_slot_cast, 60002)
_expect(
tuple(unseeded_slot_a.get(key) for key in slot_descriptor_keys)
!= tuple(unseeded_slot_b.get(key) for key in slot_descriptor_keys),
"unseeded random character slot should still follow person-axis rerolls",
)
pose_changed = False
for reroll_seed in range(deterministic_seed + 1, deterministic_seed + 10):
pose_reroll = _prompt_row(