{ "id": "joyltx25-take", "revision": 0, "last_node_id": 63, "last_link_id": 101, "nodes": [ { "id": 29, "type": "SaveVideo", "pos": [ 1045.8903447771866, -287.7634216591205 ], "size": [ 376.7688540186457, 106 ], "flags": {}, "order": 29, "mode": 0, "inputs": [ { "localized_name": "video", "name": "video", "type": "VIDEO", "link": 34 }, { "localized_name": "filename_prefix", "name": "filename_prefix", "type": "STRING", "widget": { "name": "filename_prefix" }, "link": null }, { "localized_name": "format", "name": "format", "type": "COMBO", "widget": { "name": "format" }, "link": null }, { "localized_name": "codec", "name": "codec", "type": "COMFY_DYNAMICCOMBO_V3", "widget": { "name": "codec" }, "link": null } ], "outputs": [ { "localized_name": "video", "name": "video", "type": "VIDEO", "slot_index": 0, "links": [] } ], "title": "SAVE", "properties": { "cnr_id": "comfy-core", "ver": "0.32.0", "Node name for S&R": "SaveVideo" }, "widgets_values": [ "video/JoyLTX25/multishot", "auto", "auto" ], "color": "#432", "bgcolor": "#653" }, { "id": 3, "type": "CLIPLoader", "pos": [ -350.08770698218507, 20.253495990564385 ], "size": [ 498.33837466598527, 106 ], "flags": {}, "order": 0, "mode": 0, "inputs": [ { "localized_name": "clip_name", "name": "clip_name", "type": "COMBO", "widget": { "name": "clip_name" }, "link": null }, { "localized_name": "type", "name": "type", "type": "COMBO", "widget": { "name": "type" }, "link": null }, { "localized_name": "device", "name": "device", "shape": 7, "type": "COMBO", "widget": { "name": "device" }, "link": null } ], "outputs": [ { "localized_name": "CLIP", "name": "CLIP", "type": "CLIP", "slot_index": 0, "links": [ 59 ] } ], "title": "LTX Gemma-4 encoder + device (VRAM)", "properties": { "cnr_id": "comfy-core", "ver": "0.32.0", "Node name for S&R": "CLIPLoader" }, "widgets_values": [ "gemma4-12b-with-proj-ltx-2.5-comfy-int8-convrot.safetensors", "ltxv", "default" ], "color": "#232", "bgcolor": "#353" }, { "id": 4, "type": "VAELoader", "pos": [ -350.4052072953496, 159.00905507792237 ], "size": [ 499.8948369673561, 58 ], "flags": {}, "order": 1, "mode": 0, "inputs": [ { "localized_name": "vae_name", "name": "vae_name", "type": "COMBO", "widget": { "name": "vae_name" }, "link": null } ], "outputs": [ { "localized_name": "VAE", "name": "VAE", "type": "VAE", "slot_index": 0, "links": [ 60 ] } ], "title": "LTX video VAE", "properties": { "cnr_id": "comfy-core", "ver": "0.32.0", "Node name for S&R": "VAELoader" }, "widgets_values": [ "ltx-2.5-video-vae-bf16.safetensors" ], "color": "#232", "bgcolor": "#353" }, { "id": 5, "type": "VAELoader", "pos": [ -351.1658825364234, 251.50064665224198 ], "size": [ 498.86852073089494, 58 ], "flags": {}, "order": 2, "mode": 0, "inputs": [ { "localized_name": "vae_name", "name": "vae_name", "type": "COMBO", "widget": { "name": "vae_name" }, "link": null } ], "outputs": [ { "localized_name": "VAE", "name": "VAE", "type": "VAE", "slot_index": 0, "links": [ 61 ] } ], "title": "LTX audio VAE", "properties": { "cnr_id": "comfy-core", "ver": "0.32.0", "Node name for S&R": "VAELoader" }, "widgets_values": [ "ltx-2.5-audio-vae-bf16.safetensors" ], "color": "#232", "bgcolor": "#353" }, { "id": 6, "type": "LatentUpscaleModelLoader", "pos": [ -350.7330475509172, 344.8202770317725 ], "size": [ 498.6162958629433, 58 ], "flags": {}, "order": 3, "mode": 0, "inputs": [ { "localized_name": "model_name", "name": "model_name", "type": "COMBO", "widget": { "name": "model_name" }, "link": null } ], "outputs": [ { "localized_name": "LATENT_UPSCALE_MODEL", "name": "LATENT_UPSCALE_MODEL", "type": "LATENT_UPSCALE_MODEL", "slot_index": 0, "links": [ 54 ] } ], "title": "LTX latent upscaler x2 (pass 1 -> pass 2)", "properties": { "cnr_id": "comfy-core", "ver": "0.32.0", "Node name for S&R": "LatentUpscaleModelLoader" }, "widgets_values": [ "ltx-2.5-latent-spatial-upscaler-x2-bf16-1.0.safetensors" ], "color": "#232", "bgcolor": "#353" }, { "id": 39, "type": "LatentUpscaleModelLoader", "pos": [ -350.33859795483727, 437.70128005497077 ], "size": [ 498.789989537287, 58 ], "flags": {}, "order": 4, "mode": 0, "inputs": [ { "localized_name": "model_name", "name": "model_name", "type": "COMBO", "widget": { "name": "model_name" }, "link": null } ], "outputs": [ { "localized_name": "LATENT_UPSCALE_MODEL", "name": "LATENT_UPSCALE_MODEL", "type": "LATENT_UPSCALE_MODEL", "slot_index": 0, "links": [ 55 ] } ], "title": "LTX latent upscaler x1.5 (2.3 file)", "properties": { "cnr_id": "comfy-core", "ver": "0.32.0", "Node name for S&R": "LatentUpscaleModelLoader" }, "widgets_values": [ "ltx-2.3-spatial-upscaler-x1.5-1.0.safetensors" ], "color": "#232", "bgcolor": "#353" }, { "id": 28, "type": "CreateVideo", "pos": [ 739.2658485267581, -284.3359462756465 ], "size": [ 270, 102 ], "flags": {}, "order": 27, "mode": 0, "inputs": [ { "localized_name": "images", "name": "images", "type": "IMAGE", "link": 68 }, { "localized_name": "audio", "name": "audio", "shape": 7, "type": "AUDIO", "link": 69 }, { "localized_name": "fps", "name": "fps", "type": "FLOAT", "widget": { "name": "fps" }, "link": null }, { "localized_name": "bit_depth", "name": "bit_depth", "shape": 7, "type": "INT", "widget": { "name": "bit_depth" }, "link": null } ], "outputs": [ { "localized_name": "VIDEO", "name": "VIDEO", "type": "VIDEO", "slot_index": 0, "links": [ 34 ] } ], "title": "assemble video", "properties": { "cnr_id": "comfy-core", "ver": "0.32.0", "Node name for S&R": "CreateVideo" }, "widgets_values": [ 24, 8 ], "color": "#432", "bgcolor": "#653" }, { "id": 45, "type": "JoyLTX_ImageFolder", "pos": [ 1019.9551336007006, -661.1151651891804 ], "size": [ 382.6685546875, 102 ], "flags": {}, "order": 5, "mode": 0, "inputs": [ { "localized_name": "folder", "name": "folder", "type": "COMBO", "widget": { "name": "folder" }, "link": null }, { "localized_name": "enabled", "name": "enabled", "type": "BOOLEAN", "widget": { "name": "enabled" }, "link": null } ], "outputs": [ { "localized_name": "images", "name": "images", "type": "IMAGE", "links": [ 72 ] }, { "localized_name": "count", "name": "count", "type": "INT", "links": [] } ], "title": "START frames: one image per shot (folder)", "properties": { "Node name for S&R": "JoyLTX_ImageFolder" }, "widgets_values": [ "(none)", false ], "color": "#232", "bgcolor": "#353" }, { "id": 46, "type": "JoyLTX_ImageFolder", "pos": [ 1018.8588365705774, -509.27528215323383 ], "size": [ 383.88369131817154, 102 ], "flags": {}, "order": 6, "mode": 0, "inputs": [ { "localized_name": "folder", "name": "folder", "type": "COMBO", "widget": { "name": "folder" }, "link": null }, { "localized_name": "enabled", "name": "enabled", "type": "BOOLEAN", "widget": { "name": "enabled" }, "link": null } ], "outputs": [ { "localized_name": "images", "name": "images", "type": "IMAGE", "links": [ 73 ] }, { "localized_name": "count", "name": "count", "type": "INT", "links": [] } ], "title": "END frames: one image per shot (folder)", "properties": { "Node name for S&R": "JoyLTX_ImageFolder" }, "widgets_values": [ "(none)", false ], "color": "#232", "bgcolor": "#353" }, { "id": 44, "type": "JoyLTX_OptionalImage", "pos": [ 701.3694168527886, -877.5582465451374 ], "size": [ 293.3501953125, 78 ], "flags": {}, "order": 19, "mode": 0, "inputs": [ { "localized_name": "image", "name": "image", "shape": 7, "type": "IMAGE", "link": 70 }, { "localized_name": "enabled", "name": "enabled", "type": "BOOLEAN", "widget": { "name": "enabled" }, "link": null } ], "outputs": [ { "localized_name": "image", "name": "image", "type": "IMAGE", "links": [ 71 ] }, { "localized_name": "enabled", "name": "enabled", "type": "BOOLEAN", "links": [] } ], "title": "USE I2V (off = text-to-video)", "properties": { "Node name for S&R": "JoyLTX_OptionalImage" }, "widgets_values": [ false ], "color": "#232", "bgcolor": "#353" }, { "id": 43, "type": "LoadImage", "pos": [ 704.4542574804843, -730.7775779856188 ], "size": [ 282.798828125, 314 ], "flags": {}, "order": 7, "mode": 0, "inputs": [ { "localized_name": "image", "name": "image", "type": "COMBO", "widget": { "name": "image" }, "link": null }, { "localized_name": "choose file to upload", "name": "upload", "type": "IMAGEUPLOAD", "widget": { "name": "upload" }, "link": null } ], "outputs": [ { "localized_name": "IMAGE", "name": "IMAGE", "type": "IMAGE", "links": [ 70 ] }, { "localized_name": "MASK", "name": "MASK", "type": "MASK", "links": [] } ], "title": "I2V image (optional)", "properties": { "cnr_id": "comfy-core", "ver": "0.32.0", "Node name for S&R": "LoadImage" }, "widgets_values": [ "example.png", "image" ] }, { "id": 47, "type": "Note", "pos": [ 1022.0507193951947, -884.9462602686502 ], "size": [ 383.8983379392205, 161.71181850217022 ], "flags": {}, "order": 8, "mode": 0, "inputs": [], "outputs": [], "title": "KEYFRAMES", "properties": {}, "widgets_values": [ "KEYFRAMES (optional)\n\nI2V image = the first frame of SHOT 1 only.\nSTART frames / END frames = one image PER SHOT: make a folder under ComfyUI/input (e.g. input/myshots_start), put one image per shot in it named in shot order (01.png, 02.png ...), pick the folder here, flip it on. Fewer images than shots = the last one repeats. START = how each shot begins (cut / fresh modes), END = the frame each shot travels to.\nidentity_ref on the sampler keeps the same people across shots WITHOUT any images." ], "color": "#432", "bgcolor": "#653" }, { "id": 30, "type": "PrimitiveStringMultiline", "pos": [ -1345.868882498191, 368.7421693815115 ], "size": [ 524.0980807321903, 203.0120893381611 ], "flags": {}, "order": 9, "mode": 0, "inputs": [ { "localized_name": "value", "name": "value", "type": "STRING", "widget": { "name": "value" }, "link": null } ], "outputs": [ { "localized_name": "STRING", "name": "STRING", "type": "STRING", "links": [ 93 ] } ], "title": "SCENE IDEA (your premise)", "properties": { "cnr_id": "comfy-core", "ver": "0.32.0", "Node name for S&R": "PrimitiveStringMultiline" }, "widgets_values": [ "A woman in her thirties with dark hair tied back, wearing a rust-orange sweater, sits at a kitchen table with a mug of coffee going cold and talks straight through, without stopping, about the night the power went out on her whole street and her house was the only one whose lights stayed on. Dry, matter-of-fact, American. One continuous take, static medium close-up, warm tungsten kitchen." ] }, { "id": 42, "type": "JoyLTX_Multishot", "pos": [ 176.78833318802938, -281.94834911828883 ], "size": [ 496.24765625, 854 ], "flags": {}, "order": 26, "mode": 0, "inputs": [ { "localized_name": "model", "name": "model", "type": "MODEL", "link": 75 }, { "localized_name": "clip", "name": "clip", "type": "CLIP", "link": 59 }, { "localized_name": "video_vae", "name": "video_vae", "type": "VAE", "link": 60 }, { "localized_name": "audio_vae", "name": "audio_vae", "type": "VAE", "link": 61 }, { "localized_name": "upscale_model", "name": "upscale_model", "shape": 7, "type": "LATENT_UPSCALE_MODEL", "link": 63 }, { "localized_name": "start_image", "name": "start_image", "shape": 7, "type": "IMAGE", "link": 71 }, { "localized_name": "shot_images", "name": "shot_images", "shape": 7, "type": "IMAGE", "link": 72 }, { "localized_name": "end_images", "name": "end_images", "shape": 7, "type": "IMAGE", "link": 73 }, { "localized_name": "ref_images", "name": "ref_images", "shape": 7, "type": "IMAGE", "link": 80 }, { "localized_name": "prompts", "name": "prompts", "type": "STRING", "widget": { "name": "prompts" }, "link": 79 }, { "localized_name": "negative", "name": "negative", "type": "STRING", "widget": { "name": "negative" }, "link": null }, { "localized_name": "width", "name": "width", "type": "INT", "widget": { "name": "width" }, "link": 64 }, { "localized_name": "height", "name": "height", "type": "INT", "widget": { "name": "height" }, "link": 65 }, { "localized_name": "frames_per_shot", "name": "frames_per_shot", "type": "INT", "widget": { "name": "frames_per_shot" }, "link": 66 }, { "localized_name": "shot_count", "name": "shot_count", "type": "INT", "widget": { "name": "shot_count" }, "link": null }, { "localized_name": "join", "name": "join", "type": "COMBO", "widget": { "name": "join" }, "link": null }, { "localized_name": "overlap", "name": "overlap", "type": "INT", "widget": { "name": "overlap" }, "link": null }, { "localized_name": "seed", "name": "seed", "type": "INT", "widget": { "name": "seed" }, "link": null }, { "localized_name": "seed_per_shot", "name": "seed_per_shot", "type": "BOOLEAN", "widget": { "name": "seed_per_shot" }, "link": null }, { "localized_name": "sampler_name", "name": "sampler_name", "type": "COMBO", "widget": { "name": "sampler_name" }, "link": null }, { "localized_name": "sigmas_pass1", "name": "sigmas_pass1", "type": "STRING", "widget": { "name": "sigmas_pass1" }, "link": null }, { "localized_name": "two_pass", "name": "two_pass", "type": "BOOLEAN", "widget": { "name": "two_pass" }, "link": 67 }, { "localized_name": "sigmas_pass2", "name": "sigmas_pass2", "type": "STRING", "widget": { "name": "sigmas_pass2" }, "link": null }, { "localized_name": "video_cfg", "name": "video_cfg", "type": "FLOAT", "widget": { "name": "video_cfg" }, "link": null }, { "localized_name": "audio_cfg", "name": "audio_cfg", "type": "FLOAT", "widget": { "name": "audio_cfg" }, "link": null }, { "localized_name": "frame_rate", "name": "frame_rate", "type": "FLOAT", "widget": { "name": "frame_rate" }, "link": null }, { "localized_name": "save_every_shot", "name": "save_every_shot", "type": "BOOLEAN", "widget": { "name": "save_every_shot" }, "link": null }, { "localized_name": "identity_ref", "name": "identity_ref", "type": "COMBO", "widget": { "name": "identity_ref" }, "link": null }, { "localized_name": "identity_strength", "name": "identity_strength", "type": "FLOAT", "widget": { "name": "identity_strength" }, "link": null }, { "localized_name": "image_strength", "name": "image_strength", "shape": 7, "type": "FLOAT", "widget": { "name": "image_strength" }, "link": null }, { "localized_name": "keyframe_strength", "name": "keyframe_strength", "shape": 7, "type": "FLOAT", "widget": { "name": "keyframe_strength" }, "link": null }, { "localized_name": "ref_mask", "name": "ref_mask", "shape": 7, "type": "STRING", "widget": { "name": "ref_mask" }, "link": 81 }, { "localized_name": "ref_strength", "name": "ref_strength", "shape": 7, "type": "FLOAT", "widget": { "name": "ref_strength" }, "link": null } ], "outputs": [ { "localized_name": "images", "name": "images", "type": "IMAGE", "links": [ 68 ] }, { "localized_name": "audio", "name": "audio", "type": "AUDIO", "links": [ 69, 82 ] }, { "localized_name": "info", "name": "info", "type": "STRING", "links": [] } ], "title": "LTX-2.5 MULTISHOT (two passes per shot, AV-extend joins)", "properties": { "Node name for S&R": "JoyLTX_Multishot" }, "widgets_values": [ "", "pc game, console game, video game, cartoon, childish, ugly", 960, 544, 193, 0, "continue (AV extend: seamless take)", 3, 553010, "fixed", true, "euler_ancestral", "1.0, 0.99375, 0.9875, 0.98125, 0.975, 0.909375, 0.725, 0.421875, 0.0", true, "0.85, 0.7250, 0.4219, 0.0", 1, 1, 24, false, "cuts only: frame from shot 1", 0.6, 1, 0.8, "", 0.85 ] }, { "id": 35, "type": "Note", "pos": [ -1341.9306085341652, -306.8822413001228 ], "size": [ 512.4868519909842, 248.33959429000743 ], "flags": {}, "order": 10, "mode": 0, "inputs": [], "outputs": [], "title": "START HERE", "properties": {}, "widgets_values": [ "START HERE - JOY-LTX 2.5 MULTISHOT (one story, several shots, one video)\n\nThe writer turns your premise into N shot prompts; the sampler renders each shot with the two-pass pipeline and JOINS them:\n- continue = the previous shot's last frames AND sound are pinned into the next one -> one seamless take of any length (writer join style \"extend take\").\n- cut = only the sound is pinned: the voice carries across a picture cut, the picture follows the new shot prompt (writer \"cuts\" / \"continuous scene with cuts\").\n- fresh = independent shots.\nSame people in every shot: identity_ref (on the sampler) attaches a frame of shot 1 to the later shots - no reference photos needed. identity_strength 0.3-0.6 keeps the people and lets the framing move; 1.0 copies the framing too.\n\n1. SCENE IDEA. 2. Writer: num_shots = how many shots (and a model you have). 3. MASTER CONTROLS: render size + seconds PER SHOT + upscale (auto; x2/x1.5/none by hand if you accept streaming). 4. Writer join style to match the join. 5. USE I2V (optional): first frame of shot 1. 6. Run.\n\nVRAM = one shot; take length = shots x seconds. Fewer, longer shots = fewer joins (24 GB: 4 x 30 s single pass works). Read-me note: models + links.\n\nTWO PEOPLE IN A SCENE: use cut, not continue. The pinned picture is what makes continue seamless, so when the speaker changes the new person gets painted into the old body and room - a reference photo will not overcome the pin (render-verified). In cut mode the whole pin follows whoever is speaking: their own last frame and their own voice. continue is for one person talking through a take." ], "color": "#432", "bgcolor": "#653" }, { "id": 37, "type": "Note", "pos": [ -780.2506975888696, -76.4143202095135 ], "size": [ 387.44318542142946, 152.31461052316445 ], "flags": {}, "order": 11, "mode": 0, "inputs": [], "outputs": [], "title": "WRITER", "properties": {}, "widgets_values": [ "THE WRITER\n\nlong_story (multi-shot): writes SHOTS prompts, each sized to the seconds per shot. join style \"extend take\" = one continuous speech across shots (use with continue); \"cuts\" or \"continuous scene with cuts\" = each shot its own beat (use with cut / fresh).\nCloud model returned 503 / empty? Pick another model and Run again.\nNo writer? mode = passthrough and paste shot prompts separated by --- into the sampler's prompts box.\nShot count lives HERE, on num_shots - not on MASTER CONTROLS. beat_seconds does nothing on this canvas (it sizes the beats inside one generation on the single-shot Take canvas); here every shot is seconds-per-shot long and there are num_shots of them.\n" ], "color": "#432", "bgcolor": "#653" }, { "id": 55, "type": "JoyLTX_AnySwitch", "pos": [ -707.3903091679157, -204.87552544970538 ], "size": [ 236.58359375, 66 ], "flags": { "collapsed": true }, "order": 24, "mode": 0, "inputs": [ { "localized_name": "use_on", "name": "use_on", "type": "BOOLEAN", "link": 97 }, { "localized_name": "off_path", "name": "off_path", "shape": 7, "type": "*", "link": 99 }, { "localized_name": "on_path", "name": "on_path", "shape": 7, "type": "*", "link": 98 } ], "outputs": [ { "localized_name": "value", "name": "value", "type": "*", "links": [ 101 ] } ], "title": "prompts: writer (off) / file (on)", "properties": { "Node name for S&R": "JoyLTX_AnySwitch" }, "widgets_values": [], "color": "#232", "bgcolor": "#353" }, { "id": 53, "type": "PrimitiveInt", "pos": [ -745.4968169708737, -603.26654458294 ], "size": [ 319.0647852805805, 82 ], "flags": {}, "order": 12, "mode": 0, "inputs": [ { "localized_name": "value", "name": "value", "type": "INT", "widget": { "name": "value" }, "link": null } ], "outputs": [ { "localized_name": "INT", "name": "INT", "type": "INT", "links": [ 94 ] } ], "title": "INDEX (increment = next idea)", "properties": { "cnr_id": "comfy-core", "ver": "0.32.0", "Node name for S&R": "PrimitiveInt" }, "widgets_values": [ 0, "increment" ] }, { "id": 48, "type": "JoyLTX_LoraStack", "pos": [ 60.29051882398423, -699.3167823959767 ], "size": [ 270, 226 ], "flags": {}, "order": 21, "mode": 0, "inputs": [ { "localized_name": "model", "name": "model", "type": "MODEL", "link": 74 }, { "localized_name": "lora_1", "name": "lora_1", "type": "COMBO", "widget": { "name": "lora_1" }, "link": null }, { "localized_name": "strength_1", "name": "strength_1", "type": "FLOAT", "widget": { "name": "strength_1" }, "link": null }, { "localized_name": "lora_2", "name": "lora_2", "type": "COMBO", "widget": { "name": "lora_2" }, "link": null }, { "localized_name": "strength_2", "name": "strength_2", "type": "FLOAT", "widget": { "name": "strength_2" }, "link": null }, { "localized_name": "lora_3", "name": "lora_3", "type": "COMBO", "widget": { "name": "lora_3" }, "link": null }, { "localized_name": "strength_3", "name": "strength_3", "type": "FLOAT", "widget": { "name": "strength_3" }, "link": null }, { "localized_name": "lora_4", "name": "lora_4", "type": "COMBO", "widget": { "name": "lora_4" }, "link": null }, { "localized_name": "strength_4", "name": "strength_4", "type": "FLOAT", "widget": { "name": "strength_4" }, "link": null } ], "outputs": [ { "localized_name": "MODEL", "name": "MODEL", "type": "MODEL", "links": [ 75 ] } ], "title": "LoRA stack (4 slots)", "properties": { "Node name for S&R": "JoyLTX_LoraStack" }, "widgets_values": [ "(none)", 1, "(none)", 0, "(none)", 0, "(none)", 0 ], "color": "#223", "bgcolor": "#335" }, { "id": 52, "type": "Note", "pos": [ -360.3547780260638, -783.8743648908252 ], "size": [ 396.5142862281889, 405.6738935310865 ], "flags": {}, "order": 13, "mode": 0, "inputs": [], "outputs": [], "properties": { "Node name for S&R": "Note" }, "widgets_values": [ "PLUS LANES\n\nLoRA stack - up to four LoRAs on the DiT; (none) or strength 0 = skipped. On a DEV merge, the official LTX-2.5 distilled LoRA at 0.4-0.6 is what makes it few-step.\n\nCasting from folders. Put photos in ComfyUI/input/// - one folder per character, the folder name is the name you use in the prompt (refs_root is a dropdown of the libraries it finds).\n\nThe node reads the shot prompts, finds the named character, and hands the sampler one photo per shot; the sampler attaches it at frame 0 (ref_strength 0.5), and from a character's second shot on their own rendered face and their own voice carry into every later shot of theirs.\n\npick - 'one per character' uses the same photo for a character all the way through (best identity). Write [ref: name] in a shot to force a particular character; the marker is stripped before rendering.\n\ncrop - portrait keeps the person and drops the room. Use portraits or clean character shots: a busy scene photo drags its set into the render.\n\nPROMPTS FROM FILE - write the shots yourself (--- between shots, or JSON) in input/joyltx_prompts/ and wire this node into REFS BY NAME in place of the writer.\n\nsave audio - the finished soundtrack as flac next to the video." ], "color": "#432", "bgcolor": "#653" }, { "id": 36, "type": "MarkdownNote", "pos": [ -1328.7924401356531, -834.4955195576218 ], "size": [ 519.6101137065159, 381.719011182199 ], "flags": {}, "order": 14, "mode": 0, "inputs": [], "outputs": [], "title": "JOY-LTX 2.5 - read me", "properties": {}, "widgets_values": [ "## Joy-LTX 2.5 - JoyAI-Echo's performance on LTX-2.5\n\n**DiT file** (models/diffusion_models): pick by card and GPU family. Both doses in every tier: **070T30** (default) / **100T50** (livelier; same links with `100T50` in the name).\n- 16 GB: [Q4_K_S.gguf](https://huggingface.co/joeygambino/joyai-echo-ltx25-echoVid-gguf/blob/main/LTX25dist-echoVid-070T30-v2-DiT-Q4_K_S.gguf) (RTX 30/40) · [comfy-w4a8](https://huggingface.co/joeygambino/joyai-echo-ltx25-echoVid-comfy-native/blob/main/LTX25dist-echoVid-070T30-v2-DiT-comfy-w4a8.safetensors) or [comfy-nvfp4](https://huggingface.co/joeygambino/joyai-echo-ltx25-echoVid-comfy-native/blob/main/LTX25dist-echoVid-070T30-v2-DiT-comfy-nvfp4.safetensors) (RTX 50) · 12 GB: [Q3_K_M.gguf](https://huggingface.co/joeygambino/joyai-echo-ltx25-echoVid-gguf/blob/main/LTX25dist-echoVid-070T30-v2-DiT-Q3_K_M.gguf)\n- 24 GB: [Q5_K_M.gguf](https://huggingface.co/joeygambino/joyai-echo-ltx25-echoVid-gguf/blob/main/LTX25dist-echoVid-070T30-v2-DiT-Q5_K_M.gguf) (RTX 30/40, the default) · [Q6_K.gguf](https://huggingface.co/joeygambino/joyai-echo-ltx25-echoVid-gguf/blob/main/LTX25dist-echoVid-070T30-v2-DiT-Q6_K.gguf) · [comfy-mix4x8-17.0GB](https://huggingface.co/joeygambino/joyai-echo-ltx25-echoVid-comfy-native/blob/main/LTX25dist-echoVid-070T30-v2-DiT-comfy-mix4x8-17.0GB.safetensors) (RTX 50)\n- 32 GB: [comfy-int8](https://huggingface.co/joeygambino/joyai-echo-ltx25-echoVid-comfy-native/blob/main/LTX25dist-echoVid-070T30-v2-DiT-comfy-int8.safetensors) (fastest on RTX 50) · [Q8_0.gguf](https://huggingface.co/joeygambino/joyai-echo-ltx25-echoVid-gguf/blob/main/LTX25dist-echoVid-070T30-v2-DiT-Q8_0.gguf)\nThe canvas loader (**JoyLTX Load Model**) takes either family; `.gguf` needs **ComfyUI-GGUF** installed. RTX 30/40 = GGUF, RTX 50 = comfy-native.\nAll files: [GGUF repo](https://huggingface.co/joeygambino/joyai-echo-ltx25-echoVid-gguf) · [comfy-native repo](https://huggingface.co/joeygambino/joyai-echo-ltx25-echoVid-comfy-native) · [dev merges](https://huggingface.co/joeygambino/joyai-echo-ltx25-echoVid-dev) (bf16/fp8/int8, add your own distill LoRA) · Civitai: **Joy-LTX 2.5**.\n\n**Also needed** (Lightricks/LTX-2.5 on Hugging Face): `ltx-2.5-video-vae-bf16` + `ltx-2.5-audio-vae-bf16` -> models/vae · `ltx-2.5-latent-spatial-upscaler-x2-bf16-1.0` -> models/latent_upscale_models (optional for 24 GB: `ltx-2.3-spatial-upscaler-x1.5-1.0` from LTX-2.3) · text encoder `gemma4-12b-with-proj-ltx-2.5-comfy-int8-convrot` -> models/text_encoders (16 GB: the 10.6 GB `gemma4-12b-ltx25-comfy-w4a8` from LTX-2.5-Quantized).\n\n**Writer**: `writer_pack/ComfyUI_JoyAI_Echo_GGUF_Nodes` from this zip -> custom_nodes (our writing rules are inside; the Manager copy lacks them). Point it at an Ollama with a cloud model, or any OpenAI-compatible endpoint.\n\n**Speed**: on RTX 50 add `--enable-triton-backend` to the launch line for comfy-native files (about 2x). GGUF is unaffected.\n\nModels: huggingface.co/joeygambino/joyai-echo-ltx25-echoVid-gguf · huggingface.co/joeygambino/joyai-echo-ltx25-echoVid-comfy-native\nNodes + canvases: github.com/jlucasmcrell/ComfyUI-JoyLTX25" ], "color": "#432", "bgcolor": "#653" }, { "id": 56, "type": "Note", "pos": [ -778.9399719578086, -890.763157469406 ], "size": [ 386.33050599950616, 241.77657604867636 ], "flags": {}, "order": 15, "mode": 0, "inputs": [], "outputs": [], "properties": { "Node name for S&R": "Note" }, "widgets_values": [ "STORY SOURCE\n\nWhere a run's words come from - one panel, three sources.\n\nscene idea (the box) - type a premise in the SCENE IDEA box. The writer turns it into shot prompts.\n\nidea file - a file of story IDEAS; INDEX picks one and the writer expands it. Pick the file from the dropdown (everything under ComfyUI/input; entries ending in / are whole folders and then INDEX picks the file). An idea is a few sentences: who is there, what the camera is, what happens, how it ends. Leave INDEX on increment and queue once per idea to work through a file unattended - it wraps at the end.\n\nshot file - finished shot prompts (--- on its own line between shots, or JSON). The writer is skipped; what you wrote is what renders.\n\nrefs_attached - ON: the writer uses each character's own name and writes 'looks exactly as in the reference photographs' instead of inventing a face, which is what REFS BY NAME needs to cast them. OFF: no photos, the writer describes people itself.\n\nmanual_path - only for a file outside ComfyUI/input; leave empty otherwise.\n\nNew files do not appear in the dropdowns until ComfyUI is refreshed (R) or restarted." ], "color": "#432", "bgcolor": "#653" }, { "id": 38, "type": "Note", "pos": [ -349.57890137039396, -277.06874045485296 ], "size": [ 500.06333397495223, 145.0326294155268 ], "flags": {}, "order": 16, "mode": 0, "inputs": [], "outputs": [], "title": "ENGINE - LTX-2.5 two-pass", "properties": {}, "widgets_values": [ "ENGINE: LTX-2.5 MULTISHOT sampler.\n\nOne node = the whole two-pass pipeline per shot (pass 1, latent upscale x2/x1.5, pass 2, decode) plus the join. overlap = latent frames of the previous shot pinned at the head of the next (3 = 0.7 s, trimmed on output). identity_ref / identity_strength = same people across shots. seed_per_shot varies the seed by shot. save_every_shot writes raw shots to output/video/JOYLTX_SHOTS. Optional: shot_images (one image per shot, cut/fresh) if you have plates." ], "color": "#432", "bgcolor": "#653" }, { "id": 40, "type": "JoyLTX_AnySwitch", "pos": [ -324.4959291253184, 561.0361929715809 ], "size": [ 300.332805197354, 66 ], "flags": { "collapsed": true }, "order": 22, "mode": 0, "inputs": [ { "localized_name": "use_on", "name": "use_on", "type": "BOOLEAN", "link": 53 }, { "localized_name": "off_path", "name": "off_path", "shape": 7, "type": "*", "link": 54 }, { "localized_name": "on_path", "name": "on_path", "shape": 7, "type": "*", "link": 55 } ], "outputs": [ { "localized_name": "value", "name": "value", "type": "*", "links": [ 63 ] } ], "title": "upscaler model: x2 (off) / x1.5 (on)", "properties": { "Node name for S&R": "JoyLTX_AnySwitch" }, "widgets_values": [], "color": "#232", "bgcolor": "#353" }, { "id": 51, "type": "SaveAudio", "pos": [ -25.690078368953866, 559.1708012619049 ], "size": [ 270, 112 ], "flags": { "collapsed": true }, "order": 28, "mode": 0, "inputs": [ { "localized_name": "audio", "name": "audio", "type": "AUDIO", "link": 82 }, { "localized_name": "filename_prefix", "name": "filename_prefix", "type": "STRING", "widget": { "name": "filename_prefix" }, "link": null }, { "localized_name": "audioUI", "name": "audioUI", "type": "AUDIO_UI", "widget": { "name": "audioUI" }, "link": null } ], "outputs": [ { "localized_name": "audio", "name": "audio", "type": "AUDIO", "links": null } ], "title": "save audio (flac)", "properties": { "cnr_id": "comfy-core", "ver": "0.32.0", "Node name for S&R": "SaveAudio" }, "widgets_values": [ "audio/JoyLTX25/multishot" ] }, { "id": 2, "type": "JoyLTX_LoadModel", "pos": [ -349.76371761254273, -97.17202818080243 ], "size": [ 495.49086366635356, 82 ], "flags": {}, "order": 17, "mode": 0, "inputs": [ { "localized_name": "model_name", "name": "model_name", "type": "COMBO", "widget": { "name": "model_name" }, "link": null }, { "localized_name": "weight_dtype", "name": "weight_dtype", "shape": 7, "type": "COMBO", "widget": { "name": "weight_dtype" }, "link": null } ], "outputs": [ { "localized_name": "MODEL", "name": "MODEL", "type": "MODEL", "slot_index": 0, "links": [ 74 ] } ], "title": "LTX-2.5 DiT", "properties": { "Node name for S&R": "JoyLTX_LoadModel" }, "widgets_values": [ "LTX25dist-echoVid-070T30-v2-DiT-comfy-int8.safetensors", "default" ], "color": "#232", "bgcolor": "#353" }, { "id": 60, "type": "JoyLTX_StorySource", "pos": [ -784.1306740602519, -473.35652043225406 ], "size": [ 399.0624496250425, 312 ], "flags": {}, "order": 20, "mode": 0, "inputs": [ { "localized_name": "source", "name": "source", "type": "COMBO", "widget": { "name": "source" }, "link": null }, { "localized_name": "scene_idea", "name": "scene_idea", "type": "STRING", "widget": { "name": "scene_idea" }, "link": 93 }, { "localized_name": "idea_file", "name": "idea_file", "type": "COMBO", "widget": { "name": "idea_file" }, "link": null }, { "localized_name": "shot_file", "name": "shot_file", "type": "COMBO", "widget": { "name": "shot_file" }, "link": null }, { "localized_name": "index", "name": "index", "type": "INT", "widget": { "name": "index" }, "link": 94 }, { "localized_name": "refs_attached", "name": "refs_attached", "type": "BOOLEAN", "widget": { "name": "refs_attached" }, "link": null }, { "localized_name": "manual_path", "name": "manual_path", "shape": 7, "type": "STRING", "widget": { "name": "manual_path" }, "link": null } ], "outputs": [ { "localized_name": "story_idea", "name": "story_idea", "type": "STRING", "links": [ 95 ] }, { "localized_name": "file_prompts", "name": "file_prompts", "type": "STRING", "links": [ 98 ] }, { "localized_name": "use_file", "name": "use_file", "type": "BOOLEAN", "links": [ 97 ] }, { "localized_name": "refs_attached", "name": "refs_attached", "type": "BOOLEAN", "links": [ 96 ] }, { "localized_name": "name", "name": "name", "type": "STRING", "links": [] } ], "title": "STORY SOURCE", "properties": { "Node name for S&R": "JoyLTX_StorySource" }, "widgets_values": [ "idea file (the writer writes each idea)", "", "joyltx_ideas/rift_s1_recovered.txt", "joyltx_prompts/sample_two_shots.txt", 0, true, "" ], "color": "#232", "bgcolor": "#353" }, { "id": 49, "type": "JoyLTX_RefsByName", "pos": [ 374.2970925080563, -753.1638548757705 ], "size": [ 270, 316 ], "flags": {}, "order": 25, "mode": 0, "inputs": [ { "localized_name": "prompts", "name": "prompts", "type": "STRING", "widget": { "name": "prompts" }, "link": 101 }, { "localized_name": "refs_root", "name": "refs_root", "type": "COMBO", "widget": { "name": "refs_root" }, "link": null }, { "localized_name": "pick", "name": "pick", "type": "COMBO", "widget": { "name": "pick" }, "link": null }, { "localized_name": "seed", "name": "seed", "type": "INT", "widget": { "name": "seed" }, "link": null }, { "localized_name": "width", "name": "width", "type": "INT", "widget": { "name": "width" }, "link": 77 }, { "localized_name": "height", "name": "height", "type": "INT", "widget": { "name": "height" }, "link": 78 }, { "localized_name": "crop", "name": "crop", "shape": 7, "type": "COMBO", "widget": { "name": "crop" }, "link": null } ], "outputs": [ { "localized_name": "ref_images", "name": "ref_images", "type": "IMAGE", "links": [ 80 ] }, { "localized_name": "ref_mask", "name": "ref_mask", "type": "STRING", "links": [ 81 ] }, { "localized_name": "report", "name": "report", "type": "STRING", "links": [] }, { "localized_name": "prompts", "name": "prompts", "type": "STRING", "links": [ 79 ] } ], "title": "REFS BY NAME", "properties": { "Node name for S&R": "JoyLTX_RefsByName" }, "widgets_values": [ "", "joyecho_refs", "one per character (by seed)", 0, "fixed", 960, 544, "portrait (keep the person, drop the set)" ], "color": "#232", "bgcolor": "#353" }, { "id": 31, "type": "JoyEcho_LLMEnhance", "pos": [ -786.2174679442803, 123.61014869018182 ], "size": [ 394.92234829417, 406 ], "flags": {}, "order": 23, "mode": 0, "inputs": [ { "localized_name": "refs_attached", "name": "refs_attached", "shape": 7, "type": "BOOLEAN", "link": 96 }, { "localized_name": "story_idea", "name": "story_idea", "type": "STRING", "widget": { "name": "story_idea" }, "link": 95 }, { "localized_name": "mode", "name": "mode", "type": "COMBO", "widget": { "name": "mode" }, "link": null }, { "localized_name": "api_key", "name": "api_key", "type": "STRING", "widget": { "name": "api_key" }, "link": null }, { "localized_name": "system_prompt", "name": "system_prompt", "type": "STRING", "widget": { "name": "system_prompt" }, "link": null }, { "localized_name": "base_url", "name": "base_url", "shape": 7, "type": "STRING", "widget": { "name": "base_url" }, "link": null }, { "localized_name": "model_name", "name": "model_name", "shape": 7, "type": "COMBO", "widget": { "name": "model_name" }, "link": null }, { "localized_name": "num_shots", "name": "num_shots", "shape": 7, "type": "INT", "widget": { "name": "num_shots" }, "link": null }, { "localized_name": "temperature", "name": "temperature", "shape": 7, "type": "FLOAT", "widget": { "name": "temperature" }, "link": null }, { "localized_name": "num_frames", "name": "num_frames", "shape": 7, "type": "INT", "widget": { "name": "num_frames" }, "link": 57 }, { "localized_name": "fps", "name": "fps", "shape": 7, "type": "FLOAT", "widget": { "name": "fps" }, "link": null }, { "localized_name": "model_name_custom", "name": "model_name_custom", "shape": 7, "type": "STRING", "widget": { "name": "model_name_custom" }, "link": null }, { "localized_name": "join_style", "name": "join_style", "shape": 7, "type": "COMBO", "widget": { "name": "join_style" }, "link": null }, { "localized_name": "unload_model_after", "name": "unload_model_after", "shape": 7, "type": "BOOLEAN", "widget": { "name": "unload_model_after" }, "link": null } ], "outputs": [ { "localized_name": "prompts_json", "name": "prompts_json", "type": "STRING", "slot_index": 0, "links": [ 99 ] } ], "title": "REWRITER (story -> chained shot prompts)", "properties": { "aux_id": "RealRebelAI/ComfyUI_JoyAI_Echo_GGUF_Nodes", "Node name for S&R": "JoyEcho_LLMEnhance", "ver": "0d9e32fcd2d255a16604368fcaa1875c380c7f3b", "je_widget_values": { "story_idea": "Two people talk across a booth in a late-night roadside diner about an impossible power outage: the whole street went dark for six minutes but her repair shop kept running, its lights got brighter, and the meter outside ran backwards. He is a sceptical man in his fifties in a faded blue mechanic's jacket; she is a woman in her late twenties in an oversized cream sweater and round wire-frame glasses. One warm pendant lamp above the table is the only light, rain on the window behind them, static camera at the end of the table holding both of them in a two-shot the whole time. Four shots, one continuous conversation, no camera cuts.", "mode": "long_story (multi-shot)", "api_key": "", "system_prompt": "", "base_url": "http://localhost:11434/v1", "model_name": "minimax-m3:cloud", "num_shots": 3, "temperature": 0.7, "num_frames": 0, "fps": 24, "model_name_custom": "", "join_style": "continuous take (chained, no cuts)", "unload_model_after": true } }, "widgets_values": [ "Two people talk across a booth in a late-night roadside diner about an impossible power outage: the whole street went dark for six minutes but her repair shop kept running, its lights got brighter, and the meter outside ran backwards. He is a sceptical man in his fifties in a faded blue mechanic's jacket; she is a woman in her late twenties in an oversized cream sweater and round wire-frame glasses. One warm pendant lamp above the table is the only light, rain on the window behind them, static camera at the end of the table holding both of them in a two-shot the whole time. Four shots, one continuous conversation, no camera cuts.", "long_story (multi-shot)", "", "", "http://localhost:11434/v1", "minimax-m3:cloud", 3, 0.7, 0, 24, "", "continuous take (chained, no cuts)", true ] }, { "id": 32, "type": "JoyLTX_TakeControls", "pos": [ -1318.6113666898036, 1.9113168369336435 ], "size": [ 473.284765625, 318 ], "flags": {}, "order": 18, "mode": 0, "inputs": [ { "localized_name": "width", "name": "width", "type": "INT", "widget": { "name": "width" }, "link": null }, { "localized_name": "height", "name": "height", "type": "INT", "widget": { "name": "height" }, "link": null }, { "localized_name": "take_seconds", "name": "take_seconds", "type": "FLOAT", "widget": { "name": "take_seconds" }, "link": null }, { "localized_name": "beat_seconds", "name": "beat_seconds", "type": "FLOAT", "widget": { "name": "beat_seconds" }, "link": null }, { "localized_name": "upscale", "name": "upscale", "type": "COMBO", "widget": { "name": "upscale" }, "link": null }, { "localized_name": "vram_gb", "name": "vram_gb", "shape": 7, "type": "FLOAT", "widget": { "name": "vram_gb" }, "link": null } ], "outputs": [ { "localized_name": "pass1_width", "name": "pass1_width", "type": "INT", "links": [ 64, 77 ] }, { "localized_name": "pass1_height", "name": "pass1_height", "type": "INT", "links": [ 65, 78 ] }, { "localized_name": "frames", "name": "frames", "type": "INT", "links": [ 57, 66 ] }, { "localized_name": "two_pass", "name": "two_pass", "type": "BOOLEAN", "links": [ 67 ] }, { "localized_name": "use_x15", "name": "use_x15", "type": "BOOLEAN", "links": [ 53 ] }, { "localized_name": "beats", "name": "beats", "type": "INT", "links": [] }, { "localized_name": "beat_frames", "name": "beat_frames", "type": "INT", "links": [] }, { "localized_name": "summary", "name": "summary", "type": "STRING", "links": null } ], "title": "MASTER CONTROLS (render size / seconds PER SHOT / upscale)", "properties": { "Node name for S&R": "JoyLTX_TakeControls" }, "widgets_values": [ 960, 544, 10.0, 10, "auto", 0 ] }, { "id": 63, "type": "Note", "pos": [ 374, -1233 ], "size": [ 330, 320 ], "flags": {}, "order": 0, "mode": 0, "inputs": [], "outputs": [], "properties": { "Node name for S&R": "Note" }, "widgets_values": [ "REFS BY NAME\n\nCasting from folders. Photos go in ComfyUI/input/// - one folder per character; the folder name is the name you write in the prompt (refs_root is a dropdown of the libraries found).\n\nThe node reads the shot prompts, finds the named character and hands the sampler one photo per shot; the sampler attaches it at frame 0 (ref_strength 0.5). From a character's second shot on, their own rendered face and their own voice carry into every later shot of theirs.\n\npick - 'one per character' uses the same photo for that character all the way through (best identity). Write [ref: name] in a shot to force one; the marker is stripped before rendering.\n\ncrop - portrait keeps the person and drops the room. Use portraits or clean character shots; a busy scene photo drags its set into the render.\n\nNeeds refs_attached ON in STORY SOURCE, or the writer invents faces instead of naming people.\n\nHOW HARD THE PHOTO PULLS (ref_strength on the sampler, measured on one seed)\n0.5 - you get the hair and the clothes, but the face is somebody else.\n0.85 (default) - the face, and the small things: glasses, a piercing.\n1.0 - the photograph's own room comes with it. Use only if you want that.\n\nAGE IS NOT IN THE PHOTOGRAPH. The model renders an adult unless the prompt says otherwise, and a reference photo of a teenager will not stop it. Say the age in the premise (\"Dana, sixteen\") and the writer carries one plain age phrase into every shot. Everything else about how the person looks stays out of the words and comes from the pictures.\n\nONE-OFF PHOTO INSTEAD OF THE LIBRARY: add 'JoyLTX Ref Image (manual)', wire a Load Image into it and its ref_images + ref_mask straight to the sampler (same two inputs this node feeds). One image covers every shot; a batch is one per shot. Name the character on it and the identity + voice locks apply, exactly as if they had a folder." ], "color": "#432", "bgcolor": "#653" } ], "links": [ [ 34, 28, 0, 29, 0, "VIDEO" ], [ 53, 32, 4, 40, 0, "BOOLEAN" ], [ 54, 6, 0, 40, 1, "LATENT_UPSCALE_MODEL" ], [ 55, 39, 0, 40, 2, "LATENT_UPSCALE_MODEL" ], [ 57, 32, 2, 31, 9, "INT" ], [ 59, 3, 0, 42, 1, "CLIP" ], [ 60, 4, 0, 42, 2, "VAE" ], [ 61, 5, 0, 42, 3, "VAE" ], [ 63, 40, 0, 42, 4, "*" ], [ 64, 32, 0, 42, 11, "INT" ], [ 65, 32, 1, 42, 12, "INT" ], [ 66, 32, 2, 42, 13, "INT" ], [ 67, 32, 3, 42, 21, "BOOLEAN" ], [ 68, 42, 0, 28, 0, "IMAGE" ], [ 69, 42, 1, 28, 1, "AUDIO" ], [ 70, 43, 0, 44, 0, "IMAGE" ], [ 71, 44, 0, 42, 5, "IMAGE" ], [ 72, 45, 0, 42, 6, "IMAGE" ], [ 73, 46, 0, 42, 7, "IMAGE" ], [ 74, 2, 0, 48, 0, "MODEL" ], [ 75, 48, 0, 42, 0, "MODEL" ], [ 77, 32, 0, 49, 4, "INT" ], [ 78, 32, 1, 49, 5, "INT" ], [ 79, 49, 3, 42, 9, "STRING" ], [ 80, 49, 0, 42, 8, "IMAGE" ], [ 81, 49, 1, 42, 31, "STRING" ], [ 82, 42, 1, 51, 0, "AUDIO" ], [ 93, 30, 0, 60, 1, "STRING" ], [ 94, 53, 0, 60, 4, "INT" ], [ 95, 60, 0, 31, 1, "STRING" ], [ 96, 60, 3, 31, 0, "BOOLEAN" ], [ 97, 60, 2, 55, 0, "BOOLEAN" ], [ 98, 60, 1, 55, 2, "STRING" ], [ 99, 31, 0, 55, 1, "STRING" ], [ 101, 55, 0, 49, 0, "STRING" ] ], "groups": [ { "id": 1, "title": "1 - WRITE + CONTROLS", "bounding": [ -1364.9358677377716, -388.10202224078375, 572.9230084172887, 969.759380969586 ], "color": "#3f789e", "flags": {} }, { "id": 2, "title": "2 - WRITER", "bounding": [ -790.8173372777662, -146.82838754177436, 407.04350343153584, 728.6013387540465 ], "color": "#88A", "flags": {} }, { "id": 3, "title": "3 - ENGINE: LTX-2.5 (Joy-LTX)", "bounding": [ -382.59678039651567, -359.9521522973409, 1099.8626414016546, 941.7654506704566 ], "color": "#a1309b", "flags": {} }, { "id": 4, "title": "4 - OUT", "bounding": [ 718.4362518669685, -359.9134256610992, 706.7829259492004, 941.3284364633405 ], "color": "#3f9e60", "flags": {} }, { "id": 5, "title": "I2V & Keyframes", "bounding": [ 682.2193874829999, -970.4116576172348, 748.7281413684115, 609.7344876615318 ], "color": "#3f789e", "flags": {} }, { "id": 6, "title": "LoRAs & References", "bounding": [ -383.43689930536544, -854.9918192171185, 1064.5779602187529, 494.12011935508764 ], "color": "#8AA", "flags": {} }, { "id": 7, "title": "Prompt Queue", "bounding": [ -790.5361501952899, -962.8404102655214, 406.661149865525, 815.1228512601326 ], "color": "#A88", "flags": {} } ], "config": {}, "extra": { "ds": { "scale": 1.0666093542391846, "offset": [ 2340.2594894952176, 1124.1045276977288 ] } }, "version": 0.4 }