From 4f18fcda86b051ea4dd3f858852ce5808405827a Mon Sep 17 00:00:00 2001 From: Ethanfel Date: Thu, 25 Jun 2026 23:27:39 +0200 Subject: [PATCH] Compact coworking layout prompts --- prompt_builder.py | 76 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 62 insertions(+), 14 deletions(-) diff --git a/prompt_builder.py b/prompt_builder.py index 0030a79..9045138 100644 --- a/prompt_builder.py +++ b/prompt_builder.py @@ -3590,22 +3590,22 @@ def _coworking_distance_detail(distance: str, profile: dict[str, str], subject_k distance = str(distance or "").strip().lower() subject, _pronoun = _coworking_subject_terms(subject_kind, pov_labels) if "wide" in distance or "full-body" in distance or "full body" in distance: - return f"Wide crop keeps {subject}, floor aisle, table rows, and {profile['background']} readable." + return "wide crop keeps floor aisle, table rows, and window depth readable" if "close" in distance: - return f"Close crop keeps {subject} dominant while retaining one location anchor: the {profile['foreground']} or a slice of {profile['midground']}." - return f"Medium crop keeps {subject} dominant while retaining the {profile['foreground']} and one midground layer of {profile['midground']}." + return "close crop keeps one desk or counter anchor visible" + return f"medium crop keeps {subject} dominant" def _coworking_elevation_detail(elevation: str, profile: dict[str, str], subject_kind: str, pov_labels: list[str] | None = None) -> str: elevation = str(elevation or "").strip().lower() _subject, pronoun = _coworking_subject_terms(subject_kind, pov_labels) if "low-angle" in elevation: - return f"Low angle lets the {profile['foreground']} sit low and close while windows and partition seams rise behind {pronoun}." + return f"low angle keeps the foreground desk edge low while windows and partitions rise behind {pronoun}" if "elevated" in elevation: - return f"Elevated angle shows tabletop surfaces, laptop rectangles, chair positions, and the walking aisle around {pronoun}." + return f"elevated angle shows tabletop surfaces, laptop shapes, chairs, and walking aisle around {pronoun}" if "high-angle" in elevation: - return f"High angle looks down over the desk grid, chairs, floor aisle, and placement of {pronoun}." - return f"Eye-level angle keeps tabletop lines and glass seams straight enough to sell the {profile['place']}." + return f"high angle shows the desk grid, chairs, floor aisle, and placement of {pronoun}" + return f"eye-level angle keeps tabletop lines and glass seams straight" def _coworking_camera_scene_directive( @@ -3632,16 +3632,54 @@ def _coworking_camera_scene_directive( if pov_labels: return ( f"{profile['layout_label']} from POV: {direction_detail}. " - f"{distance_detail} {elevation_detail} Use the multiangle camera only as first-person spatial geometry." + f"{distance_detail}; {elevation_detail}; use the multiangle camera only as first-person spatial geometry." ) geometry = _camera_geometry_phrase(parsed) geometry_clause = f" ({geometry})" if geometry else "" return ( - f"{profile['layout_label']}{geometry_clause}: {direction_detail}. " - f"{distance_detail} {elevation_detail}" + f"{profile['layout_label']}{geometry_clause}: {direction_detail}; " + f"{distance_detail}; {elevation_detail}." ) +def _coworking_composition_prompt(scene_text: Any, composition: Any, subject_kind: str = "subjects") -> str: + text = str(composition or "").strip() + if not text or not _is_coworking_scene(scene_text): + return text + lower = text.lower() + if not any(term in lower for term in ("office-lobby", "office lobby", "walking composition", "outfit-check")): + return text + subject, _pronoun = _coworking_subject_terms(subject_kind) + if subject_kind == "woman": + return "coworking lounge selfie frame with the woman near a desk edge and tall-window depth behind her" + if subject_kind == "man": + return "coworking lounge portrait frame with the man near a desk edge and tall-window depth behind him" + return f"coworking lounge frame with {subject} near a desk edge and tall-window depth behind them" + + +def _apply_coworking_composition(row: dict[str, Any], subject_kind: str) -> dict[str, Any]: + scene_text = row.get("scene_text") or row.get("source_scene_text") or row.get("scene") + old_composition = str(row.get("composition") or "").strip() + new_composition = _coworking_composition_prompt(scene_text, old_composition, subject_kind) + if not old_composition or new_composition == old_composition: + return row + row["source_composition"] = row.get("source_composition") or old_composition + row["composition"] = new_composition + row["composition_prompt"] = _composition_prompt(new_composition) + prompt = str(row.get("prompt") or "") + replacements = ( + (f"Composition: vertical {old_composition}.", f"Composition: {_composition_prompt(new_composition)}."), + (f"Composition: {old_composition}.", f"Composition: {_composition_prompt(new_composition)}."), + (f"Framed as {old_composition}.", f"Framed as {new_composition}."), + ) + for old_fragment, new_fragment in replacements: + if old_fragment in prompt: + row["prompt"] = prompt.replace(old_fragment, new_fragment) + break + row["caption"] = str(row.get("caption") or "").replace(f", {old_composition},", f", {new_composition},") + return row + + def _camera_scene_directive_for_context( scene_text: Any, composition: Any, @@ -3683,12 +3721,14 @@ def _apply_camera_config(row: dict[str, Any], camera_config: str | dict[str, Any ) if not pov_labels: pov_labels = [str(label) for label in _list_from(row.get("pov_character_labels")) if str(label).strip()] + subject_kind = _row_camera_subject_kind(row) + row = _apply_coworking_composition(row, subject_kind) scene_directive, parsed = _camera_scene_directive_for_context( row.get("scene_text") or row.get("source_scene_text") or row.get("scene"), row.get("composition") or row.get("source_composition"), parsed, pov_labels, - _row_camera_subject_kind(row), + subject_kind, ) row["camera_config"] = parsed row["camera_scene_directive"] = scene_directive @@ -8231,8 +8271,16 @@ def build_insta_of_pair( hard_camera_config = _insta_camera_config_with_detail(hard_camera_config, options["camera_detail"]) soft_camera_directive, soft_camera_config = _camera_directive(soft_camera_config) hard_camera_directive, hard_camera_config = _camera_directive(hard_camera_config) + soft_subject_kind = "woman" if options["softcore_cast"] == "solo" else "subjects" + hard_subject_kind = "couple" if hard_women_count + hard_men_count == 2 else "subjects" + soft_row = _apply_coworking_composition(soft_row, soft_subject_kind) + hard_row = _apply_coworking_composition(hard_row, hard_subject_kind) hard_scene = soft_row["scene_text"] if options["continuity"] == "same_creator_same_room" else hard_row["scene_text"] - hard_composition = hard_row["composition"] + hard_composition = _coworking_composition_prompt(hard_scene, hard_row["composition"], hard_subject_kind) + if hard_composition != hard_row["composition"]: + hard_row["source_composition"] = hard_row.get("source_composition") or hard_row["composition"] + hard_row["composition"] = hard_composition + hard_row["composition_prompt"] = _composition_prompt(hard_composition) soft_pov_camera_labels = ( pov_character_labels if options["softcore_cast"] == "same_as_hardcore" @@ -8243,14 +8291,14 @@ def build_insta_of_pair( soft_row.get("composition"), soft_camera_config, soft_pov_camera_labels, - "woman" if options["softcore_cast"] == "solo" else "subjects", + soft_subject_kind, ) hard_camera_scene_directive, hard_camera_config = _camera_scene_directive_for_context( hard_scene, hard_composition, hard_camera_config, pov_character_labels, - "couple" if hard_women_count + hard_men_count == 2 else "subjects", + hard_subject_kind, ) if soft_pov_camera_labels: soft_camera_directive = ""