From b8d8066fdbf6046c682251099261c627ae425f49 Mon Sep 17 00:00:00 2001 From: Ethanfel Date: Sun, 28 Jun 2026 00:41:29 +0200 Subject: [PATCH] Add workspace lounge Insta OF workflow --- README.md | 6 + ...in_workspace_lounge_insta_of_workflow.json | 2076 +++++++++++++++++ location_config.py | 11 + scene_camera_adapters.py | 16 +- tools/prompt_smoke.py | 26 + 5 files changed, 2128 insertions(+), 7 deletions(-) create mode 100644 examples/scene_chain_workspace_lounge_insta_of_workflow.json diff --git a/README.md b/README.md index bc3c02c..3b5d68f 100644 --- a/README.md +++ b/README.md @@ -168,6 +168,12 @@ A proposed adapter-style v2 layout is available at chain in one center lane and parks layer-specific option nodes beside the layer they override. +A no-freeform workspace lounge Insta/OF branch demo is available at +`examples/scene_chain_workspace_lounge_insta_of_workflow.json`. It uses the +`workspace_lounge` location theme with camera orbit control, so the coworking +layout text adapts to camera position while the softcore and hardcore prompts +stay split. + ## Loop Nodes `SxCP For Loop Start` and `SxCP For Loop End` provide a lightweight replacement diff --git a/examples/scene_chain_workspace_lounge_insta_of_workflow.json b/examples/scene_chain_workspace_lounge_insta_of_workflow.json new file mode 100644 index 0000000..924808a --- /dev/null +++ b/examples/scene_chain_workspace_lounge_insta_of_workflow.json @@ -0,0 +1,2076 @@ +{ + "last_node_id": 31, + "last_link_id": 31, + "nodes": [ + { + "id": 1, + "type": "SxCPGlobalSeed", + "pos": [ + -2100, + -960 + ], + "size": [ + 300, + 90 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "seed", + "type": "INT", + "links": null, + "slot_index": 0 + }, + { + "name": "seed_config", + "type": "STRING", + "links": [ + 1 + ], + "slot_index": 1 + }, + { + "name": "summary", + "type": "STRING", + "links": null, + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "SxCPGlobalSeed" + }, + "widgets_values": [ + 20260912 + ] + }, + { + "id": 2, + "type": "SxCPStylePool", + "pos": [ + -2100, + -820 + ], + "size": [ + 360, + 240 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "style_config", + "type": "SXCP_STYLE_CONFIG", + "links": [ + 2 + ], + "slot_index": 0 + }, + { + "name": "summary", + "type": "STRING", + "links": null, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "SxCPStylePool" + }, + "widgets_values": [ + true, + "replace", + "realistic_photo", + "", + "", + "" + ] + }, + { + "id": 3, + "type": "SxCPLocationTheme", + "pos": [ + -2100, + -520 + ], + "size": [ + 420, + 250 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "location_config", + "type": "SXCP_LOCATION_CONFIG", + "links": [ + 9 + ], + "slot_index": 0 + }, + { + "name": "composition_config", + "type": "SXCP_COMPOSITION_CONFIG", + "links": [ + 18 + ], + "slot_index": 1 + }, + { + "name": "summary", + "type": "STRING", + "links": null, + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "SxCPLocationTheme" + }, + "widgets_values": [ + true, + "replace", + "workspace_lounge", + "", + "" + ] + }, + { + "id": 4, + "type": "SxCPCameraOrbitControl", + "pos": [ + -2100, + -220 + ], + "size": [ + 360, + 360 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "camera_config", + "type": "SXCP_CAMERA_CONFIG", + "links": [ + 15 + ], + "slot_index": 0 + }, + { + "name": "camera_prompt", + "type": "STRING", + "links": null, + "slot_index": 1 + }, + { + "name": "camera_info_json", + "type": "STRING", + "links": null, + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "SxCPCameraOrbitControl" + }, + "widgets_values": [ + true, + "standard", + 45, + -15, + 5.5, + "from_zoom", + "environment", + "auto", + "vertical_story", + "auto", + "strong", + "compact", + true + ] + }, + { + "id": 5, + "type": "SxCPSceneStart", + "pos": [ + -1580, + -760 + ], + "size": [ + 380, + 270 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "seed_config", + "type": "SXCP_SEED_CONFIG", + "link": 1 + }, + { + "name": "style_config", + "type": "SXCP_STYLE_CONFIG", + "link": 2 + } + ], + "outputs": [ + { + "name": "scene", + "type": "SXCP_SCENE", + "links": [ + 3 + ], + "slot_index": 0 + }, + { + "name": "summary", + "type": "STRING", + "links": null, + "slot_index": 1 + }, + { + "name": "metadata_json", + "type": "STRING", + "links": null, + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "SxCPSceneStart" + }, + "widgets_values": [ + 1, + 41, + 20260912, + "raw", + "provocative_erotic", + "random", + "krea2_friendly", + "sxcppnl7", + true + ] + }, + { + "id": 6, + "type": "SxCPSceneCast", + "pos": [ + -1140, + -760 + ], + "size": [ + 360, + 150 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "scene", + "type": "SXCP_SCENE", + "link": 3 + } + ], + "outputs": [ + { + "name": "scene", + "type": "SXCP_SCENE", + "links": [ + 4 + ], + "slot_index": 0 + }, + { + "name": "cast_config", + "type": "SXCP_CAST_CONFIG", + "links": null, + "slot_index": 1 + }, + { + "name": "summary", + "type": "STRING", + "links": null, + "slot_index": 2 + }, + { + "name": "metadata_json", + "type": "STRING", + "links": null, + "slot_index": 3 + } + ], + "properties": { + "Node name for S&R": "SxCPSceneCast" + }, + "widgets_values": [ + "mixed_couple", + 1, + 1, + "woman_a", + "none" + ] + }, + { + "id": 7, + "type": "SxCPSceneCharacter", + "pos": [ + -740, + -940 + ], + "size": [ + 390, + 360 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "scene", + "type": "SXCP_SCENE", + "link": 4 + } + ], + "outputs": [ + { + "name": "scene", + "type": "SXCP_SCENE", + "links": [ + 5 + ], + "slot_index": 0 + }, + { + "name": "character_cast", + "type": "SXCP_CHARACTER_CAST", + "links": null, + "slot_index": 1 + }, + { + "name": "character_slot", + "type": "SXCP_CHARACTER_SLOT", + "links": null, + "slot_index": 2 + }, + { + "name": "summary", + "type": "STRING", + "links": null, + "slot_index": 3 + }, + { + "name": "metadata_json", + "type": "STRING", + "links": null, + "slot_index": 4 + } + ], + "properties": { + "Node name for S&R": "SxCPSceneCharacter" + }, + "widgets_values": [ + true, + "woman", + "A", + -1, + "random", + "random", + "random", + "random", + "full", + true, + -1.0, + "visible", + 0.45, + 0.85 + ] + }, + { + "id": 8, + "type": "SxCPSceneCharacter", + "pos": [ + -740, + -500 + ], + "size": [ + 390, + 360 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "scene", + "type": "SXCP_SCENE", + "link": 5 + } + ], + "outputs": [ + { + "name": "scene", + "type": "SXCP_SCENE", + "links": [ + 6 + ], + "slot_index": 0 + }, + { + "name": "character_cast", + "type": "SXCP_CHARACTER_CAST", + "links": null, + "slot_index": 1 + }, + { + "name": "character_slot", + "type": "SXCP_CHARACTER_SLOT", + "links": null, + "slot_index": 2 + }, + { + "name": "summary", + "type": "STRING", + "links": null, + "slot_index": 3 + }, + { + "name": "metadata_json", + "type": "STRING", + "links": null, + "slot_index": 4 + } + ], + "properties": { + "Node name for S&R": "SxCPSceneCharacter" + }, + "widgets_values": [ + true, + "man", + "A", + -1, + "random", + "random", + "random", + "random", + "compact", + true, + -1.0, + "visible", + 0.35, + 0.75 + ] + }, + { + "id": 9, + "type": "SxCPSceneWardrobe", + "pos": [ + -300, + -940 + ], + "size": [ + 390, + 250 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "scene", + "type": "SXCP_SCENE", + "link": 6 + } + ], + "outputs": [ + { + "name": "scene", + "type": "SXCP_SCENE", + "links": [ + 7 + ], + "slot_index": 0 + }, + { + "name": "character_cast", + "type": "SXCP_CHARACTER_CAST", + "links": null, + "slot_index": 1 + }, + { + "name": "summary", + "type": "STRING", + "links": null, + "slot_index": 2 + }, + { + "name": "metadata_json", + "type": "STRING", + "links": null, + "slot_index": 3 + } + ], + "properties": { + "Node name for S&R": "SxCPSceneWardrobe" + }, + "widgets_values": [ + true, + "woman", + "A", + "random", + "", + "", + "" + ] + }, + { + "id": 10, + "type": "SxCPSceneWardrobe", + "pos": [ + -300, + -620 + ], + "size": [ + 390, + 250 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "scene", + "type": "SXCP_SCENE", + "link": 7 + } + ], + "outputs": [ + { + "name": "scene", + "type": "SXCP_SCENE", + "links": [ + 8 + ], + "slot_index": 0 + }, + { + "name": "character_cast", + "type": "SXCP_CHARACTER_CAST", + "links": null, + "slot_index": 1 + }, + { + "name": "summary", + "type": "STRING", + "links": null, + "slot_index": 2 + }, + { + "name": "metadata_json", + "type": "STRING", + "links": null, + "slot_index": 3 + } + ], + "properties": { + "Node name for S&R": "SxCPSceneWardrobe" + }, + "widgets_values": [ + true, + "man", + "A", + "random", + "", + "", + "" + ] + }, + { + "id": 11, + "type": "SxCPSceneLocation", + "pos": [ + 150, + -940 + ], + "size": [ + 410, + 210 + ], + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "scene", + "type": "SXCP_SCENE", + "link": 8 + }, + { + "name": "location_config", + "type": "SXCP_LOCATION_CONFIG", + "link": 9 + } + ], + "outputs": [ + { + "name": "scene", + "type": "SXCP_SCENE", + "links": [ + 10 + ], + "slot_index": 0 + }, + { + "name": "location_config", + "type": "SXCP_LOCATION_CONFIG", + "links": null, + "slot_index": 1 + }, + { + "name": "summary", + "type": "STRING", + "links": null, + "slot_index": 2 + }, + { + "name": "metadata_json", + "type": "STRING", + "links": null, + "slot_index": 3 + } + ], + "properties": { + "Node name for S&R": "SxCPSceneLocation" + }, + "widgets_values": [ + true, + "add", + "custom_only", + "", + "" + ] + }, + { + "id": 12, + "type": "SxCPSceneSetDressing", + "pos": [ + 150, + -650 + ], + "size": [ + 410, + 250 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "scene", + "type": "SXCP_SCENE", + "link": 10 + } + ], + "outputs": [ + { + "name": "scene", + "type": "SXCP_SCENE", + "links": [ + 11 + ], + "slot_index": 0 + }, + { + "name": "summary", + "type": "STRING", + "links": null, + "slot_index": 1 + }, + { + "name": "metadata_json", + "type": "STRING", + "links": null, + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "SxCPSceneSetDressing" + }, + "widgets_values": [ + true, + "", + "", + "", + "" + ] + }, + { + "id": 13, + "type": "SxCPSceneBlocking", + "pos": [ + 610, + -940 + ], + "size": [ + 410, + 250 + ], + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "scene", + "type": "SXCP_SCENE", + "link": 11 + } + ], + "outputs": [ + { + "name": "scene", + "type": "SXCP_SCENE", + "links": [ + 12 + ], + "slot_index": 0 + }, + { + "name": "summary", + "type": "STRING", + "links": null, + "slot_index": 1 + }, + { + "name": "metadata_json", + "type": "STRING", + "links": null, + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "SxCPSceneBlocking" + }, + "widgets_values": [ + true, + "auto", + "", + "", + "" + ] + }, + { + "id": 14, + "type": "SxCPSceneAction", + "pos": [ + 610, + -650 + ], + "size": [ + 410, + 210 + ], + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "scene", + "type": "SXCP_SCENE", + "link": 12 + } + ], + "outputs": [ + { + "name": "scene", + "type": "SXCP_SCENE", + "links": [ + 13 + ], + "slot_index": 0 + }, + { + "name": "hardcore_position_config", + "type": "SXCP_HARDCORE_POSITION_CONFIG", + "links": null, + "slot_index": 1 + }, + { + "name": "summary", + "type": "STRING", + "links": null, + "slot_index": 2 + }, + { + "name": "metadata_json", + "type": "STRING", + "links": null, + "slot_index": 3 + } + ], + "properties": { + "Node name for S&R": "SxCPSceneAction" + }, + "widgets_values": [ + true, + "regular", + "no_change", + "" + ] + }, + { + "id": 15, + "type": "SxCPScenePerformance", + "pos": [ + 1060, + -940 + ], + "size": [ + 390, + 210 + ], + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "name": "scene", + "type": "SXCP_SCENE", + "link": 13 + } + ], + "outputs": [ + { + "name": "scene", + "type": "SXCP_SCENE", + "links": [ + 14 + ], + "slot_index": 0 + }, + { + "name": "summary", + "type": "STRING", + "links": null, + "slot_index": 1 + }, + { + "name": "metadata_json", + "type": "STRING", + "links": null, + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "SxCPScenePerformance" + }, + "widgets_values": [ + true, + "random", + -1.0, + "" + ] + }, + { + "id": 16, + "type": "SxCPSceneCameraOptions", + "pos": [ + 1060, + -650 + ], + "size": [ + 390, + 170 + ], + "flags": {}, + "order": 15, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "camera_options", + "type": "SXCP_SCENE_CAMERA_OPTIONS", + "links": [ + 16 + ], + "slot_index": 0 + }, + { + "name": "summary", + "type": "STRING", + "links": null, + "slot_index": 1 + }, + { + "name": "metadata_json", + "type": "STRING", + "links": null, + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "SxCPSceneCameraOptions" + }, + "widgets_values": [ + "replace", + "from_camera_config", + true, + "" + ] + }, + { + "id": 17, + "type": "SxCPSceneCamera", + "pos": [ + 1480, + -940 + ], + "size": [ + 410, + 330 + ], + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "scene", + "type": "SXCP_SCENE", + "link": 14 + }, + { + "name": "camera_config", + "type": "SXCP_CAMERA_CONFIG", + "link": 15 + }, + { + "name": "camera_options", + "type": "SXCP_SCENE_CAMERA_OPTIONS", + "link": 16 + } + ], + "outputs": [ + { + "name": "scene", + "type": "SXCP_SCENE", + "links": [ + 17 + ], + "slot_index": 0 + }, + { + "name": "camera_config", + "type": "SXCP_CAMERA_CONFIG", + "links": null, + "slot_index": 1 + }, + { + "name": "summary", + "type": "STRING", + "links": null, + "slot_index": 2 + }, + { + "name": "metadata_json", + "type": "STRING", + "links": null, + "slot_index": 3 + } + ], + "properties": { + "Node name for S&R": "SxCPSceneCamera" + }, + "widgets_values": [ + true, + "standard", + "auto", + "auto", + "auto", + "auto", + "auto", + "auto", + "strong", + "compact", + "" + ] + }, + { + "id": 18, + "type": "SxCPSceneComposition", + "pos": [ + 1940, + -940 + ], + "size": [ + 410, + 210 + ], + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "name": "scene", + "type": "SXCP_SCENE", + "link": 17 + }, + { + "name": "composition_config", + "type": "SXCP_COMPOSITION_CONFIG", + "link": 18 + } + ], + "outputs": [ + { + "name": "scene", + "type": "SXCP_SCENE", + "links": [ + 19 + ], + "slot_index": 0 + }, + { + "name": "composition_config", + "type": "SXCP_COMPOSITION_CONFIG", + "links": null, + "slot_index": 1 + }, + { + "name": "summary", + "type": "STRING", + "links": null, + "slot_index": 2 + }, + { + "name": "metadata_json", + "type": "STRING", + "links": null, + "slot_index": 3 + } + ], + "properties": { + "Node name for S&R": "SxCPSceneComposition" + }, + "widgets_values": [ + true, + "add", + "custom_only", + "", + "" + ] + }, + { + "id": 19, + "type": "SxCPSceneLighting", + "pos": [ + 1940, + -650 + ], + "size": [ + 410, + 220 + ], + "flags": {}, + "order": 18, + "mode": 0, + "inputs": [ + { + "name": "scene", + "type": "SXCP_SCENE", + "link": 19 + } + ], + "outputs": [ + { + "name": "scene", + "type": "SXCP_SCENE", + "links": [ + 20 + ], + "slot_index": 0 + }, + { + "name": "summary", + "type": "STRING", + "links": null, + "slot_index": 1 + }, + { + "name": "metadata_json", + "type": "STRING", + "links": null, + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "SxCPSceneLighting" + }, + "widgets_values": [ + true, + "window_light", + "soft", + "medium", + "warm", + "" + ] + }, + { + "id": 20, + "type": "SxCPSceneBranchPair", + "pos": [ + 2410, + -760 + ], + "size": [ + 390, + 160 + ], + "flags": {}, + "order": 19, + "mode": 0, + "inputs": [ + { + "name": "scene", + "type": "SXCP_SCENE", + "link": 20 + } + ], + "outputs": [ + { + "name": "softcore_scene", + "type": "SXCP_SCENE", + "links": [ + 21 + ], + "slot_index": 0 + }, + { + "name": "hardcore_scene", + "type": "SXCP_SCENE", + "links": [ + 22 + ], + "slot_index": 1 + }, + { + "name": "summary", + "type": "STRING", + "links": null, + "slot_index": 2 + }, + { + "name": "metadata_json", + "type": "STRING", + "links": null, + "slot_index": 3 + } + ], + "properties": { + "Node name for S&R": "SxCPSceneBranchPair" + }, + "widgets_values": [ + "same_creator_same_room", + "hybrid" + ] + }, + { + "id": 21, + "type": "SxCPSoftcoreBranchOptions", + "pos": [ + 2850, + -940 + ], + "size": [ + 390, + 260 + ], + "flags": {}, + "order": 20, + "mode": 0, + "inputs": [ + { + "name": "scene", + "type": "SXCP_SCENE", + "link": 21 + } + ], + "outputs": [ + { + "name": "scene", + "type": "SXCP_SCENE", + "links": [ + 24 + ], + "slot_index": 0 + }, + { + "name": "summary", + "type": "STRING", + "links": null, + "slot_index": 1 + }, + { + "name": "metadata_json", + "type": "STRING", + "links": null, + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "SxCPSoftcoreBranchOptions" + }, + "widgets_values": [ + "same_as_hardcore", + "lingerie_tease", + true, + 0.45, + "from_camera_config", + "compact", + "" + ] + }, + { + "id": 22, + "type": "SxCPHardcoreActionFilter", + "pos": [ + 2410, + -500 + ], + "size": [ + 360, + 300 + ], + "flags": {}, + "order": 21, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "hardcore_position_config", + "type": "SXCP_HARDCORE_POSITION_CONFIG", + "links": [ + 23 + ], + "slot_index": 0 + }, + { + "name": "summary", + "type": "STRING", + "links": null, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "SxCPHardcoreActionFilter" + }, + "widgets_values": [ + "keep_pool", + false, + false, + true, + true, + true, + true, + true, + true, + false, + false + ] + }, + { + "id": 23, + "type": "SxCPHardcoreBranchOptions", + "pos": [ + 2850, + -560 + ], + "size": [ + 390, + 360 + ], + "flags": {}, + "order": 22, + "mode": 0, + "inputs": [ + { + "name": "scene", + "type": "SXCP_SCENE", + "link": 22 + }, + { + "name": "hardcore_position_config", + "type": "SXCP_HARDCORE_POSITION_CONFIG", + "link": 23 + } + ], + "outputs": [ + { + "name": "scene", + "type": "SXCP_SCENE", + "links": [ + 25 + ], + "slot_index": 0 + }, + { + "name": "hardcore_position_config", + "type": "SXCP_HARDCORE_POSITION_CONFIG", + "links": null, + "slot_index": 1 + }, + { + "name": "summary", + "type": "STRING", + "links": null, + "slot_index": 2 + }, + { + "name": "metadata_json", + "type": "STRING", + "links": null, + "slot_index": 3 + } + ], + "properties": { + "Node name for S&R": "SxCPHardcoreBranchOptions" + }, + "widgets_values": [ + "couple", + 1, + 1, + "hardcore", + true, + 0.85, + "explicit_nude", + "from_camera_config", + "compact", + "balanced", + "" + ] + }, + { + "id": 24, + "type": "SxCPScenePairOutput", + "pos": [ + 3310, + -760 + ], + "size": [ + 430, + 290 + ], + "flags": {}, + "order": 23, + "mode": 0, + "inputs": [ + { + "name": "softcore_scene", + "type": "SXCP_SCENE", + "link": 24 + }, + { + "name": "hardcore_scene", + "type": "SXCP_SCENE", + "link": 25 + } + ], + "outputs": [ + { + "name": "softcore_prompt", + "type": "STRING", + "links": [ + 28 + ], + "slot_index": 0 + }, + { + "name": "hardcore_prompt", + "type": "STRING", + "links": [ + 29 + ], + "slot_index": 1 + }, + { + "name": "softcore_negative_prompt", + "type": "STRING", + "links": null, + "slot_index": 2 + }, + { + "name": "hardcore_negative_prompt", + "type": "STRING", + "links": null, + "slot_index": 3 + }, + { + "name": "softcore_caption", + "type": "STRING", + "links": null, + "slot_index": 4 + }, + { + "name": "hardcore_caption", + "type": "STRING", + "links": null, + "slot_index": 5 + }, + { + "name": "shared_descriptor", + "type": "STRING", + "links": null, + "slot_index": 6 + }, + { + "name": "metadata_json", + "type": "STRING", + "links": [ + 26, + 27 + ], + "slot_index": 7 + }, + { + "name": "scene_metadata_json", + "type": "SXCP_SCENE", + "links": null, + "slot_index": 8 + } + ], + "properties": { + "Node name for S&R": "SxCPScenePairOutput" + }, + "widgets_values": [] + }, + { + "id": 25, + "type": "SxCPKrea2Formatter", + "pos": [ + 3810, + -900 + ], + "size": [ + 390, + 270 + ], + "flags": {}, + "order": 24, + "mode": 0, + "inputs": [ + { + "name": "metadata_json", + "type": "STRING", + "link": 26 + } + ], + "outputs": [ + { + "name": "krea_prompt", + "type": "STRING", + "links": null, + "slot_index": 0 + }, + { + "name": "negative_prompt", + "type": "STRING", + "links": null, + "slot_index": 1 + }, + { + "name": "krea_softcore_prompt", + "type": "STRING", + "links": [ + 30 + ], + "slot_index": 2 + }, + { + "name": "krea_hardcore_prompt", + "type": "STRING", + "links": [ + 31 + ], + "slot_index": 3 + }, + { + "name": "softcore_negative_prompt", + "type": "STRING", + "links": null, + "slot_index": 4 + }, + { + "name": "hardcore_negative_prompt", + "type": "STRING", + "links": null, + "slot_index": 5 + }, + { + "name": "method", + "type": "STRING", + "links": null, + "slot_index": 6 + }, + { + "name": "route_trace_json", + "type": "STRING", + "links": null, + "slot_index": 7 + } + ], + "properties": { + "Node name for S&R": "SxCPKrea2Formatter" + }, + "widgets_values": [ + "", + "metadata_json", + "auto", + "balanced", + "preserve", + true, + "", + "" + ] + }, + { + "id": 26, + "type": "SxCPCaptionNaturalizer", + "pos": [ + 3810, + -560 + ], + "size": [ + 390, + 240 + ], + "flags": {}, + "order": 25, + "mode": 0, + "inputs": [ + { + "name": "metadata_json", + "type": "STRING", + "link": 27 + } + ], + "outputs": [ + { + "name": "natural_caption", + "type": "STRING", + "links": null, + "slot_index": 0 + }, + { + "name": "method", + "type": "STRING", + "links": null, + "slot_index": 1 + }, + { + "name": "route_trace_json", + "type": "STRING", + "links": null, + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "SxCPCaptionNaturalizer" + }, + "widgets_values": [ + "", + "metadata_json", + "training_dense", + "balanced", + "drop_style_tail", + "sxcppnl7", + true, + "auto" + ] + }, + { + "id": 27, + "type": "SxCPPreviewAnyAsText", + "pos": [ + 4280, + -1040 + ], + "size": [ + 420, + 180 + ], + "flags": {}, + "order": 26, + "mode": 0, + "inputs": [ + { + "name": "value", + "type": "*", + "link": 28 + } + ], + "outputs": [ + { + "name": "text", + "type": "STRING", + "links": null, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "SxCPPreviewAnyAsText" + }, + "widgets_values": [ + "Raw softcore prompt preview", + "auto", + 30000 + ] + }, + { + "id": 28, + "type": "SxCPPreviewAnyAsText", + "pos": [ + 4280, + -830 + ], + "size": [ + 420, + 180 + ], + "flags": {}, + "order": 27, + "mode": 0, + "inputs": [ + { + "name": "value", + "type": "*", + "link": 29 + } + ], + "outputs": [ + { + "name": "text", + "type": "STRING", + "links": null, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "SxCPPreviewAnyAsText" + }, + "widgets_values": [ + "Raw hardcore prompt preview", + "auto", + 30000 + ] + }, + { + "id": 29, + "type": "SxCPPreviewAnyAsText", + "pos": [ + 4280, + -620 + ], + "size": [ + 420, + 180 + ], + "flags": {}, + "order": 28, + "mode": 0, + "inputs": [ + { + "name": "value", + "type": "*", + "link": 30 + } + ], + "outputs": [ + { + "name": "text", + "type": "STRING", + "links": null, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "SxCPPreviewAnyAsText" + }, + "widgets_values": [ + "Krea softcore prompt preview", + "auto", + 30000 + ] + }, + { + "id": 30, + "type": "SxCPPreviewAnyAsText", + "pos": [ + 4280, + -410 + ], + "size": [ + 420, + 180 + ], + "flags": {}, + "order": 29, + "mode": 0, + "inputs": [ + { + "name": "value", + "type": "*", + "link": 31 + } + ], + "outputs": [ + { + "name": "text", + "type": "STRING", + "links": null, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "SxCPPreviewAnyAsText" + }, + "widgets_values": [ + "Krea hardcore prompt preview", + "auto", + 30000 + ] + }, + { + "id": 31, + "type": "Note", + "pos": [ + -2100, + 190 + ], + "size": [ + 650, + 260 + ], + "flags": {}, + "order": 30, + "mode": 0, + "inputs": [], + "outputs": [], + "properties": {}, + "widgets_values": [ + "Workspace lounge scene-chain Insta/OF demo. No freeform/manual prompt text is required: the workspace_lounge theme supplies the coworking lounge, Camera Orbit supplies position, Scene Camera preserves the location layout, and Scene Pair Output produces raw softcore/hardcore prompts plus Krea2 previews." + ] + } + ], + "links": [ + [ + 1, + 1, + 1, + 5, + 0, + "SXCP_SEED_CONFIG" + ], + [ + 2, + 2, + 0, + 5, + 1, + "SXCP_STYLE_CONFIG" + ], + [ + 3, + 5, + 0, + 6, + 0, + "SXCP_SCENE" + ], + [ + 4, + 6, + 0, + 7, + 0, + "SXCP_SCENE" + ], + [ + 5, + 7, + 0, + 8, + 0, + "SXCP_SCENE" + ], + [ + 6, + 8, + 0, + 9, + 0, + "SXCP_SCENE" + ], + [ + 7, + 9, + 0, + 10, + 0, + "SXCP_SCENE" + ], + [ + 8, + 10, + 0, + 11, + 0, + "SXCP_SCENE" + ], + [ + 9, + 3, + 0, + 11, + 1, + "SXCP_LOCATION_CONFIG" + ], + [ + 10, + 11, + 0, + 12, + 0, + "SXCP_SCENE" + ], + [ + 11, + 12, + 0, + 13, + 0, + "SXCP_SCENE" + ], + [ + 12, + 13, + 0, + 14, + 0, + "SXCP_SCENE" + ], + [ + 13, + 14, + 0, + 15, + 0, + "SXCP_SCENE" + ], + [ + 14, + 15, + 0, + 17, + 0, + "SXCP_SCENE" + ], + [ + 15, + 4, + 0, + 17, + 1, + "SXCP_CAMERA_CONFIG" + ], + [ + 16, + 16, + 0, + 17, + 2, + "SXCP_SCENE_CAMERA_OPTIONS" + ], + [ + 17, + 17, + 0, + 18, + 0, + "SXCP_SCENE" + ], + [ + 18, + 3, + 1, + 18, + 1, + "SXCP_COMPOSITION_CONFIG" + ], + [ + 19, + 18, + 0, + 19, + 0, + "SXCP_SCENE" + ], + [ + 20, + 19, + 0, + 20, + 0, + "SXCP_SCENE" + ], + [ + 21, + 20, + 0, + 21, + 0, + "SXCP_SCENE" + ], + [ + 22, + 20, + 1, + 23, + 0, + "SXCP_SCENE" + ], + [ + 23, + 22, + 0, + 23, + 1, + "SXCP_HARDCORE_POSITION_CONFIG" + ], + [ + 24, + 21, + 0, + 24, + 0, + "SXCP_SCENE" + ], + [ + 25, + 23, + 0, + 24, + 1, + "SXCP_SCENE" + ], + [ + 26, + 24, + 7, + 25, + 0, + "STRING" + ], + [ + 27, + 24, + 7, + 26, + 0, + "STRING" + ], + [ + 28, + 24, + 0, + 27, + 0, + "*" + ], + [ + 29, + 24, + 1, + 28, + 0, + "*" + ], + [ + 30, + 25, + 2, + 29, + 0, + "*" + ], + [ + 31, + 25, + 3, + 30, + 0, + "*" + ] + ], + "groups": [ + { + "title": "Preset Inputs, No Freeform Prompt Text", + "bounding": [ + -2140, + -1010, + 760, + 1490 + ], + "color": "#4d6b8f", + "font_size": 24 + }, + { + "title": "Complete Scene Chain", + "bounding": [ + -1620, + -1000, + 4010, + 620 + ], + "color": "#3f789e", + "font_size": 24 + }, + { + "title": "Insta/OF Softcore and Hardcore Split", + "bounding": [ + 2380, + -990, + 880, + 830 + ], + "color": "#8a5a5a", + "font_size": 24 + }, + { + "title": "Pair Output, Krea2 Formatter, Persistent Text Previews", + "bounding": [ + 3280, + -1090, + 1460, + 900 + ], + "color": "#4d7f45", + "font_size": 24 + } + ], + "config": {}, + "extra": { + "ds": { + "scale": 0.52, + "offset": [ + 1260, + 650 + ] + } + }, + "version": 0.4 +} diff --git a/location_config.py b/location_config.py index c2863f3..7190839 100644 --- a/location_config.py +++ b/location_config.py @@ -95,6 +95,17 @@ THEMATIC_LOCATION_PRESETS = { "glossy mirror-wall composition with floor reflection line at the lower edge", ], }, + "workspace_lounge": { + "locations": [ + {"slug": "coworking_lounge_window", "prompt": "coworking lounge with tall windows, warm desks, laptop tables, glass partition seams, repeated desk rows, plants, and soft shared-office depth"}, + ], + "compositions": [ + "camera-aware coworking lounge frame with the subjects near a desk edge and tall-window depth behind them", + "mid-distance workspace lounge composition with laptop tables and glass partition seams readable around the bodies", + "diagonal desk-row frame using repeated work tables, plants, and tall windows for room continuity", + "foreground desk-edge composition with the subject dominant and coworking lounge depth still readable", + ], + }, "boudoir_bedroom": { "locations": [ {"slug": "warm_boudoir_canopy_bed", "prompt": "warm boudoir bedroom with satin sheets, canopy curtains, low lamplight, and bedside phone framing"}, diff --git a/scene_camera_adapters.py b/scene_camera_adapters.py index c43ab96..438be5a 100644 --- a/scene_camera_adapters.py +++ b/scene_camera_adapters.py @@ -895,11 +895,13 @@ def scene_direction_detail( background = profile["background"] detail_label = profile.get("detail_label") or "location details" subject, pronoun = scene_subject_terms(subject_kind, pov_labels) + is_verb = "are" if subject == "the subjects" else "is" + face_verb = "face" if subject == "the subjects" else "faces" if pov_labels: if "right side" in direction: - return f"{subject} is in right-side profile; {midground} run behind {pronoun} toward {background}, with {detail_label} kept at the frame edges" + return f"{subject} {is_verb} in right-side profile; {midground} run behind {pronoun} toward {background}, with {detail_label} kept at the frame edges" if "left side" in direction: - return f"{subject} is in left-side profile; {midground} run behind {pronoun} toward {background}, with {detail_label} kept at the frame edges" + return f"{subject} {is_verb} in left-side profile; {midground} run behind {pronoun} toward {background}, with {detail_label} kept at the frame edges" if "back-right" in direction or "back-left" in direction: return f"{subject} stays close in one continuous diagonal first-person body angle; {midground} lead toward {background} behind {pronoun} at the edges, not in the lower foreground" if direction == "back view": @@ -908,14 +910,14 @@ def scene_direction_detail( return f"{subject} fills the first-person front-quarter view; {midground} recede diagonally behind {pronoun} toward {background}" return f"{subject} faces the viewer in first-person view; {midground} and {background} stay behind {pronoun}, not between viewer and body" if "right side" in direction or "left side" in direction: - return f"{subject} is held in side profile along the {foreground}; {midground} run laterally behind {pronoun}, with {background} still readable" + return f"{subject} {is_verb} held in side profile along the {foreground}; {midground} run laterally behind {pronoun}, with {background} still readable" if "back-right" in direction or "back-left" in direction: - return f"{subject} is viewed from a rear-quarter angle, partly turning back toward camera; the {foreground} stays low in frame while {midground} lead into {background}" + return f"{subject} {is_verb} viewed from a rear-quarter angle, partly turning back toward camera; the {foreground} stays low in frame while {midground} lead into {background}" if direction == "back view": - return f"{subject} is seen from behind with the {foreground} at camera side, facing into {midground} and {background}" + return f"{subject} {is_verb} seen from behind with the {foreground} at camera side, facing into {midground} and {background}" if "front-right" in direction or "front-left" in direction: - return f"{subject} is placed beside the {foreground}; {midground} recede diagonally behind {pronoun} toward {background}" - return f"{subject} faces camera beside the {foreground}; {midground} sit between {pronoun} and {background}" + return f"{subject} {is_verb} placed beside the {foreground}; {midground} recede diagonally behind {pronoun} toward {background}" + return f"{subject} {face_verb} camera beside the {foreground}; {midground} sit between {pronoun} and {background}" def coworking_direction_detail( diff --git a/tools/prompt_smoke.py b/tools/prompt_smoke.py index 612e859..5f51e87 100644 --- a/tools/prompt_smoke.py +++ b/tools/prompt_smoke.py @@ -841,6 +841,18 @@ def smoke_scene_camera_adapter_pov_profile_policy() -> None: "lower foreground is reserved for POV body or hand cues" in pov, f"{key} POV scene directive lost lower-foreground body-cue reservation", ) + plural_directive = scene_camera_adapters.scene_camera_directive( + "", + parsed_camera, + pov_labels=[], + subject_kind="subjects", + profile_key="coworking_lounge", + ) + _expect( + "the subjects are placed" in plural_directive, + "scene camera adapter used singular grammar for plural subjects", + ) + _expect("the subjects is" not in plural_directive, "scene camera adapter leaked 'the subjects is'") def smoke_row_camera_policy() -> None: @@ -1724,6 +1736,7 @@ def smoke_location_config_policy() -> None: _expect("classical_library" in location_config.location_theme_choices(), "Location themes lost classical_library") _expect("creator_bedroom" in location_config.location_theme_choices(), "Location themes lost creator_bedroom") _expect("mirror_room" in location_config.location_theme_choices(), "Location themes lost mirror_room") + _expect("workspace_lounge" in location_config.location_theme_choices(), "Location themes lost workspace_lounge") _expect("fetish_studio" in location_config.location_theme_choices(), "Location themes lost fetish_studio") custom = json.loads( @@ -1822,6 +1835,19 @@ def smoke_location_config_policy() -> None: _expect(themed_composition_payload.get("theme") == "classical_library", "Themed composition config lost theme metadata") parsed_themed = pb._parse_location_config(themed_location_payload) _expect(parsed_themed.get("theme") == "classical_library", "Location parser lost theme metadata") + workspace_location, workspace_composition, workspace_summary = pb.build_thematic_location_json( + enabled=True, + combine_mode="replace", + theme="workspace_lounge", + ) + workspace_location_payload = json.loads(workspace_location) + workspace_composition_payload = json.loads(workspace_composition) + _expect("workspace_lounge" in workspace_summary, "Workspace theme summary lost theme name") + _expect( + workspace_location_payload.get("scene_entries", [{}])[0].get("slug") == "coworking_lounge_window", + "Workspace theme lost coworking lounge location slug", + ) + _expect(workspace_composition_payload.get("composition_entries"), "Workspace theme did not output compositions") replaced_after_theme = json.loads( location_config.build_location_pool_json( enabled=True,