diff --git a/docs/serviceTemplates/README.md b/docs/serviceTemplates/README.md index da37c18b8..7b82e965d 100644 --- a/docs/serviceTemplates/README.md +++ b/docs/serviceTemplates/README.md @@ -28,9 +28,11 @@ Templates are validated against `ServiceTemplateSchema` | `image` + exactly one of `tag` / `checksum` / `dockerfile` | Image spec (`dockerfile` triggers a build and is gated per daemon by `allowImageBuild`) | | `exposedPorts` | Container ports forwarded to host ports and returned as service endpoints | | `command` / `entrypoint` | Docker CMD / ENTRYPOINT overrides | +| `commandFile` | Path to a script, resolved relative to this directory and inlined as `command[0]` at load time (mutually exclusive with `command`) | | `envVars` | Fixed operator-set env vars (values never returned to callers) | | `userConfigurableEnvVars` | Env vars the consumer supplies via ECIES-encrypted `userData` (optional regex `validation`, `sensitive` UI hint) | | `requiredResources` / `recommendedResources` | Gate/score environment selection (`min` is enforced at `SERVICE_START`) | +| `workflows` | Selectable graphs for UI-driven templates; each entry is `id` / `name` / `file` (a path to the graph JSON, resolved relative to this directory and inlined into `graph` at load time) | ## Templates in this folder @@ -101,6 +103,56 @@ so no `command` override is needed. Bundles ComfyUI-Manager for installing check custom nodes from the UI; `HF_TOKEN` / `CIVITAI_TOKEN` are optional user env vars for gated downloads. ~10 GB VRAM for SDXL. +### `ltx-video-ugc-product.json` — ComfyUI, LTX-2.3 product video (GPU) + +A product photo becomes a 9:16 vertical clip (720×1280, 5 s) with camera motion and ambient +audio, using the fixed workflow `workflows/ocean_ugc_product.json`. Needs a CUDA GPU with +48 GB+ VRAM. + +Pick a persistent-storage bucket: it holds ComfyUI's whole base directory, so the ~38 GiB +weight set downloads only on the first launch, and clips are written to the bucket root where +the storage API's `listFiles` (top-level files only) can see them. Without a bucket everything +goes to `/tmp` and is lost on stop. + +### `ltx-video-ugc-multishot.json` — ComfyUI, LTX-2.3 multishot UGC reel (GPU) + +Same image and bucket behavior, but builds a 15-shot vertical reel (704×1280, 5 s per shot) +with one consistent character. Ships two workflows: + +- `workflows/ocean_ugc_multishot.json` — renders one shot per Run. +- `workflows/ocean_ugc_assemble.json` — concatenates rendered shots into one reel. + +Upload a person photo and/or a product photo — both optional, prompt-only also works — type one +prompt per line into the shot-list box, then click **Run**. Each Run renders the shot at the current shot index and the index advances +automatically, so review the clip before running the next. Don't like a take? Set the index back +to that shot's number and Run again — SaveVideo appends a counter rather than overwriting, so +both takes land in the bucket and you choose which to use at assembly time. + +Clips save to the bucket root as `shot_00.mp4`, `shot_01.mp4`, etc. Once every shot looks good, +switch to the **Assemble reel** workflow, pick the shots to use in its `LoadVideo` slots, and +Run — it concatenates them (image + audio) into one clip inside ComfyUI, no external editor +needed. + +The shot index wraps at the shot count, so a run past the last line starts again at line 0. +Update *Shots in list* if you change how many lines are in the shot list. + +## The shared bootstrap (`ltx-video-ugc-bootstrap.sh`) + +Both templates inline this script via `commandFile`. It runs ComfyUI from the image's +read-only bundle with `--base-directory` pointed at the bucket, bypassing the image entrypoint, +which writes to `/root/ComfyUI` and fails wherever the container is not uid 0. + +The workflow arrives as userData (`COMFY_WORKFLOW_ID` + gzipped `COMFY_WORKFLOW`) and is +installed at `custom_nodes//example_workflows/.json`, which ComfyUI serves at +`/api/workflow_templates//.json` — so `?template=&source=` deep-links it. +`source` must name the module; `source=all` only searches ComfyUI's own templates. It is also +copied into `user/default/workflows/` so it appears in the Workflows sidebar. + +Weights are not listed here: the script downloads the HuggingFace URLs carried by the installed +graph itself, so each template fetches only what it loads and a new workflow needs no change +here. A template's `envVars` cannot drive this — nothing merges them into a service container +(`SERVICE_START` has no template id; the container env comes only from `userData`). + ### `automatic1111.json` — Stable Diffusion WebUI (A1111) (GPU) The classic AUTOMATIC1111 UI (`universonic/stable-diffusion-webui`). The image entrypoint diff --git a/docs/serviceTemplates/ltx-video-ugc-bootstrap.sh b/docs/serviceTemplates/ltx-video-ugc-bootstrap.sh new file mode 100755 index 000000000..e7e978324 --- /dev/null +++ b/docs/serviceTemplates/ltx-video-ugc-bootstrap.sh @@ -0,0 +1,192 @@ +#!/bin/bash +# Bypasses the image entrypoint, which writes to /root/ComfyUI and fails where the container +# is not uid 0. +set -euo pipefail + +WF_ID="${COMFY_WORKFLOW_ID:-}" +# Client-supplied, and becomes a directory + filename. userConfigurableEnvVars.validation is not +# enforced node-side, so this is the only guard against traversal. No dots: it becomes a Python +# module name. +if [ -n "$WF_ID" ] && ! [[ "$WF_ID" =~ ^[A-Za-z0-9_-]{1,64}$ ]]; then + echo "[ocean] invalid COMFY_WORKFLOW_ID" >&2 + exit 1 +fi + +echo "[ocean] $(id) | /data/outputs: $(ls -ld /data/outputs 2>&1 | head -1)" + +if [ -d /data/outputs ]; then + BASE=/data/outputs/comfy + # Rendered shots land in --output-directory; LoadVideo's dropdown only lists --input-directory. + # Same path for both, so the assemble workflow can pick up clips the generate workflow made. + INPUT_DIR=/data/outputs + OUTPUT_DIR_ARGS="--output-directory /data/outputs --input-directory $INPUT_DIR" +else + BASE=/tmp/comfy + INPUT_DIR="$BASE/input" + OUTPUT_DIR_ARGS="" + echo "[ocean] no bucket mounted — models download to the container and are lost on stop." \ + "If you did select a bucket, the node is not applying outputBucketId: check that it runs" \ + "ocean-node with service bucket-mount support, and that persistentStorage is configured." >&2 +fi + +MODELS="$BASE/models" +mkdir -p "$MODELS/checkpoints" "$MODELS/loras" "$MODELS/text_encoders" \ + "$MODELS/latent_upscale_models" "$BASE/output" "$INPUT_DIR" "$BASE/temp" "$BASE/user" + +# .part then rename: a truncated file in a persistent bucket would look cached forever. +get() { + if [ -f "$2" ]; then + echo "[ocean] cached $(basename "$2")" + return 0 + fi + echo "[ocean] downloading $(basename "$2")" + http_code=$(curl -L --retry 5 --retry-delay 5 -C - -o "$2.part" -w '%{http_code}' "$1") + if [ "$http_code" = "416" ] && [ -f "$2.part" ]; then + echo "[ocean] $(basename "$2").part already complete" + elif [ "$http_code" -lt 200 ] || [ "$http_code" -ge 300 ]; then + echo "[ocean] download failed for $(basename "$2") (HTTP $http_code)" >&2 + return 22 + fi + # A proxy or HF error page returns a few hundred bytes with HTTP 200; without this floor that + # body would be cached as a model. Smallest real file is ~300 MB. + size=$(wc -c < "$2.part") + if [ "$size" -lt 10485760 ]; then + echo "[ocean] $(basename "$2") is only $size bytes — not a model file. First bytes:" >&2 + head -c 300 "$2.part" >&2 || true + echo >&2 + rm -f "$2.part" + return 22 + fi + mv "$2.part" "$2" +} + +WORKFLOW_JSON="" +if [ -n "$WF_ID" ] && [ -n "${COMFY_WORKFLOW:-}" ]; then + # Pack dir is named after $WF_ID (the first workflow), so ?template=&source= resolves + # with no hard-coded name on either side. COMFY_WORKFLOW carries every workflow the template + # ships as {"": , ...} — each entry gets its own file in the pack + sidebar. + PACK="$BASE/custom_nodes/$WF_ID" + SAVED="$BASE/user/default/workflows" + mkdir -p "$PACK/example_workflows" "$SAVED" + echo 'NODE_CLASS_MAPPINGS = {}' > "$PACK/__init__.py" + RAW="$PACK/.comfy_workflow_payload.json" + # Escrow is already claimed: a corrupt payload must not kill the container. + if printf '%s' "$COMFY_WORKFLOW" | base64 -d | gunzip > "$RAW"; then + # `|| true`: a decoded-but-malformed payload (wrong shape, bad ids) must not abort either. + INSTALLED=$(python3.13 - "$RAW" "$PACK/example_workflows" "$SAVED" "$WF_ID" <<'PY' || true +import json, re, sys +raw_path, pack_dir, saved_dir = sys.argv[1:4] +try: + payload = json.load(open(raw_path, encoding='utf-8')) + if not isinstance(payload, dict) or not payload: + raise ValueError('expected a non-empty object') +except Exception as e: + print(f'[ocean] COMFY_WORKFLOW did not decode to an object: {e}', file=sys.stderr) + sys.exit(0) +# A bare graph has a top-level "nodes" list; an id -> graph map does not. Without this check a +# bare graph installs one junk file per dict-valued key it happens to have (config, extra, ...). +if isinstance(payload.get('nodes'), list): + payload = {sys.argv[4]: payload} +for wf_id, graph in payload.items(): + if not re.fullmatch(r'[A-Za-z0-9_.-]{1,64}', wf_id): + print(f'[ocean] skipping workflow with unsafe id {wf_id!r}', file=sys.stderr) + continue + if not isinstance(graph, dict): + print(f'[ocean] skipping workflow {wf_id!r} — graph is not an object', file=sys.stderr) + continue + text = json.dumps(graph, ensure_ascii=False) + open(f'{pack_dir}/{wf_id}.json', 'w', encoding='utf-8').write(text) + open(f'{saved_dir}/{wf_id}.json', 'w', encoding='utf-8').write(text) + print(wf_id) +PY +) + rm -f "$RAW" + if [ -n "$INSTALLED" ]; then + echo "[ocean] installed workflows: $(echo "$INSTALLED" | tr '\n' ' ') (template pack + Workflows sidebar)" + if [ -f "$PACK/example_workflows/$WF_ID.json" ]; then + WORKFLOW_JSON="$PACK/example_workflows/$WF_ID.json" + else + echo "[ocean] COMFY_WORKFLOW_ID ($WF_ID) was not among the installed workflows" >&2 + fi + else + echo "[ocean] no workflows installed from COMFY_WORKFLOW — starting ComfyUI without one" >&2 + fi + else + echo "[ocean] failed to decode COMFY_WORKFLOW — starting ComfyUI without a workflow" >&2 + rm -f "$RAW" + fi +fi + +# The graph carries the HuggingFace URLs for everything it loads, so each template fetches only +# what it uses and a new workflow needs no edit here. Template envVars can't drive this: nothing +# merges them into a service container. +if [ -n "$WORKFLOW_JSON" ]; then + # `|| true` and the except are both needed: a payload that gunzips but isn't a graph must not + # abort the bootstrap after escrow is claimed. + MODEL_URLS=$(python3.13 - "$WORKFLOW_JSON" <<'PY' || true +import json, re, sys +seen = [] +def walk(o): + if isinstance(o, dict): + for v in o.values(): walk(v) + elif isinstance(o, list): + for v in o: walk(v) + elif isinstance(o, str): + for m in re.findall(r'https://huggingface\.co/[^\s\)\]"]+?\.safetensors', o): + if m not in seen: seen.append(m) +try: + walk(json.load(open(sys.argv[1]))) +except Exception as e: + print(f'[ocean] cannot read model URLs from the workflow: {e}', file=sys.stderr) +print('\n'.join(seen)) +PY +) + if [ -z "$MODEL_URLS" ]; then + echo "[ocean] no model URLs found in the workflow — ComfyUI will start without weights" >&2 + fi + for url in $MODEL_URLS; do + case "$url" in + */text_encoders/*) sub=text_encoders ;; + */loras/*) sub=loras ;; + *upscaler*) sub=latent_upscale_models ;; + *) sub=checkpoints ;; + esac + # One renamed file must not cost the whole paid session. + get "$url" "$MODELS/$sub/$(basename "$url")" || + echo "[ocean] could not fetch $(basename "$url") — ComfyUI will start without it" >&2 + done +else + echo "[ocean] no workflow supplied — skipping model download" >&2 +fi + +# The graph's LoadImage/LoadAudio widgets name example assets that ship inside the +# comfyui-workflow-templates package. Copying them into input/ is what makes the first Queue +# work without the user uploading anything. +if [ -n "$WORKFLOW_JSON" ]; then + python3.13 - "$WORKFLOW_JSON" "$INPUT_DIR" <<'PY' || true +import json, shutil, sys +from pathlib import Path +try: + import comfyui_workflow_templates as pkg + src = Path(pkg.__file__).parent / 'templates' + graph = json.load(open(sys.argv[1])) + dest = Path(sys.argv[2]) + for node in graph.get('nodes', []): + if node.get('type') in ('LoadImage', 'LoadAudio'): + name = (node.get('widgets_values') or [None])[0] + if name and (src / name).is_file() and not (dest / name).exists(): + shutil.copy2(src / name, dest / name) + print(f'[ocean] seeded input {name}') +except Exception as e: + print(f'[ocean] could not seed example inputs: {e}', file=sys.stderr) +PY +fi + +export HOME="$BASE" +export PYTHONPYCACHEPREFIX="$BASE/.cache/pycache" +export XDG_CACHE_HOME="$BASE/.cache" +export HF_HOME="$BASE/.cache/huggingface" + +echo "[ocean] starting ComfyUI with base directory $BASE" +exec python3.13 /default-comfyui-bundle/ComfyUI/main.py \ + --base-directory "$BASE" ${OUTPUT_DIR_ARGS} --listen --port 8188 ${CLI_ARGS:-} diff --git a/docs/serviceTemplates/ltx-video-ugc-multishot.json b/docs/serviceTemplates/ltx-video-ugc-multishot.json new file mode 100644 index 000000000..f08085cac --- /dev/null +++ b/docs/serviceTemplates/ltx-video-ugc-multishot.json @@ -0,0 +1,66 @@ +{ + "id": "ltx-video-ugc-multishot", + "name": "ComfyUI — UGC multishot reel (LTX-2.3)", + "description": "ComfyUI preloaded with LTX-2.3 (IC-LoRA Ingredients) for a 15-shot vertical UGC product reel with one consistent character. Usage: optionally upload a person photo and/or a product photo as the workflow's two image inputs — both are optional, so leaving both empty renders from the prompt alone — then type one prompt per line in its shot-list text box (each line a distinct camera angle/action, e.g. close-up on the product, hands unboxing, walking outdoors), then click Run once — it renders the shot at the current shot index and the index advances automatically, so review each clip before running the next; set the index back to a shot number and Run again to redo one you don't like. Clips are 9:16 vertical (704×1280, both divisible by 32 as LTX requires) at 5 seconds each (125 frames at 25 fps), saved to the bucket root as shot_00.mp4, shot_01.mp4, etc. Once every shot is good, switch to the Assemble reel workflow to concatenate them into one clip inside ComfyUI — no external editor needed. Select a persistent-storage bucket: it holds ComfyUI's whole base directory, so the ~39 GiB of weights download once and are reused, and the numbered shot clips land in the bucket root where the storage API's listFiles can see them. Needs a CUDA GPU with 48 GB+ VRAM.", + "image": "yanwk/comfyui-boot", + "tag": "cu130-megapak-pt211-20260803", + "exposedPorts": [ + 8188 + ], + "entrypoint": [ + "/bin/bash", + "-c" + ], + "commandFile": "ltx-video-ugc-bootstrap.sh", + "workflows": [ + { + "id": "ocean_ugc_multishot", + "name": "Multishot reel (15 shots)", + "description": "Upload an optional person photo and/or product photo (both optional — prompt-only also works) and a 15-line shot list, then click Run once per shot — the shot index advances automatically and you review each clip before the next. Produces numbered 9:16 clips (shot_00.mp4, shot_01.mp4, …).", + "file": "workflows/ocean_ugc_multishot.json" + }, + { + "id": "ocean_ugc_assemble", + "name": "Assemble reel", + "description": "Concatenates up to 8 rendered shot_NN.mp4 clips (video + audio) into a single reel using core ComfyUI video nodes — pick clips in the LoadVideo dropdowns, bypass any slots you don't need, and Run.", + "file": "workflows/ocean_ugc_assemble.json" + } + ], + "userConfigurableEnvVars": [ + { + "key": "COMFY_WORKFLOW_ID", + "validation": "^[A-Za-z0-9_-]+$" + }, + { + "key": "COMFY_WORKFLOW" + } + ], + "requiredResources": [ + { + "id": "cpu", + "min": 8, + "recommended": 16, + "unit": "cores" + }, + { + "id": "ram", + "min": 48, + "recommended": 128, + "unit": "GB" + }, + { + "id": "disk", + "min": 45, + "recommended": 85, + "unit": "GB" + }, + { + "kind": "discrete", + "type": "gpu", + "min": 1, + "recommended": 1, + "unit": "count", + "description": "CUDA GPU, 48 GB+ VRAM recommended (LTX-2.3 22B distilled fp8 + Gemma-3-12B encoder)" + } + ] +} diff --git a/docs/serviceTemplates/ltx-video-ugc-product.json b/docs/serviceTemplates/ltx-video-ugc-product.json new file mode 100644 index 000000000..b8367a324 --- /dev/null +++ b/docs/serviceTemplates/ltx-video-ugc-product.json @@ -0,0 +1,60 @@ +{ + "id": "ltx-video-ugc-product", + "name": "ComfyUI — UGC product video (LTX-2.3)", + "description": "ComfyUI preloaded with LTX-2.3 for vertical short-form product video: a product photo becomes a 9:16 clip with camera motion and ambient audio, capped at the graph's 5 seconds (126 frames at 25 fps). Select a persistent-storage bucket: it holds ComfyUI's whole base directory, so the 38 GiB of weights download once and are reused, and generated clips land in the bucket root. Needs a CUDA GPU with 48 GB+ VRAM.", + "image": "yanwk/comfyui-boot", + "tag": "cu130-megapak-pt211-20260803", + "exposedPorts": [ + 8188 + ], + "entrypoint": [ + "/bin/bash", + "-c" + ], + "commandFile": "ltx-video-ugc-bootstrap.sh", + "workflows": [ + { + "id": "ocean_ugc_product", + "name": "Product → vertical clip", + "description": "Upload a product photo, get a 9:16 clip with camera motion and ambient audio.", + "file": "workflows/ocean_ugc_product.json" + } + ], + "userConfigurableEnvVars": [ + { + "key": "COMFY_WORKFLOW_ID", + "validation": "^[A-Za-z0-9_-]+$" + }, + { + "key": "COMFY_WORKFLOW" + } + ], + "requiredResources": [ + { + "id": "cpu", + "min": 8, + "recommended": 16, + "unit": "cores" + }, + { + "id": "ram", + "min": 48, + "recommended": 128, + "unit": "GB" + }, + { + "id": "disk", + "min": 40, + "recommended": 80, + "unit": "GB" + }, + { + "kind": "discrete", + "type": "gpu", + "min": 1, + "recommended": 1, + "unit": "count", + "description": "CUDA GPU, 48 GB+ VRAM recommended (LTX-2.3 22B fp8 + Gemma-3-12B encoder)" + } + ] +} diff --git a/docs/serviceTemplates/workflows/ocean_ugc_assemble.json b/docs/serviceTemplates/workflows/ocean_ugc_assemble.json new file mode 100644 index 000000000..4fb092844 --- /dev/null +++ b/docs/serviceTemplates/workflows/ocean_ugc_assemble.json @@ -0,0 +1,1759 @@ +{ + "id": "f0a7b59b-e37f-4ce2-9564-e772ecd7d9c2", + "revision": 0, + "last_node_id": 51, + "last_link_id": 40, + "nodes": [ + { + "id": 1, + "type": "MarkdownNote", + "pos": [ + -2000.0, + 0.0 + ], + "size": [ + 1600, + 260 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [], + "outputs": [], + "properties": {}, + "widgets_values": [ + "## Assemble reel\n\nPick a rendered `shot_NN.mp4` in each slot's **file** dropdown below (the dropdown lists what's been generated in the bucket — hit ComfyUI's refresh icon if a clip you just rendered isn't listed yet).\n\n**Bypass (Ctrl+B) any slot you don't need.** The chain concatenates whichever slots stay active, in order, so an unused tail slot just needs bypassing — no rewiring.\n\nClick **Run** once. The stitched reel saves as `reel_00001.mp4` in the bucket root.\n\nOnly 8 slots: each 5 s clip is ~125 frames at 704×1280 in float32, about 1.3 GB as a tensor — 15 slots (the multishot template's shot count) would need ~20 GB of RAM just to hold the frames. 8 slots gives a ~40 s reel and stays comfortably inside this template's 128 GB." + ], + "title": "How to use" + }, + { + "id": 10, + "type": "LoadVideo", + "pos": [ + 0.0, + 0.0 + ], + "size": [ + 270, + 100 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "VIDEO", + "type": "VIDEO", + "links": [ + 1 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "Node name for S&R": "LoadVideo" + }, + "widgets_values": [ + "shot_00.mp4" + ], + "title": "Shot 1" + }, + { + "id": 20, + "type": "GetVideoComponents", + "pos": [ + 350.0, + 0.0 + ], + "size": [ + 270, + 126 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "video", + "type": "VIDEO", + "link": 1 + } + ], + "outputs": [ + { + "name": "images", + "type": "IMAGE", + "links": [ + 9 + ] + }, + { + "name": "audio", + "type": "AUDIO", + "links": [ + 23 + ] + }, + { + "name": "fps", + "type": "FLOAT", + "links": [ + 38 + ] + }, + { + "name": "bit_depth", + "type": "INT", + "links": [] + } + ], + "properties": { + "cnr_id": "comfy-core", + "Node name for S&R": "GetVideoComponents" + }, + "title": "Shot 1 components" + }, + { + "id": 11, + "type": "LoadVideo", + "pos": [ + 0.0, + 150.0 + ], + "size": [ + 270, + 100 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "VIDEO", + "type": "VIDEO", + "links": [ + 2 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "Node name for S&R": "LoadVideo" + }, + "widgets_values": [ + "shot_01.mp4" + ], + "title": "Shot 2" + }, + { + "id": 21, + "type": "GetVideoComponents", + "pos": [ + 350.0, + 150.0 + ], + "size": [ + 270, + 126 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "video", + "type": "VIDEO", + "link": 2 + } + ], + "outputs": [ + { + "name": "images", + "type": "IMAGE", + "links": [ + 10 + ] + }, + { + "name": "audio", + "type": "AUDIO", + "links": [ + 24 + ] + }, + { + "name": "fps", + "type": "FLOAT", + "links": [] + }, + { + "name": "bit_depth", + "type": "INT", + "links": [] + } + ], + "properties": { + "cnr_id": "comfy-core", + "Node name for S&R": "GetVideoComponents" + }, + "title": "Shot 2 components" + }, + { + "id": 12, + "type": "LoadVideo", + "pos": [ + 0.0, + 300.0 + ], + "size": [ + 270, + 100 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "VIDEO", + "type": "VIDEO", + "links": [ + 3 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "Node name for S&R": "LoadVideo" + }, + "widgets_values": [ + "shot_02.mp4" + ], + "title": "Shot 3" + }, + { + "id": 22, + "type": "GetVideoComponents", + "pos": [ + 350.0, + 300.0 + ], + "size": [ + 270, + 126 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "video", + "type": "VIDEO", + "link": 3 + } + ], + "outputs": [ + { + "name": "images", + "type": "IMAGE", + "links": [ + 12 + ] + }, + { + "name": "audio", + "type": "AUDIO", + "links": [ + 26 + ] + }, + { + "name": "fps", + "type": "FLOAT", + "links": [] + }, + { + "name": "bit_depth", + "type": "INT", + "links": [] + } + ], + "properties": { + "cnr_id": "comfy-core", + "Node name for S&R": "GetVideoComponents" + }, + "title": "Shot 3 components" + }, + { + "id": 13, + "type": "LoadVideo", + "pos": [ + 0.0, + 450.0 + ], + "size": [ + 270, + 100 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "VIDEO", + "type": "VIDEO", + "links": [ + 4 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "Node name for S&R": "LoadVideo" + }, + "widgets_values": [ + "shot_03.mp4" + ], + "title": "Shot 4" + }, + { + "id": 23, + "type": "GetVideoComponents", + "pos": [ + 350.0, + 450.0 + ], + "size": [ + 270, + 126 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "video", + "type": "VIDEO", + "link": 4 + } + ], + "outputs": [ + { + "name": "images", + "type": "IMAGE", + "links": [ + 14 + ] + }, + { + "name": "audio", + "type": "AUDIO", + "links": [ + 28 + ] + }, + { + "name": "fps", + "type": "FLOAT", + "links": [] + }, + { + "name": "bit_depth", + "type": "INT", + "links": [] + } + ], + "properties": { + "cnr_id": "comfy-core", + "Node name for S&R": "GetVideoComponents" + }, + "title": "Shot 4 components" + }, + { + "id": 14, + "type": "LoadVideo", + "pos": [ + 0.0, + 600.0 + ], + "size": [ + 270, + 100 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "VIDEO", + "type": "VIDEO", + "links": [ + 5 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "Node name for S&R": "LoadVideo" + }, + "widgets_values": [ + "shot_04.mp4" + ], + "title": "Shot 5" + }, + { + "id": 24, + "type": "GetVideoComponents", + "pos": [ + 350.0, + 600.0 + ], + "size": [ + 270, + 126 + ], + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "video", + "type": "VIDEO", + "link": 5 + } + ], + "outputs": [ + { + "name": "images", + "type": "IMAGE", + "links": [ + 16 + ] + }, + { + "name": "audio", + "type": "AUDIO", + "links": [ + 30 + ] + }, + { + "name": "fps", + "type": "FLOAT", + "links": [] + }, + { + "name": "bit_depth", + "type": "INT", + "links": [] + } + ], + "properties": { + "cnr_id": "comfy-core", + "Node name for S&R": "GetVideoComponents" + }, + "title": "Shot 5 components" + }, + { + "id": 15, + "type": "LoadVideo", + "pos": [ + 0.0, + 750.0 + ], + "size": [ + 270, + 100 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "VIDEO", + "type": "VIDEO", + "links": [ + 6 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "Node name for S&R": "LoadVideo" + }, + "widgets_values": [ + "shot_05.mp4" + ], + "title": "Shot 6" + }, + { + "id": 25, + "type": "GetVideoComponents", + "pos": [ + 350.0, + 750.0 + ], + "size": [ + 270, + 126 + ], + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "video", + "type": "VIDEO", + "link": 6 + } + ], + "outputs": [ + { + "name": "images", + "type": "IMAGE", + "links": [ + 18 + ] + }, + { + "name": "audio", + "type": "AUDIO", + "links": [ + 32 + ] + }, + { + "name": "fps", + "type": "FLOAT", + "links": [] + }, + { + "name": "bit_depth", + "type": "INT", + "links": [] + } + ], + "properties": { + "cnr_id": "comfy-core", + "Node name for S&R": "GetVideoComponents" + }, + "title": "Shot 6 components" + }, + { + "id": 16, + "type": "LoadVideo", + "pos": [ + 0.0, + 900.0 + ], + "size": [ + 270, + 100 + ], + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "VIDEO", + "type": "VIDEO", + "links": [ + 7 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "Node name for S&R": "LoadVideo" + }, + "widgets_values": [ + "shot_06.mp4" + ], + "title": "Shot 7" + }, + { + "id": 26, + "type": "GetVideoComponents", + "pos": [ + 350.0, + 900.0 + ], + "size": [ + 270, + 126 + ], + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "name": "video", + "type": "VIDEO", + "link": 7 + } + ], + "outputs": [ + { + "name": "images", + "type": "IMAGE", + "links": [ + 20 + ] + }, + { + "name": "audio", + "type": "AUDIO", + "links": [ + 34 + ] + }, + { + "name": "fps", + "type": "FLOAT", + "links": [] + }, + { + "name": "bit_depth", + "type": "INT", + "links": [] + } + ], + "properties": { + "cnr_id": "comfy-core", + "Node name for S&R": "GetVideoComponents" + }, + "title": "Shot 7 components" + }, + { + "id": 17, + "type": "LoadVideo", + "pos": [ + 0.0, + 1050.0 + ], + "size": [ + 270, + 100 + ], + "flags": {}, + "order": 15, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "VIDEO", + "type": "VIDEO", + "links": [ + 8 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "Node name for S&R": "LoadVideo" + }, + "widgets_values": [ + "shot_07.mp4" + ], + "title": "Shot 8" + }, + { + "id": 27, + "type": "GetVideoComponents", + "pos": [ + 350.0, + 1050.0 + ], + "size": [ + 270, + 126 + ], + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "video", + "type": "VIDEO", + "link": 8 + } + ], + "outputs": [ + { + "name": "images", + "type": "IMAGE", + "links": [ + 22 + ] + }, + { + "name": "audio", + "type": "AUDIO", + "links": [ + 36 + ] + }, + { + "name": "fps", + "type": "FLOAT", + "links": [] + }, + { + "name": "bit_depth", + "type": "INT", + "links": [] + } + ], + "properties": { + "cnr_id": "comfy-core", + "Node name for S&R": "GetVideoComponents" + }, + "title": "Shot 8 components" + }, + { + "id": 30, + "type": "ImageBatch", + "pos": [ + 760.0, + 260.0 + ], + "size": [ + 210, + 60 + ], + "flags": { + "collapsed": true + }, + "order": 17, + "mode": 0, + "inputs": [ + { + "name": "image1", + "type": "IMAGE", + "link": 9 + }, + { + "name": "image2", + "type": "IMAGE", + "link": 10 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 11 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "Node name for S&R": "ImageBatch" + } + }, + { + "id": 31, + "type": "ImageBatch", + "pos": [ + 950.0, + 260.0 + ], + "size": [ + 210, + 60 + ], + "flags": { + "collapsed": true + }, + "order": 18, + "mode": 0, + "inputs": [ + { + "name": "image1", + "type": "IMAGE", + "link": 11 + }, + { + "name": "image2", + "type": "IMAGE", + "link": 12 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 13 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "Node name for S&R": "ImageBatch" + } + }, + { + "id": 32, + "type": "ImageBatch", + "pos": [ + 1140.0, + 260.0 + ], + "size": [ + 210, + 60 + ], + "flags": { + "collapsed": true + }, + "order": 19, + "mode": 0, + "inputs": [ + { + "name": "image1", + "type": "IMAGE", + "link": 13 + }, + { + "name": "image2", + "type": "IMAGE", + "link": 14 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 15 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "Node name for S&R": "ImageBatch" + } + }, + { + "id": 33, + "type": "ImageBatch", + "pos": [ + 1330.0, + 260.0 + ], + "size": [ + 210, + 60 + ], + "flags": { + "collapsed": true + }, + "order": 20, + "mode": 0, + "inputs": [ + { + "name": "image1", + "type": "IMAGE", + "link": 15 + }, + { + "name": "image2", + "type": "IMAGE", + "link": 16 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 17 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "Node name for S&R": "ImageBatch" + } + }, + { + "id": 34, + "type": "ImageBatch", + "pos": [ + 1520.0, + 260.0 + ], + "size": [ + 210, + 60 + ], + "flags": { + "collapsed": true + }, + "order": 21, + "mode": 0, + "inputs": [ + { + "name": "image1", + "type": "IMAGE", + "link": 17 + }, + { + "name": "image2", + "type": "IMAGE", + "link": 18 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 19 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "Node name for S&R": "ImageBatch" + } + }, + { + "id": 35, + "type": "ImageBatch", + "pos": [ + 1710.0, + 260.0 + ], + "size": [ + 210, + 60 + ], + "flags": { + "collapsed": true + }, + "order": 22, + "mode": 0, + "inputs": [ + { + "name": "image1", + "type": "IMAGE", + "link": 19 + }, + { + "name": "image2", + "type": "IMAGE", + "link": 20 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 21 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "Node name for S&R": "ImageBatch" + } + }, + { + "id": 36, + "type": "ImageBatch", + "pos": [ + 1900.0, + 260.0 + ], + "size": [ + 210, + 60 + ], + "flags": { + "collapsed": true + }, + "order": 23, + "mode": 0, + "inputs": [ + { + "name": "image1", + "type": "IMAGE", + "link": 21 + }, + { + "name": "image2", + "type": "IMAGE", + "link": 22 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 37 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "Node name for S&R": "ImageBatch" + } + }, + { + "id": 40, + "type": "AudioConcat", + "pos": [ + 760.0, + 480.0 + ], + "size": [ + 210, + 78 + ], + "flags": { + "collapsed": true + }, + "order": 24, + "mode": 0, + "inputs": [ + { + "name": "audio1", + "type": "AUDIO", + "link": 23 + }, + { + "name": "audio2", + "type": "AUDIO", + "link": 24 + } + ], + "outputs": [ + { + "name": "AUDIO", + "type": "AUDIO", + "links": [ + 25 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "Node name for S&R": "AudioConcat" + }, + "widgets_values": [ + "after" + ] + }, + { + "id": 41, + "type": "AudioConcat", + "pos": [ + 950.0, + 480.0 + ], + "size": [ + 210, + 78 + ], + "flags": { + "collapsed": true + }, + "order": 25, + "mode": 0, + "inputs": [ + { + "name": "audio1", + "type": "AUDIO", + "link": 25 + }, + { + "name": "audio2", + "type": "AUDIO", + "link": 26 + } + ], + "outputs": [ + { + "name": "AUDIO", + "type": "AUDIO", + "links": [ + 27 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "Node name for S&R": "AudioConcat" + }, + "widgets_values": [ + "after" + ] + }, + { + "id": 42, + "type": "AudioConcat", + "pos": [ + 1140.0, + 480.0 + ], + "size": [ + 210, + 78 + ], + "flags": { + "collapsed": true + }, + "order": 26, + "mode": 0, + "inputs": [ + { + "name": "audio1", + "type": "AUDIO", + "link": 27 + }, + { + "name": "audio2", + "type": "AUDIO", + "link": 28 + } + ], + "outputs": [ + { + "name": "AUDIO", + "type": "AUDIO", + "links": [ + 29 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "Node name for S&R": "AudioConcat" + }, + "widgets_values": [ + "after" + ] + }, + { + "id": 43, + "type": "AudioConcat", + "pos": [ + 1330.0, + 480.0 + ], + "size": [ + 210, + 78 + ], + "flags": { + "collapsed": true + }, + "order": 27, + "mode": 0, + "inputs": [ + { + "name": "audio1", + "type": "AUDIO", + "link": 29 + }, + { + "name": "audio2", + "type": "AUDIO", + "link": 30 + } + ], + "outputs": [ + { + "name": "AUDIO", + "type": "AUDIO", + "links": [ + 31 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "Node name for S&R": "AudioConcat" + }, + "widgets_values": [ + "after" + ] + }, + { + "id": 44, + "type": "AudioConcat", + "pos": [ + 1520.0, + 480.0 + ], + "size": [ + 210, + 78 + ], + "flags": { + "collapsed": true + }, + "order": 28, + "mode": 0, + "inputs": [ + { + "name": "audio1", + "type": "AUDIO", + "link": 31 + }, + { + "name": "audio2", + "type": "AUDIO", + "link": 32 + } + ], + "outputs": [ + { + "name": "AUDIO", + "type": "AUDIO", + "links": [ + 33 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "Node name for S&R": "AudioConcat" + }, + "widgets_values": [ + "after" + ] + }, + { + "id": 45, + "type": "AudioConcat", + "pos": [ + 1710.0, + 480.0 + ], + "size": [ + 210, + 78 + ], + "flags": { + "collapsed": true + }, + "order": 29, + "mode": 0, + "inputs": [ + { + "name": "audio1", + "type": "AUDIO", + "link": 33 + }, + { + "name": "audio2", + "type": "AUDIO", + "link": 34 + } + ], + "outputs": [ + { + "name": "AUDIO", + "type": "AUDIO", + "links": [ + 35 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "Node name for S&R": "AudioConcat" + }, + "widgets_values": [ + "after" + ] + }, + { + "id": 46, + "type": "AudioConcat", + "pos": [ + 1900.0, + 480.0 + ], + "size": [ + 210, + 78 + ], + "flags": { + "collapsed": true + }, + "order": 30, + "mode": 0, + "inputs": [ + { + "name": "audio1", + "type": "AUDIO", + "link": 35 + }, + { + "name": "audio2", + "type": "AUDIO", + "link": 36 + } + ], + "outputs": [ + { + "name": "AUDIO", + "type": "AUDIO", + "links": [ + 39 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "Node name for S&R": "AudioConcat" + }, + "widgets_values": [ + "after" + ] + }, + { + "id": 50, + "type": "CreateVideo", + "pos": [ + 2180.0, + 350.0 + ], + "size": [ + 270, + 150 + ], + "flags": {}, + "order": 31, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 37 + }, + { + "name": "fps", + "type": "FLOAT", + "widget": { + "name": "fps" + }, + "link": 38 + }, + { + "name": "audio", + "type": "AUDIO", + "shape": 7, + "link": 39 + } + ], + "outputs": [ + { + "name": "VIDEO", + "type": "VIDEO", + "links": [ + 40 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "Node name for S&R": "CreateVideo" + }, + "widgets_values": [ + 25.0, + 8 + ], + "title": "Create reel" + }, + { + "id": 51, + "type": "SaveVideo", + "pos": [ + 2520.0, + 350.0 + ], + "size": [ + 400, + 300 + ], + "flags": {}, + "order": 32, + "mode": 0, + "inputs": [ + { + "name": "video", + "type": "VIDEO", + "link": 40 + } + ], + "outputs": [ + { + "name": "video", + "type": "VIDEO", + "links": null + } + ], + "properties": { + "cnr_id": "comfy-core", + "Node name for S&R": "SaveVideo" + }, + "widgets_values": [ + "reel", + "auto", + "auto" + ], + "title": "Output reel" + } + ], + "links": [ + [ + 1, + 10, + 0, + 20, + 0, + "VIDEO" + ], + [ + 2, + 11, + 0, + 21, + 0, + "VIDEO" + ], + [ + 3, + 12, + 0, + 22, + 0, + "VIDEO" + ], + [ + 4, + 13, + 0, + 23, + 0, + "VIDEO" + ], + [ + 5, + 14, + 0, + 24, + 0, + "VIDEO" + ], + [ + 6, + 15, + 0, + 25, + 0, + "VIDEO" + ], + [ + 7, + 16, + 0, + 26, + 0, + "VIDEO" + ], + [ + 8, + 17, + 0, + 27, + 0, + "VIDEO" + ], + [ + 9, + 20, + 0, + 30, + 0, + "IMAGE" + ], + [ + 10, + 21, + 0, + 30, + 1, + "IMAGE" + ], + [ + 11, + 30, + 0, + 31, + 0, + "IMAGE" + ], + [ + 12, + 22, + 0, + 31, + 1, + "IMAGE" + ], + [ + 13, + 31, + 0, + 32, + 0, + "IMAGE" + ], + [ + 14, + 23, + 0, + 32, + 1, + "IMAGE" + ], + [ + 15, + 32, + 0, + 33, + 0, + "IMAGE" + ], + [ + 16, + 24, + 0, + 33, + 1, + "IMAGE" + ], + [ + 17, + 33, + 0, + 34, + 0, + "IMAGE" + ], + [ + 18, + 25, + 0, + 34, + 1, + "IMAGE" + ], + [ + 19, + 34, + 0, + 35, + 0, + "IMAGE" + ], + [ + 20, + 26, + 0, + 35, + 1, + "IMAGE" + ], + [ + 21, + 35, + 0, + 36, + 0, + "IMAGE" + ], + [ + 22, + 27, + 0, + 36, + 1, + "IMAGE" + ], + [ + 23, + 20, + 1, + 40, + 0, + "AUDIO" + ], + [ + 24, + 21, + 1, + 40, + 1, + "AUDIO" + ], + [ + 25, + 40, + 0, + 41, + 0, + "AUDIO" + ], + [ + 26, + 22, + 1, + 41, + 1, + "AUDIO" + ], + [ + 27, + 41, + 0, + 42, + 0, + "AUDIO" + ], + [ + 28, + 23, + 1, + 42, + 1, + "AUDIO" + ], + [ + 29, + 42, + 0, + 43, + 0, + "AUDIO" + ], + [ + 30, + 24, + 1, + 43, + 1, + "AUDIO" + ], + [ + 31, + 43, + 0, + 44, + 0, + "AUDIO" + ], + [ + 32, + 25, + 1, + 44, + 1, + "AUDIO" + ], + [ + 33, + 44, + 0, + 45, + 0, + "AUDIO" + ], + [ + 34, + 26, + 1, + 45, + 1, + "AUDIO" + ], + [ + 35, + 45, + 0, + 46, + 0, + "AUDIO" + ], + [ + 36, + 27, + 1, + 46, + 1, + "AUDIO" + ], + [ + 37, + 36, + 0, + 50, + 0, + "IMAGE" + ], + [ + 38, + 20, + 2, + 50, + 1, + "FLOAT" + ], + [ + 39, + 46, + 0, + 50, + 2, + "AUDIO" + ], + [ + 40, + 50, + 0, + 51, + 0, + "VIDEO" + ] + ], + "groups": [], + "definitions": { + "subgraphs": [] + }, + "config": {}, + "extra": { + "ds": { + "scale": 1, + "offset": [ + 0, + 0 + ] + } + }, + "version": 0.4 +} \ No newline at end of file diff --git a/docs/serviceTemplates/workflows/ocean_ugc_multishot.json b/docs/serviceTemplates/workflows/ocean_ugc_multishot.json new file mode 100644 index 000000000..bfdb5f8cd --- /dev/null +++ b/docs/serviceTemplates/workflows/ocean_ugc_multishot.json @@ -0,0 +1,4229 @@ +{ + "id": "0112e9af-5129-48ba-af78-92c40ac40b40", + "revision": 0, + "last_node_id": 735, + "last_link_id": 1838, + "nodes": [ + { + "id": 68, + "type": "SaveVideo", + "pos": [ + 2160.0, + 0.0 + ], + "size": [ + 910, + 700 + ], + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "video", + "type": "VIDEO", + "link": 256 + }, + { + "name": "filename_prefix", + "type": "STRING", + "widget": { + "name": "filename_prefix" + }, + "link": 1831 + } + ], + "outputs": [ + { + "name": "video", + "type": "VIDEO", + "links": null + } + ], + "properties": { + "Node name for S&R": "SaveVideo", + "cnr_id": "comfy-core", + "enableTabs": false, + "hasSecondTab": false, + "secondTabOffset": 80, + "secondTabText": "Send Back", + "secondTabWidth": 65, + "tabWidth": 65, + "tabXOffset": 10, + "ue_properties": { + "input_ue_unconnectable": {}, + "version": "7.7", + "widget_ue_connectable": {} + }, + "ver": "0.14.1" + }, + "widgets_values": [ + "shot", + "auto", + "auto" + ], + "title": "Output clips" + }, + { + "id": 129, + "type": "f9f61b10-b689-4d67-b4fa-0acc1d9b5390", + "pos": [ + 1560.0, + 0.0 + ], + "size": [ + 540, + 680 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "label": "first_frame", + "name": "input", + "type": "IMAGE,MASK", + "link": 1805 + }, + { + "label": "control_images", + "name": "input_1", + "type": "IMAGE,MASK", + "link": 1824 + }, + { + "label": "prompt", + "name": "text", + "type": "STRING", + "widget": { + "name": "text" + }, + "link": 1830 + }, + { + "label": "prompt_enhance", + "name": "value_4", + "type": "BOOLEAN", + "widget": { + "name": "value_4" + }, + "link": null + }, + { + "label": "width", + "name": "value", + "type": "INT", + "widget": { + "name": "value" + }, + "link": 1817 + }, + { + "label": "height", + "name": "value_1", + "type": "INT", + "widget": { + "name": "value_1" + }, + "link": 1818 + }, + { + "label": "fps", + "name": "value_3", + "type": "INT", + "widget": { + "name": "value_3" + }, + "link": 1809 + }, + { + "label": "seed", + "name": "noise_seed", + "type": "INT", + "widget": { + "name": "noise_seed" + }, + "link": null + }, + { + "label": "ckpt_name", + "name": "ckpt_name_1", + "type": "COMBO", + "widget": { + "name": "ckpt_name_1" + }, + "link": null + }, + { + "label": "text_encoder", + "name": "text_encoder", + "type": "COMBO", + "widget": { + "name": "text_encoder" + }, + "link": null + }, + { + "label": "lora", + "name": "lora_name", + "type": "COMBO", + "widget": { + "name": "lora_name" + }, + "link": null + }, + { + "label": "ic_lora", + "name": "lora_name_1", + "type": "COMBO", + "widget": { + "name": "lora_name_1" + }, + "link": null + }, + { + "label": "lora_strength", + "name": "strength_model", + "type": "FLOAT", + "widget": { + "name": "strength_model" + }, + "link": null + }, + { + "label": "bypass_first_frame", + "name": "value_2", + "type": "BOOLEAN", + "widget": { + "name": "value_2" + }, + "link": null + } + ], + "outputs": [ + { + "name": "VIDEO", + "type": "VIDEO", + "links": [ + 256 + ] + } + ], + "properties": { + "proxyWidgets": [ + [ + "209", + "prompt" + ], + [ + "212", + "value" + ], + [ + "113", + "value" + ], + [ + "98", + "value" + ], + [ + "114", + "value" + ], + [ + "704", + "seed" + ], + [ + "126", + "ckpt_name" + ], + [ + "103", + "text_encoder" + ], + [ + "208", + "lora_name" + ], + [ + "195", + "lora_name" + ], + [ + "195", + "strength_model" + ], + [ + "711", + "value" + ] + ], + "cnr_id": "comfy-core", + "enableTabs": false, + "hasSecondTab": false, + "secondTabOffset": 80, + "secondTabText": "Send Back", + "secondTabWidth": 65, + "tabWidth": 65, + "tabXOffset": 10, + "ue_properties": { + "input_ue_unconnectable": {}, + "version": "7.7", + "widget_ue_connectable": {} + }, + "ver": "0.18.1" + }, + "widgets_values": [], + "title": "Generate video" + }, + { + "id": 709, + "type": "RepeatImageBatch", + "pos": [ + 1180.0, + 360.0 + ], + "size": [ + 270, + 110 + ], + "flags": { + "collapsed": true + }, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 1838 + }, + { + "name": "amount", + "type": "INT", + "widget": { + "name": "amount" + }, + "link": 1812 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 1821 + ] + } + ], + "properties": { + "Node name for S&R": "RepeatImageBatch" + }, + "widgets_values": [ + 125 + ] + }, + { + "id": 712, + "type": "EmptyImage", + "pos": [ + 1180.0, + 290.0 + ], + "size": [ + 225, + 8 + ], + "flags": { + "collapsed": true + }, + "order": 2, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 1805, + 1835 + ] + } + ], + "properties": { + "Node name for S&R": "EmptyImage" + }, + "widgets_values": [ + 704, + 1280, + 1, + 0 + ] + }, + { + "id": 715, + "type": "PrimitiveInt", + "pos": [ + 820.0, + 300.0 + ], + "size": [ + 270, + 110 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 1810 + ] + } + ], + "title": "Seconds per shot", + "properties": { + "Node name for S&R": "PrimitiveInt" + }, + "widgets_values": [ + 5, + "fixed" + ] + }, + { + "id": 716, + "type": "PrimitiveInt", + "pos": [ + 820.0, + 450.0 + ], + "size": [ + 270, + 110 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 1809, + 1811 + ] + } + ], + "title": "FPS", + "properties": { + "Node name for S&R": "PrimitiveInt" + }, + "widgets_values": [ + 25, + "fixed" + ] + }, + { + "id": 717, + "type": "ComfyMathExpression", + "pos": [ + 820.0, + 920.0 + ], + "size": [ + 225, + 8 + ], + "flags": { + "collapsed": true + }, + "order": 6, + "mode": 0, + "inputs": [ + { + "label": "a", + "name": "values.a", + "type": "FLOAT,INT,BOOLEAN", + "link": 1810 + }, + { + "label": "b", + "name": "values.b", + "shape": 7, + "type": "FLOAT,INT,BOOLEAN", + "link": 1811 + }, + { + "label": "c", + "name": "values.c", + "shape": 7, + "type": "FLOAT,INT,BOOLEAN", + "link": null + } + ], + "outputs": [ + { + "name": "FLOAT", + "type": "FLOAT", + "links": null + }, + { + "name": "INT", + "type": "INT", + "links": [ + 1812 + ] + }, + { + "name": "BOOL", + "type": "BOOLEAN", + "links": null + } + ], + "properties": { + "Node name for S&R": "ComfyMathExpression" + }, + "widgets_values": [ + "a * b" + ] + }, + { + "id": 721, + "type": "GetImageSize", + "pos": [ + 1180.0, + 220.0 + ], + "size": [ + 225, + 8 + ], + "flags": { + "collapsed": true + }, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 1822 + } + ], + "outputs": [ + { + "name": "width", + "type": "INT", + "links": [ + 1817 + ] + }, + { + "name": "height", + "type": "INT", + "links": [ + 1818 + ] + }, + { + "name": "batch_size", + "type": "INT", + "links": null + } + ], + "properties": { + "Node name for S&R": "GetImageSize" + }, + "widgets_values": [] + }, + { + "id": 722, + "type": "ResizeAndPadImage", + "pos": [ + 1180.0, + 0.0 + ], + "size": [ + 280, + 170 + ], + "flags": { + "collapsed": true + }, + "order": 8, + "mode": 0, + "showAdvanced": false, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 1821 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 1822, + 1823, + 1824 + ] + } + ], + "title": "Resize And Pad Image (Size)", + "properties": { + "Node name for S&R": "ResizeAndPadImage" + }, + "widgets_values": [ + 704, + 1280, + "black", + "lanczos" + ] + }, + { + "id": 723, + "type": "PreviewImage", + "pos": [ + 1180.0, + 500.0 + ], + "size": [ + 650, + 110 + ], + "flags": {}, + "order": 10, + "mode": 4, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 1823 + } + ], + "outputs": [ + { + "name": "images", + "type": "IMAGE", + "links": null + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + }, + "widgets_values": [] + }, + { + "id": 724, + "type": "LoadImage", + "pos": [ + 0.0, + 0.0 + ], + "size": [ + 730, + 660 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 1825 + ] + }, + { + "name": "MASK", + "type": "MASK", + "links": null + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "subject-girl-holding-skincare-bottle.png", + "image" + ], + "title": "Person (optional)" + }, + { + "id": 725, + "type": "PrimitiveStringMultiline", + "pos": [ + 0.0, + 1120.0 + ], + "size": [ + 400, + 360 + ], + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 1828 + ] + } + ], + "title": "Shot list (one prompt per line)", + "properties": { + "Node name for S&R": "PrimitiveStringMultiline" + }, + "widgets_values": [ + "Extreme close-up on the product label, slow rotation under soft studio light, shallow depth of field.\nHands unboxing the product from its packaging on a wooden table, top-down angle.\nOver-the-shoulder shot as the person opens the product for the first time, natural window light.\nPerson walking outdoors on a city sidewalk, holding the product up to the camera, casual handheld motion.\nMirror selfie in a bright bathroom, person showing the product at chest height, phone visible in reflection.\nClose-up of hands applying the product, soft focus background, warm indoor lighting.\nPerson sitting on a couch, casually gesturing toward the product on the coffee table, medium shot.\nLow-angle shot looking up as the person raises the product triumphantly outdoors, blue sky background.\nProduct placed on a kitchen counter, slow dolly-in past morning coffee and sunlight through a window.\nPerson talking directly to camera, product held at shoulder height, blurred cafe background.\nOverhead flat-lay shot of the product surrounded by lifestyle props, a hand entering frame to pick it up.\nTracking shot following the person as they carry the product through a sunlit hallway.\nClose-up on the person's face lighting up with a smile as they look at the product, shallow depth of field.\nPerson unboxing the product in a car, phone mounted on the dashboard, natural daylight.\nSlow-motion shot of the product being set down on a marble countertop, logo facing the camera." + ] + }, + { + "id": 726, + "type": "PrimitiveInt", + "pos": [ + 820.0, + 0.0 + ], + "size": [ + 270, + 110 + ], + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 1832 + ] + } + ], + "title": "Shot index (auto-increments)", + "properties": { + "Node name for S&R": "PrimitiveInt" + }, + "widgets_values": [ + 0, + "increment" + ] + }, + { + "id": 727, + "type": "StringFormat", + "pos": [ + 820.0, + 620.0 + ], + "size": [ + 320, + 150 + ], + "flags": { + "collapsed": true + }, + "order": 15, + "mode": 0, + "inputs": [ + { + "label": "a", + "name": "values.a", + "type": "*", + "link": 1826 + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 1829 + ] + } + ], + "title": "Format Text (line-select regex)", + "properties": { + "Node name for S&R": "StringFormat" + }, + "widgets_values": [ + "(?s)^(?:[^\\n]*\\n){{{a}}}([^\\n]*)" + ] + }, + { + "id": 728, + "type": "RegexExtract", + "pos": [ + 820.0, + 700.0 + ], + "size": [ + 320, + 250 + ], + "flags": { + "collapsed": true + }, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "string", + "type": "STRING", + "link": 1828, + "widget": { + "name": "string" + } + }, + { + "name": "regex_pattern", + "type": "STRING", + "link": 1829, + "widget": { + "name": "regex_pattern" + } + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 1830 + ] + } + ], + "title": "Extract Text (shot N)", + "properties": { + "Node name for S&R": "RegexExtract" + }, + "widgets_values": [ + "", + "", + "First Group", + true, + false, + false, + 1 + ] + }, + { + "id": 729, + "type": "StringFormat", + "pos": [ + 820.0, + 780.0 + ], + "size": [ + 320, + 150 + ], + "flags": { + "collapsed": true + }, + "order": 17, + "mode": 0, + "inputs": [ + { + "label": "a", + "name": "values.a", + "type": "*", + "link": 1827 + } + ], + "outputs": [ + { + "name": "STRING", + "type": "STRING", + "links": [ + 1831 + ] + } + ], + "title": "Format Text (filename prefix)", + "properties": { + "Node name for S&R": "StringFormat" + }, + "widgets_values": [ + "shot_{a:02d}" + ] + }, + { + "id": 730, + "type": "PrimitiveInt", + "pos": [ + 820.0, + 150.0 + ], + "size": [ + 270, + 110 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "INT", + "type": "INT", + "links": [ + 1833 + ] + } + ], + "title": "Shots in list", + "properties": { + "Node name for S&R": "PrimitiveInt" + }, + "widgets_values": [ + 15, + "fixed" + ] + }, + { + "id": 731, + "type": "ComfyMathExpression", + "pos": [ + 820.0, + 860.0 + ], + "size": [ + 225, + 8 + ], + "flags": { + "collapsed": true + }, + "order": 7, + "mode": 0, + "inputs": [ + { + "label": "a", + "name": "values.a", + "type": "FLOAT,INT,BOOLEAN", + "link": 1832 + }, + { + "label": "b", + "name": "values.b", + "shape": 7, + "type": "FLOAT,INT,BOOLEAN", + "link": 1833 + }, + { + "label": "c", + "name": "values.c", + "shape": 7, + "type": "FLOAT,INT,BOOLEAN", + "link": null + } + ], + "outputs": [ + { + "name": "FLOAT", + "type": "FLOAT", + "links": null + }, + { + "name": "INT", + "type": "INT", + "links": [ + 1826, + 1827 + ] + }, + { + "name": "BOOL", + "type": "BOOLEAN", + "links": null + } + ], + "title": "Wrap shot index", + "properties": { + "Node name for S&R": "ComfyMathExpression" + }, + "widgets_values": [ + "a % b" + ] + }, + { + "id": 732, + "type": "MarkdownNote", + "pos": [ + -1300.0, + 0.0 + ], + "size": [ + 900, + 340 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [], + "outputs": [], + "title": "How to use", + "properties": {}, + "widgets_values": [ + "## 15-shot vertical reel\n\n*Person* and *Product* are both optional — leave both empty and it renders from the prompt alone.\n\n| Want | Do |\n|---|---|\n| Both images | Leave everything as-is |\n| Person only | Bypass (Ctrl+B) **Product (optional)** |\n| Product only | Set the switch on **Use person image? (else blank)** to false — don't bypass **Person (optional)** itself, it feeds a required input |\n| Neither (prompt-only) | Bypass **Product (optional)** *and* set that switch to false |\n\n**1.** One prompt per line in *Shot list*; match *Shots in list* to the count.\n\n**2.** Click **Run** once. It renders the current *Shot index*, then the index auto-advances.\n\n**3.** Redo a shot: set *Shot index* back to that number and Run again — SaveVideo appends a counter, so the earlier take is still there.\n\n**4.** Once every shot looks good, switch to the **Assemble reel** workflow to stitch them.\n\nClips save as `shot_00.mp4`, `shot_01.mp4`, … — 704×1280, 5 s each." + ] + }, + { + "id": 733, + "type": "LoadImage", + "pos": [ + 0.0, + 680.0 + ], + "size": [ + 730, + 420 + ], + "flags": {}, + "order": 18, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 1837 + ] + }, + { + "name": "MASK", + "type": "MASK", + "links": null + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "brown_moisturizer_bottle.jpg", + "image" + ], + "title": "Product (optional)" + }, + { + "id": 734, + "type": "ComfySwitchNode", + "pos": [ + 440.0, + 1120.0 + ], + "size": [ + 270, + 130 + ], + "flags": {}, + "order": 19, + "mode": 0, + "inputs": [ + { + "name": "on_false", + "type": "IMAGE", + "link": 1835 + }, + { + "name": "on_true", + "type": "IMAGE", + "link": 1834 + } + ], + "outputs": [ + { + "name": "output", + "type": "IMAGE", + "links": [ + 1836 + ] + } + ], + "properties": { + "Node name for S&R": "ComfySwitchNode" + }, + "widgets_values": [ + true + ], + "title": "Use person image? (else blank)" + }, + { + "id": 735, + "type": "ImageStitch", + "pos": [ + 440.0, + 1270.0 + ], + "size": [ + 270, + 150 + ], + "flags": {}, + "order": 20, + "mode": 0, + "inputs": [ + { + "name": "image1", + "type": "IMAGE", + "link": 1836 + }, + { + "name": "image2", + "type": "IMAGE", + "link": 1837 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 1838 + ] + } + ], + "properties": { + "Node name for S&R": "ImageStitch" + }, + "widgets_values": [ + "right", + true, + 0, + "white" + ], + "title": "Combine reference images" + } + ], + "links": [ + [ + 256, + 129, + 0, + 68, + 0, + "VIDEO" + ], + [ + 1805, + 712, + 0, + 129, + 0, + "IMAGE" + ], + [ + 1809, + 716, + 0, + 129, + 6, + "INT" + ], + [ + 1810, + 715, + 0, + 717, + 0, + "INT" + ], + [ + 1811, + 716, + 0, + 717, + 1, + "INT" + ], + [ + 1812, + 717, + 1, + 709, + 1, + "INT" + ], + [ + 1817, + 721, + 0, + 129, + 4, + "INT" + ], + [ + 1818, + 721, + 1, + 129, + 5, + "INT" + ], + [ + 1821, + 709, + 0, + 722, + 0, + "IMAGE" + ], + [ + 1822, + 722, + 0, + 721, + 0, + "IMAGE" + ], + [ + 1823, + 722, + 0, + 723, + 0, + "IMAGE" + ], + [ + 1824, + 722, + 0, + 129, + 1, + "IMAGE" + ], + [ + 1826, + 731, + 1, + 727, + 0, + "INT" + ], + [ + 1827, + 731, + 1, + 729, + 0, + "INT" + ], + [ + 1828, + 725, + 0, + 728, + 0, + "STRING" + ], + [ + 1829, + 727, + 0, + 728, + 1, + "STRING" + ], + [ + 1830, + 728, + 0, + 129, + 2, + "STRING" + ], + [ + 1831, + 729, + 0, + 68, + 1, + "STRING" + ], + [ + 1832, + 726, + 0, + 731, + 0, + "INT" + ], + [ + 1833, + 730, + 0, + 731, + 1, + "INT" + ], + [ + 1834, + 724, + 0, + 734, + 1, + "IMAGE" + ], + [ + 1835, + 712, + 0, + 734, + 0, + "IMAGE" + ], + [ + 1836, + 734, + 0, + 735, + 0, + "IMAGE" + ], + [ + 1837, + 733, + 0, + 735, + 1, + "IMAGE" + ], + [ + 1838, + 735, + 0, + 709, + 0, + "IMAGE" + ] + ], + "groups": [ + { + "id": 28, + "title": "Video Settings", + "bounding": [ + 100, + 2240, + 740, + 690 + ], + "color": "#3f789e", + "flags": {} + } + ], + "definitions": { + "subgraphs": [ + { + "id": "f9f61b10-b689-4d67-b4fa-0acc1d9b5390", + "version": 1, + "state": { + "lastGroupId": 28, + "lastNodeId": 724, + "lastLinkId": 1825, + "lastRerouteId": 0 + }, + "revision": 0, + "config": {}, + "name": "LTX-2.3 IC-LoRA Video Generation", + "inputNode": { + "id": -10, + "bounding": [ + -160, + 3060, + 155.00390625, + 328 + ] + }, + "outputNode": { + "id": -20, + "bounding": [ + 3620, + 3120, + 128, + 68 + ] + }, + "inputs": [ + { + "id": "6fe179c4-d96f-4383-b202-844f6de4922e", + "name": "input", + "type": "IMAGE,MASK", + "linkIds": [ + 1735, + 1786 + ], + "localized_name": "input", + "label": "first_frame", + "pos": [ + -28.99609375, + 3084 + ] + }, + { + "id": "e80df1ae-5f39-4f86-91bd-0467635e2f2d", + "name": "input_1", + "type": "IMAGE,MASK", + "linkIds": [ + 1777, + 1802 + ], + "localized_name": "input_1", + "label": "control_images", + "pos": [ + -28.99609375, + 3104 + ] + }, + { + "id": "433148fa-bf73-4ab1-81d9-09e2e38ed861", + "name": "text", + "type": "STRING", + "linkIds": [ + 316, + 317 + ], + "label": "prompt", + "pos": [ + -28.99609375, + 3124 + ] + }, + { + "id": "80e8d306-4496-4641-a896-249352d68a33", + "name": "value_4", + "type": "BOOLEAN", + "linkIds": [ + 315 + ], + "label": "prompt_enhance", + "pos": [ + -28.99609375, + 3144 + ] + }, + { + "id": "36915bc8-a6ed-4d48-8619-e0e8723228e9", + "name": "value", + "type": "INT", + "linkIds": [ + 266 + ], + "label": "width", + "pos": [ + -28.99609375, + 3164 + ] + }, + { + "id": "425a36b8-91ab-41b7-81e9-496eba064ec8", + "name": "value_1", + "type": "INT", + "linkIds": [ + 267 + ], + "label": "height", + "pos": [ + -28.99609375, + 3184 + ] + }, + { + "id": "581b52ff-21c5-4774-ac2a-8f69a7e09e2e", + "name": "value_3", + "type": "INT", + "linkIds": [ + 269 + ], + "label": "fps", + "pos": [ + -28.99609375, + 3204 + ] + }, + { + "id": "d03cc171-45da-4658-99aa-77252bbcf522", + "name": "noise_seed", + "type": "INT", + "linkIds": [ + 1793 + ], + "label": "seed", + "pos": [ + -28.99609375, + 3224 + ] + }, + { + "id": "e68e61c8-905e-43ac-8c76-65ac52270a08", + "name": "ckpt_name_1", + "type": "COMBO", + "linkIds": [ + 272, + 275, + 276 + ], + "label": "ckpt_name", + "pos": [ + -28.99609375, + 3244 + ] + }, + { + "id": "5d065f3b-891b-499f-950b-c2df0be24536", + "name": "text_encoder", + "type": "COMBO", + "linkIds": [ + 273 + ], + "label": "text_encoder", + "pos": [ + -28.99609375, + 3264 + ] + }, + { + "id": "e9abdbac-c422-4a1e-bc0d-6b99c0730086", + "name": "lora_name", + "type": "COMBO", + "linkIds": [ + 1768 + ], + "label": "lora", + "pos": [ + -28.99609375, + 3284 + ] + }, + { + "id": "c05ba793-3f43-4594-b7df-3f17fa3f99ba", + "name": "lora_name_1", + "type": "COMBO", + "linkIds": [ + 1769 + ], + "label": "ic_lora", + "pos": [ + -28.99609375, + 3304 + ] + }, + { + "id": "b475372d-89e7-44bb-995b-647f8e29c484", + "name": "strength_model", + "type": "FLOAT", + "linkIds": [ + 1770 + ], + "label": "lora_strength", + "pos": [ + -28.99609375, + 3324 + ] + }, + { + "id": "bfc27fa2-b100-413c-9c64-d38ab1ed5a2d", + "name": "value_2", + "type": "BOOLEAN", + "linkIds": [ + 1804 + ], + "label": "bypass_first_frame", + "pos": [ + -28.99609375, + 3344 + ] + } + ], + "outputs": [ + { + "id": "0c8c2dc0-c67c-4bc2-9e57-6aa00db2e3a9", + "name": "VIDEO", + "type": "VIDEO", + "linkIds": [ + 252 + ], + "localized_name": "VIDEO", + "pos": [ + 3644, + 3144 + ] + } + ], + "widgets": [], + "nodes": [ + { + "id": 101, + "type": "LTXVEmptyLatentAudio", + "pos": [ + 1180, + 3800 + ], + "size": [ + 280, + 170 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "localized_name": "audio_vae", + "name": "audio_vae", + "type": "VAE", + "link": 205 + }, + { + "localized_name": "frames_number", + "name": "frames_number", + "type": "INT", + "widget": { + "name": "frames_number" + }, + "link": 1801 + }, + { + "localized_name": "frame_rate", + "name": "frame_rate", + "type": "INT", + "widget": { + "name": "frame_rate" + }, + "link": 207 + } + ], + "outputs": [ + { + "localized_name": "Latent", + "name": "Latent", + "type": "LATENT", + "links": [ + 245 + ] + } + ], + "properties": { + "Node name for S&R": "LTXVEmptyLatentAudio", + "cnr_id": "comfy-core", + "enableTabs": false, + "hasSecondTab": false, + "secondTabOffset": 80, + "secondTabText": "Send Back", + "secondTabWidth": 65, + "tabWidth": 65, + "tabXOffset": 10, + "ue_properties": { + "input_ue_unconnectable": {}, + "version": "7.5.2", + "widget_ue_connectable": {} + }, + "ver": "0.3.68" + }, + "widgets_values": [ + 97, + 25, + 1 + ] + }, + { + "id": 106, + "type": "LTXVCropGuides", + "pos": [ + 2430, + 2450 + ], + "size": [ + 280, + 120 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "link": 290 + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "link": 292 + }, + { + "localized_name": "latent", + "name": "latent", + "type": "LATENT", + "link": 215 + } + ], + "outputs": [ + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "links": [] + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "links": [] + }, + { + "localized_name": "latent", + "name": "latent", + "type": "LATENT", + "links": [ + 211 + ] + } + ], + "properties": { + "Node name for S&R": "LTXVCropGuides", + "cnr_id": "comfy-core", + "enableTabs": false, + "hasSecondTab": false, + "secondTabOffset": 80, + "secondTabText": "Send Back", + "secondTabWidth": 65, + "tabWidth": 65, + "tabXOffset": 10, + "ue_properties": { + "input_ue_unconnectable": {}, + "version": "7.5.2", + "widget_ue_connectable": {} + }, + "ver": "0.8.2" + }, + "widgets_values": [] + }, + { + "id": 108, + "type": "EmptyLTXVLatentVideo", + "pos": [ + 1180, + 3550 + ], + "size": [ + 280, + 200 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "localized_name": "width", + "name": "width", + "type": "INT", + "widget": { + "name": "width" + }, + "link": 1778 + }, + { + "localized_name": "height", + "name": "height", + "type": "INT", + "widget": { + "name": "height" + }, + "link": 1779 + }, + { + "localized_name": "length", + "name": "length", + "type": "INT", + "widget": { + "name": "length" + }, + "link": 1800 + } + ], + "outputs": [ + { + "localized_name": "LATENT", + "name": "LATENT", + "type": "LATENT", + "links": [ + 296 + ] + } + ], + "properties": { + "Node name for S&R": "EmptyLTXVLatentVideo", + "cnr_id": "comfy-core", + "enableTabs": false, + "hasSecondTab": false, + "secondTabOffset": 80, + "secondTabText": "Send Back", + "secondTabWidth": 65, + "tabWidth": 65, + "tabXOffset": 10, + "ue_properties": { + "input_ue_unconnectable": {}, + "version": "7.5.2", + "widget_ue_connectable": {} + }, + "ver": "0.3.60" + }, + "widgets_values": [ + 768, + 512, + 97, + 1 + ] + }, + { + "id": 109, + "type": "LTXVConditioning", + "pos": [ + 1180, + 3350 + ], + "size": [ + 280, + 130 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "link": 221 + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "link": 222 + }, + { + "localized_name": "frame_rate", + "name": "frame_rate", + "type": "FLOAT", + "widget": { + "name": "frame_rate" + }, + "link": 223 + } + ], + "outputs": [ + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "links": [ + 236 + ] + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "links": [ + 237 + ] + } + ], + "properties": { + "Node name for S&R": "LTXVConditioning", + "cnr_id": "comfy-core", + "enableTabs": false, + "hasSecondTab": false, + "secondTabOffset": 80, + "secondTabText": "Send Back", + "secondTabWidth": 65, + "tabWidth": 65, + "tabXOffset": 10, + "ue_properties": { + "input_ue_unconnectable": {}, + "version": "7.5.2", + "widget_ue_connectable": {} + }, + "ver": "0.3.56" + }, + "widgets_values": [ + 25 + ] + }, + { + "id": 114, + "type": "PrimitiveInt", + "pos": [ + 760, + 3840 + ], + "size": [ + 230, + 110 + ], + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "localized_name": "value", + "name": "value", + "type": "INT", + "widget": { + "name": "value" + }, + "link": 269 + } + ], + "outputs": [ + { + "localized_name": "INT", + "name": "INT", + "type": "INT", + "links": [ + 207, + 235 + ] + } + ], + "title": "Frame Rate(int)", + "properties": { + "Node name for S&R": "PrimitiveInt", + "cnr_id": "comfy-core", + "enableTabs": false, + "hasSecondTab": false, + "secondTabOffset": 80, + "secondTabText": "Send Back", + "secondTabWidth": 65, + "tabWidth": 65, + "tabXOffset": 10, + "ue_properties": { + "input_ue_unconnectable": {}, + "version": "7.5.2", + "widget_ue_connectable": {} + }, + "ver": "0.7.0" + }, + "widgets_values": [ + 25, + "fixed" + ] + }, + { + "id": 115, + "type": "LTXVAddGuide", + "pos": [ + 2030, + 3360 + ], + "size": [ + 280, + 310 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "link": 236 + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "link": 237 + }, + { + "localized_name": "vae", + "name": "vae", + "type": "VAE", + "link": 307 + }, + { + "localized_name": "latent", + "name": "latent", + "type": "LATENT", + "link": 289 + }, + { + "localized_name": "image", + "name": "image", + "type": "IMAGE", + "link": 1777 + }, + { + "localized_name": "attention_mask", + "name": "attention_mask", + "shape": 7, + "type": "MASK", + "link": null + }, + { + "localized_name": "iclora_parameters", + "name": "iclora_parameters", + "shape": 7, + "type": "IC_LORA_PARAMETERS", + "link": 288 + } + ], + "outputs": [ + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "links": [ + 290, + 1791 + ] + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "links": [ + 292, + 1790 + ] + }, + { + "localized_name": "latent", + "name": "latent", + "type": "LATENT", + "links": [ + 287 + ] + } + ], + "properties": { + "Node name for S&R": "LTXVAddGuide", + "cnr_id": "comfy-core", + "enableTabs": false, + "hasSecondTab": false, + "secondTabOffset": 80, + "secondTabText": "Send Back", + "secondTabWidth": 65, + "tabWidth": 65, + "tabXOffset": 10, + "ue_properties": { + "input_ue_unconnectable": {}, + "version": "7.7", + "widget_ue_connectable": {} + }, + "ver": "0.12.3" + }, + "widgets_values": [ + 0, + 1 + ] + }, + { + "id": 119, + "type": "LTXVConcatAVLatent", + "pos": [ + 2030, + 2390 + ], + "size": [ + 280, + 100 + ], + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "localized_name": "video_latent", + "name": "video_latent", + "type": "LATENT", + "link": 287 + }, + { + "localized_name": "audio_latent", + "name": "audio_latent", + "type": "LATENT", + "link": 245 + } + ], + "outputs": [ + { + "localized_name": "latent", + "name": "latent", + "type": "LATENT", + "links": [ + 1789 + ] + } + ], + "properties": { + "Node name for S&R": "LTXVConcatAVLatent", + "cnr_id": "comfy-core", + "enableTabs": false, + "hasSecondTab": false, + "secondTabOffset": 80, + "secondTabText": "Send Back", + "secondTabWidth": 65, + "tabWidth": 65, + "tabXOffset": 10, + "ue_properties": { + "input_ue_unconnectable": {}, + "version": "7.5.2", + "widget_ue_connectable": {} + }, + "ver": "0.7.0" + }, + "widgets_values": [] + }, + { + "id": 123, + "type": "ComfyMathExpression", + "pos": [ + 770, + 4000 + ], + "size": [ + 230, + 80 + ], + "flags": { + "collapsed": true + }, + "order": 15, + "mode": 0, + "inputs": [ + { + "label": "a", + "localized_name": "values.a", + "name": "values.a", + "type": "FLOAT,INT,BOOLEAN", + "link": 235 + }, + { + "label": "b", + "localized_name": "values.b", + "name": "values.b", + "shape": 7, + "type": "FLOAT,INT,BOOLEAN", + "link": null + } + ], + "outputs": [ + { + "localized_name": "FLOAT", + "name": "FLOAT", + "type": "FLOAT", + "links": [ + 223, + 234 + ] + }, + { + "localized_name": "INT", + "name": "INT", + "type": "INT", + "links": [] + }, + { + "localized_name": "BOOL", + "name": "BOOL", + "type": "BOOLEAN", + "links": null + } + ], + "properties": { + "Node name for S&R": "ComfyMathExpression", + "cnr_id": "comfy-core", + "enableTabs": false, + "hasSecondTab": false, + "secondTabOffset": 80, + "secondTabText": "Send Back", + "secondTabWidth": 65, + "tabWidth": 65, + "tabXOffset": 10, + "ue_properties": { + "input_ue_unconnectable": {}, + "version": "7.7", + "widget_ue_connectable": {} + }, + "ver": "0.17.0" + }, + "widgets_values": [ + "a" + ] + }, + { + "id": 113, + "type": "PrimitiveInt", + "pos": [ + 760, + 3340 + ], + "size": [ + 230, + 110 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "localized_name": "value", + "name": "value", + "type": "INT", + "widget": { + "name": "value" + }, + "link": 266 + } + ], + "outputs": [ + { + "localized_name": "INT", + "name": "INT", + "type": "INT", + "links": [ + 1778 + ] + } + ], + "title": "Width", + "properties": { + "Node name for S&R": "PrimitiveInt", + "cnr_id": "comfy-core", + "enableTabs": false, + "hasSecondTab": false, + "secondTabOffset": 80, + "secondTabText": "Send Back", + "secondTabWidth": 65, + "tabWidth": 65, + "tabXOffset": 10, + "ue_properties": { + "input_ue_unconnectable": {}, + "version": "7.5.2", + "widget_ue_connectable": {} + }, + "ver": "0.7.0" + }, + "widgets_values": [ + 704, + "fixed" + ] + }, + { + "id": 98, + "type": "PrimitiveInt", + "pos": [ + 760, + 3490 + ], + "size": [ + 230, + 110 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [ + { + "localized_name": "value", + "name": "value", + "type": "INT", + "widget": { + "name": "value" + }, + "link": 267 + } + ], + "outputs": [ + { + "localized_name": "INT", + "name": "INT", + "type": "INT", + "links": [ + 1779 + ] + } + ], + "title": "height", + "properties": { + "Node name for S&R": "PrimitiveInt", + "cnr_id": "comfy-core", + "enableTabs": false, + "hasSecondTab": false, + "secondTabOffset": 80, + "secondTabText": "Send Back", + "secondTabWidth": 65, + "tabWidth": 65, + "tabXOffset": 10, + "ue_properties": { + "input_ue_unconnectable": {}, + "version": "7.5.2", + "widget_ue_connectable": {} + }, + "ver": "0.7.0" + }, + "widgets_values": [ + 1280, + "fixed" + ] + }, + { + "id": 112, + "type": "CLIPTextEncode", + "pos": [ + 1320, + 2870 + ], + "size": [ + 590, + 200 + ], + "flags": { + "collapsed": false + }, + "order": 8, + "mode": 0, + "inputs": [ + { + "localized_name": "clip", + "name": "clip", + "type": "CLIP", + "link": 230 + } + ], + "outputs": [ + { + "localized_name": "CONDITIONING", + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 222 + ] + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode", + "cnr_id": "comfy-core", + "enableTabs": false, + "hasSecondTab": false, + "secondTabOffset": 80, + "secondTabText": "Send Back", + "secondTabWidth": 65, + "tabWidth": 65, + "tabXOffset": 10, + "ue_properties": { + "input_ue_unconnectable": {}, + "version": "7.5.2", + "widget_ue_connectable": {} + }, + "ver": "0.3.56" + }, + "widgets_values": [ + "blurry, out of focus, overexposed, underexposed, low contrast, washed out colors, excessive noise, grainy texture, poor lighting, flickering, motion blur, distorted proportions, unnatural skin tones, deformed facial features, asymmetrical face, missing facial features, extra limbs, disfigured hands, wrong hand count, artifacts around text, unreadable text on shirt or hat, incorrect lettering on cap (“PNTR”), incorrect t-shirt slogan (“JUST DO IT”), missing microphone, misplaced microphone, inconsistent perspective, camera shake, incorrect depth of field, background too sharp, background clutter, distracting reflections, harsh shadows, inconsistent lighting direction, color banding, cartoonish rendering, 3D CGI look, unrealistic materials, uncanny valley effect, incorrect ethnicity, wrong gender, exaggerated expressions, smiling, laughing, exaggerated sadness, wrong gaze direction, eyes looking at camera, mismatched lip sync, silent or muted audio, distorted voice, robotic voice, echo, background noise, off-sync audio, missing sniff sounds, incorrect dialogue, added dialogue, repetitive speech, jittery movement, awkward pauses, incorrect timing, unnatural transitions, inconsistent framing, tilted camera, missing door or shelves, missing shallow depth of field, flat lighting, inconsistent tone, cinematic oversaturation, stylized filters, or AI artifacts." + ], + "color": "#223", + "bgcolor": "#335" + }, + { + "id": 122, + "type": "CreateVideo", + "pos": [ + 2890, + 2900 + ], + "size": [ + 280, + 160 + ], + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "localized_name": "images", + "name": "images", + "type": "IMAGE", + "link": 232 + }, + { + "localized_name": "audio", + "name": "audio", + "shape": 7, + "type": "AUDIO", + "link": 233 + }, + { + "localized_name": "fps", + "name": "fps", + "type": "FLOAT", + "widget": { + "name": "fps" + }, + "link": 234 + } + ], + "outputs": [ + { + "localized_name": "VIDEO", + "name": "VIDEO", + "type": "VIDEO", + "links": [ + 252 + ] + } + ], + "properties": { + "Node name for S&R": "CreateVideo", + "cnr_id": "comfy-core", + "enableTabs": false, + "hasSecondTab": false, + "secondTabOffset": 80, + "secondTabText": "Send Back", + "secondTabWidth": 65, + "tabWidth": 65, + "tabXOffset": 10, + "ue_properties": { + "input_ue_unconnectable": {}, + "version": "7.7", + "widget_ue_connectable": {} + }, + "ver": "0.14.1" + }, + "widgets_values": [ + 24, + 8 + ] + }, + { + "id": 105, + "type": "VAEDecodeTiled", + "pos": [ + 2430, + 2630 + ], + "size": [ + 280, + 200 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "link": 211 + }, + { + "localized_name": "vae", + "name": "vae", + "type": "VAE", + "link": 212 + } + ], + "outputs": [ + { + "localized_name": "IMAGE", + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 232 + ] + } + ], + "properties": { + "Node name for S&R": "VAEDecodeTiled", + "cnr_id": "comfy-core", + "enableTabs": false, + "hasSecondTab": false, + "secondTabOffset": 80, + "secondTabText": "Send Back", + "secondTabWidth": 65, + "tabWidth": 65, + "tabXOffset": 10, + "ue_properties": { + "input_ue_unconnectable": {}, + "version": "7.5.2", + "widget_ue_connectable": {} + }, + "ver": "0.7.0" + }, + "widgets_values": [ + 768, + 64, + 4096, + 64 + ] + }, + { + "id": 107, + "type": "LTXVAudioVAEDecode", + "pos": [ + 2430, + 2920 + ], + "size": [ + 280, + 100 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "link": 216 + }, + { + "label": "Audio VAE", + "localized_name": "audio_vae", + "name": "audio_vae", + "type": "VAE", + "link": 217 + } + ], + "outputs": [ + { + "localized_name": "Audio", + "name": "Audio", + "type": "AUDIO", + "links": [ + 233 + ] + } + ], + "properties": { + "Node name for S&R": "LTXVAudioVAEDecode", + "cnr_id": "comfy-core", + "enableTabs": false, + "hasSecondTab": false, + "secondTabOffset": 80, + "secondTabText": "Send Back", + "secondTabWidth": 65, + "tabWidth": 65, + "tabXOffset": 10, + "ue_properties": { + "input_ue_unconnectable": {}, + "version": "7.5.2", + "widget_ue_connectable": {} + }, + "ver": "0.7.0" + }, + "widgets_values": [] + }, + { + "id": 121, + "type": "LTXVSeparateAVLatent", + "pos": [ + 2040, + 3010 + ], + "size": [ + 250, + 100 + ], + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "localized_name": "av_latent", + "name": "av_latent", + "type": "LATENT", + "link": 1788 + } + ], + "outputs": [ + { + "localized_name": "video_latent", + "name": "video_latent", + "type": "LATENT", + "links": [ + 215 + ] + }, + { + "localized_name": "audio_latent", + "name": "audio_latent", + "type": "LATENT", + "links": [ + 216 + ] + } + ], + "properties": { + "Node name for S&R": "LTXVSeparateAVLatent", + "cnr_id": "comfy-core", + "enableTabs": false, + "hasSecondTab": false, + "secondTabOffset": 80, + "secondTabText": "Send Back", + "secondTabWidth": 65, + "tabWidth": 65, + "tabXOffset": 10, + "ue_properties": { + "input_ue_unconnectable": {}, + "version": "7.5.2", + "widget_ue_connectable": {} + }, + "ver": "0.5.1" + }, + "widgets_values": [] + }, + { + "id": 128, + "type": "CLIPTextEncode", + "pos": [ + 1310, + 2380 + ], + "size": [ + 620, + 420 + ], + "flags": {}, + "order": 18, + "mode": 0, + "inputs": [ + { + "localized_name": "clip", + "name": "clip", + "type": "CLIP", + "link": 231 + }, + { + "localized_name": "text", + "name": "text", + "type": "STRING", + "widget": { + "name": "text" + }, + "link": 1808 + } + ], + "outputs": [ + { + "localized_name": "CONDITIONING", + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 221 + ] + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode", + "cnr_id": "comfy-core", + "enableTabs": false, + "hasSecondTab": false, + "secondTabOffset": 80, + "secondTabText": "Send Back", + "secondTabWidth": 65, + "tabWidth": 65, + "tabXOffset": 10, + "ue_properties": { + "input_ue_unconnectable": {}, + "version": "7.5.2", + "widget_ue_connectable": {} + }, + "ver": "0.3.56" + }, + "widgets_values": [ + "A slow forward dolly shot on a bright, sunlit day in a lush jungle ruin. A lone figure in nature-themed armor stands before a weathered stone arch overgrown with ivy. A textured marble sphere wrapped in twisting vines levitates in the arch’s center, spinning slowly. As the camera glides forward, vines sway softly, leaves flutter in the light breeze. Strong golden sunlight streams through the canopy, illuminating the mossy ruins with bright, clear light. The scene feels vibrant and peaceful, with subtle natural motion." + ], + "color": "#232", + "bgcolor": "#353" + }, + { + "id": 127, + "type": "CheckpointLoaderSimple", + "pos": [ + 770, + 2380 + ], + "size": [ + 420, + 160 + ], + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "localized_name": "ckpt_name", + "name": "ckpt_name", + "type": "COMBO", + "widget": { + "name": "ckpt_name" + }, + "link": 276 + } + ], + "outputs": [ + { + "localized_name": "MODEL", + "name": "MODEL", + "type": "MODEL", + "links": [ + 279, + 313 + ] + }, + { + "localized_name": "CLIP", + "name": "CLIP", + "type": "CLIP", + "links": [] + }, + { + "localized_name": "VAE", + "name": "VAE", + "type": "VAE", + "links": [ + 212, + 306, + 307 + ] + } + ], + "properties": { + "Node name for S&R": "CheckpointLoaderSimple", + "cnr_id": "comfy-core", + "enableTabs": false, + "hasSecondTab": false, + "models": [ + { + "name": "ltx-2.3-22b-distilled-fp8.safetensors", + "url": "https://huggingface.co/Lightricks/LTX-2.3-fp8/resolve/main/ltx-2.3-22b-distilled-fp8.safetensors", + "directory": "checkpoints" + } + ], + "secondTabOffset": 80, + "secondTabText": "Send Back", + "secondTabWidth": 65, + "tabWidth": 65, + "tabXOffset": 10, + "ue_properties": { + "input_ue_unconnectable": {}, + "version": "7.5.2", + "widget_ue_connectable": {} + }, + "ver": "0.10.0" + }, + "widgets_values": [ + "ltx-2.3-22b-distilled-fp8.safetensors" + ] + }, + { + "id": 126, + "type": "LTXVAudioVAELoader", + "pos": [ + 770, + 2590 + ], + "size": [ + 420, + 110 + ], + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "localized_name": "ckpt_name", + "name": "ckpt_name", + "type": "COMBO", + "widget": { + "name": "ckpt_name" + }, + "link": 272 + } + ], + "outputs": [ + { + "localized_name": "Audio VAE", + "name": "Audio VAE", + "type": "VAE", + "links": [ + 205, + 217 + ] + } + ], + "properties": { + "Node name for S&R": "LTXVAudioVAELoader", + "cnr_id": "comfy-core", + "enableTabs": false, + "hasSecondTab": false, + "models": [ + { + "name": "ltx-2.3-22b-distilled-fp8.safetensors", + "url": "https://huggingface.co/Lightricks/LTX-2.3-fp8/resolve/main/ltx-2.3-22b-distilled-fp8.safetensors", + "directory": "checkpoints" + } + ], + "secondTabOffset": 80, + "secondTabText": "Send Back", + "secondTabWidth": 65, + "tabWidth": 65, + "tabXOffset": 10, + "ue_properties": { + "input_ue_unconnectable": {}, + "version": "7.5.2", + "widget_ue_connectable": {} + }, + "ver": "0.10.0" + }, + "widgets_values": [ + "ltx-2.3-22b-distilled-fp8.safetensors" + ] + }, + { + "id": 103, + "type": "LTXAVTextEncoderLoader", + "pos": [ + 770, + 2750 + ], + "size": [ + 410, + 170 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "localized_name": "text_encoder", + "name": "text_encoder", + "type": "COMBO", + "widget": { + "name": "text_encoder" + }, + "link": 273 + }, + { + "localized_name": "ckpt_name", + "name": "ckpt_name", + "type": "COMBO", + "widget": { + "name": "ckpt_name" + }, + "link": 275 + } + ], + "outputs": [ + { + "localized_name": "CLIP", + "name": "CLIP", + "type": "CLIP", + "links": [ + 230, + 231, + 314 + ] + } + ], + "properties": { + "Node name for S&R": "LTXAVTextEncoderLoader", + "cnr_id": "comfy-core", + "enableTabs": false, + "hasSecondTab": false, + "models": [ + { + "name": "gemma_3_12B_it_fp4_mixed.safetensors", + "url": "https://huggingface.co/Comfy-Org/ltx-2/resolve/main/split_files/text_encoders/gemma_3_12B_it_fp4_mixed.safetensors", + "directory": "text_encoders" + }, + { + "name": "ltx-2.3-22b-distilled-fp8.safetensors", + "url": "https://huggingface.co/Lightricks/LTX-2.3-fp8/resolve/main/ltx-2.3-22b-distilled-fp8.safetensors", + "directory": "checkpoints" + } + ], + "secondTabOffset": 80, + "secondTabText": "Send Back", + "secondTabWidth": 65, + "tabWidth": 65, + "tabXOffset": 10, + "ue_properties": { + "input_ue_unconnectable": {}, + "version": "7.5.2", + "widget_ue_connectable": {} + }, + "ver": "0.10.0" + }, + "widgets_values": [ + "gemma_3_12B_it_fp4_mixed.safetensors", + "ltx-2.3-22b-distilled-fp8.safetensors", + "default" + ] + }, + { + "id": 195, + "type": "LoraLoaderModelOnly", + "pos": [ + 750, + 3020 + ], + "size": [ + 470, + 140 + ], + "flags": {}, + "order": 19, + "mode": 0, + "inputs": [ + { + "localized_name": "model", + "name": "model", + "type": "MODEL", + "link": 279 + }, + { + "localized_name": "lora_name", + "name": "lora_name", + "type": "COMBO", + "widget": { + "name": "lora_name" + }, + "link": 1769 + }, + { + "localized_name": "strength_model", + "name": "strength_model", + "type": "FLOAT", + "widget": { + "name": "strength_model" + }, + "link": 1770 + } + ], + "outputs": [ + { + "localized_name": "MODEL", + "name": "MODEL", + "type": "MODEL", + "links": [ + 277, + 1792 + ] + } + ], + "properties": { + "Node name for S&R": "LoraLoaderModelOnly", + "cnr_id": "comfy-core", + "enableTabs": false, + "hasSecondTab": false, + "models": [ + { + "name": "ltx-2.3-22b-ic-lora-ingredients-0.9.safetensors", + "url": "https://huggingface.co/Comfy-Org/ltx-2.3/resolve/main/split_files/loras/ltx-2.3-22b-ic-lora-ingredients-0.9.safetensors", + "directory": "loras" + } + ], + "secondTabOffset": 80, + "secondTabText": "Send Back", + "secondTabWidth": 65, + "tabWidth": 65, + "tabXOffset": 10, + "ver": "0.22.0" + }, + "widgets_values": [ + "ltx-2.3-22b-ic-lora-ingredients-0.9.safetensors", + 1 + ], + "color": "#323", + "bgcolor": "#535" + }, + { + "id": 196, + "type": "GetICLoRAParameters", + "pos": [ + 1590, + 3630 + ], + "size": [ + 300, + 80 + ], + "flags": {}, + "order": 20, + "mode": 0, + "inputs": [ + { + "localized_name": "iclora_model", + "name": "iclora_model", + "type": "MODEL", + "link": 277 + } + ], + "outputs": [ + { + "localized_name": "iclora_parameters", + "name": "iclora_parameters", + "type": "IC_LORA_PARAMETERS", + "links": [ + 288 + ] + } + ], + "properties": { + "Node name for S&R": "GetICLoRAParameters", + "cnr_id": "comfy-core", + "enableTabs": false, + "hasSecondTab": false, + "secondTabOffset": 80, + "secondTabText": "Send Back", + "secondTabWidth": 65, + "tabWidth": 65, + "tabXOffset": 10, + "ver": "0.22.0" + }, + "widgets_values": [], + "color": "#323", + "bgcolor": "#535" + }, + { + "id": 198, + "type": "LTXVImgToVideoInplace", + "pos": [ + 1580, + 3360 + ], + "size": [ + 270, + 180 + ], + "flags": {}, + "order": 21, + "mode": 0, + "inputs": [ + { + "localized_name": "vae", + "name": "vae", + "type": "VAE", + "link": 306 + }, + { + "localized_name": "image", + "name": "image", + "type": "IMAGE", + "link": 1786 + }, + { + "localized_name": "latent", + "name": "latent", + "type": "LATENT", + "link": 296 + }, + { + "localized_name": "bypass", + "name": "bypass", + "type": "BOOLEAN", + "widget": { + "name": "bypass" + }, + "link": 1803 + } + ], + "outputs": [ + { + "localized_name": "latent", + "name": "latent", + "type": "LATENT", + "links": [ + 289 + ] + } + ], + "properties": { + "Node name for S&R": "LTXVImgToVideoInplace", + "cnr_id": "comfy-core", + "enableTabs": false, + "hasSecondTab": false, + "secondTabOffset": 80, + "secondTabText": "Send Back", + "secondTabWidth": 65, + "tabWidth": 65, + "tabXOffset": 10, + "ver": "0.22.0" + }, + "widgets_values": [ + 1, + true + ] + }, + { + "id": 208, + "type": "LoraLoader", + "pos": [ + 770, + 1570 + ], + "size": [ + 380, + 230 + ], + "flags": {}, + "order": 22, + "mode": 0, + "inputs": [ + { + "localized_name": "model", + "name": "model", + "type": "MODEL", + "link": 313 + }, + { + "localized_name": "clip", + "name": "clip", + "type": "CLIP", + "link": 314 + }, + { + "localized_name": "lora_name", + "name": "lora_name", + "type": "COMBO", + "widget": { + "name": "lora_name" + }, + "link": 1768 + } + ], + "outputs": [ + { + "localized_name": "MODEL", + "name": "MODEL", + "type": "MODEL", + "links": null + }, + { + "localized_name": "CLIP", + "name": "CLIP", + "type": "CLIP", + "links": [ + 309 + ] + } + ], + "properties": { + "Node name for S&R": "LoraLoader", + "cnr_id": "comfy-core", + "enableTabs": false, + "hasSecondTab": false, + "models": [ + { + "name": "gemma-3-12b-it-abliterated_lora_rank64_bf16.safetensors", + "url": "https://huggingface.co/Comfy-Org/ltx-2/resolve/main/split_files/loras/gemma-3-12b-it-abliterated_lora_rank64_bf16.safetensors", + "directory": "loras" + } + ], + "secondTabOffset": 80, + "secondTabText": "Send Back", + "secondTabWidth": 65, + "tabWidth": 65, + "tabXOffset": 10, + "ver": "0.16.3" + }, + "widgets_values": [ + "gemma-3-12b-it-abliterated_lora_rank64_bf16.safetensors", + 1, + 1 + ] + }, + { + "id": 209, + "type": "TextGenerateLTX2Prompt", + "pos": [ + 1200, + 1570 + ], + "size": [ + 400, + 420 + ], + "flags": { + "collapsed": false + }, + "order": 23, + "mode": 0, + "inputs": [ + { + "localized_name": "clip", + "name": "clip", + "type": "CLIP", + "link": 309 + }, + { + "localized_name": "image", + "name": "image", + "shape": 7, + "type": "IMAGE", + "link": 1735 + }, + { + "localized_name": "video", + "name": "video", + "shape": 7, + "type": "IMAGE", + "link": null + }, + { + "localized_name": "audio", + "name": "audio", + "shape": 7, + "type": "AUDIO", + "link": null + }, + { + "localized_name": "prompt", + "name": "prompt", + "type": "STRING", + "widget": { + "name": "prompt" + }, + "link": 316 + } + ], + "outputs": [ + { + "localized_name": "generated_text", + "name": "generated_text", + "type": "STRING", + "links": [ + 311 + ] + } + ], + "properties": { + "Node name for S&R": "TextGenerateLTX2Prompt", + "cnr_id": "comfy-core", + "enableTabs": false, + "hasSecondTab": false, + "secondTabOffset": 80, + "secondTabText": "Send Back", + "secondTabWidth": 65, + "tabWidth": 65, + "tabXOffset": 10, + "ver": "0.16.3" + }, + "widgets_values": [ + "### Reference Sheet Description **Top Row Left (Character):** An anthropomorphic bipedal German Shepherd news anchor with realistic brown, tan, and black fur, a calm professional expression, and thin round copper-bronze framed glasses. He is shown in close-up portraits and full-body front, three-quarter, side, and back views standing upright like a person, with a humanoid torso and limbs and a long bushy German Shepherd tail. He wears a vibrant long-sleeve button-down shirt with an abstract multicolored pink-purple-turquoise-yellow woven pattern, dark charcoal dress pants, and dark leather dress shoes. **Top Row Right (Prop):** A professional black studio condenser microphone on a short circular desk stand shown from multiple angles, plus black over-the-ear wireless earpieces / headsets for broadcast cues. **Middle Row Right (Prop):** A flat product view of the same vibrant long-sleeve multicolored patterned button-down shirt, clearly showing the abstract pink, purple, turquoise, and yellow woven texture. **Bottom Row (Setting):** A wide shot of a high-end professional news studio with a large curved dark teal anchor desk in the foreground, a massive digital backdrop screen displaying bold white \"NEWS\" lettering over soft blue-green abstract graphics, and polished cinematic broadcast lighting with studio fixtures visible around the set.\n\n### Target Description A cozy, cinematic scene inside a high-end professional news studio. The camera begins on a wide establishing shot of the large curved dark teal anchor desk and the soft-focus blue-green \"NEWS\" backdrop, then smoothly pushes in to a steady medium shot of the anthropomorphic bipedal German Shepherd news anchor seated behind the desk. He has realistic brown-tan-black fur, thin round copper-bronze glasses, and a calm professional expression. He wears the vibrant long-sleeve multicolored pink-purple-turquoise-yellow patterned button-down shirt with dark charcoal dress pants. His paw-like hands rest on the desk near the black studio condenser microphone. The studio is bathed in polished cinematic broadcast light from the backdrop and overhead fixtures. His initial expression is focused and composed, then he leans slightly toward the microphone, softens into a confident on-air smile, and speaks clearly to camera: \"Good evening, and welcome to tonight's top stories.\" He pauses briefly, glances down at the desk, then looks back up and continues: \"Here's what you need to know.\" The background \"NEWS\" screen and studio lights remain softly detailed behind him, emphasizing his face, glasses, and colorful shirt under the clean broadcast lighting.", + 2048, + "on", + 0.7, + 64, + 0.95, + 0.05, + 1.05, + 0, + 0, + false, + true + ] + }, + { + "id": 210, + "type": "PreviewAny", + "pos": [ + 2040, + 1590 + ], + "size": [ + 510, + 360 + ], + "flags": {}, + "order": 24, + "mode": 4, + "inputs": [ + { + "localized_name": "source", + "name": "source", + "type": "*", + "link": 310 + } + ], + "outputs": [ + { + "localized_name": "STRING", + "name": "STRING", + "type": "STRING", + "links": [ + 1808 + ] + } + ], + "properties": { + "Node name for S&R": "PreviewAny", + "cnr_id": "comfy-core", + "enableTabs": false, + "hasSecondTab": false, + "secondTabOffset": 80, + "secondTabText": "Send Back", + "secondTabWidth": 65, + "tabWidth": 65, + "tabXOffset": 10, + "ver": "0.16.3" + }, + "widgets_values": [ + null, + null, + null + ] + }, + { + "id": 211, + "type": "ComfySwitchNode", + "pos": [ + 1730, + 1980 + ], + "size": [ + 270, + 130 + ], + "flags": {}, + "order": 25, + "mode": 0, + "inputs": [ + { + "localized_name": "on_false", + "name": "on_false", + "type": "STRING", + "link": 317 + }, + { + "localized_name": "on_true", + "name": "on_true", + "type": "STRING", + "link": 311 + }, + { + "localized_name": "switch", + "name": "switch", + "type": "BOOLEAN", + "widget": { + "name": "switch" + }, + "link": 312 + } + ], + "outputs": [ + { + "localized_name": "output", + "name": "output", + "type": "STRING", + "links": [ + 310 + ] + } + ], + "properties": { + "Node name for S&R": "ComfySwitchNode", + "cnr_id": "comfy-core", + "enableTabs": false, + "hasSecondTab": false, + "secondTabOffset": 80, + "secondTabText": "Send Back", + "secondTabWidth": 65, + "tabWidth": 65, + "tabXOffset": 10, + "ver": "0.22.0" + }, + "widgets_values": [ + false + ] + }, + { + "id": 212, + "type": "PrimitiveBoolean", + "pos": [ + 770, + 2050 + ], + "size": [ + 270, + 100 + ], + "flags": {}, + "order": 26, + "mode": 0, + "inputs": [ + { + "localized_name": "value", + "name": "value", + "type": "BOOLEAN", + "widget": { + "name": "value" + }, + "link": 315 + } + ], + "outputs": [ + { + "localized_name": "BOOLEAN", + "name": "BOOLEAN", + "type": "BOOLEAN", + "links": [ + 312 + ] + } + ], + "title": "Boolean (Enable Prompt Enhance)", + "properties": { + "Node name for S&R": "PrimitiveBoolean", + "cnr_id": "comfy-core", + "enableTabs": false, + "hasSecondTab": false, + "secondTabOffset": 80, + "secondTabText": "Send Back", + "secondTabWidth": 65, + "tabWidth": 65, + "tabXOffset": 10, + "ver": "0.22.0" + }, + "widgets_values": [ + false + ] + }, + { + "id": 704, + "type": "KSampler", + "pos": [ + 2030, + 2570 + ], + "size": [ + 270, + 350 + ], + "flags": {}, + "order": 27, + "mode": 0, + "inputs": [ + { + "localized_name": "model", + "name": "model", + "type": "MODEL", + "link": 1792 + }, + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "link": 1791 + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "link": 1790 + }, + { + "localized_name": "latent_image", + "name": "latent_image", + "type": "LATENT", + "link": 1789 + }, + { + "localized_name": "seed", + "name": "seed", + "type": "INT", + "widget": { + "name": "seed" + }, + "link": 1793 + } + ], + "outputs": [ + { + "localized_name": "LATENT", + "name": "LATENT", + "type": "LATENT", + "links": [ + 1788 + ] + } + ], + "properties": { + "Node name for S&R": "KSampler", + "cnr_id": "comfy-core", + "enableTabs": false, + "hasSecondTab": false, + "secondTabOffset": 80, + "secondTabText": "Send Back", + "secondTabWidth": 65, + "tabWidth": 65, + "tabXOffset": 10, + "ver": "0.22.0" + }, + "widgets_values": [ + 288370150520961, + "randomize", + 8, + 1, + "euler_ancestral", + "linear_quadratic", + 1 + ] + }, + { + "id": 710, + "type": "GetImageSize", + "pos": [ + 770, + 3650 + ], + "size": [ + 230, + 120 + ], + "flags": {}, + "order": 28, + "mode": 0, + "inputs": [ + { + "localized_name": "image", + "name": "image", + "type": "IMAGE", + "link": 1802 + } + ], + "outputs": [ + { + "localized_name": "width", + "name": "width", + "type": "INT", + "links": null + }, + { + "localized_name": "height", + "name": "height", + "type": "INT", + "links": null + }, + { + "localized_name": "batch_size", + "name": "batch_size", + "type": "INT", + "links": [ + 1800, + 1801 + ] + } + ], + "properties": { + "Node name for S&R": "GetImageSize" + }, + "widgets_values": [] + }, + { + "id": 711, + "type": "PrimitiveBoolean", + "pos": [ + 750, + 4080 + ], + "size": [ + 270, + 100 + ], + "flags": {}, + "order": 29, + "mode": 0, + "inputs": [ + { + "localized_name": "value", + "name": "value", + "type": "BOOLEAN", + "widget": { + "name": "value" + }, + "link": 1804 + } + ], + "outputs": [ + { + "localized_name": "BOOLEAN", + "name": "BOOLEAN", + "type": "BOOLEAN", + "links": [ + 1803 + ] + } + ], + "properties": { + "Node name for S&R": "PrimitiveBoolean" + }, + "widgets_values": [ + true + ] + } + ], + "groups": [ + { + "id": 1, + "title": "Conditioning", + "bounding": [ + 1050, + 3250, + 1700, + 960 + ], + "color": "#3f789e", + "flags": {} + }, + { + "id": 2, + "title": "Settings", + "bounding": [ + 730, + 3250, + 300, + 960 + ], + "color": "#3f789e", + "flags": {} + }, + { + "id": 5, + "title": "Model", + "bounding": [ + 730, + 2240, + 500, + 980 + ], + "color": "#3f789e", + "flags": {} + }, + { + "id": 6, + "title": "Prompt", + "bounding": [ + 1260, + 2240, + 680, + 980 + ], + "color": "#3f789e", + "flags": {} + }, + { + "id": 7, + "title": "Sampling", + "bounding": [ + 1970, + 2240, + 380, + 980 + ], + "color": "#3f789e", + "flags": {} + }, + { + "id": 8, + "title": "Decoding", + "bounding": [ + 2380, + 2240, + 370, + 980 + ], + "color": "#3f789e", + "flags": {} + }, + { + "id": 24, + "title": "Prompt Enhancement", + "bounding": [ + 730, + 1490, + 2020, + 720 + ], + "color": "#3f789e", + "flags": {} + } + ], + "links": [ + { + "id": 205, + "origin_id": 126, + "origin_slot": 0, + "target_id": 101, + "target_slot": 0, + "type": "VAE" + }, + { + "id": 207, + "origin_id": 114, + "origin_slot": 0, + "target_id": 101, + "target_slot": 2, + "type": "INT" + }, + { + "id": 215, + "origin_id": 121, + "origin_slot": 0, + "target_id": 106, + "target_slot": 2, + "type": "LATENT" + }, + { + "id": 221, + "origin_id": 128, + "origin_slot": 0, + "target_id": 109, + "target_slot": 0, + "type": "CONDITIONING" + }, + { + "id": 222, + "origin_id": 112, + "origin_slot": 0, + "target_id": 109, + "target_slot": 1, + "type": "CONDITIONING" + }, + { + "id": 223, + "origin_id": 123, + "origin_slot": 0, + "target_id": 109, + "target_slot": 2, + "type": "FLOAT" + }, + { + "id": 236, + "origin_id": 109, + "origin_slot": 0, + "target_id": 115, + "target_slot": 0, + "type": "CONDITIONING" + }, + { + "id": 237, + "origin_id": 109, + "origin_slot": 1, + "target_id": 115, + "target_slot": 1, + "type": "CONDITIONING" + }, + { + "id": 245, + "origin_id": 101, + "origin_slot": 0, + "target_id": 119, + "target_slot": 1, + "type": "LATENT" + }, + { + "id": 235, + "origin_id": 114, + "origin_slot": 0, + "target_id": 123, + "target_slot": 0, + "type": "INT" + }, + { + "id": 230, + "origin_id": 103, + "origin_slot": 0, + "target_id": 112, + "target_slot": 0, + "type": "CLIP" + }, + { + "id": 232, + "origin_id": 105, + "origin_slot": 0, + "target_id": 122, + "target_slot": 0, + "type": "IMAGE" + }, + { + "id": 233, + "origin_id": 107, + "origin_slot": 0, + "target_id": 122, + "target_slot": 1, + "type": "AUDIO" + }, + { + "id": 234, + "origin_id": 123, + "origin_slot": 0, + "target_id": 122, + "target_slot": 2, + "type": "FLOAT" + }, + { + "id": 211, + "origin_id": 106, + "origin_slot": 2, + "target_id": 105, + "target_slot": 0, + "type": "LATENT" + }, + { + "id": 212, + "origin_id": 127, + "origin_slot": 2, + "target_id": 105, + "target_slot": 1, + "type": "VAE" + }, + { + "id": 216, + "origin_id": 121, + "origin_slot": 1, + "target_id": 107, + "target_slot": 0, + "type": "LATENT" + }, + { + "id": 217, + "origin_id": 126, + "origin_slot": 0, + "target_id": 107, + "target_slot": 1, + "type": "VAE" + }, + { + "id": 231, + "origin_id": 103, + "origin_slot": 0, + "target_id": 128, + "target_slot": 0, + "type": "CLIP" + }, + { + "id": 252, + "origin_id": 122, + "origin_slot": 0, + "target_id": -20, + "target_slot": 0, + "type": "VIDEO" + }, + { + "id": 266, + "origin_id": -10, + "origin_slot": 4, + "target_id": 113, + "target_slot": 0, + "type": "INT" + }, + { + "id": 267, + "origin_id": -10, + "origin_slot": 5, + "target_id": 98, + "target_slot": 0, + "type": "INT" + }, + { + "id": 269, + "origin_id": -10, + "origin_slot": 6, + "target_id": 114, + "target_slot": 0, + "type": "INT" + }, + { + "id": 272, + "origin_id": -10, + "origin_slot": 8, + "target_id": 126, + "target_slot": 0, + "type": "COMBO" + }, + { + "id": 273, + "origin_id": -10, + "origin_slot": 9, + "target_id": 103, + "target_slot": 0, + "type": "COMBO" + }, + { + "id": 275, + "origin_id": -10, + "origin_slot": 8, + "target_id": 103, + "target_slot": 1, + "type": "COMBO" + }, + { + "id": 276, + "origin_id": -10, + "origin_slot": 8, + "target_id": 127, + "target_slot": 0, + "type": "COMBO" + }, + { + "id": 277, + "origin_id": 195, + "origin_slot": 0, + "target_id": 196, + "target_slot": 0, + "type": "MODEL" + }, + { + "id": 279, + "origin_id": 127, + "origin_slot": 0, + "target_id": 195, + "target_slot": 0, + "type": "MODEL" + }, + { + "id": 287, + "origin_id": 115, + "origin_slot": 2, + "target_id": 119, + "target_slot": 0, + "type": "LATENT" + }, + { + "id": 288, + "origin_id": 196, + "origin_slot": 0, + "target_id": 115, + "target_slot": 6, + "type": "IC_LORA_PARAMETERS" + }, + { + "id": 289, + "origin_id": 198, + "origin_slot": 0, + "target_id": 115, + "target_slot": 3, + "type": "LATENT" + }, + { + "id": 290, + "origin_id": 115, + "origin_slot": 0, + "target_id": 106, + "target_slot": 0, + "type": "CONDITIONING" + }, + { + "id": 292, + "origin_id": 115, + "origin_slot": 1, + "target_id": 106, + "target_slot": 1, + "type": "CONDITIONING" + }, + { + "id": 296, + "origin_id": 108, + "origin_slot": 0, + "target_id": 198, + "target_slot": 2, + "type": "LATENT" + }, + { + "id": 306, + "origin_id": 127, + "origin_slot": 2, + "target_id": 198, + "target_slot": 0, + "type": "VAE" + }, + { + "id": 307, + "origin_id": 127, + "origin_slot": 2, + "target_id": 115, + "target_slot": 2, + "type": "VAE" + }, + { + "id": 309, + "origin_id": 208, + "origin_slot": 1, + "target_id": 209, + "target_slot": 0, + "type": "CLIP" + }, + { + "id": 310, + "origin_id": 211, + "origin_slot": 0, + "target_id": 210, + "target_slot": 0, + "type": "*" + }, + { + "id": 311, + "origin_id": 209, + "origin_slot": 0, + "target_id": 211, + "target_slot": 1, + "type": "STRING" + }, + { + "id": 312, + "origin_id": 212, + "origin_slot": 0, + "target_id": 211, + "target_slot": 2, + "type": "BOOLEAN" + }, + { + "id": 313, + "origin_id": 127, + "origin_slot": 0, + "target_id": 208, + "target_slot": 0, + "type": "MODEL" + }, + { + "id": 314, + "origin_id": 103, + "origin_slot": 0, + "target_id": 208, + "target_slot": 1, + "type": "CLIP" + }, + { + "id": 315, + "origin_id": -10, + "origin_slot": 3, + "target_id": 212, + "target_slot": 0, + "type": "BOOLEAN" + }, + { + "id": 316, + "origin_id": -10, + "origin_slot": 2, + "target_id": 209, + "target_slot": 4, + "type": "STRING" + }, + { + "id": 317, + "origin_id": -10, + "origin_slot": 2, + "target_id": 211, + "target_slot": 0, + "type": "STRING" + }, + { + "id": 1735, + "origin_id": -10, + "origin_slot": 0, + "target_id": 209, + "target_slot": 1, + "type": "IMAGE" + }, + { + "id": 1768, + "origin_id": -10, + "origin_slot": 10, + "target_id": 208, + "target_slot": 2, + "type": "COMBO" + }, + { + "id": 1769, + "origin_id": -10, + "origin_slot": 11, + "target_id": 195, + "target_slot": 1, + "type": "COMBO" + }, + { + "id": 1770, + "origin_id": -10, + "origin_slot": 12, + "target_id": 195, + "target_slot": 2, + "type": "FLOAT" + }, + { + "id": 1777, + "origin_id": -10, + "origin_slot": 1, + "target_id": 115, + "target_slot": 4, + "type": "IMAGE" + }, + { + "id": 1778, + "origin_id": 113, + "origin_slot": 0, + "target_id": 108, + "target_slot": 0, + "type": "INT" + }, + { + "id": 1779, + "origin_id": 98, + "origin_slot": 0, + "target_id": 108, + "target_slot": 1, + "type": "INT" + }, + { + "id": 1786, + "origin_id": -10, + "origin_slot": 0, + "target_id": 198, + "target_slot": 1, + "type": "IMAGE" + }, + { + "id": 1788, + "origin_id": 704, + "origin_slot": 0, + "target_id": 121, + "target_slot": 0, + "type": "LATENT" + }, + { + "id": 1789, + "origin_id": 119, + "origin_slot": 0, + "target_id": 704, + "target_slot": 3, + "type": "LATENT" + }, + { + "id": 1790, + "origin_id": 115, + "origin_slot": 1, + "target_id": 704, + "target_slot": 2, + "type": "CONDITIONING" + }, + { + "id": 1791, + "origin_id": 115, + "origin_slot": 0, + "target_id": 704, + "target_slot": 1, + "type": "CONDITIONING" + }, + { + "id": 1792, + "origin_id": 195, + "origin_slot": 0, + "target_id": 704, + "target_slot": 0, + "type": "MODEL" + }, + { + "id": 1793, + "origin_id": -10, + "origin_slot": 7, + "target_id": 704, + "target_slot": 4, + "type": "INT" + }, + { + "id": 1800, + "origin_id": 710, + "origin_slot": 2, + "target_id": 108, + "target_slot": 2, + "type": "INT" + }, + { + "id": 1801, + "origin_id": 710, + "origin_slot": 2, + "target_id": 101, + "target_slot": 1, + "type": "INT" + }, + { + "id": 1802, + "origin_id": -10, + "origin_slot": 1, + "target_id": 710, + "target_slot": 0, + "type": "IMAGE" + }, + { + "id": 1803, + "origin_id": 711, + "origin_slot": 0, + "target_id": 198, + "target_slot": 3, + "type": "BOOLEAN" + }, + { + "id": 1804, + "origin_id": -10, + "origin_slot": 13, + "target_id": 711, + "target_slot": 0, + "type": "BOOLEAN" + }, + { + "id": 1808, + "origin_id": 210, + "origin_slot": 0, + "target_id": 128, + "target_slot": 1, + "type": "STRING" + } + ], + "extra": { + "ue_links": [] + } + } + ] + }, + "config": {}, + "extra": { + "VHS_KeepIntermediate": true, + "VHS_MetadataImage": true, + "VHS_latentpreview": false, + "VHS_latentpreviewrate": 0, + "frontendVersion": "1.45.15", + "ue_links": [], + "workflowRendererVersion": "Vue-corrected", + "ds": { + "scale": 0.5959744833082783, + "offset": [ + 2409.0282524930844, + -1818.184424107724 + ] + } + }, + "version": 0.4 +} \ No newline at end of file diff --git a/docs/serviceTemplates/workflows/ocean_ugc_product.json b/docs/serviceTemplates/workflows/ocean_ugc_product.json new file mode 100644 index 000000000..8692c0e19 --- /dev/null +++ b/docs/serviceTemplates/workflows/ocean_ugc_product.json @@ -0,0 +1,5059 @@ +{ + "id": "07824bbb-6672-4bb0-ac36-4313a519e35b", + "revision": 0, + "last_node_id": 400, + "last_link_id": 646, + "nodes": [ + { + "id": 269, + "type": "LoadImage", + "pos": [ + 0.0, + 0.0 + ], + "size": [ + 410, + 530 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 633 + ] + }, + { + "name": "MASK", + "type": "MASK", + "links": null + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.16.3", + "Node name for S&R": "LoadImage", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + "egyptian_queen.png", + "image" + ], + "title": "Product photo" + }, + { + "id": 75, + "type": "SaveVideo", + "pos": [ + 960.0, + 0.0 + ], + "size": [ + 660, + 580 + ], + "flags": { + "collapsed": false + }, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "video", + "type": "VIDEO", + "link": 632 + } + ], + "outputs": [ + { + "name": "video", + "type": "VIDEO", + "links": null + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.5.1", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "Node name for S&R": "SaveVideo", + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + "ocean_ugc_product", + "auto", + "auto" + ], + "title": "Output clip" + }, + { + "id": 320, + "type": "2454ad83-157c-40dd-9f19-5daaf4041ce0", + "pos": [ + 500.0, + 0.0 + ], + "size": [ + 380, + 650 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "label": "first_frame", + "name": "input", + "type": "IMAGE,MASK", + "link": 633 + }, + { + "label": "prompt", + "name": "value", + "type": "STRING", + "widget": { + "name": "value" + }, + "link": null + }, + { + "label": "prompt_enhance", + "name": "value_1", + "type": "BOOLEAN", + "widget": { + "name": "value_1" + }, + "link": null + }, + { + "label": "width", + "name": "value_2", + "type": "INT", + "widget": { + "name": "value_2" + }, + "link": null + }, + { + "label": "height", + "name": "value_3", + "type": "INT", + "widget": { + "name": "value_3" + }, + "link": null + }, + { + "label": "duration", + "name": "value_4", + "type": "INT", + "widget": { + "name": "value_4" + }, + "link": null + }, + { + "label": "fps", + "name": "value_5", + "type": "INT", + "widget": { + "name": "value_5" + }, + "link": null + }, + { + "label": "seed", + "name": "noise_seed", + "type": "INT", + "widget": { + "name": "noise_seed" + }, + "link": null + }, + { + "label": "distilled_lora", + "name": "lora_name", + "type": "COMBO", + "widget": { + "name": "lora_name" + }, + "link": null + }, + { + "label": "text_encoder", + "name": "text_encoder", + "type": "COMBO", + "widget": { + "name": "text_encoder" + }, + "link": null + }, + { + "label": "latent_upscale_model", + "name": "model_name", + "type": "COMBO", + "widget": { + "name": "model_name" + }, + "link": null + }, + { + "label": "lora", + "name": "lora_name_1", + "type": "COMBO", + "widget": { + "name": "lora_name_1" + }, + "link": null + } + ], + "outputs": [ + { + "name": "VIDEO", + "type": "VIDEO", + "links": [ + 632 + ] + } + ], + "properties": { + "proxyWidgets": [ + [ + "319", + "value" + ], + [ + "328", + "value" + ], + [ + "312", + "value" + ], + [ + "299", + "value" + ], + [ + "301", + "value" + ], + [ + "300", + "value" + ], + [ + "277", + "noise_seed" + ], + [ + "316", + "ckpt_name" + ], + [ + "285", + "lora_name" + ], + [ + "317", + "text_encoder" + ], + [ + "311", + "model_name" + ], + [ + "324", + "lora_name" + ] + ], + "cnr_id": "comfy-core", + "ver": "0.16.3", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": { + "value_1": true, + "value_2": true, + "value_3": true, + "value_4": true, + "lora_name": true, + "model_name": true, + "value_5": true + }, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [], + "title": "Generate video" + }, + { + "id": 400, + "type": "MarkdownNote", + "pos": [ + -1580.0, + 0.0 + ], + "size": [ + 1180.0, + 180.0 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [], + "outputs": [], + "title": "How to use", + "properties": {}, + "widgets_values": [ + "## Product → vertical clip\n\n**1.** Upload your product photo in *Product photo*.\n\n**2.** Edit the prompt inside *Generate video* to describe the shot you want.\n\n**3.** Run.\n\nThe clip saves to your bucket — 720×1280, 5 s, with ambient audio." + ] + } + ], + "links": [ + [ + 632, + 320, + 0, + 75, + 0, + "VIDEO" + ], + [ + 633, + 269, + 0, + 320, + 0, + "IMAGE" + ] + ], + "groups": [], + "definitions": { + "subgraphs": [ + { + "id": "2454ad83-157c-40dd-9f19-5daaf4041ce0", + "version": 1, + "state": { + "lastGroupId": 26, + "lastNodeId": 329, + "lastLinkId": 646, + "lastRerouteId": 0 + }, + "revision": 0, + "config": {}, + "name": "Image to Video (LTX-2.3)", + "inputNode": { + "id": -10, + "bounding": [ + 730, + 4110, + 170.162109375, + 308 + ] + }, + "outputNode": { + "id": -20, + "bounding": [ + 6590, + 4360, + 128, + 68 + ] + }, + "inputs": [ + { + "id": "7afd6ea8-c738-4fd9-97b8-66fa905cd381", + "name": "input", + "type": "IMAGE,MASK", + "linkIds": [ + 535 + ], + "localized_name": "input", + "label": "first_frame", + "pos": [ + 876.162109375, + 4134 + ] + }, + { + "id": "9494c550-4172-49c6-930e-5b508f775e77", + "name": "value", + "type": "STRING", + "linkIds": [ + 595 + ], + "label": "prompt", + "pos": [ + 876.162109375, + 4154 + ] + }, + { + "id": "ec291311-2d21-49f9-aaba-24bb2e544ce0", + "name": "value_1", + "type": "BOOLEAN", + "linkIds": [ + 644 + ], + "label": "prompt_enhance", + "pos": [ + 876.162109375, + 4174 + ] + }, + { + "id": "58dbb3f6-f924-4548-96ef-e0e34610bd4e", + "name": "value_2", + "type": "INT", + "linkIds": [ + 597 + ], + "label": "width", + "pos": [ + 876.162109375, + 4194 + ] + }, + { + "id": "6086d5b8-2586-448c-a641-dd14d76dd102", + "name": "value_3", + "type": "INT", + "linkIds": [ + 598 + ], + "label": "height", + "pos": [ + 876.162109375, + 4214 + ] + }, + { + "id": "feb8c2eb-ae48-4fa8-bc24-929552d656c3", + "name": "value_4", + "type": "INT", + "linkIds": [ + 599 + ], + "label": "duration", + "pos": [ + 876.162109375, + 4234 + ] + }, + { + "id": "3e32ce15-0ae7-4cd0-909f-a354e8e9c4c9", + "name": "value_5", + "type": "INT", + "linkIds": [ + 624 + ], + "label": "fps", + "pos": [ + 876.162109375, + 4254 + ] + }, + { + "id": "dc40eadf-b8a9-421e-88f6-245042dd5424", + "name": "noise_seed", + "type": "INT", + "linkIds": [ + 646 + ], + "label": "seed", + "pos": [ + 876.162109375, + 4274 + ] + }, + { + "id": "d7255058-319a-4880-8f9a-7e542c8f3c3c", + "name": "ckpt_name", + "type": "COMBO", + "linkIds": [ + 601, + 604, + 605 + ], + "pos": [ + 876.162109375, + 4294 + ] + }, + { + "id": "4afce68d-8f65-4342-9d6d-ae0a7688c3e3", + "name": "lora_name", + "type": "COMBO", + "linkIds": [ + 602 + ], + "label": "distilled_lora", + "pos": [ + 876.162109375, + 4314 + ] + }, + { + "id": "ab842b4b-c977-4679-b421-424722785b57", + "name": "text_encoder", + "type": "COMBO", + "linkIds": [ + 606 + ], + "label": "text_encoder", + "pos": [ + 876.162109375, + 4334 + ] + }, + { + "id": "9e47372d-28d9-4311-91e9-e90d03f4eb43", + "name": "model_name", + "type": "COMBO", + "linkIds": [ + 607 + ], + "label": "latent_upscale_model", + "pos": [ + 876.162109375, + 4354 + ] + }, + { + "id": "682e457c-5d94-49b2-bf40-5731696deaf0", + "name": "lora_name_1", + "type": "COMBO", + "linkIds": [ + 645 + ], + "label": "lora", + "pos": [ + 876.162109375, + 4374 + ] + } + ], + "outputs": [ + { + "id": "954ef307-c897-4eea-8b5c-5c6ce15a5357", + "name": "VIDEO", + "type": "VIDEO", + "linkIds": [ + 536 + ], + "localized_name": "VIDEO", + "pos": [ + 6614, + 4384 + ] + } + ], + "widgets": [], + "nodes": [ + { + "id": 276, + "type": "RandomNoise", + "pos": [ + 4700, + 3650 + ], + "size": [ + 280, + 110 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [], + "outputs": [ + { + "localized_name": "NOISE", + "name": "NOISE", + "type": "NOISE", + "links": [ + 490 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.3.75", + "Node name for S&R": "RandomNoise", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + 42, + "fixed" + ] + }, + { + "id": 277, + "type": "RandomNoise", + "pos": [ + 3160, + 3630 + ], + "size": [ + 280, + 110 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "localized_name": "noise_seed", + "name": "noise_seed", + "type": "INT", + "widget": { + "name": "noise_seed" + }, + "link": 646 + } + ], + "outputs": [ + { + "localized_name": "NOISE", + "name": "NOISE", + "type": "NOISE", + "links": [ + 483 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.3.56", + "Node name for S&R": "RandomNoise", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + 60540193790228, + "randomize" + ] + }, + { + "id": 278, + "type": "LTXVConcatAVLatent", + "pos": [ + 4710, + 4490 + ], + "size": [ + 280, + 100 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "localized_name": "video_latent", + "name": "video_latent", + "type": "LATENT", + "link": 512 + }, + { + "localized_name": "audio_latent", + "name": "audio_latent", + "type": "LATENT", + "link": 513 + } + ], + "outputs": [ + { + "localized_name": "latent", + "name": "latent", + "type": "LATENT", + "links": [ + 494 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.5.1", + "Node name for S&R": "LTXVConcatAVLatent", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [] + }, + { + "id": 279, + "type": "LTXVAudioVAELoader", + "pos": [ + 1660, + 4100 + ], + "size": [ + 430, + 110 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "localized_name": "ckpt_name", + "name": "ckpt_name", + "type": "COMBO", + "widget": { + "name": "ckpt_name" + }, + "link": 604 + } + ], + "outputs": [ + { + "localized_name": "Audio VAE", + "name": "Audio VAE", + "type": "VAE", + "links": [ + 481, + 496 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.3.68", + "Node name for S&R": "LTXVAudioVAELoader", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "models": [ + { + "name": "ltx-2.3-22b-dev-fp8.safetensors", + "url": "https://huggingface.co/Lightricks/LTX-2.3-fp8/resolve/main/ltx-2.3-22b-dev-fp8.safetensors", + "directory": "checkpoints" + } + ], + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + "ltx-2.3-22b-dev-fp8.safetensors" + ] + }, + { + "id": 280, + "type": "KSamplerSelect", + "pos": [ + 4700, + 4100 + ], + "size": [ + 280, + 110 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [], + "outputs": [ + { + "localized_name": "SAMPLER", + "name": "SAMPLER", + "type": "SAMPLER", + "links": [ + 492 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.3.75", + "Node name for S&R": "KSamplerSelect", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + "euler" + ] + }, + { + "id": 281, + "type": "ManualSigmas", + "pos": [ + 4700, + 4290 + ], + "size": [ + 280, + 110 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [], + "outputs": [ + { + "localized_name": "SIGMAS", + "name": "SIGMAS", + "type": "SIGMAS", + "links": [ + 493 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.5.1", + "Node name for S&R": "ManualSigmas", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + "0.85, 0.7250, 0.4219, 0.0" + ] + }, + { + "id": 282, + "type": "CFGGuider", + "pos": [ + 4700, + 3850 + ], + "size": [ + 280, + 160 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "localized_name": "model", + "name": "model", + "type": "MODEL", + "link": 478 + }, + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "link": 479 + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "link": 480 + } + ], + "outputs": [ + { + "localized_name": "GUIDER", + "name": "GUIDER", + "type": "GUIDER", + "links": [ + 491 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.3.71", + "Node name for S&R": "CFGGuider", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + 1 + ] + }, + { + "id": 283, + "type": "SamplerCustomAdvanced", + "pos": [ + 3550, + 3630 + ], + "size": [ + 230, + 170 + ], + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "localized_name": "noise", + "name": "noise", + "type": "NOISE", + "link": 483 + }, + { + "localized_name": "guider", + "name": "guider", + "type": "GUIDER", + "link": 484 + }, + { + "localized_name": "sampler", + "name": "sampler", + "type": "SAMPLER", + "link": 485 + }, + { + "localized_name": "sigmas", + "name": "sigmas", + "type": "SIGMAS", + "link": 544 + }, + { + "localized_name": "latent_image", + "name": "latent_image", + "type": "LATENT", + "link": 487 + } + ], + "outputs": [ + { + "localized_name": "output", + "name": "output", + "type": "LATENT", + "links": [ + 488 + ] + }, + { + "localized_name": "denoised_output", + "name": "denoised_output", + "type": "LATENT", + "links": [] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.3.60", + "Node name for S&R": "SamplerCustomAdvanced", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [] + }, + { + "id": 284, + "type": "LTXVCropGuides", + "pos": [ + 3830, + 3810 + ], + "size": [ + 250, + 120 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "link": 475 + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "link": 476 + }, + { + "localized_name": "latent", + "name": "latent", + "type": "LATENT", + "link": 477 + } + ], + "outputs": [ + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "links": [ + 479 + ] + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "links": [ + 480 + ] + }, + { + "localized_name": "latent", + "name": "latent", + "type": "LATENT", + "slot_index": 2, + "links": [] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.3.68", + "Node name for S&R": "LTXVCropGuides", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [] + }, + { + "id": 285, + "type": "LoraLoaderModelOnly", + "pos": [ + 1660, + 3890 + ], + "size": [ + 430, + 140 + ], + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "localized_name": "model", + "name": "model", + "type": "MODEL", + "link": 520 + }, + { + "localized_name": "lora_name", + "name": "lora_name", + "type": "COMBO", + "widget": { + "name": "lora_name" + }, + "link": 602 + } + ], + "outputs": [ + { + "localized_name": "MODEL", + "name": "MODEL", + "type": "MODEL", + "links": [ + 478, + 541, + 641 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.3.75", + "Node name for S&R": "LoraLoaderModelOnly", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "models": [ + { + "name": "ltx_2.3_22b_distilled_1.1_lora_dynamic_fro09_avg_rank_111_bf16.safetensors", + "url": "https://huggingface.co/Comfy-Org/ltx-2.3/resolve/main/split_files/loras/ltx_2.3_22b_distilled_1.1_lora_dynamic_fro09_avg_rank_111_bf16.safetensors", + "directory": "loras" + } + ], + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + "ltx_2.3_22b_distilled_1.1_lora_dynamic_fro09_avg_rank_111_bf16.safetensors", + 0.5 + ] + }, + { + "id": 286, + "type": "ResizeImagesByLongerEdge", + "pos": [ + 2070, + 4810 + ], + "size": [ + 348.624609375, + 110 + ], + "flags": { + "collapsed": false + }, + "order": 13, + "mode": 0, + "inputs": [ + { + "localized_name": "images", + "name": "images", + "type": "IMAGE", + "link": 523 + } + ], + "outputs": [ + { + "localized_name": "images", + "name": "images", + "type": "IMAGE", + "links": [ + 505 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.5.1", + "Node name for S&R": "ResizeImagesByLongerEdge", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + 1536 + ] + }, + { + "id": 287, + "type": "LTXVLatentUpsampler", + "pos": [ + 4250, + 3760 + ], + "size": [ + 330, + 120 + ], + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "link": 547 + }, + { + "localized_name": "upscale_model", + "name": "upscale_model", + "type": "LATENT_UPSCALE_MODEL", + "link": 545 + }, + { + "localized_name": "vae", + "name": "vae", + "type": "VAE", + "link": 554 + } + ], + "outputs": [ + { + "localized_name": "LATENT", + "name": "LATENT", + "type": "LATENT", + "links": [ + 548 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.14.1", + "Node name for S&R": "LTXVLatentUpsampler", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [] + }, + { + "id": 288, + "type": "LTXVImgToVideoInplace", + "pos": [ + 4230, + 4100 + ], + "size": [ + 300, + 180 + ], + "flags": {}, + "order": 15, + "mode": 0, + "inputs": [ + { + "localized_name": "vae", + "name": "vae", + "type": "VAE", + "link": 552 + }, + { + "localized_name": "image", + "name": "image", + "type": "IMAGE", + "link": 515 + }, + { + "localized_name": "latent", + "name": "latent", + "type": "LATENT", + "link": 548 + }, + { + "localized_name": "bypass", + "name": "bypass", + "type": "BOOLEAN", + "widget": { + "name": "bypass" + }, + "link": 543 + } + ], + "outputs": [ + { + "localized_name": "latent", + "name": "latent", + "type": "LATENT", + "links": [ + 512 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.7.0", + "Node name for S&R": "LTXVImgToVideoInplace", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + 1, + false + ] + }, + { + "id": 289, + "type": "LTXVPreprocess", + "pos": [ + 2100, + 5010 + ], + "size": [ + 290, + 110 + ], + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "localized_name": "image", + "name": "image", + "type": "IMAGE", + "link": 505 + } + ], + "outputs": [ + { + "localized_name": "output_image", + "name": "output_image", + "type": "IMAGE", + "links": [ + 510, + 515 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.7.0", + "Node name for S&R": "LTXVPreprocess", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + 18 + ] + }, + { + "id": 290, + "type": "ResizeImageMaskNode", + "pos": [ + 1660, + 4810 + ], + "size": [ + 300, + 154 + ], + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "localized_name": "input", + "name": "input", + "type": "IMAGE,MASK", + "link": 535 + }, + { + "localized_name": "width", + "name": "resize_type.width", + "type": "INT", + "widget": { + "name": "resize_type.width" + }, + "link": 558 + }, + { + "localized_name": "height", + "name": "resize_type.height", + "type": "INT", + "widget": { + "name": "resize_type.height" + }, + "link": 559 + } + ], + "outputs": [ + { + "localized_name": "resized", + "name": "resized", + "type": "IMAGE,MASK", + "links": [ + 523 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.7.0", + "Node name for S&R": "ResizeImageMaskNode", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + "scale dimensions", + 1920, + 1088, + "center", + "lanczos" + ] + }, + { + "id": 291, + "type": "KSamplerSelect", + "pos": [ + 3160, + 4040 + ], + "size": [ + 280, + 110 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [], + "outputs": [ + { + "localized_name": "SAMPLER", + "name": "SAMPLER", + "type": "SAMPLER", + "links": [ + 485 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.3.56", + "Node name for S&R": "KSamplerSelect", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + "euler" + ] + }, + { + "id": 292, + "type": "ComfyMathExpression", + "pos": [ + 2540, + 4830 + ], + "size": [ + 225, + 74 + ], + "flags": { + "collapsed": true + }, + "order": 18, + "mode": 0, + "inputs": [ + { + "label": "a", + "localized_name": "values.a", + "name": "values.a", + "type": "FLOAT,INT,BOOLEAN", + "link": 560 + }, + { + "label": "b", + "localized_name": "values.b", + "name": "values.b", + "shape": 7, + "type": "FLOAT,INT,BOOLEAN", + "link": null + } + ], + "outputs": [ + { + "localized_name": "FLOAT", + "name": "FLOAT", + "type": "FLOAT", + "links": null + }, + { + "localized_name": "INT", + "name": "INT", + "type": "INT", + "links": [ + 561 + ] + }, + { + "localized_name": "BOOL", + "name": "BOOL", + "type": "BOOLEAN", + "links": null + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.16.3", + "Node name for S&R": "ComfyMathExpression", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + "a/2" + ] + }, + { + "id": 293, + "type": "Reroute", + "pos": [ + 3850, + 4050 + ], + "size": [ + 75, + 26 + ], + "flags": {}, + "order": 19, + "mode": 0, + "inputs": [ + { + "name": "", + "type": "*", + "link": 557 + } + ], + "outputs": [ + { + "name": "", + "type": "VAE", + "links": [ + 552, + 553, + 554 + ] + } + ], + "properties": { + "showOutputText": false, + "horizontal": false, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + } + }, + { + "id": 294, + "type": "ComfyMathExpression", + "pos": [ + 2550, + 4890 + ], + "size": [ + 225, + 74 + ], + "flags": { + "collapsed": true + }, + "order": 20, + "mode": 0, + "inputs": [ + { + "label": "a", + "localized_name": "values.a", + "name": "values.a", + "type": "FLOAT,INT,BOOLEAN", + "link": 562 + }, + { + "label": "b", + "localized_name": "values.b", + "name": "values.b", + "shape": 7, + "type": "FLOAT,INT,BOOLEAN", + "link": null + } + ], + "outputs": [ + { + "localized_name": "FLOAT", + "name": "FLOAT", + "type": "FLOAT", + "links": null + }, + { + "localized_name": "INT", + "name": "INT", + "type": "INT", + "links": [ + 563 + ] + }, + { + "localized_name": "BOOL", + "name": "BOOL", + "type": "BOOLEAN", + "links": null + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.16.3", + "Node name for S&R": "ComfyMathExpression", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + "a/2" + ] + }, + { + "id": 295, + "type": "EmptyLTXVLatentVideo", + "pos": [ + 2870, + 4940 + ], + "size": [ + 280, + 200 + ], + "flags": {}, + "order": 21, + "mode": 0, + "inputs": [ + { + "localized_name": "width", + "name": "width", + "type": "INT", + "widget": { + "name": "width" + }, + "link": 561 + }, + { + "localized_name": "height", + "name": "height", + "type": "INT", + "widget": { + "name": "height" + }, + "link": 563 + }, + { + "localized_name": "length", + "name": "length", + "type": "INT", + "widget": { + "name": "length" + }, + "link": 631 + } + ], + "outputs": [ + { + "localized_name": "LATENT", + "name": "LATENT", + "type": "LATENT", + "links": [ + 511 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.3.60", + "Node name for S&R": "EmptyLTXVLatentVideo", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + 768, + 512, + 97, + 1 + ] + }, + { + "id": 296, + "type": "LTXVImgToVideoInplace", + "pos": [ + 3230, + 4810 + ], + "size": [ + 280, + 180 + ], + "flags": {}, + "order": 22, + "mode": 0, + "inputs": [ + { + "localized_name": "vae", + "name": "vae", + "type": "VAE", + "link": 556 + }, + { + "localized_name": "image", + "name": "image", + "type": "IMAGE", + "link": 510 + }, + { + "localized_name": "latent", + "name": "latent", + "type": "LATENT", + "link": 511 + }, + { + "localized_name": "bypass", + "name": "bypass", + "type": "BOOLEAN", + "widget": { + "name": "bypass" + }, + "link": 542 + } + ], + "outputs": [ + { + "localized_name": "latent", + "name": "latent", + "type": "LATENT", + "links": [ + 497 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.7.0", + "Node name for S&R": "LTXVImgToVideoInplace", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + 0.7, + false + ] + }, + { + "id": 297, + "type": "LTXVAudioVAEDecode", + "pos": [ + 5760, + 3970 + ], + "size": [ + 270, + 100 + ], + "flags": {}, + "order": 23, + "mode": 0, + "inputs": [ + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "link": 495 + }, + { + "label": "Audio VAE", + "localized_name": "audio_vae", + "name": "audio_vae", + "type": "VAE", + "link": 496 + } + ], + "outputs": [ + { + "localized_name": "Audio", + "name": "Audio", + "type": "AUDIO", + "links": [ + 534 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.7.0", + "Node name for S&R": "LTXVAudioVAEDecode", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [] + }, + { + "id": 298, + "type": "ComfyMathExpression", + "pos": [ + 2540, + 5030 + ], + "size": [ + 225, + 74 + ], + "flags": { + "collapsed": true + }, + "order": 24, + "mode": 0, + "inputs": [ + { + "label": "a", + "localized_name": "values.a", + "name": "values.a", + "type": "FLOAT,INT,BOOLEAN", + "link": 564 + }, + { + "label": "b", + "localized_name": "values.b", + "name": "values.b", + "shape": 7, + "type": "FLOAT,INT,BOOLEAN", + "link": null + } + ], + "outputs": [ + { + "localized_name": "FLOAT", + "name": "FLOAT", + "type": "FLOAT", + "links": [ + 566, + 591 + ] + }, + { + "localized_name": "INT", + "name": "INT", + "type": "INT", + "links": [ + 565 + ] + }, + { + "localized_name": "BOOL", + "name": "BOOL", + "type": "BOOLEAN", + "links": null + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.16.3", + "Node name for S&R": "ComfyMathExpression", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + "a" + ] + }, + { + "id": 299, + "type": "PrimitiveInt", + "pos": [ + 1190, + 4650 + ], + "size": [ + 370, + 110 + ], + "flags": {}, + "order": 25, + "mode": 0, + "inputs": [ + { + "localized_name": "value", + "name": "value", + "type": "INT", + "widget": { + "name": "value" + }, + "link": 598 + } + ], + "outputs": [ + { + "localized_name": "INT", + "name": "INT", + "type": "INT", + "links": [ + 559, + 562 + ] + } + ], + "title": "Height", + "properties": { + "cnr_id": "comfy-core", + "ver": "0.16.3", + "Node name for S&R": "PrimitiveInt", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + 1280, + "fixed" + ] + }, + { + "id": 300, + "type": "PrimitiveInt", + "pos": [ + 1190, + 4840 + ], + "size": [ + 370, + 110 + ], + "flags": {}, + "order": 26, + "mode": 0, + "inputs": [ + { + "localized_name": "value", + "name": "value", + "type": "INT", + "widget": { + "name": "value" + }, + "link": 624 + } + ], + "outputs": [ + { + "localized_name": "INT", + "name": "INT", + "type": "INT", + "links": [ + 564, + 629 + ] + } + ], + "title": "Frame Rate", + "properties": { + "cnr_id": "comfy-core", + "ver": "0.16.3", + "Node name for S&R": "PrimitiveInt", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + 25, + "fixed" + ] + }, + { + "id": 301, + "type": "PrimitiveInt", + "pos": [ + 1190, + 4280 + ], + "size": [ + 370, + 110 + ], + "flags": {}, + "order": 27, + "mode": 0, + "inputs": [ + { + "localized_name": "value", + "name": "value", + "type": "INT", + "widget": { + "name": "value" + }, + "link": 599 + } + ], + "outputs": [ + { + "localized_name": "INT", + "name": "INT", + "type": "INT", + "links": [ + 628 + ] + } + ], + "title": "Duration", + "properties": { + "cnr_id": "comfy-core", + "ver": "0.7.0", + "Node name for S&R": "PrimitiveInt", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + 5, + "fixed" + ] + }, + { + "id": 302, + "type": "PrimitiveBoolean", + "pos": [ + 1190, + 4110 + ], + "size": [ + 370, + 100 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [], + "outputs": [ + { + "localized_name": "BOOLEAN", + "name": "BOOLEAN", + "type": "BOOLEAN", + "links": [ + 542, + 543 + ] + } + ], + "title": "Switch to Text to Video?", + "properties": { + "cnr_id": "comfy-core", + "ver": "0.16.0", + "Node name for S&R": "PrimitiveBoolean", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + false + ] + }, + { + "id": 303, + "type": "CLIPTextEncode", + "pos": [ + 2170, + 3640 + ], + "size": [ + 600, + 390 + ], + "flags": {}, + "order": 28, + "mode": 0, + "inputs": [ + { + "localized_name": "clip", + "name": "clip", + "type": "CLIP", + "link": 642 + }, + { + "localized_name": "text", + "name": "text", + "type": "STRING", + "widget": { + "name": "text" + }, + "link": 638 + } + ], + "outputs": [ + { + "localized_name": "CONDITIONING", + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 526 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.3.56", + "Node name for S&R": "CLIPTextEncode", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + "" + ], + "color": "#232", + "bgcolor": "#353" + }, + { + "id": 304, + "type": "LTXVConditioning", + "pos": [ + 2800, + 3810 + ], + "size": [ + 280, + 130 + ], + "flags": {}, + "order": 29, + "mode": 0, + "inputs": [ + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "link": 526 + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "link": 527 + }, + { + "localized_name": "frame_rate", + "name": "frame_rate", + "type": "FLOAT", + "widget": { + "name": "frame_rate" + }, + "link": 566 + } + ], + "outputs": [ + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "links": [ + 475, + 518 + ] + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "links": [ + 476, + 519 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.3.56", + "Node name for S&R": "LTXVConditioning", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + 24 + ] + }, + { + "id": 305, + "type": "LTXVEmptyLatentAudio", + "pos": [ + 3540, + 4960 + ], + "size": [ + 280, + 170 + ], + "flags": {}, + "order": 30, + "mode": 0, + "inputs": [ + { + "localized_name": "audio_vae", + "name": "audio_vae", + "type": "VAE", + "link": 481 + }, + { + "localized_name": "frames_number", + "name": "frames_number", + "type": "INT", + "widget": { + "name": "frames_number" + }, + "link": 630 + }, + { + "localized_name": "frame_rate", + "name": "frame_rate", + "type": "INT", + "widget": { + "name": "frame_rate" + }, + "link": 565 + } + ], + "outputs": [ + { + "localized_name": "Latent", + "name": "Latent", + "type": "LATENT", + "links": [ + 498 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.3.68", + "Node name for S&R": "LTXVEmptyLatentAudio", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + 97, + 25, + 1 + ] + }, + { + "id": 306, + "type": "ManualSigmas", + "pos": [ + 3160, + 4220 + ], + "size": [ + 500, + 110 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [], + "outputs": [ + { + "localized_name": "SIGMAS", + "name": "SIGMAS", + "type": "SIGMAS", + "links": [ + 544 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.14.1", + "Node name for S&R": "ManualSigmas", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + "1.0, 0.99375, 0.9875, 0.98125, 0.975, 0.909375, 0.725, 0.421875, 0.0" + ] + }, + { + "id": 307, + "type": "LTXVSeparateAVLatent", + "pos": [ + 3820, + 3630 + ], + "size": [ + 250, + 100 + ], + "flags": {}, + "order": 31, + "mode": 0, + "inputs": [ + { + "localized_name": "av_latent", + "name": "av_latent", + "type": "LATENT", + "link": 488 + } + ], + "outputs": [ + { + "localized_name": "video_latent", + "name": "video_latent", + "type": "LATENT", + "links": [ + 477, + 547 + ] + }, + { + "localized_name": "audio_latent", + "name": "audio_latent", + "type": "LATENT", + "links": [ + 513 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.5.1", + "Node name for S&R": "LTXVSeparateAVLatent", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [] + }, + { + "id": 308, + "type": "SamplerCustomAdvanced", + "pos": [ + 5050, + 3650 + ], + "size": [ + 230, + 170 + ], + "flags": {}, + "order": 32, + "mode": 0, + "inputs": [ + { + "localized_name": "noise", + "name": "noise", + "type": "NOISE", + "link": 490 + }, + { + "localized_name": "guider", + "name": "guider", + "type": "GUIDER", + "link": 491 + }, + { + "localized_name": "sampler", + "name": "sampler", + "type": "SAMPLER", + "link": 492 + }, + { + "localized_name": "sigmas", + "name": "sigmas", + "type": "SIGMAS", + "link": 493 + }, + { + "localized_name": "latent_image", + "name": "latent_image", + "type": "LATENT", + "link": 494 + } + ], + "outputs": [ + { + "localized_name": "output", + "name": "output", + "type": "LATENT", + "links": [ + 578 + ] + }, + { + "localized_name": "denoised_output", + "name": "denoised_output", + "type": "LATENT", + "links": [] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.3.75", + "Node name for S&R": "SamplerCustomAdvanced", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [] + }, + { + "id": 309, + "type": "LTXVSeparateAVLatent", + "pos": [ + 5390, + 3650 + ], + "size": [ + 230, + 100 + ], + "flags": {}, + "order": 33, + "mode": 0, + "inputs": [ + { + "localized_name": "av_latent", + "name": "av_latent", + "type": "LATENT", + "link": 578 + } + ], + "outputs": [ + { + "localized_name": "video_latent", + "name": "video_latent", + "type": "LATENT", + "links": [ + 539 + ] + }, + { + "localized_name": "audio_latent", + "name": "audio_latent", + "type": "LATENT", + "links": [ + 495 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.5.1", + "Node name for S&R": "LTXVSeparateAVLatent", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [] + }, + { + "id": 310, + "type": "CreateVideo", + "pos": [ + 6050, + 4490 + ], + "size": [ + 280, + 130 + ], + "flags": {}, + "order": 34, + "mode": 0, + "inputs": [ + { + "localized_name": "images", + "name": "images", + "type": "IMAGE", + "link": 538 + }, + { + "localized_name": "audio", + "name": "audio", + "shape": 7, + "type": "AUDIO", + "link": 534 + }, + { + "localized_name": "fps", + "name": "fps", + "type": "FLOAT", + "widget": { + "name": "fps" + }, + "link": 591 + } + ], + "outputs": [ + { + "localized_name": "VIDEO", + "name": "VIDEO", + "type": "VIDEO", + "links": [ + 536 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.5.1", + "Node name for S&R": "CreateVideo", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + 24, + 8 + ] + }, + { + "id": 311, + "type": "LatentUpscaleModelLoader", + "pos": [ + 1670, + 4550 + ], + "size": [ + 400, + 110 + ], + "flags": {}, + "order": 35, + "mode": 0, + "inputs": [ + { + "localized_name": "model_name", + "name": "model_name", + "type": "COMBO", + "widget": { + "name": "model_name" + }, + "link": 607 + } + ], + "outputs": [ + { + "localized_name": "LATENT_UPSCALE_MODEL", + "name": "LATENT_UPSCALE_MODEL", + "type": "LATENT_UPSCALE_MODEL", + "links": [ + 545 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.7.0", + "Node name for S&R": "LatentUpscaleModelLoader", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "models": [ + { + "name": "ltx-2.3-spatial-upscaler-x2-1.1.safetensors", + "url": "https://huggingface.co/Lightricks/LTX-2.3/resolve/main/ltx-2.3-spatial-upscaler-x2-1.1.safetensors", + "directory": "latent_upscale_models" + } + ], + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + "ltx-2.3-spatial-upscaler-x2-1.1.safetensors" + ] + }, + { + "id": 312, + "type": "PrimitiveInt", + "pos": [ + 1190, + 4470 + ], + "size": [ + 370, + 110 + ], + "flags": {}, + "order": 36, + "mode": 0, + "inputs": [ + { + "localized_name": "value", + "name": "value", + "type": "INT", + "widget": { + "name": "value" + }, + "link": 597 + } + ], + "outputs": [ + { + "localized_name": "INT", + "name": "INT", + "type": "INT", + "links": [ + 558, + 560 + ] + } + ], + "title": "Width", + "properties": { + "cnr_id": "comfy-core", + "ver": "0.16.3", + "Node name for S&R": "PrimitiveInt", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + 720, + "fixed" + ] + }, + { + "id": 313, + "type": "CLIPTextEncode", + "pos": [ + 2180, + 4120 + ], + "size": [ + 600, + 170 + ], + "flags": {}, + "order": 37, + "mode": 0, + "inputs": [ + { + "localized_name": "clip", + "name": "clip", + "type": "CLIP", + "link": 627 + } + ], + "outputs": [ + { + "localized_name": "CONDITIONING", + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 527 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.3.56", + "Node name for S&R": "CLIPTextEncode", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + "pc game, console game, video game, cartoon, childish, ugly" + ], + "color": "#323", + "bgcolor": "#535" + }, + { + "id": 314, + "type": "CFGGuider", + "pos": [ + 3160, + 3810 + ], + "size": [ + 280, + 160 + ], + "flags": {}, + "order": 38, + "mode": 0, + "inputs": [ + { + "localized_name": "model", + "name": "model", + "type": "MODEL", + "link": 541 + }, + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "link": 518 + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "link": 519 + } + ], + "outputs": [ + { + "localized_name": "GUIDER", + "name": "GUIDER", + "type": "GUIDER", + "links": [ + 484 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.3.64", + "Node name for S&R": "CFGGuider", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + 1 + ] + }, + { + "id": 315, + "type": "VAEDecodeTiled", + "pos": [ + 5750, + 3610 + ], + "size": [ + 280, + 200 + ], + "flags": {}, + "order": 39, + "mode": 0, + "inputs": [ + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "link": 539 + }, + { + "localized_name": "vae", + "name": "vae", + "type": "VAE", + "link": 553 + } + ], + "outputs": [ + { + "localized_name": "IMAGE", + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 538 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.14.1", + "Node name for S&R": "VAEDecodeTiled", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + 768, + 64, + 4096, + 4 + ] + }, + { + "id": 316, + "type": "CheckpointLoaderSimple", + "pos": [ + 1660, + 3660 + ], + "size": [ + 430, + 160 + ], + "flags": {}, + "order": 40, + "mode": 0, + "inputs": [ + { + "localized_name": "ckpt_name", + "name": "ckpt_name", + "type": "COMBO", + "widget": { + "name": "ckpt_name" + }, + "link": 601 + } + ], + "outputs": [ + { + "localized_name": "MODEL", + "name": "MODEL", + "type": "MODEL", + "links": [ + 520 + ] + }, + { + "localized_name": "CLIP", + "name": "CLIP", + "type": "CLIP", + "links": [] + }, + { + "localized_name": "VAE", + "name": "VAE", + "type": "VAE", + "links": [ + 556, + 557 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.3.56", + "Node name for S&R": "CheckpointLoaderSimple", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "models": [ + { + "name": "ltx-2.3-22b-dev-fp8.safetensors", + "url": "https://huggingface.co/Lightricks/LTX-2.3-fp8/resolve/main/ltx-2.3-22b-dev-fp8.safetensors", + "directory": "checkpoints" + } + ], + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + "ltx-2.3-22b-dev-fp8.safetensors" + ] + }, + { + "id": 317, + "type": "LTXAVTextEncoderLoader", + "pos": [ + 1660, + 4280 + ], + "size": [ + 430, + 170 + ], + "flags": {}, + "order": 41, + "mode": 0, + "showAdvanced": false, + "inputs": [ + { + "localized_name": "text_encoder", + "name": "text_encoder", + "type": "COMBO", + "widget": { + "name": "text_encoder" + }, + "link": 606 + }, + { + "localized_name": "ckpt_name", + "name": "ckpt_name", + "type": "COMBO", + "widget": { + "name": "ckpt_name" + }, + "link": 605 + } + ], + "outputs": [ + { + "localized_name": "CLIP", + "name": "CLIP", + "type": "CLIP", + "links": [ + 627, + 642, + 643 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.7.0", + "Node name for S&R": "LTXAVTextEncoderLoader", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "models": [ + { + "name": "ltx-2.3-22b-dev-fp8.safetensors", + "url": "https://huggingface.co/Lightricks/LTX-2.3-fp8/resolve/main/ltx-2.3-22b-dev-fp8.safetensors", + "directory": "checkpoints" + }, + { + "name": "gemma_3_12B_it_fp4_mixed.safetensors", + "url": "https://huggingface.co/Comfy-Org/ltx-2/resolve/main/split_files/text_encoders/gemma_3_12B_it_fp4_mixed.safetensors", + "directory": "text_encoders" + } + ], + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + "gemma_3_12B_it_fp4_mixed.safetensors", + "ltx-2.3-22b-dev-fp8.safetensors", + "default" + ] + }, + { + "id": 318, + "type": "LTXVConcatAVLatent", + "pos": [ + 3860, + 4830 + ], + "size": [ + 240, + 100 + ], + "flags": {}, + "order": 42, + "mode": 0, + "inputs": [ + { + "localized_name": "video_latent", + "name": "video_latent", + "type": "LATENT", + "link": 497 + }, + { + "localized_name": "audio_latent", + "name": "audio_latent", + "type": "LATENT", + "link": 498 + } + ], + "outputs": [ + { + "localized_name": "latent", + "name": "latent", + "type": "LATENT", + "links": [ + 487 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.7.0", + "Node name for S&R": "LTXVConcatAVLatent", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [] + }, + { + "id": 319, + "type": "PrimitiveStringMultiline", + "pos": [ + 1190, + 3680 + ], + "size": [ + 370, + 350 + ], + "flags": {}, + "order": 43, + "mode": 0, + "inputs": [ + { + "localized_name": "value", + "name": "value", + "type": "STRING", + "widget": { + "name": "value" + }, + "link": 595 + } + ], + "outputs": [ + { + "localized_name": "STRING", + "name": "STRING", + "type": "STRING", + "links": [ + 639, + 640 + ] + } + ], + "title": "Prompt", + "properties": { + "cnr_id": "comfy-core", + "ver": "0.16.3", + "Node name for S&R": "PrimitiveStringMultiline", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "version": "7.7", + "input_ue_unconnectable": {} + } + }, + "widgets_values": [ + "Egyptian royal in blue-and-gold headdress and high collar, white dress with golden embroidery and armbands, desert, robot soldiers in formation left and right. She walks steadily forward, head held level and gaze fixed ahead—no dipping or lowering of the head. The camera performs a single, smooth push-in only: starting in a wider shot of her, the robots, and the desert, it moves steadily forward until she is in a medium or medium-close frame, then holds. She stops, posture and head still upright, and says: “The old gods are silent. I am not.” Robot soldiers shift or march in place; sand and fabric move with the wind. No pull-back; the only camera move is the continuous push-in." + ] + }, + { + "id": 323, + "type": "ComfyMathExpression", + "pos": [ + 1210, + 5040 + ], + "size": [ + 225, + 94 + ], + "flags": { + "collapsed": true + }, + "order": 44, + "mode": 0, + "inputs": [ + { + "label": "a", + "localized_name": "values.a", + "name": "values.a", + "type": "FLOAT,INT,BOOLEAN", + "link": 628 + }, + { + "label": "b", + "localized_name": "values.b", + "name": "values.b", + "shape": 7, + "type": "FLOAT,INT,BOOLEAN", + "link": 629 + }, + { + "label": "c", + "localized_name": "values.c", + "name": "values.c", + "shape": 7, + "type": "FLOAT,INT,BOOLEAN", + "link": null + } + ], + "outputs": [ + { + "localized_name": "FLOAT", + "name": "FLOAT", + "type": "FLOAT", + "links": null + }, + { + "localized_name": "INT", + "name": "INT", + "type": "INT", + "links": [ + 630, + 631 + ] + }, + { + "localized_name": "BOOL", + "name": "BOOL", + "type": "BOOLEAN", + "links": null + } + ], + "title": "Math Expression (length)", + "properties": { + "cnr_id": "comfy-core", + "ver": "0.18.1", + "Node name for S&R": "ComfyMathExpression", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "ue_properties": { + "widget_ue_connectable": {}, + "input_ue_unconnectable": {}, + "version": "7.7" + } + }, + "widgets_values": [ + "a * b + 1" + ] + }, + { + "id": 324, + "type": "LoraLoader", + "pos": [ + 1200, + 2870 + ], + "size": [ + 380, + 230 + ], + "flags": {}, + "order": 45, + "mode": 0, + "inputs": [ + { + "localized_name": "model", + "name": "model", + "type": "MODEL", + "link": 641 + }, + { + "localized_name": "clip", + "name": "clip", + "type": "CLIP", + "link": 643 + }, + { + "localized_name": "lora_name", + "name": "lora_name", + "type": "COMBO", + "widget": { + "name": "lora_name" + }, + "link": 645 + } + ], + "outputs": [ + { + "localized_name": "MODEL", + "name": "MODEL", + "type": "MODEL", + "links": null + }, + { + "localized_name": "CLIP", + "name": "CLIP", + "type": "CLIP", + "links": [ + 634 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.16.3", + "Node name for S&R": "LoraLoader", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65, + "models": [ + { + "name": "gemma-3-12b-it-abliterated_lora_rank64_bf16.safetensors", + "url": "https://huggingface.co/Comfy-Org/ltx-2/resolve/main/split_files/loras/gemma-3-12b-it-abliterated_lora_rank64_bf16.safetensors", + "directory": "loras" + } + ] + }, + "widgets_values": [ + "gemma-3-12b-it-abliterated_lora_rank64_bf16.safetensors", + 1, + 1 + ] + }, + { + "id": 325, + "type": "TextGenerateLTX2Prompt", + "pos": [ + 1630, + 2870 + ], + "size": [ + 400, + 412 + ], + "flags": { + "collapsed": false + }, + "order": 46, + "mode": 0, + "inputs": [ + { + "localized_name": "clip", + "name": "clip", + "type": "CLIP", + "link": 634 + }, + { + "localized_name": "image", + "name": "image", + "shape": 7, + "type": "IMAGE", + "link": null + }, + { + "localized_name": "video", + "name": "video", + "shape": 7, + "type": "IMAGE", + "link": null + }, + { + "localized_name": "audio", + "name": "audio", + "shape": 7, + "type": "AUDIO", + "link": null + }, + { + "localized_name": "prompt", + "name": "prompt", + "type": "STRING", + "widget": { + "name": "prompt" + }, + "link": 639 + } + ], + "outputs": [ + { + "localized_name": "generated_text", + "name": "generated_text", + "type": "STRING", + "links": [ + 636 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.16.3", + "Node name for S&R": "TextGenerateLTX2Prompt", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65 + }, + "widgets_values": [ + "A young woman holds the product up to the camera in a bright modern kitchen, turning it slowly to show the label, then smiles at the camera. Handheld iPhone footage, natural window light, shallow depth of field, authentic UGC style.", + 2048, + "on", + 0.7, + 64, + 0.95, + 0.05, + 1.05, + 0, + 0, + false, + true + ] + }, + { + "id": 326, + "type": "PreviewAny", + "pos": [ + 2470, + 2890 + ], + "size": [ + 510, + 360 + ], + "flags": {}, + "order": 47, + "mode": 0, + "inputs": [ + { + "localized_name": "source", + "name": "source", + "type": "*", + "link": 635 + } + ], + "outputs": [ + { + "localized_name": "STRING", + "name": "STRING", + "type": "STRING", + "links": [] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.16.3", + "Node name for S&R": "PreviewAny", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65 + }, + "widgets_values": [] + }, + { + "id": 327, + "type": "ComfySwitchNode", + "pos": [ + 2160, + 3280 + ], + "size": [ + 270, + 130 + ], + "flags": {}, + "order": 48, + "mode": 0, + "inputs": [ + { + "localized_name": "on_false", + "name": "on_false", + "type": "STRING", + "link": 640 + }, + { + "localized_name": "on_true", + "name": "on_true", + "type": "STRING", + "link": 636 + }, + { + "localized_name": "switch", + "name": "switch", + "type": "BOOLEAN", + "widget": { + "name": "switch" + }, + "link": 637 + } + ], + "outputs": [ + { + "localized_name": "output", + "name": "output", + "type": "STRING", + "links": [ + 635, + 638 + ] + } + ], + "properties": { + "cnr_id": "comfy-core", + "ver": "0.22.0", + "Node name for S&R": "ComfySwitchNode", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65 + }, + "widgets_values": [ + false + ] + }, + { + "id": 328, + "type": "PrimitiveBoolean", + "pos": [ + 1200, + 3350 + ], + "size": [ + 270, + 100 + ], + "flags": {}, + "order": 49, + "mode": 0, + "inputs": [ + { + "localized_name": "value", + "name": "value", + "type": "BOOLEAN", + "widget": { + "name": "value" + }, + "link": 644 + } + ], + "outputs": [ + { + "localized_name": "BOOLEAN", + "name": "BOOLEAN", + "type": "BOOLEAN", + "links": [ + 637 + ] + } + ], + "title": "Boolean (Enable Prompt Enhance)", + "properties": { + "cnr_id": "comfy-core", + "ver": "0.22.0", + "Node name for S&R": "PrimitiveBoolean", + "enableTabs": false, + "tabWidth": 65, + "tabXOffset": 10, + "hasSecondTab": false, + "secondTabText": "Send Back", + "secondTabOffset": 80, + "secondTabWidth": 65 + }, + "widgets_values": [ + false + ] + } + ], + "groups": [ + { + "id": 1, + "title": "Model", + "bounding": [ + 1630, + 3550, + 480, + 1140 + ], + "color": "#3f789e", + "flags": {} + }, + { + "id": 2, + "title": "Generate Low Resolution", + "bounding": [ + 3130, + 3550, + 1000, + 1140 + ], + "color": "#3f789e", + "flags": {} + }, + { + "id": 3, + "title": "Prompt", + "bounding": [ + 2140, + 3550, + 960, + 1140 + ], + "color": "#3f789e", + "flags": {} + }, + { + "id": 6, + "title": "Generate High Resolution", + "bounding": [ + 4670, + 3550, + 990, + 1130 + ], + "color": "#3f789e", + "flags": {} + }, + { + "id": 7, + "title": "Latent Upscale", + "bounding": [ + 4160, + 3550, + 480, + 1130 + ], + "color": "#3f789e", + "flags": {} + }, + { + "id": 19, + "title": "Video Settings", + "bounding": [ + 1150, + 3550, + 460, + 1610 + ], + "color": "#3f789e", + "flags": {} + }, + { + "id": 20, + "title": "Image Preprocess", + "bounding": [ + 1630, + 4720, + 830, + 440 + ], + "color": "#3f789e", + "flags": {} + }, + { + "id": 21, + "title": "Empty Latent", + "bounding": [ + 2820, + 4720, + 1310, + 450 + ], + "color": "#3f789e", + "flags": {} + }, + { + "id": 22, + "title": "Number conversion", + "bounding": [ + 2480, + 4720, + 310, + 440 + ], + "color": "#3f789e", + "flags": {} + }, + { + "id": 26, + "title": "Prompt Enhancement", + "bounding": [ + 1160, + 2790, + 2010, + 720 + ], + "color": "#3f789e", + "flags": {} + } + ], + "links": [ + { + "id": 512, + "origin_id": 288, + "origin_slot": 0, + "target_id": 278, + "target_slot": 0, + "type": "LATENT" + }, + { + "id": 513, + "origin_id": 307, + "origin_slot": 1, + "target_id": 278, + "target_slot": 1, + "type": "LATENT" + }, + { + "id": 478, + "origin_id": 285, + "origin_slot": 0, + "target_id": 282, + "target_slot": 0, + "type": "MODEL" + }, + { + "id": 479, + "origin_id": 284, + "origin_slot": 0, + "target_id": 282, + "target_slot": 1, + "type": "CONDITIONING" + }, + { + "id": 480, + "origin_id": 284, + "origin_slot": 1, + "target_id": 282, + "target_slot": 2, + "type": "CONDITIONING" + }, + { + "id": 541, + "origin_id": 285, + "origin_slot": 0, + "target_id": 314, + "target_slot": 0, + "type": "MODEL" + }, + { + "id": 518, + "origin_id": 304, + "origin_slot": 0, + "target_id": 314, + "target_slot": 1, + "type": "CONDITIONING" + }, + { + "id": 519, + "origin_id": 304, + "origin_slot": 1, + "target_id": 314, + "target_slot": 2, + "type": "CONDITIONING" + }, + { + "id": 483, + "origin_id": 277, + "origin_slot": 0, + "target_id": 283, + "target_slot": 0, + "type": "NOISE" + }, + { + "id": 484, + "origin_id": 314, + "origin_slot": 0, + "target_id": 283, + "target_slot": 1, + "type": "GUIDER" + }, + { + "id": 485, + "origin_id": 291, + "origin_slot": 0, + "target_id": 283, + "target_slot": 2, + "type": "SAMPLER" + }, + { + "id": 544, + "origin_id": 306, + "origin_slot": 0, + "target_id": 283, + "target_slot": 3, + "type": "SIGMAS" + }, + { + "id": 487, + "origin_id": 318, + "origin_slot": 0, + "target_id": 283, + "target_slot": 4, + "type": "LATENT" + }, + { + "id": 475, + "origin_id": 304, + "origin_slot": 0, + "target_id": 284, + "target_slot": 0, + "type": "CONDITIONING" + }, + { + "id": 476, + "origin_id": 304, + "origin_slot": 1, + "target_id": 284, + "target_slot": 1, + "type": "CONDITIONING" + }, + { + "id": 477, + "origin_id": 307, + "origin_slot": 0, + "target_id": 284, + "target_slot": 2, + "type": "LATENT" + }, + { + "id": 520, + "origin_id": 316, + "origin_slot": 0, + "target_id": 285, + "target_slot": 0, + "type": "MODEL" + }, + { + "id": 523, + "origin_id": 290, + "origin_slot": 0, + "target_id": 286, + "target_slot": 0, + "type": "IMAGE" + }, + { + "id": 547, + "origin_id": 307, + "origin_slot": 0, + "target_id": 287, + "target_slot": 0, + "type": "LATENT" + }, + { + "id": 545, + "origin_id": 311, + "origin_slot": 0, + "target_id": 287, + "target_slot": 1, + "type": "LATENT_UPSCALE_MODEL" + }, + { + "id": 554, + "origin_id": 293, + "origin_slot": 0, + "target_id": 287, + "target_slot": 2, + "type": "VAE" + }, + { + "id": 552, + "origin_id": 293, + "origin_slot": 0, + "target_id": 288, + "target_slot": 0, + "type": "VAE" + }, + { + "id": 515, + "origin_id": 289, + "origin_slot": 0, + "target_id": 288, + "target_slot": 1, + "type": "IMAGE" + }, + { + "id": 548, + "origin_id": 287, + "origin_slot": 0, + "target_id": 288, + "target_slot": 2, + "type": "LATENT" + }, + { + "id": 543, + "origin_id": 302, + "origin_slot": 0, + "target_id": 288, + "target_slot": 3, + "type": "BOOLEAN" + }, + { + "id": 505, + "origin_id": 286, + "origin_slot": 0, + "target_id": 289, + "target_slot": 0, + "type": "IMAGE" + }, + { + "id": 558, + "origin_id": 312, + "origin_slot": 0, + "target_id": 290, + "target_slot": 1, + "type": "INT" + }, + { + "id": 559, + "origin_id": 299, + "origin_slot": 0, + "target_id": 290, + "target_slot": 2, + "type": "INT" + }, + { + "id": 560, + "origin_id": 312, + "origin_slot": 0, + "target_id": 292, + "target_slot": 0, + "type": "INT" + }, + { + "id": 557, + "origin_id": 316, + "origin_slot": 2, + "target_id": 293, + "target_slot": 0, + "type": "VAE" + }, + { + "id": 562, + "origin_id": 299, + "origin_slot": 0, + "target_id": 294, + "target_slot": 0, + "type": "INT" + }, + { + "id": 561, + "origin_id": 292, + "origin_slot": 1, + "target_id": 295, + "target_slot": 0, + "type": "INT" + }, + { + "id": 563, + "origin_id": 294, + "origin_slot": 1, + "target_id": 295, + "target_slot": 1, + "type": "INT" + }, + { + "id": 556, + "origin_id": 316, + "origin_slot": 2, + "target_id": 296, + "target_slot": 0, + "type": "VAE" + }, + { + "id": 510, + "origin_id": 289, + "origin_slot": 0, + "target_id": 296, + "target_slot": 1, + "type": "IMAGE" + }, + { + "id": 511, + "origin_id": 295, + "origin_slot": 0, + "target_id": 296, + "target_slot": 2, + "type": "LATENT" + }, + { + "id": 542, + "origin_id": 302, + "origin_slot": 0, + "target_id": 296, + "target_slot": 3, + "type": "BOOLEAN" + }, + { + "id": 495, + "origin_id": 309, + "origin_slot": 1, + "target_id": 297, + "target_slot": 0, + "type": "LATENT" + }, + { + "id": 496, + "origin_id": 279, + "origin_slot": 0, + "target_id": 297, + "target_slot": 1, + "type": "VAE" + }, + { + "id": 564, + "origin_id": 300, + "origin_slot": 0, + "target_id": 298, + "target_slot": 0, + "type": "INT" + }, + { + "id": 526, + "origin_id": 303, + "origin_slot": 0, + "target_id": 304, + "target_slot": 0, + "type": "CONDITIONING" + }, + { + "id": 527, + "origin_id": 313, + "origin_slot": 0, + "target_id": 304, + "target_slot": 1, + "type": "CONDITIONING" + }, + { + "id": 566, + "origin_id": 298, + "origin_slot": 0, + "target_id": 304, + "target_slot": 2, + "type": "FLOAT" + }, + { + "id": 497, + "origin_id": 296, + "origin_slot": 0, + "target_id": 318, + "target_slot": 0, + "type": "LATENT" + }, + { + "id": 498, + "origin_id": 305, + "origin_slot": 0, + "target_id": 318, + "target_slot": 1, + "type": "LATENT" + }, + { + "id": 481, + "origin_id": 279, + "origin_slot": 0, + "target_id": 305, + "target_slot": 0, + "type": "VAE" + }, + { + "id": 565, + "origin_id": 298, + "origin_slot": 1, + "target_id": 305, + "target_slot": 2, + "type": "INT" + }, + { + "id": 488, + "origin_id": 283, + "origin_slot": 0, + "target_id": 307, + "target_slot": 0, + "type": "LATENT" + }, + { + "id": 490, + "origin_id": 276, + "origin_slot": 0, + "target_id": 308, + "target_slot": 0, + "type": "NOISE" + }, + { + "id": 491, + "origin_id": 282, + "origin_slot": 0, + "target_id": 308, + "target_slot": 1, + "type": "GUIDER" + }, + { + "id": 492, + "origin_id": 280, + "origin_slot": 0, + "target_id": 308, + "target_slot": 2, + "type": "SAMPLER" + }, + { + "id": 493, + "origin_id": 281, + "origin_slot": 0, + "target_id": 308, + "target_slot": 3, + "type": "SIGMAS" + }, + { + "id": 494, + "origin_id": 278, + "origin_slot": 0, + "target_id": 308, + "target_slot": 4, + "type": "LATENT" + }, + { + "id": 578, + "origin_id": 308, + "origin_slot": 0, + "target_id": 309, + "target_slot": 0, + "type": "LATENT" + }, + { + "id": 539, + "origin_id": 309, + "origin_slot": 0, + "target_id": 315, + "target_slot": 0, + "type": "LATENT" + }, + { + "id": 553, + "origin_id": 293, + "origin_slot": 0, + "target_id": 315, + "target_slot": 1, + "type": "VAE" + }, + { + "id": 538, + "origin_id": 315, + "origin_slot": 0, + "target_id": 310, + "target_slot": 0, + "type": "IMAGE" + }, + { + "id": 534, + "origin_id": 297, + "origin_slot": 0, + "target_id": 310, + "target_slot": 1, + "type": "AUDIO" + }, + { + "id": 591, + "origin_id": 298, + "origin_slot": 0, + "target_id": 310, + "target_slot": 2, + "type": "FLOAT" + }, + { + "id": 535, + "origin_id": -10, + "origin_slot": 0, + "target_id": 290, + "target_slot": 0, + "type": "IMAGE,MASK" + }, + { + "id": 536, + "origin_id": 310, + "origin_slot": 0, + "target_id": -20, + "target_slot": 0, + "type": "VIDEO" + }, + { + "id": 595, + "origin_id": -10, + "origin_slot": 1, + "target_id": 319, + "target_slot": 0, + "type": "STRING" + }, + { + "id": 597, + "origin_id": -10, + "origin_slot": 3, + "target_id": 312, + "target_slot": 0, + "type": "INT" + }, + { + "id": 598, + "origin_id": -10, + "origin_slot": 4, + "target_id": 299, + "target_slot": 0, + "type": "INT" + }, + { + "id": 599, + "origin_id": -10, + "origin_slot": 5, + "target_id": 301, + "target_slot": 0, + "type": "INT" + }, + { + "id": 601, + "origin_id": -10, + "origin_slot": 8, + "target_id": 316, + "target_slot": 0, + "type": "COMBO" + }, + { + "id": 602, + "origin_id": -10, + "origin_slot": 9, + "target_id": 285, + "target_slot": 1, + "type": "COMBO" + }, + { + "id": 604, + "origin_id": -10, + "origin_slot": 8, + "target_id": 279, + "target_slot": 0, + "type": "COMBO" + }, + { + "id": 605, + "origin_id": -10, + "origin_slot": 8, + "target_id": 317, + "target_slot": 1, + "type": "COMBO" + }, + { + "id": 606, + "origin_id": -10, + "origin_slot": 10, + "target_id": 317, + "target_slot": 0, + "type": "COMBO" + }, + { + "id": 607, + "origin_id": -10, + "origin_slot": 11, + "target_id": 311, + "target_slot": 0, + "type": "COMBO" + }, + { + "id": 624, + "origin_id": -10, + "origin_slot": 6, + "target_id": 300, + "target_slot": 0, + "type": "INT" + }, + { + "id": 627, + "origin_id": 317, + "origin_slot": 0, + "target_id": 313, + "target_slot": 0, + "type": "CLIP" + }, + { + "id": 628, + "origin_id": 301, + "origin_slot": 0, + "target_id": 323, + "target_slot": 0, + "type": "INT" + }, + { + "id": 629, + "origin_id": 300, + "origin_slot": 0, + "target_id": 323, + "target_slot": 1, + "type": "INT" + }, + { + "id": 630, + "origin_id": 323, + "origin_slot": 1, + "target_id": 305, + "target_slot": 1, + "type": "INT" + }, + { + "id": 631, + "origin_id": 323, + "origin_slot": 1, + "target_id": 295, + "target_slot": 2, + "type": "INT" + }, + { + "id": 634, + "origin_id": 324, + "origin_slot": 1, + "target_id": 325, + "target_slot": 0, + "type": "CLIP" + }, + { + "id": 635, + "origin_id": 327, + "origin_slot": 0, + "target_id": 326, + "target_slot": 0, + "type": "*" + }, + { + "id": 636, + "origin_id": 325, + "origin_slot": 0, + "target_id": 327, + "target_slot": 1, + "type": "STRING" + }, + { + "id": 637, + "origin_id": 328, + "origin_slot": 0, + "target_id": 327, + "target_slot": 2, + "type": "BOOLEAN" + }, + { + "id": 638, + "origin_id": 327, + "origin_slot": 0, + "target_id": 303, + "target_slot": 1, + "type": "STRING" + }, + { + "id": 639, + "origin_id": 319, + "origin_slot": 0, + "target_id": 325, + "target_slot": 4, + "type": "STRING" + }, + { + "id": 640, + "origin_id": 319, + "origin_slot": 0, + "target_id": 327, + "target_slot": 0, + "type": "STRING" + }, + { + "id": 641, + "origin_id": 285, + "origin_slot": 0, + "target_id": 324, + "target_slot": 0, + "type": "MODEL" + }, + { + "id": 642, + "origin_id": 317, + "origin_slot": 0, + "target_id": 303, + "target_slot": 0, + "type": "CLIP" + }, + { + "id": 643, + "origin_id": 317, + "origin_slot": 0, + "target_id": 324, + "target_slot": 1, + "type": "CLIP" + }, + { + "id": 644, + "origin_id": -10, + "origin_slot": 2, + "target_id": 328, + "target_slot": 0, + "type": "BOOLEAN" + }, + { + "id": 645, + "origin_id": -10, + "origin_slot": 12, + "target_id": 324, + "target_slot": 2, + "type": "COMBO" + }, + { + "id": 646, + "origin_id": -10, + "origin_slot": 7, + "target_id": 277, + "target_slot": 0, + "type": "INT" + } + ], + "extra": { + "workflowRendererVersion": "Vue-corrected", + "ue_links": [] + } + } + ] + }, + "config": {}, + "extra": { + "ds": { + "scale": 0.41201716738197425, + "offset": [ + 1618.0394287109375, + -3067.713541666667 + ] + }, + "frontendVersion": "1.45.21", + "workflowRendererVersion": "Vue-corrected", + "prompt": { + "1": { + "inputs": { + "ckpt_name": "ltx-av-step-1751000_vocoder_24K.safetensors" + }, + "class_type": "CheckpointLoaderSimple", + "_meta": { + "title": "Load Checkpoint" + } + }, + "2": { + "inputs": { + "gemma_path": "gemma-3-12b-it-qat-q4_0-unquantized_readout_proj/model/model.safetensors", + "ltxv_path": "ltx-av-step-1751000_vocoder_24K.safetensors", + "max_length": 1024 + }, + "class_type": "LTXVGemmaCLIPModelLoader", + "_meta": { + "title": "🅛🅣🅧 Gemma 3 Model Loader" + } + }, + "3": { + "inputs": { + "text": "", + "clip": [ + "2", + 0 + ] + }, + "class_type": "CLIPTextEncode", + "_meta": { + "title": "CLIP Text Encode (Prompt)" + } + }, + "4": { + "inputs": { + "text": "blurry, low quality, still frame, frames, watermark, overlay, titles, has blurbox, has subtitles", + "clip": [ + "2", + 0 + ] + }, + "class_type": "CLIPTextEncode", + "_meta": { + "title": "CLIP Text Encode (Prompt)" + } + }, + "8": { + "inputs": { + "sampler_name": "euler" + }, + "class_type": "KSamplerSelect", + "_meta": { + "title": "KSamplerSelect" + } + }, + "9": { + "inputs": { + "steps": 20, + "max_shift": 2.05, + "base_shift": 0.95, + "stretch": true, + "terminal": 0.1, + "latent": [ + "28", + 0 + ] + }, + "class_type": "LTXVScheduler", + "_meta": { + "title": "LTXVScheduler" + } + }, + "11": { + "inputs": { + "noise_seed": 10 + }, + "class_type": "RandomNoise", + "_meta": { + "title": "RandomNoise" + } + }, + "12": { + "inputs": { + "samples": [ + "29", + 0 + ], + "vae": [ + "1", + 2 + ] + }, + "class_type": "VAEDecode", + "_meta": { + "title": "VAE Decode" + } + }, + "13": { + "inputs": { + "ckpt_name": "ltx-av-step-1751000_vocoder_24K.safetensors" + }, + "class_type": "LTXVAudioVAELoader", + "_meta": { + "title": "🅛🅣🅧 LTXV Audio VAE Loader" + } + }, + "14": { + "inputs": { + "samples": [ + "29", + 1 + ], + "audio_vae": [ + "13", + 0 + ] + }, + "class_type": "LTXVAudioVAEDecode", + "_meta": { + "title": "🅛🅣🅧 LTXV Audio VAE Decode" + } + }, + "15": { + "inputs": { + "frame_rate": [ + "23", + 0 + ], + "loop_count": 0, + "filename_prefix": "AnimateDiff", + "format": "video/h264-mp4", + "pix_fmt": "yuv420p", + "crf": 19, + "save_metadata": true, + "trim_to_audio": false, + "pingpong": false, + "save_output": true, + "images": [ + "12", + 0 + ], + "audio": [ + "14", + 0 + ] + }, + "class_type": "VHS_VideoCombine", + "_meta": { + "title": "Video Combine 🎥🅥🅗🅢" + } + }, + "17": { + "inputs": { + "skip_blocks": "29", + "model": [ + "28", + 1 + ], + "positive": [ + "22", + 0 + ], + "negative": [ + "22", + 1 + ], + "parameters": [ + "18", + 0 + ] + }, + "class_type": "MultimodalGuider", + "_meta": { + "title": "🅛🅣🅧 Multimodal Guider" + } + }, + "18": { + "inputs": { + "modality": "VIDEO", + "cfg": 3, + "stg": 0, + "rescale": 0, + "modality_scale": 3, + "parameters": [ + "19", + 0 + ] + }, + "class_type": "GuiderParameters", + "_meta": { + "title": "🅛🅣🅧 Guider Parameters" + } + }, + "19": { + "inputs": { + "modality": "AUDIO", + "cfg": 7, + "stg": 0, + "rescale": 0, + "modality_scale": 3 + }, + "class_type": "GuiderParameters", + "_meta": { + "title": "🅛🅣🅧 Guider Parameters" + } + }, + "21": { + "inputs": { + "audioUI": "", + "audio": [ + "14", + 0 + ] + }, + "class_type": "PreviewAudio", + "_meta": { + "title": "PreviewAudio" + } + }, + "22": { + "inputs": { + "frame_rate": [ + "23", + 0 + ], + "positive": [ + "3", + 0 + ], + "negative": [ + "4", + 0 + ] + }, + "class_type": "LTXVConditioning", + "_meta": { + "title": "LTXVConditioning" + } + }, + "23": { + "inputs": { + "value": 25 + }, + "class_type": "FloatConstant", + "_meta": { + "title": "Float Constant" + } + }, + "26": { + "inputs": { + "frames_number": [ + "27", + 0 + ], + "frame_rate": [ + "42", + 0 + ], + "batch_size": 1 + }, + "class_type": "LTXVEmptyLatentAudio", + "_meta": { + "title": "🅛🅣🅧 LTXV Empty Latent Audio" + } + }, + "27": { + "inputs": { + "value": 105 + }, + "class_type": "INTConstant", + "_meta": { + "title": "INT Constant" + } + }, + "28": { + "inputs": { + "video_latent": [ + "43", + 0 + ], + "audio_latent": [ + "26", + 0 + ], + "model": [ + "44", + 0 + ] + }, + "class_type": "LTXVConcatAVLatent", + "_meta": { + "title": "🅛🅣🅧 LTXV Concat AV Latent" + } + }, + "29": { + "inputs": { + "av_latent": [ + "41", + 0 + ], + "model": [ + "28", + 1 + ] + }, + "class_type": "LTXVSeparateAVLatent", + "_meta": { + "title": "🅛🅣🅧 LTXV Separate AV Latent" + } + }, + "41": { + "inputs": { + "noise": [ + "11", + 0 + ], + "guider": [ + "17", + 0 + ], + "sampler": [ + "8", + 0 + ], + "sigmas": [ + "9", + 0 + ], + "latent_image": [ + "28", + 0 + ] + }, + "class_type": "SamplerCustomAdvanced", + "_meta": { + "title": "SamplerCustomAdvanced" + } + }, + "42": { + "inputs": { + "a": [ + "23", + 0 + ] + }, + "class_type": "CM_FloatToInt", + "_meta": { + "title": "FloatToInt" + } + }, + "43": { + "inputs": { + "width": 768, + "height": 512, + "length": [ + "27", + 0 + ], + "batch_size": 1 + }, + "class_type": "EmptyLTXVLatentVideo", + "_meta": { + "title": "EmptyLTXVLatentVideo" + } + }, + "44": { + "inputs": { + "torch_compile": true, + "disable_backup": false, + "model": [ + "1", + 0 + ] + }, + "class_type": "LTXVSequenceParallelMultiGPUPatcher", + "_meta": { + "title": "LTXVSequenceParallelMultiGPUPatcher" + } + }, + "45": { + "inputs": { + "frame_idx": 0, + "strength": 1 + }, + "class_type": "LTXVAddGuide", + "_meta": { + "title": "LTXVAddGuide" + } + } + }, + "comfy_fork_version": "feature/av_inference@a6994ed1", + "VHS_latentpreview": false, + "VHS_latentpreviewrate": 0, + "VHS_MetadataImage": true, + "VHS_KeepIntermediate": true, + "ue_links": [] + }, + "version": 0.4 +} \ No newline at end of file diff --git a/src/@types/C2D/ServiceOnDemand.ts b/src/@types/C2D/ServiceOnDemand.ts index f859530b5..1d866c3de 100644 --- a/src/@types/C2D/ServiceOnDemand.ts +++ b/src/@types/C2D/ServiceOnDemand.ts @@ -22,6 +22,14 @@ export interface UserConfigurableEnvVar { sensitive?: boolean // advisory hint for clients/UI (e.g. mask on input). The node receives ALL userData ECIES-encrypted, so this does not change node-side storage. } +export interface ServiceTemplateWorkflow { + id: string // [A-Za-z0-9_.-]+ — becomes a filename and a ?template= value + name: string + description?: string + file?: string // path relative to the templates dir; inlined into `graph` at load time + graph?: unknown // the workflow JSON itself +} + export interface ServiceTemplate { id: string // [a-z0-9][a-z0-9_-]{0,63} name?: string @@ -36,9 +44,12 @@ export interface ServiceTemplate { envVars?: Record // fixed env vars — operator-set, never returned to callers userConfigurableEnvVars?: UserConfigurableEnvVar[] command?: string[] // Docker CMD override; ${KEY} expanded from userData + commandFile?: string // path relative to the templates dir; inlined into command[0] at load + // time and dropped (mutually exclusive with `command`) entrypoint?: string[] // Docker ENTRYPOINT override requiredResources?: TemplateResourceRequirement[] // MUST satisfy — gates SERVICE_START recommendedResources?: TemplateResourceRequirement[] // SHOULD satisfy — used for scoring + UI + workflows?: ServiceTemplateWorkflow[] // client-selectable graphs; no operator secrets, so public } // ── Public / sanitized types ────────────────────────────────────────── @@ -141,6 +152,7 @@ export interface ServiceJob { exposedPorts: number[] endpoints: ServiceEndpoint[] userData?: string // ECIES(node key) string sent by the client; stored as-is, decrypted only at start/restart; never returned + outputBucketId?: string // persistent-storage bucket bind-mounted at /data/outputs resources: ComputeResourceRequestWithPrice[] payment: DBComputeJobPayment // initial start payment extendPayments?: DBComputeJobPayment[] // one entry per successful SERVICE_EXTEND diff --git a/src/@types/commands.ts b/src/@types/commands.ts index 358cab0f0..a8ea49141 100644 --- a/src/@types/commands.ts +++ b/src/@types/commands.ts @@ -422,6 +422,7 @@ export interface ServiceStartCommand extends Command { resources?: ComputeResourceRequest[] duration: number // seconds; capped by serviceOnDemand.maxDurationSeconds userData?: string // ECIES-encrypted (to the node's public key) JSON object → the container's env-var map + outputBucketId?: string // persistent-storage bucket bind-mounted at /data/outputs payment: { chainId: number; token: string } } diff --git a/src/components/c2d/compute_engine_base.ts b/src/components/c2d/compute_engine_base.ts index 977ceb126..714084af8 100644 --- a/src/components/c2d/compute_engine_base.ts +++ b/src/components/c2d/compute_engine_base.ts @@ -100,7 +100,8 @@ export abstract class C2DEngine { owner: string, payment: DBComputeJobPayment, serviceId: string, - userData?: string // ECIES-encrypted; the engine decrypts it transiently into the container env + userData?: string, // ECIES-encrypted; the engine decrypts it transiently into the container env + outputBucketId?: string ): Promise { return null } diff --git a/src/components/c2d/compute_engine_docker.ts b/src/components/c2d/compute_engine_docker.ts index 0c250addb..1e4cae7f5 100755 --- a/src/components/c2d/compute_engine_docker.ts +++ b/src/components/c2d/compute_engine_docker.ts @@ -72,6 +72,7 @@ import { SERVICE_START_PENDING_STATUSES } from '../../@types/C2D/ServiceOnDemand.js' import type { ServiceJob } from '../../@types/C2D/ServiceOnDemand.js' +import type { DockerMountObject } from '../../@types/PersistentStorage.js' import { resolveServiceImage } from './serviceResourceMatching.js' import { allocateHostPort, @@ -3364,7 +3365,8 @@ export class C2DEngineDocker extends C2DEngine { owner: string, payment: DBComputeJobPayment, serviceId: string, - userData?: string + userData?: string, + outputBucketId?: string ): Promise { const containerImage = resolveServiceImage( image, @@ -3396,6 +3398,7 @@ export class C2DEngineDocker extends C2DEngine { exposedPorts, endpoints: [], userData, // stored as received (ECIES-encrypted); decrypted transiently at container start + outputBucketId, resources: resources.map((r) => ({ id: r.id, amount: r.amount })), payment } @@ -3611,6 +3614,14 @@ export class C2DEngineDocker extends C2DEngine { job.environment ) + // Mount failure must fail the start: an unmounted container silently re-downloads its models. + const Mounts: DockerMountObject[] = [] + if (job.outputBucketId) { + const ps = OceanNode.getInstance().getPersistentStorage() + if (!ps) throw new Error('Persistent storage is not configured on this node') + Mounts.push(await ps.getDockerOutputMountObject(job.outputBucketId, job.owner)) + } + container = await this.docker.createContainer({ Image: job.containerImage, Cmd: cmd, @@ -3626,7 +3637,8 @@ export class C2DEngineDocker extends C2DEngine { NetworkMode: network.id, SecurityOpt: ['no-new-privileges'], // security plan #5 CapDrop: ['ALL'], - PidsLimit: 512 + PidsLimit: 512, + Mounts } }) CORE_LOGGER.debug( @@ -4310,6 +4322,14 @@ export class C2DEngineDocker extends C2DEngine { ) // 8. Create and start new container + // Same bind-mount as service start (see above). + const Mounts: DockerMountObject[] = [] + if (job.outputBucketId) { + const ps = OceanNode.getInstance().getPersistentStorage() + if (!ps) throw new Error('Persistent storage is not configured on this node') + Mounts.push(await ps.getDockerOutputMountObject(job.outputBucketId, job.owner)) + } + container = await this.docker.createContainer({ Image: effContainerImage, Cmd: cmd, @@ -4325,7 +4345,8 @@ export class C2DEngineDocker extends C2DEngine { NetworkMode: network.id, SecurityOpt: ['no-new-privileges'], CapDrop: ['ALL'], - PidsLimit: 512 + PidsLimit: 512, + Mounts } }) CORE_LOGGER.debug( diff --git a/src/components/core/service/startService.ts b/src/components/core/service/startService.ts index 585ce69bd..34fc662fe 100644 --- a/src/components/core/service/startService.ts +++ b/src/components/core/service/startService.ts @@ -15,7 +15,7 @@ import type { ComputeEnvironment, DBComputeJobPayment as Payment } from '../../../@types/C2D/C2D.js' -import { generateUniqueID } from '../compute/utils.js' +import { generateUniqueID, validateOutputBucket } from '../compute/utils.js' import { validateAccess } from '../compute/startCompute.js' import { decryptUserData, toPublicServiceJob } from './utils.js' @@ -122,6 +122,17 @@ export class ServiceStartHandler extends CommandHandler { } } + // Must run before createServiceJob claims escrow, or a bad bucket burns the user's payment. + const isValidOutputBucket = await validateOutputBucket( + node, + task.outputBucketId, + '', + task.consumerAddress + ) + if (isValidOutputBucket.status.httpStatus !== 200) { + return isValidOutputBucket + } + // 4. Duration limit const sod = engine.getC2DConfig().connection?.serviceOnDemand const maxDuration = sod?.maxDurationSeconds ?? 86400 @@ -237,7 +248,8 @@ export class ServiceStartHandler extends CommandHandler { task.consumerAddress, payment, serviceId, - task.userData + task.userData, + task.outputBucketId ) return { diff --git a/src/components/core/service/templateLoader.ts b/src/components/core/service/templateLoader.ts index fc3c99abc..3ad66852a 100644 --- a/src/components/core/service/templateLoader.ts +++ b/src/components/core/service/templateLoader.ts @@ -1,9 +1,21 @@ import { readdir, readFile } from 'fs/promises' -import { join } from 'path' -import type { ServiceTemplate } from '../../../@types/C2D/ServiceOnDemand.js' +import { join, resolve, sep } from 'path' +import type { + ServiceTemplate, + ServiceTemplateWorkflow +} from '../../../@types/C2D/ServiceOnDemand.js' import { ServiceTemplateSchema } from '../../../utils/config/schemas.js' import { CORE_LOGGER } from '../../../utils/logging/common.js' +// Null when `relPath` escapes `resolvedDir` — template paths are author-controlled. +function resolveInTemplatesDir(resolvedDir: string, relPath: string): string | null { + const target = resolve(resolvedDir, relPath) + if (target !== resolvedDir && !target.startsWith(resolvedDir + sep)) { + return null + } + return target +} + // Re-reads on every call so operators can add/edit/remove template files without a restart. // (If profiling ever shows this is hot, add an mtime-keyed cache — semantics stay identical.) export async function loadServiceTemplates(dir?: string): Promise { @@ -25,6 +37,7 @@ export async function loadServiceTemplates(dir?: string): Promise() for (const file of files) { let raw: unknown @@ -54,6 +67,52 @@ export async function loadServiceTemplates(dir?: string): Promise resources: (req.body.resources as ComputeResourceRequest[]) || undefined, duration: req.body.duration as number, userData: (req.body.userData as string) || undefined, + outputBucketId: (req.body.outputBucketId as string) || undefined, payment: req.body.payment, authorization: req.headers?.authorization, caller: req.caller diff --git a/src/test/unit/service/serviceHandlers.test.ts b/src/test/unit/service/serviceHandlers.test.ts index 9e0ab3150..6c46a6ad3 100644 --- a/src/test/unit/service/serviceHandlers.test.ts +++ b/src/test/unit/service/serviceHandlers.test.ts @@ -160,6 +160,12 @@ function buildFakes(opts: FakeOpts = {}) { fetchServiceTemplates: sinon.stub().resolves([{ ...TEMPLATE }]) } + // Valid by default; override validateBucket/assertConsumerAllowedForBucket to fail it. + const persistentStorage: any = { + validateBucket: sinon.stub(), + assertConsumerAllowedForBucket: sinon.stub().resolves(undefined) + } + const node: any = { getRequestMap: () => new Map(), getConfig: (): any => ({ @@ -172,10 +178,11 @@ function buildFakes(opts: FakeOpts = {}) { }), getAuth: () => ({ validateAuthenticationOrToken: () => Promise.resolve({ valid: true }) - }) + }), + getPersistentStorage: () => persistentStorage } - return { node, engine, engines, escrow, env } + return { node, engine, engines, escrow, env, persistentStorage } } function body(response: any): Promise { @@ -947,6 +954,29 @@ describe('Service handlers', () => { const out = await body(res) expect(out[0]).to.not.have.property('userData') }) + + it('forwards outputBucketId to createServiceJob', async () => { + const { node, engine } = buildFakes() + const res = await new ServiceStartHandler(node).handle({ + ...baseTask, + outputBucketId: 'bucket-42' + } as any) + expect(res.status.httpStatus).to.equal(200) + expect(engine.createServiceJob.lastCall.args.at(-1)).to.equal('bucket-42') + }) + + it('400 with a clear message when outputBucketId is invalid, and no job record is created (fail fast)', async () => { + const { node, engine, persistentStorage } = buildFakes() + persistentStorage.validateBucket.throws(new Error('bucket not found')) + const res = await new ServiceStartHandler(node).handle({ + ...baseTask, + outputBucketId: 'bad-bucket' + } as any) + expect(res.status.httpStatus).to.equal(400) + expect(String(res.status.error)).to.contain('bucket not found') + // no job record may be created for a start that was refused upfront (see startService.ts) + expect(engine.createServiceJob.called).to.equal(false) + }) }) describe('ServiceGetStreamableLogsHandler', () => { diff --git a/src/test/unit/service/serviceSchemas.test.ts b/src/test/unit/service/serviceSchemas.test.ts index 1377e7f31..d361a15ca 100644 --- a/src/test/unit/service/serviceSchemas.test.ts +++ b/src/test/unit/service/serviceSchemas.test.ts @@ -1,4 +1,6 @@ import { expect } from 'chai' +import { readFileSync } from 'fs' +import { join } from 'path' import { ServiceTemplateSchema, ServiceOnDemandConfigSchema, @@ -84,6 +86,13 @@ describe('ServiceTemplateSchema', () => { }).success ).to.equal(true) }) + it('ltx-video-ugc-product/multishot: templates match ServiceTemplateSchema', () => { + const dir = join(process.cwd(), 'docs', 'serviceTemplates') + for (const file of ['ltx-video-ugc-product.json', 'ltx-video-ugc-multishot.json']) { + const tmpl = JSON.parse(readFileSync(join(dir, file), 'utf8')) + expect(ServiceTemplateSchema.safeParse(tmpl).success).to.equal(true) + } + }) }) describe('ServiceOnDemandConfigSchema', () => { diff --git a/src/test/unit/service/templateLoader.test.ts b/src/test/unit/service/templateLoader.test.ts index 791f5275f..b6059d3e7 100644 --- a/src/test/unit/service/templateLoader.test.ts +++ b/src/test/unit/service/templateLoader.test.ts @@ -1,6 +1,6 @@ import { expect } from 'chai' -import { mkdtempSync, writeFileSync, rmSync } from 'fs' -import { join } from 'path' +import { mkdtempSync, mkdirSync, writeFileSync, rmSync } from 'fs' +import { join, relative } from 'path' import { tmpdir } from 'os' import { loadServiceTemplates } from '../../../components/core/service/templateLoader.js' @@ -83,4 +83,77 @@ describe('loadServiceTemplates', () => { writeFileSync(join(dir, 'b.json'), JSON.stringify(valid('b'))) expect(await loadServiceTemplates(dir)).to.have.length(2) }) + + it('10. workflows[].file is inlined into graph and file is dropped', async () => { + mkdirSync(join(dir, 'workflows')) + writeFileSync( + join(dir, 'workflows', 'w.json'), + JSON.stringify({ nodes: [{ id: 1 }] }) + ) + writeFileSync( + join(dir, 'a.json'), + JSON.stringify({ + ...valid('tmpl-wf'), + workflows: [ + { id: 'ocean_ugc_product', name: 'Product', file: 'workflows/w.json' } + ] + }) + ) + const [tmpl] = await loadServiceTemplates(dir) + expect(tmpl.workflows[0].graph).to.deep.equal({ nodes: [{ id: 1 }] }) + expect(tmpl.workflows[0]).to.not.have.property('file') + }) + + it('11. workflows[].file escaping the templates dir via ../ is dropped, template survives', async () => { + const outsideDir = mkdtempSync(join(tmpdir(), 'svc-templates-outside-')) + try { + const secretPath = join(outsideDir, 'secret.json') + writeFileSync(secretPath, JSON.stringify({ secret: true })) + writeFileSync( + join(dir, 'a.json'), + JSON.stringify({ + ...valid('tmpl-escape'), + workflows: [ + { id: 'escape', name: 'Escape', file: relative(dir, secretPath) }, + { id: 'inline', name: 'Inline', graph: { nodes: [] } } + ] + }) + ) + const [tmpl] = await loadServiceTemplates(dir) + expect(tmpl.id).to.equal('tmpl-escape') + expect(tmpl.workflows.map((w) => w.id)).to.deep.equal(['inline']) + } finally { + rmSync(outsideDir, { recursive: true, force: true }) + } + }) + + it('12. commandFile is inlined into command[0] and the key is dropped', async () => { + writeFileSync(join(dir, 'boot.sh'), '#!/bin/bash\necho hi\n') + writeFileSync( + join(dir, 'a.json'), + JSON.stringify({ ...valid('tmpl-cmd'), commandFile: 'boot.sh' }) + ) + const [tmpl] = await loadServiceTemplates(dir) + expect(tmpl.command[0]).to.equal('#!/bin/bash\necho hi\n') + expect(tmpl).to.not.have.property('commandFile') + }) + + it('13. commandFile escaping the templates dir skips the whole template', async () => { + const outsideDir = mkdtempSync(join(tmpdir(), 'svc-templates-outside-')) + try { + const secret = join(outsideDir, 'secret.sh') + writeFileSync(secret, 'echo pwned\n') + writeFileSync( + join(dir, 'a.json'), + JSON.stringify({ + ...valid('tmpl-escape-cmd'), + commandFile: relative(dir, secret) + }) + ) + // A bad workflow is dropped on its own; a template with no command is not servable. + expect(await loadServiceTemplates(dir)).to.deep.equal([]) + } finally { + rmSync(outsideDir, { recursive: true, force: true }) + } + }) }) diff --git a/src/utils/config/schemas.ts b/src/utils/config/schemas.ts index 5b4820384..f6df2c071 100644 --- a/src/utils/config/schemas.ts +++ b/src/utils/config/schemas.ts @@ -343,6 +343,21 @@ const UserConfigurableEnvVarSchema = z }) .strict() +export const ServiceTemplateWorkflowSchema = z + .object({ + id: z.string().regex(/^[A-Za-z0-9_.-]+$/, { + message: 'Workflow id must match [A-Za-z0-9_.-]+' + }), + name: z.string().min(1), + description: z.string().optional(), + file: z.string().min(1).optional(), + graph: z.unknown().optional() + }) + .strict() + .refine((w) => !!w.file !== !!w.graph, { + message: 'A workflow must set exactly one of "file" or "graph"' + }) + export const ServiceTemplateSchema = z .object({ id: z.string().regex(/^[a-z0-9][a-z0-9_-]{0,63}$/, { @@ -362,9 +377,11 @@ export const ServiceTemplateSchema = z envVars: z.record(z.string()).optional(), userConfigurableEnvVars: z.array(UserConfigurableEnvVarSchema).optional(), command: z.array(z.string()).optional(), + commandFile: z.string().min(1).optional(), entrypoint: z.array(z.string()).optional(), requiredResources: z.array(TemplateResourceRequirementSchema).optional(), - recommendedResources: z.array(TemplateResourceRequirementSchema).optional() + recommendedResources: z.array(TemplateResourceRequirementSchema).optional(), + workflows: z.array(ServiceTemplateWorkflowSchema).optional() }) .strict() .superRefine((tmpl, ctx) => { @@ -412,6 +429,14 @@ export const ServiceTemplateSchema = z path: ['additionalDockerFiles'] }) } + + if (tmpl.command && tmpl.commandFile) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: '"command" and "commandFile" are mutually exclusive — set at most one', + path: ['commandFile'] + }) + } }) // ── Per-daemon service config (no templates here) ─────────────────────