docs: simplify demo to SPEED and BIM-VFI

This commit is contained in:
2026-08-15 22:10:24 +02:00
parent 2ee1c6f4cf
commit eee68aa356
4 changed files with 378 additions and 760 deletions
+2 -3
View File
@@ -25,10 +25,9 @@ Dependencies are declared in `pyproject.toml` and `requirements.txt` and are ins
### Demo workflow
Import [`example_workflows/tween_speed_ldf_model_lab.json`](example_workflows/tween_speed_ldf_model_lab.json) for the recommended starter graph. It requires [ComfyUI-VideoHelperSuite](https://github.com/Kosinkadink/ComfyUI-VideoHelperSuite) for video loading and encoding.
Import [`example_workflows/tween_speed_bim_model_lab.json`](example_workflows/tween_speed_bim_model_lab.json) for the recommended starter graph. It requires [ComfyUI-VideoHelperSuite](https://github.com/Kosinkadink/ComfyUI-VideoHelperSuite) for video loading and encoding.
- The enabled SPEED branch loads a 25-frame, 24 FPS sample, automatically tunes memory settings, interpolates to 48 FPS, preserves audio, and writes `Tween/demo_speed_24_to_48`.
- The LDF-VFI branch is visibly grouped and muted by default so the workflow does not unexpectedly download ~6.4 GB or reserve ~20 GB VRAM. Enable its three coral nodes when you want to compare the sequence-native model.
- The SPEED and BIM-VFI branches load the same 25-frame, 24 FPS sample, tune memory settings independently, interpolate to 48 FPS, preserve audio, and save separate comparison videos.
- Keep the loader's `force_rate`, Tween's `source_fps`/`target_fps`, and Video Combine's `frame_rate` synchronized when changing cadence.
### cupy (accelerates BIM-VFI, SGM-VFI, and GIMM-VFI)
@@ -0,0 +1,323 @@
{
"last_node_id": 9,
"last_link_id": 14,
"nodes": [
{
"id": 1,
"type": "VHS_LoadVideoPath",
"pos": [20, 170],
"size": [300, 310],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [
{"name": "meta_batch", "shape": 7, "type": "VHS_BatchManager", "link": null},
{"name": "vae", "shape": 7, "type": "VAE", "link": null}
],
"outputs": [
{"name": "IMAGE", "type": "IMAGE", "links": [1, 8]},
{"name": "frame_count", "type": "INT", "links": null},
{"name": "audio", "type": "AUDIO", "links": [7, 14]},
{"name": "video_info", "type": "VHS_VIDEOINFO", "links": null}
],
"properties": {
"cnr_id": "comfyui-videohelpersuite",
"Node name for S&R": "VHS_LoadVideoPath"
},
"widgets_values": {
"video": "",
"force_rate": 24,
"custom_width": 0,
"custom_height": 0,
"frame_load_cap": 25,
"skip_first_frames": 0,
"select_every_nth": 1,
"format": "AnimateDiff",
"videopreview": {
"hidden": false,
"paused": false,
"params": {
"filename": "",
"type": "path",
"format": "video/",
"force_rate": 24,
"custom_width": 0,
"custom_height": 0,
"frame_load_cap": 25,
"skip_first_frames": 0,
"select_every_nth": 1
}
}
}
},
{
"id": 2,
"type": "LoadSPEEDVFIModel",
"pos": [390, 150],
"size": [300, 105],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [],
"outputs": [
{"name": "model", "type": "SPEED_VFI_MODEL", "links": [2, 4]}
],
"properties": {
"aux_id": "ComfyUI-Tween.git",
"Node name for S&R": "LoadSPEEDVFIModel"
},
"widgets_values": ["speed.pt", "auto"],
"color": "#243b32",
"bgcolor": "#315244"
},
{
"id": 3,
"type": "VFIOptimizer",
"pos": [390, 320],
"size": [310, 150],
"flags": {},
"order": 2,
"mode": 0,
"inputs": [
{"name": "images", "type": "IMAGE", "link": 1},
{"name": "model", "type": "*", "link": 2}
],
"outputs": [
{"name": "images", "type": "IMAGE", "links": [3]},
{"name": "settings", "type": "VFI_SETTINGS", "links": [5]}
],
"properties": {
"aux_id": "ComfyUI-Tween.git",
"Node name for S&R": "VFIOptimizer"
},
"widgets_values": [2, 0],
"color": "#243b32",
"bgcolor": "#315244"
},
{
"id": 4,
"type": "SPEEDVFIInterpolate",
"pos": [760, 220],
"size": [355, 360],
"flags": {},
"order": 3,
"mode": 0,
"inputs": [
{"name": "images", "type": "IMAGE", "link": 3},
{"name": "model", "type": "SPEED_VFI_MODEL", "link": 4},
{"name": "settings", "shape": 7, "type": "VFI_SETTINGS", "link": 5}
],
"outputs": [
{"name": "images", "type": "IMAGE", "links": [6]},
{"name": "oversampled", "type": "IMAGE", "links": null},
{"name": "elapsed_seconds", "type": "FLOAT", "links": null}
],
"properties": {
"aux_id": "ComfyUI-Tween.git",
"Node name for S&R": "SPEEDVFIInterpolate"
},
"widgets_values": [2, 10, true, false, 1, 0, 24, 48, 0],
"color": "#243b32",
"bgcolor": "#315244"
},
{
"id": 5,
"type": "VHS_VideoCombine",
"pos": [1170, 220],
"size": [360, 340],
"flags": {},
"order": 4,
"mode": 0,
"inputs": [
{"name": "images", "type": "IMAGE", "link": 6},
{"name": "audio", "shape": 7, "type": "AUDIO", "link": 7},
{"name": "meta_batch", "shape": 7, "type": "VHS_BatchManager", "link": null},
{"name": "vae", "shape": 7, "type": "VAE", "link": null}
],
"outputs": [
{"name": "Filenames", "type": "VHS_FILENAMES", "links": null}
],
"properties": {
"cnr_id": "comfyui-videohelpersuite",
"Node name for S&R": "VHS_VideoCombine"
},
"widgets_values": {
"frame_rate": 48,
"loop_count": 0,
"filename_prefix": "Tween/demo_speed_24_to_48",
"format": "video/h264-mp4",
"pix_fmt": "yuv420p",
"crf": 19,
"save_metadata": true,
"trim_to_audio": false,
"pingpong": false,
"save_output": true,
"videopreview": {"hidden": false, "paused": false, "params": {}}
},
"color": "#243b32",
"bgcolor": "#315244"
},
{
"id": 6,
"type": "LoadBIMVFIModel",
"pos": [390, 790],
"size": [300, 125],
"flags": {},
"order": 5,
"mode": 0,
"inputs": [],
"outputs": [
{"name": "model", "type": "BIM_VFI_MODEL", "links": [9, 11]}
],
"properties": {
"aux_id": "ComfyUI-Tween.git",
"Node name for S&R": "LoadBIMVFIModel"
},
"widgets_values": ["bim_vfi.pth", true, 3],
"color": "#28384a",
"bgcolor": "#36506b"
},
{
"id": 7,
"type": "VFIOptimizer",
"pos": [390, 970],
"size": [310, 150],
"flags": {},
"order": 6,
"mode": 0,
"inputs": [
{"name": "images", "type": "IMAGE", "link": 8},
{"name": "model", "type": "*", "link": 9}
],
"outputs": [
{"name": "images", "type": "IMAGE", "links": [10]},
{"name": "settings", "type": "VFI_SETTINGS", "links": [12]}
],
"properties": {
"aux_id": "ComfyUI-Tween.git",
"Node name for S&R": "VFIOptimizer"
},
"widgets_values": [2, 0],
"color": "#28384a",
"bgcolor": "#36506b"
},
{
"id": 8,
"type": "BIMVFIInterpolate",
"pos": [760, 860],
"size": [355, 340],
"flags": {},
"order": 7,
"mode": 0,
"inputs": [
{"name": "images", "type": "IMAGE", "link": 10},
{"name": "model", "type": "BIM_VFI_MODEL", "link": 11},
{"name": "settings", "shape": 7, "type": "VFI_SETTINGS", "link": 12}
],
"outputs": [
{"name": "images", "type": "IMAGE", "links": [13]},
{"name": "oversampled", "type": "IMAGE", "links": null},
{"name": "elapsed_seconds", "type": "FLOAT", "links": null}
],
"properties": {
"aux_id": "ComfyUI-Tween.git",
"Node name for S&R": "BIMVFIInterpolate"
},
"widgets_values": [2, 10, true, false, 1, 0, 24, 48],
"color": "#28384a",
"bgcolor": "#36506b"
},
{
"id": 9,
"type": "VHS_VideoCombine",
"pos": [1170, 860],
"size": [360, 340],
"flags": {},
"order": 8,
"mode": 0,
"inputs": [
{"name": "images", "type": "IMAGE", "link": 13},
{"name": "audio", "shape": 7, "type": "AUDIO", "link": 14},
{"name": "meta_batch", "shape": 7, "type": "VHS_BatchManager", "link": null},
{"name": "vae", "shape": 7, "type": "VAE", "link": null}
],
"outputs": [
{"name": "Filenames", "type": "VHS_FILENAMES", "links": null}
],
"properties": {
"cnr_id": "comfyui-videohelpersuite",
"Node name for S&R": "VHS_VideoCombine"
},
"widgets_values": {
"frame_rate": 48,
"loop_count": 0,
"filename_prefix": "Tween/demo_bim_24_to_48",
"format": "video/h264-mp4",
"pix_fmt": "yuv420p",
"crf": 19,
"save_metadata": true,
"trim_to_audio": false,
"pingpong": false,
"save_output": true,
"videopreview": {"hidden": false, "paused": false, "params": {}}
},
"color": "#28384a",
"bgcolor": "#36506b"
}
],
"links": [
[1, 1, 0, 3, 0, "IMAGE"],
[2, 2, 0, 3, 1, "*"],
[3, 3, 0, 4, 0, "IMAGE"],
[4, 2, 0, 4, 1, "SPEED_VFI_MODEL"],
[5, 3, 1, 4, 2, "VFI_SETTINGS"],
[6, 4, 0, 5, 0, "IMAGE"],
[7, 1, 2, 5, 1, "AUDIO"],
[8, 1, 0, 7, 0, "IMAGE"],
[9, 6, 0, 7, 1, "*"],
[10, 7, 0, 8, 0, "IMAGE"],
[11, 6, 0, 8, 1, "BIM_VFI_MODEL"],
[12, 7, 1, 8, 2, "VFI_SETTINGS"],
[13, 8, 0, 9, 0, "IMAGE"],
[14, 1, 2, 9, 1, "AUDIO"]
],
"groups": [
{
"id": 1,
"title": "INPUT · 24 FPS / 25 FRAMES",
"bounding": [-20, 100, 360, 470],
"color": "#625d52",
"font_size": 22,
"flags": {}
},
{
"id": 2,
"title": "SPEED",
"bounding": [350, 100, 1240, 520],
"color": "#347a56",
"font_size": 22,
"flags": {}
},
{
"id": 3,
"title": "BIM-VFI",
"bounding": [350, 740, 1240, 510],
"color": "#3f6488",
"font_size": 22,
"flags": {}
}
],
"config": {},
"extra": {
"workflowRendererVersion": "LG",
"ue_links": [],
"links_added_by_ue": [],
"ds": {"scale": 0.76, "offset": [80, 80]},
"frontendVersion": "1.45.19",
"VHS_latentpreview": true,
"VHS_latentpreviewrate": 0,
"VHS_MetadataImage": true,
"VHS_KeepIntermediate": true
},
"version": 0.4
}
@@ -1,757 +0,0 @@
{
"id": "d1b1b840-08a9-4f93-9a1a-5bb9bdb05c39",
"revision": 0,
"last_node_id": 13,
"last_link_id": 11,
"nodes": [
{
"id": 1,
"type": "Note",
"pos": [
0,
0
],
"size": [
1420,
112
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [],
"properties": {
"Node name for S&R": "Note"
},
"widgets_values": [
"TWEEN MODEL LAB — SPEED + LDF-VFI\n1) Choose a short input video below. 2) Queue Prompt to run the enabled SPEED path. 3) The LDF-VFI path is muted by default; enable its three coral nodes only when you want the heavier sequence model."
],
"color": "#1f3a4d",
"bgcolor": "#294d66"
},
{
"id": 2,
"type": "VHS_LoadVideoPath",
"pos": [
20,
190
],
"size": [
300,
310
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [
{
"name": "meta_batch",
"shape": 7,
"type": "VHS_BatchManager",
"link": null
},
{
"name": "vae",
"shape": 7,
"type": "VAE",
"link": null
}
],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"links": [
1,
8
]
},
{
"name": "frame_count",
"type": "INT",
"links": null
},
{
"name": "audio",
"type": "AUDIO",
"links": [
7,
11
]
},
{
"name": "video_info",
"type": "VHS_VIDEOINFO",
"links": null
}
],
"properties": {
"cnr_id": "comfyui-videohelpersuite",
"Node name for S&R": "VHS_LoadVideoPath"
},
"widgets_values": {
"video": "",
"force_rate": 24,
"custom_width": 0,
"custom_height": 0,
"frame_load_cap": 25,
"skip_first_frames": 0,
"select_every_nth": 1,
"format": "AnimateDiff",
"videopreview": {
"hidden": false,
"paused": false,
"params": {
"filename": "",
"type": "path",
"format": "video/",
"force_rate": 24,
"custom_width": 0,
"custom_height": 0,
"frame_load_cap": 25,
"skip_first_frames": 0,
"select_every_nth": 1
}
}
}
},
{
"id": 3,
"type": "Note",
"pos": [
20,
520
],
"size": [
300,
166
],
"flags": {},
"order": 2,
"mode": 0,
"inputs": [],
"outputs": [],
"properties": {
"Node name for S&R": "Note"
},
"widgets_values": [
"INPUT SAFETY DEFAULTS\n• force_rate = 24 FPS\n• frame_load_cap = 25 (~1 second)\n• dimensions = source size\n\nFor another source rate, change force_rate here and source_fps in the chosen Tween node. The Video Combine frame rate must match target_fps."
],
"color": "#3f3520",
"bgcolor": "#594b2d"
},
{
"id": 4,
"type": "LoadSPEEDVFIModel",
"pos": [
390,
170
],
"size": [
300,
105
],
"flags": {},
"order": 3,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "model",
"type": "SPEED_VFI_MODEL",
"links": [
2,
4
]
}
],
"properties": {
"aux_id": "ComfyUI-Tween.git",
"Node name for S&R": "LoadSPEEDVFIModel"
},
"widgets_values": [
"speed.pt",
"auto"
],
"color": "#243b32",
"bgcolor": "#315244"
},
{
"id": 5,
"type": "VFIOptimizer",
"pos": [
390,
330
],
"size": [
310,
150
],
"flags": {},
"order": 4,
"mode": 0,
"inputs": [
{
"name": "images",
"type": "IMAGE",
"link": 1
},
{
"name": "model",
"type": "*",
"link": 2
}
],
"outputs": [
{
"name": "images",
"type": "IMAGE",
"links": [
3
]
},
{
"name": "settings",
"type": "VFI_SETTINGS",
"links": [
5
]
}
],
"properties": {
"aux_id": "ComfyUI-Tween.git",
"Node name for S&R": "VFIOptimizer"
},
"widgets_values": [
2,
0
],
"color": "#243b32",
"bgcolor": "#315244"
},
{
"id": 6,
"type": "SPEEDVFIInterpolate",
"pos": [
760,
240
],
"size": [
355,
340
],
"flags": {},
"order": 5,
"mode": 0,
"inputs": [
{
"name": "images",
"type": "IMAGE",
"link": 3
},
{
"name": "model",
"type": "SPEED_VFI_MODEL",
"link": 4
},
{
"name": "settings",
"shape": 7,
"type": "VFI_SETTINGS",
"link": 5
}
],
"outputs": [
{
"name": "images",
"type": "IMAGE",
"links": [
6
]
},
{
"name": "oversampled",
"type": "IMAGE",
"links": null
}
],
"properties": {
"aux_id": "ComfyUI-Tween.git",
"Node name for S&R": "SPEEDVFIInterpolate"
},
"widgets_values": [
2,
10,
true,
false,
1,
0,
24,
48,
0
],
"color": "#243b32",
"bgcolor": "#315244"
},
{
"id": 7,
"type": "VHS_VideoCombine",
"pos": [
1170,
240
],
"size": [
360,
340
],
"flags": {},
"order": 6,
"mode": 0,
"inputs": [
{
"name": "images",
"type": "IMAGE",
"link": 6
},
{
"name": "audio",
"shape": 7,
"type": "AUDIO",
"link": 7
},
{
"name": "meta_batch",
"shape": 7,
"type": "VHS_BatchManager",
"link": null
},
{
"name": "vae",
"shape": 7,
"type": "VAE",
"link": null
}
],
"outputs": [
{
"name": "Filenames",
"type": "VHS_FILENAMES",
"links": null
}
],
"properties": {
"cnr_id": "comfyui-videohelpersuite",
"Node name for S&R": "VHS_VideoCombine"
},
"widgets_values": {
"frame_rate": 48,
"loop_count": 0,
"filename_prefix": "Tween/demo_speed_24_to_48",
"format": "video/h264-mp4",
"pix_fmt": "yuv420p",
"crf": 19,
"save_metadata": true,
"trim_to_audio": false,
"pingpong": false,
"save_output": true,
"videopreview": {
"hidden": false,
"paused": false,
"params": {}
}
},
"color": "#243b32",
"bgcolor": "#315244"
},
{
"id": 8,
"type": "Note",
"pos": [
390,
20
],
"size": [
1140,
110
],
"flags": {},
"order": 7,
"mode": 0,
"inputs": [],
"outputs": [],
"properties": {
"Node name for S&R": "Note"
},
"widgets_values": [
"SPEED — RECOMMENDED, ENABLED\nOne-step diffusion midpoint interpolation. This branch uses target-FPS mode (24→48), a fixed seed, and VFI Optimizer settings. First use downloads the official ~447 MB checkpoint and checksum-pinned runtime."
],
"color": "#234936",
"bgcolor": "#2d6046"
},
{
"id": 9,
"type": "Note",
"pos": [
390,
760
],
"size": [
1140,
125
],
"flags": {},
"order": 8,
"mode": 0,
"inputs": [],
"outputs": [],
"properties": {
"Node name for S&R": "Note"
},
"widgets_values": [
"LDF-VFI — ADVANCED, MUTED BY DEFAULT\nRequires an NVIDIA BF16 GPU and roughly 20 GB VRAM; first use downloads ~6.4 GB. To run it, select the three coral nodes below and set Mode → Always. Disable/mute the SPEED output node if you only want LDF. Use 16 sampling steps for the official quality-oriented quick-start setting."
],
"color": "#5a2d2d",
"bgcolor": "#743b3b"
},
{
"id": 10,
"type": "LoadLDFVFIModel",
"pos": [
390,
930
],
"size": [
340,
190
],
"flags": {},
"order": 9,
"mode": 2,
"inputs": [],
"outputs": [
{
"name": "model",
"type": "LDF_VFI_MODEL",
"links": [
9
]
}
],
"properties": {
"aux_id": "ComfyUI-Tween.git",
"Node name for S&R": "LoadLDFVFIModel"
},
"widgets_values": [
"onecat-ai/LDF-VFI",
256,
64,
4,
"slide_chunk_all_block_2x1x1"
],
"color": "#5a2d2d",
"bgcolor": "#743b3b"
},
{
"id": 11,
"type": "LDFVFIInterpolate",
"pos": [
790,
930
],
"size": [
370,
320
],
"flags": {},
"order": 10,
"mode": 2,
"inputs": [
{
"name": "images",
"type": "IMAGE",
"link": 8
},
{
"name": "model",
"type": "LDF_VFI_MODEL",
"link": 9
}
],
"outputs": [
{
"name": "images",
"type": "IMAGE",
"links": [
10
]
},
{
"name": "generated_sequence",
"type": "IMAGE",
"links": null
}
],
"properties": {
"aux_id": "ComfyUI-Tween.git",
"Node name for S&R": "LDFVFIInterpolate"
},
"widgets_values": [
2,
8,
8,
0.1,
42,
true,
24,
48
],
"color": "#5a2d2d",
"bgcolor": "#743b3b"
},
{
"id": 12,
"type": "VHS_VideoCombine",
"pos": [
1210,
930
],
"size": [
360,
340
],
"flags": {},
"order": 11,
"mode": 2,
"inputs": [
{
"name": "images",
"type": "IMAGE",
"link": 10
},
{
"name": "audio",
"shape": 7,
"type": "AUDIO",
"link": 11
},
{
"name": "meta_batch",
"shape": 7,
"type": "VHS_BatchManager",
"link": null
},
{
"name": "vae",
"shape": 7,
"type": "VAE",
"link": null
}
],
"outputs": [
{
"name": "Filenames",
"type": "VHS_FILENAMES",
"links": null
}
],
"properties": {
"cnr_id": "comfyui-videohelpersuite",
"Node name for S&R": "VHS_VideoCombine"
},
"widgets_values": {
"frame_rate": 48,
"loop_count": 0,
"filename_prefix": "Tween/demo_ldf_24_to_48",
"format": "video/h264-mp4",
"pix_fmt": "yuv420p",
"crf": 19,
"save_metadata": true,
"trim_to_audio": false,
"pingpong": false,
"save_output": true,
"videopreview": {
"hidden": false,
"paused": false,
"params": {}
}
},
"color": "#5a2d2d",
"bgcolor": "#743b3b"
},
{
"id": 13,
"type": "Note",
"pos": [
20,
930
],
"size": [
300,
236
],
"flags": {},
"order": 12,
"mode": 0,
"inputs": [],
"outputs": [],
"properties": {
"Node name for S&R": "Note"
},
"widgets_values": [
"WHY TWO PATHS?\n\nSPEED\n• Best default for normal pairwise VFI\n• Much smaller and faster\n• 2x midpoint; 4x/8x recursive\n\nLDF-VFI\n• Sequence-native temporal modeling\n• Better suited to long-range coherence\n• 2x16x, but far heavier\n\nThe LDF demo uses 8 steps for a quicker test. Raise to 16 after the graph is working."
],
"color": "#40303b",
"bgcolor": "#594353"
}
],
"links": [
[
1,
2,
0,
5,
0,
"IMAGE"
],
[
2,
4,
0,
5,
1,
"*"
],
[
3,
5,
0,
6,
0,
"IMAGE"
],
[
4,
4,
0,
6,
1,
"SPEED_VFI_MODEL"
],
[
5,
5,
1,
6,
2,
"VFI_SETTINGS"
],
[
6,
6,
0,
7,
0,
"IMAGE"
],
[
7,
2,
2,
7,
1,
"AUDIO"
],
[
8,
2,
0,
11,
0,
"IMAGE"
],
[
9,
10,
0,
11,
1,
"LDF_VFI_MODEL"
],
[
10,
11,
0,
12,
0,
"IMAGE"
],
[
11,
2,
2,
12,
1,
"AUDIO"
]
],
"groups": [
{
"id": 1,
"title": "1 · INPUT CLIP",
"bounding": [
-20,
135,
360,
575
],
"color": "#8a6d2f",
"font_size": 24,
"flags": {}
},
{
"id": 2,
"title": "2 · SPEED — RECOMMENDED / ENABLED",
"bounding": [
350,
-20,
1240,
650
],
"color": "#347a56",
"font_size": 24,
"flags": {}
},
{
"id": 3,
"title": "3 · LDF-VFI — ADVANCED / MUTED",
"bounding": [
350,
730,
1240,
590
],
"color": "#8a4646",
"font_size": 24,
"flags": {}
}
],
"config": {},
"extra": {
"workflowRendererVersion": "LG",
"ue_links": [],
"links_added_by_ue": [],
"ds": {
"scale": 0.76,
"offset": [
80,
80
]
},
"frontendVersion": "1.45.19",
"VHS_latentpreview": true,
"VHS_latentpreviewrate": 0,
"VHS_MetadataImage": true,
"VHS_KeepIntermediate": true
},
"version": 0.4
}
+53
View File
@@ -0,0 +1,53 @@
import json
from pathlib import Path
WORKFLOW_PATH = (
Path(__file__).resolve().parents[1]
/ "example_workflows"
/ "tween_speed_bim_model_lab.json"
)
def _workflow():
return json.loads(WORKFLOW_PATH.read_text(encoding="utf-8"))
def test_speed_bim_demo_is_clean_and_current():
workflow = _workflow()
node_types = [node["type"] for node in workflow["nodes"]]
assert "Note" not in node_types
assert not any("LDF" in node_type for node_type in node_types)
assert node_types.count("SPEEDVFIInterpolate") == 1
assert node_types.count("BIMVFIInterpolate") == 1
assert [group["title"] for group in workflow["groups"]] == [
"INPUT · 24 FPS / 25 FRAMES",
"SPEED",
"BIM-VFI",
]
def test_speed_bim_demo_links_are_internally_consistent():
workflow = _workflow()
nodes = {node["id"]: node for node in workflow["nodes"]}
node_ids = set(nodes)
links = {link[0]: link for link in workflow["links"]}
assert workflow["last_node_id"] == max(node_ids)
assert workflow["last_link_id"] == max(links)
for link_id, source_id, source_slot, target_id, target_slot, _ in workflow["links"]:
assert link_id in links
assert source_id in node_ids
assert target_id in node_ids
assert link_id in nodes[source_id]["outputs"][source_slot]["links"]
assert nodes[target_id]["inputs"][target_slot]["link"] == link_id
for node in workflow["nodes"]:
for input_slot in node.get("inputs", []):
if input_slot.get("link") is not None:
assert input_slot["link"] in links
for output_slot in node.get("outputs", []):
for link_id in output_slot.get("links") or []:
assert link_id in links