Extract row assembly policy

This commit is contained in:
2026-06-27 10:04:22 +02:00
parent a7e1a37ad8
commit ddf72a87dd
5 changed files with 352 additions and 120 deletions
+56 -120
View File
@@ -34,6 +34,7 @@ try:
from . import pair_options
from . import pov_policy
from . import row_normalization as row_policy
from . import row_assembly as row_assembly_policy
from . import row_camera as row_camera_policy
from . import row_category_route as row_category_route_policy
from . import row_expression as row_expression_policy
@@ -82,6 +83,7 @@ except ImportError: # Allows local smoke tests with `python -c`.
import pair_options
import pov_policy
import row_normalization as row_policy
import row_assembly as row_assembly_policy
import row_camera as row_camera_policy
import row_category_route as row_category_route_policy
import row_expression as row_expression_policy
@@ -2084,6 +2086,10 @@ def _prompt_axes_route(
)
def _assemble_custom_row(**kwargs: Any) -> dict[str, Any]:
return row_assembly_policy.assemble_custom_row(**kwargs)
def _build_custom_row(
category_choice: str,
subcategory_choice: str,
@@ -2258,130 +2264,60 @@ def _build_custom_row(
)
item_label = str(_merged_field(category, subcategory, item, "item_label", category["name"]))
context.update(
{
"trigger": g.TRIGGER,
"main_category": category["name"],
"subcategory": subcategory["name"],
"category": category["name"],
"item": item_text,
"item_name": item_name,
"item_label": item_label,
"style": style,
"scene": scene,
"scene_slug": scene_slug,
"pose": pose,
"expression": expression,
"shared_expression": shared_expression,
"character_expressions": character_expressions,
"character_expression_text": character_expression_text,
"expression_enabled": not expression_disabled,
"expression_disabled": expression_disabled,
"expression_intensity": expression_intensity,
"expression_intensity_source": expression_intensity_source,
"composition": composition,
"source_composition": source_composition,
"composition_prompt": _composition_prompt(composition),
"composition_config": parsed_composition_config if _composition_config_active(parsed_composition_config) else {},
"role_graph": role_graph,
"source_role_graph": source_role_graph,
"action_family": action_family,
"position_family": position_family,
"position_key": position_key,
"position_keys": position_keys,
"pov_character_labels": pov_character_labels,
"pov_prompt_directive": _pov_prompt_directive(pov_character_labels),
"cast_descriptors": cast_descriptor_text,
"positive_suffix": positive_suffix,
"negative_prompt": negative_prompt,
}
)
rendered = row_rendering_policy.render_prompt_caption(
item=item,
subcategory=subcategory,
return _assemble_custom_row(
row_number=row_number,
start_index=start_index,
category=category,
subject_type=subject_type,
subcategory=subcategory,
item=item,
context=context,
subject_type=subject_type,
item_text=item_text,
item_name=item_name,
item_axis_values=item_axis_values,
item_template_metadata=item_template_metadata,
formatter_hints=item_formatter_hints,
item_label=item_label,
style=style,
positive_suffix=positive_suffix,
negative_prompt=negative_prompt,
scene_slug=scene_slug,
scene=scene,
pose=pose,
expression=expression,
shared_expression=shared_expression,
character_expressions=character_expressions,
character_expression_text=character_expression_text,
expression_disabled=expression_disabled,
expression_intensity=expression_intensity,
expression_intensity_source=expression_intensity_source,
composition=composition,
source_composition=source_composition,
role_graph=role_graph,
source_role_graph=source_role_graph,
action_family=action_family,
position_family=position_family,
position_key=position_key,
position_keys=position_keys,
pov_character_labels=pov_character_labels,
cast_descriptors=cast_descriptors,
cast_descriptor_text=cast_descriptor_text,
pov_prompt_directive=_pov_prompt_directive(pov_character_labels) if pov_character_labels else "",
seed_config=seed_config,
hardcore_position_config=(
parsed_hardcore_position_config
if _hardcore_position_config_active(parsed_hardcore_position_config)
else {}
),
location_config=parsed_location_config if _location_config_active(parsed_location_config) else {},
composition_config=parsed_composition_config if _composition_config_active(parsed_composition_config) else {},
content_seed_axis=content_axis,
count_adjustment=count_adjustment,
applied_profile=applied_profile,
profile_status=profile_status,
applied_slot=applied_slot,
slot_status=slot_status,
character_slots=character_slots,
)
prompt = rendered["prompt"]
caption = rendered["caption"]
batch = max(1, ((row_number - 1) // g.BATCH_SIZE) + 1)
index = start_index + row_number - 1
row = g.row_base(index, batch, context["subject"], context["age"], context["body"], scene_slug, composition)
row.update(
{
"prompt": prompt,
"caption": caption,
"negative_prompt": negative_prompt,
"expression": expression,
"main_category": category["name"],
"subcategory": subcategory["name"],
"category_slug": category["slug"],
"subcategory_slug": subcategory["slug"],
"subject_type": subject_type,
"subject_phrase": context.get("subject_phrase", ""),
"body_phrase": context.get("body_phrase", ""),
"skin": context.get("skin", ""),
"hair": context.get("hair", ""),
"eyes": context.get("eyes", ""),
"style": style,
"item": item_text,
"item_label": item_label,
"positive_suffix": positive_suffix,
"custom_item": item_name,
"item_axis_values": item_axis_values,
"item_template_metadata": item_template_metadata,
"formatter_hints": item_formatter_hints,
"scene_text": scene,
"location_config": parsed_location_config if _location_config_active(parsed_location_config) else {},
"pose": pose,
"seed_config": seed_config,
"hardcore_position_config": (
parsed_hardcore_position_config
if _hardcore_position_config_active(parsed_hardcore_position_config)
else {}
),
"content_seed_axis": content_axis,
"role_graph": role_graph,
"source_role_graph": source_role_graph,
"action_family": action_family,
"position_family": position_family,
"position_key": position_key,
"position_keys": position_keys,
"source_composition": source_composition,
"pov_character_labels": pov_character_labels,
"pov_prompt_directive": _pov_prompt_directive(pov_character_labels),
"shared_expression": shared_expression,
"character_expressions": character_expressions,
"character_expression_text": character_expression_text,
"expression_enabled": not expression_disabled,
"expression_disabled": expression_disabled,
"cast_summary": context.get("cast_summary", ""),
"cast_descriptors": cast_descriptors,
"cast_descriptor_text": cast_descriptor_text,
"scene_kind": context.get("scene_kind", ""),
"women_count": context.get("women_count", ""),
"men_count": context.get("men_count", ""),
"person_count": context.get("person_count", ""),
"cast_count_adjustment": count_adjustment if subject_type == "configured_cast" else {},
"character_profile": applied_profile,
"character_profile_status": profile_status,
"character_slot": applied_slot,
"character_slot_status": slot_status,
"character_cast_slots": character_slots,
"expression_intensity": expression_intensity,
"expression_intensity_source": expression_intensity_source,
"source": "json_category",
}
)
if context.get("figure"):
row["figure"] = context["figure"]
if expression_disabled:
row = _disable_row_expression(row, expression_intensity_source)
return row
def build_prompt(