Skip to content

Commit c1e4a43

Browse files
committed
Major Release - WAN Studio & Infrastructure Upgrades
Release of WAN Studio. New node base class for prototyping & consistency. ...
1 parent b59ab3c commit c1e4a43

32 files changed

+2306
-198
lines changed

FS_Constants.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,15 @@
1515
##
1616
# CONSTANTS
1717
##
18+
19+
# SYSTEM INFO
20+
SYSTEM_NAME = 'FlowState Creator Suite'
21+
SYSTEM_VERSION = '0.1.5'
22+
23+
# IMAGE PARAMETERS
1824
MAX_RESOLUTION=16384
25+
26+
# TYPES
1927
TOOLTIP_UNDERLINE = 32
2028

2129

FS_Mappings.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,19 @@
2020
# MAPPINGS
2121
##
2222
NODE_CLASS_MAPPINGS = {
23+
'FlowState_SimpleLatent': FlowState_SimpleLatent,
24+
'FlowState_VideoCreator': FlowState_VideoCreator,
2325
'FlowState_LatentSource': FlowState_LatentSource,
2426
'FlowState_FluxEngine': FlowState_FluxEngine,
27+
'FlowState_WANStudio': FlowState_WANStudio,
2528
}
2629

2730
NODE_DISPLAY_NAME_MAPPINGS = {
31+
'FlowState_VideoCreator': '🌊🎥 FlowState Video Creator',
32+
'FlowState_SimpleLatent': '🌊👌 FlowState Simple Latent',
2833
'FlowState_LatentSource': '🌊🌱 FlowState Latent Source',
2934
'FlowState_FluxEngine': '🌊🚒 FlowState Flux Engine',
35+
'FlowState_WANStudio': '🌊🎬 FlowState WAN Studio',
3036
# 'FlowState_QuickEdit': '🌊 FlowState Quick Edit',
3137
# 'FlowState_AssetForge': '🌊 FlowState Asset Forge',
3238
}

FS_Nodes.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# Project: FlowState Creator Suite
2-
# Description: A collection of custom nodes to solve problems I couldn't find existing nodes for.
2+
# Description: A node suite designed for professional production, offering a stable, efficient,
3+
# and scalable solution that simplifies complex workflows for high-quality, fine-tuned asset creation.
34
# Author: Johnathan Chivington
45
# Contact: [email protected] | youtube.com/@flowstateeng
56

@@ -14,8 +15,11 @@
1415
##
1516
# NODES
1617
##
18+
from .FlowState_SimpleLatent import *
1719
from .FlowState_LatentSource import *
1820
from .FlowState_FluxEngine import *
21+
from .FlowState_VideoCreator import *
22+
from .FlowState_WANStudio import *
1923

2024

2125
##

FS_Types.py

Lines changed: 210 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@
1919
import nodes
2020

2121

22+
23+
# -----------------------------------------------------------
24+
# BEGIN GENERIC TYPES
25+
# -----------------------------------------------------------
26+
2227
##
2328
# ANY TYPE
2429
##
@@ -72,11 +77,11 @@ def __ne__(self, __value: object) -> bool:
7277
)})
7378

7479
# IMAGE
75-
TYPE_IMG_WIDTH = ('INT', {'default': 1024, 'min': 16, 'max': nodes.MAX_RESOLUTION, 'step': 8, 'tooltip': (
80+
TYPE_IMG_WIDTH = ('INT', {'default': 1024, 'min': 16, 'max': nodes.MAX_RESOLUTION, 'step': 1, 'tooltip': (
7681
f' Width\n {"-" * TOOLTIP_UNDERLINE}\n'
7782
f' - Defines the width of the image.\n\n'
7883
)})
79-
TYPE_IMG_HEIGHT = ('INT', {'default': 1024, 'min': 16, 'max': nodes.MAX_RESOLUTION, 'step': 8, 'tooltip': (
84+
TYPE_IMG_HEIGHT = ('INT', {'default': 1024, 'min': 16, 'max': nodes.MAX_RESOLUTION, 'step': 1, 'tooltip': (
8085
f' Height\n {"-" * TOOLTIP_UNDERLINE}\n'
8186
f' - Defines the height of the image.\n\n'
8287
)})
@@ -115,9 +120,13 @@ def __ne__(self, __value: object) -> bool:
115120
f' - The amount of denoising applied, lower values will maintain the structure of the initial image allowing for image to image sampling.\n\n'
116121
)
117122
})
118-
TYPE_PROMPT_POSITIVE = ('STRING', {'multiline': True, 'default': 'Enter your positive prompt.', 'tooltip': (
123+
TYPE_PROMPT_POSITIVE = ('STRING', {'multiline': True, 'default': '✅ Describe the image you want the model to create.', 'tooltip': (
124+
f' Positive Prompt\n {"-" * TOOLTIP_UNDERLINE}\n'
125+
f' - ✅ Describe the image you want the model to create.\n\n'
126+
)})
127+
TYPE_PROMPT_NEGATIVE = ('STRING', {'multiline': True, 'default': '⛔ Describe what you do not want to see in the image.', 'tooltip': (
119128
f' Positive Prompt\n {"-" * TOOLTIP_UNDERLINE}\n'
120-
f' - Positive text prompt describing your desired output.\n\n'
129+
f' - ⛔ Describe what you do not want to see in the image.\n\n'
121130
)})
122131

123132
# MODEL
@@ -186,12 +195,12 @@ def __ne__(self, __value: object) -> bool:
186195
f' - Used to encode and decode images.\n\n'
187196
)})
188197

189-
TYPE_CONTROL_NETS_LIST = lambda: (['none'] + CONTROL_NETS_LIST(), {'tooltip': (
198+
TYPE_CONTROL_NETS_LIST = lambda: (['disabled'] + CONTROL_NETS_LIST(), {'tooltip': (
190199
f' Control Net List\n {"-" * TOOLTIP_UNDERLINE}\n'
191200
f' - List of available Control Nets.\n'
192201
f' - Used to transfer structure of an input image to a generated output image.\n\n'
193202
)})
194-
TYPE_LORAS_LIST = lambda: (['none'] + LORAS_LIST(), {'tooltip': (
203+
TYPE_LORAS_LIST = lambda: (['disabled'] + LORAS_LIST(), {'tooltip': (
195204
f' LoRA List\n {"-" * TOOLTIP_UNDERLINE}\n'
196205
f' - List of available Low-Rank Adaptation models.\n'
197206
f' - Used to transfer a pre-trained style (cyberpunk, anime, photorealism, disney, etc.) to a generated output image.\n\n'
@@ -232,10 +241,67 @@ def __ne__(self, __value: object) -> bool:
232241
TYPE_IMAGE = ('IMAGE', )
233242

234243

244+
245+
# -----------------------------------------------------------
246+
# BEGIN FLOWSTATE TYPES
247+
# -----------------------------------------------------------
248+
249+
235250
##
236-
# FLOWSTATE CREATOR TYPES
251+
# FLOWSTATE CREATOR LABELS
237252
##
238253

254+
def pad_label(label):
255+
width = 100
256+
len_label = len(label)
257+
num_spaces = width - len_label
258+
left_side = num_spaces // 2 - 10
259+
right_side = num_spaces - left_side
260+
padded_label = ' ' * left_side + '--- ' + label + ' ---' + ' ' * right_side
261+
return padded_label
262+
263+
# GENERIC LABELS
264+
TYPE_FLOWSTATE_LABEL_MODEL = ('STRING', {'default': pad_label('🤖 Model Settings'), 'tooltip': (
265+
f' Label\n {"-" * TOOLTIP_UNDERLINE}\n'
266+
f' - This field is not functional. It is just a label for the group of settings below.\n\n'
267+
)})
268+
269+
TYPE_FLOWSTATE_LABEL_AUG = ('STRING', {'default': pad_label('🔥 Augmentation Settings'), 'tooltip': (
270+
f' Label\n {"-" * TOOLTIP_UNDERLINE}\n'
271+
f' - This field is not functional. It is just a label for the group of settings below.\n\n'
272+
)})
273+
274+
TYPE_FLOWSTATE_LABEL_ENCODER = ('STRING', {'default': pad_label('🔣 Encoder Settings'), 'tooltip': (
275+
f' Label\n {"-" * TOOLTIP_UNDERLINE}\n'
276+
f' - This field is not functional. It is just a label for the group of settings below.\n\n'
277+
)})
278+
279+
TYPE_FLOWSTATE_LABEL_IMAGE = ('STRING', {'default': pad_label('🖼️ Image Settings'), 'tooltip': (
280+
f' Label\n {"-" * TOOLTIP_UNDERLINE}\n'
281+
f' - This field is not functional. It is just a label for the group of settings below.\n\n'
282+
)})
283+
284+
TYPE_FLOWSTATE_LABEL_VIDEO = ('STRING', {'default': pad_label('🎥 Video Settings'), 'tooltip': (
285+
f' Label\n {"-" * TOOLTIP_UNDERLINE}\n'
286+
f' - This field is not functional. It is just a label for the group of settings below.\n\n'
287+
)})
288+
289+
TYPE_FLOWSTATE_LABEL_SAMPLING = ('STRING', {'default': pad_label('🧪 Sampling Settings'), 'tooltip': (
290+
f' Label\n {"-" * TOOLTIP_UNDERLINE}\n'
291+
f' - This field is not functional. It is just a label for the group of settings below.\n\n'
292+
)})
293+
294+
TYPE_FLOWSTATE_LABEL_PROMPT = ('STRING', {'default': pad_label('📝 Prompt(s)'), 'tooltip': (
295+
f' Label\n {"-" * TOOLTIP_UNDERLINE}\n'
296+
f' - This field is not functional. It is just a label for the group of settings below.\n\n'
297+
)})
298+
299+
300+
##
301+
# FLOWSTATE CREATOR GENERIC TYPES
302+
##
303+
304+
239305
# SAGE ATTENTION
240306
enabled_sage_modes = [
241307
"disabled",
@@ -261,11 +327,66 @@ def __ne__(self, __value: object) -> bool:
261327
f' - If using a checkpoint, then the weight_dtype, clip_1_name, clip_2_name & vae_name fields will ignored.\n\n'
262328
)})
263329

264-
# LATENT SOURCE
330+
331+
# VIDEO
332+
TYPE_NUM_VIDEO_FRAMES = ('INT', {'default': 48, 'min': 1, 'max': nodes.MAX_RESOLUTION, 'step': 1, 'tooltip': (
333+
f' Number of Video Frames\n {"-" * TOOLTIP_UNDERLINE}\n'
334+
f' - The number of frames you want in your final video.\n\n'
335+
)})
336+
337+
338+
##
339+
# FLOWSTATE VIDEO CREATOR
340+
##
341+
TYPE_FPS = ('INT', {'default': 12, 'min': 1, 'max': 120, 'tooltip': (
342+
f' Frames Per Second\n {"-" * TOOLTIP_UNDERLINE}\n'
343+
f' - The number of frames per second in the created video.\n\n'
344+
)})
345+
TYPE_FRAMES_IN = ('IMAGE', {'tooltip': (
346+
f' Video Frames\n {"-" * TOOLTIP_UNDERLINE}\n'
347+
f' - The frames used to create the video.\n\n'
348+
)})
349+
TYPE_AUDIO_IN = ('AUDIO', {'tooltip': (
350+
f' Video Audio\n {"-" * TOOLTIP_UNDERLINE}\n'
351+
f' - Optional audio to be added to the video.\n\n'
352+
)})
353+
TYPE_FILENAME_PREFIX = ('STRING', {'default': 'video/ComyUI', 'tooltip': (
354+
f' Filename Prefix\n {"-" * TOOLTIP_UNDERLINE}\n'
355+
f' - The prefix for the file to save.\n'
356+
f' - This may include formatting information such as %date:yyyy-MM-dd% or %Empty Latent Image.width% to include values from nodes.\n\n'
357+
)})
358+
TYPE_VIDEO_FORMAT = (['mp4', 'auto'], {
359+
'tooltip': (
360+
f' Video Format\n {"-" * TOOLTIP_UNDERLINE}\n'
361+
f' - The format to save the video as.\n\n'
362+
)
363+
})
364+
TYPE_VIDEO_CODEC = (['h264', 'auto'], {
365+
'tooltip': (
366+
f' Video Codec\n {"-" * TOOLTIP_UNDERLINE}\n'
367+
f' - The codec to use for the video.\n\n'
368+
)
369+
})
370+
371+
372+
##
373+
# FLOWSTATE SIMPLE LATENT
374+
##
375+
TYPE_SIMPLE_LATENT_INPUT_TYPE = (['Empty Latent', 'Input Image'], {
376+
'tooltip': (
377+
f' Latent Type\n {"-" * TOOLTIP_UNDERLINE}\n'
378+
f' - Your choice of an empty latent (all zeros) or an image as a latent.\n\n'
379+
)
380+
})
381+
382+
383+
##
384+
# FLOWSTATE LATENT SOURCE
385+
##
265386
TYPE_LATENT_BATCH_SIZE = ('INT', {'default': 1, 'min': 1, 'max': 4096, 'tooltip': (
266-
f' Custom Batch Size\n {"-" * TOOLTIP_UNDERLINE}\n'
267-
f' - The number of images you want to generate.\n\n'
268-
)})
387+
f' Custom Batch Size\n {"-" * TOOLTIP_UNDERLINE}\n'
388+
f' - The number of images you want to generate.\n\n'
389+
)})
269390
TYPE_LATENT_SOURCE_INPUT_TYPE = (['Empty Latent', 'Input Image', 'Uploaded Image'], {
270391
'tooltip': (
271392
f' Latent Type\n {"-" * TOOLTIP_UNDERLINE}\n'
@@ -296,7 +417,8 @@ def __ne__(self, __value: object) -> bool:
296417
], {
297418
'tooltip': (
298419
f' Resolution Selector\n {"-" * TOOLTIP_UNDERLINE}\n'
299-
f' - Select custom to use the entered width & height, or select a resolution.\n\n'
420+
f' - Select "Custom" to use the entered custom_width & custom_height.\n'
421+
f' - Select a preset resolution & orientation.\n\n'
300422
)
301423
})
302424
TYPE_LATENT_SOURCE_ORIENTATION = (['Horizontal', 'Vertical'], {
@@ -305,8 +427,81 @@ def __ne__(self, __value: object) -> bool:
305427
f' - Resolutions given in horizontal orientation. Select vertical to swap resolution aspect ratio.\n\n'
306428
)
307429
})
308-
TYPE_LATENT_SOURCE_OUT = ('LATENT', )
430+
TYPE_LATENT_SOURCE_OUT = ('LATENT',)
431+
432+
433+
##
434+
# FLOWSTATE FLUX ENGINE
435+
##
436+
TYPE_PROMPT_FLUX_ENGINE = ('STRING', {'multiline': True, 'default': '✅ Describe the image you want Flux to create.', 'tooltip': (
437+
f' Positive Prompt\n {"-" * TOOLTIP_UNDERLINE}\n'
438+
f' - ✅ Describe the image you want Flux to create.\n\n'
439+
)})
440+
TYPE_FLUX_ENGINE_OUT = ('MODEL', 'CLIP', 'VAE', 'IMAGE', 'LATENT')
441+
442+
443+
##
444+
# FLOWSTATE WAN STUDIO
445+
##
446+
TYPE_PROMPT_WAN_STUDIO_POSITIVE = ('STRING', {'multiline': True, 'default': '✅ Describe the video you want WAN to create.', 'tooltip': (
447+
f' Positive Prompt\n {"-" * TOOLTIP_UNDERLINE}\n'
448+
f' - ✅ Describe the video you want WAN to create.\n\n'
449+
)})
450+
TYPE_PROMPT_WAN_STUDIO_NEGATIVE = ('STRING', {'multiline': True, 'default': '⛔ Describe what you do not want to see in the video.', 'tooltip': (
451+
f' Positive Prompt\n {"-" * TOOLTIP_UNDERLINE}\n'
452+
f' - ⛔ Describe what you do not want to see in the video.\n\n'
453+
)})
454+
TYPE_WAN_STUDIO_STARTING_FRAME = ('IMAGE', {'tooltip': (
455+
f' Starting Frame\n {"-" * TOOLTIP_UNDERLINE}\n'
456+
f' - Optionally, select an input image to use as the starting frame.\n\n'
457+
)})
458+
TYPE_WAN_STUDIO_RESOLUTION = ([
459+
'Custom',
460+
'Use Starting Frame Resolution',
461+
# HORIZONTAL
462+
'1920x1080 - 16:9',
463+
'1280x720 - 16:9',
464+
'1280x768 - 5:3',
465+
'1280x960 - 4:3',
466+
'1024x768 - 4:3',
467+
'2048x512 - 4:1',
468+
'1152x896 - 9:7',
469+
'4096x2048 - 2:1',
470+
'2048x1024 - 2:1',
471+
'1564x670 - 21:9',
472+
'2212x948 - 21:9',
473+
# SQUARE
474+
'4096x4096 - 1:1',
475+
'3072x3072 - 1:1',
476+
'2048x2048 - 1:1',
477+
'1024x1024 - 1:1',
478+
'720x720 - 1:1',
479+
'512x512 - 1:1'
480+
], {
481+
'tooltip': (
482+
f' Resolution Selector\n {"-" * TOOLTIP_UNDERLINE}\n'
483+
f' - Select "Custom" to use the entered custom_width & custom_height.\n'
484+
f' - Select "Use Starting Frame Resolution" to use the resolution of the input image.\n'
485+
f' - Select a preset resolution & orientation.\n\n'
486+
)
487+
})
488+
TYPE_WAN_CLIP_VISION = ('CLIP_VISION', {'tooltip': (
489+
f' CLIP Vision Output\n {"-" * TOOLTIP_UNDERLINE}\n'
490+
f' - Optionally, use a CLIP Vision model.\n\n'
491+
)})
492+
TYPE_WAN_STUDIO_OUT = ('IMAGE', 'LATENT')
493+
309494

310-
# FLUX ENGINE
311-
TYPE_FLUX_ENGINE_OUT = ('MODEL', 'CLIP', 'VAE', 'IMAGE', 'LATENT', )
495+
##
496+
# FLOWSTATE QUICK EDIT
497+
##
498+
TYPE_PROMPT_QUICK_EDIT_CHANGES = ('STRING', {'multiline': True, 'default': 'Describe the edits you want Qwen to make.', 'tooltip': (
499+
f' Positive Prompt\n {"-" * TOOLTIP_UNDERLINE}\n'
500+
f' - Describe the edits you want Qwen to make.\n\n'
501+
)})
502+
TYPE_PROMPT_QUICK_EDIT_REFINE = ('STRING', {'multiline': True, 'default': 'Describe the new image after the edits are made.', 'tooltip': (
503+
f' Positive Prompt\n {"-" * TOOLTIP_UNDERLINE}\n'
504+
f' - Describe the new image after the edits are made.\n\n'
505+
)})
506+
TYPE_QUICK_EDIT_OUT = ('MODEL', 'CLIP', 'VAE', 'IMAGE', 'LATENT')
312507

FS_Utils.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ def get_output_files():
3232
files = folder_paths.filter_files_content_types(files, ["image"])
3333
return files
3434

35+
def correct_model_name(name):
36+
return name.replace('.sft', '.safetensors')
37+
3538

3639
# MODELS
3740
def get_vae_list():

0 commit comments

Comments
 (0)