Thanks everyone for the Buzz β‘ and the feedback π
This workflow supports 3 types of models currently:
Standard LTX 2.3 distilled
LTX 2.3 distilled GGUF
10Eros
π‘ The models are self-contained. You can safely delete the entire group of whichever model you don't use without breaking the workflow. The remaining model groups will work independently without any additional changes needed.
This workflow is a modular and flexible text/image/audio-to-video generation system built in ComfyUI, designed to give full control over video creation using LTX-based models. It allows you to easily mix and match multiple generation modes such as text-to-video, image-to-video, lipsync, and fully guided animation by enabling or disabling grouped nodes.
π Personal notes:
The 10Eros model is better for NSFW content, whereas the standard model is better for SFW generations, although the body movement of the 10Eros model can be beneficial in some cases for SFW content too, but in general, use each model as I just said.
Try to always use 2 phase sampling generations (Half res + 2x upscaler), this yields the best quality and character consistency, LTX is not good at all at preserving character ID, so don't make it worse by doing a single pass generation. The upscaler model adds extra detail and improves character consistency, that's why I recommend using it.
However, using half res on resolutions under 480p will generate bad quality videos since, at that point, you would be creating a first pass video so small that the upscaler won't have much details to work with. So for 480p and below, one single pass video generation is the way to go. On an RTX 4090, you can generate 1440p short videos using half res + upscaler, however, I think the sweet spot between quality and speed is at 720p.Don't use the detailer when generating "Amateur look" videos, it adds a light layer of detail to the final result, and most of the time it will look too "polished" for a real amateur recording; amateur style videos look more real when they look low quality.
Main features
GGUF support
Prompt relay for segmented prompts
NSFW prompt enhancer
Text, image, audio, and ControlNet-driven video generation
LoRA support (character, style, and voice via ID LoRA)
Custom or AI-generated audio with automatic syncing
Reference image + up to 7 keyframes (FFLF animation control)
ControlNet video guidance with hybrid reference support
Half-res sampling + 2Γ upscaling for faster high-quality results
LTX detailer for enhanced final output
Common Setups
Text to video:
All bypassers disabled + Prompt + Default audioImage to video:
Prompt + Reference image + Default audioLipsync:
Prompt + Reference image + Custom audioAudio to video:
Prompt + Custom audio onlyCharacter LoRA + voice cloning:
Prompt + Character LoRA + ID LoRA + Default audioVoice reference to video:
Prompt + ID LoRA + Default audio
OR
Prompt + ID LoRA + Reference image + Default audioCharacter animation:
Prompt + ControlNet + Reference image + (Custom or Default audio)First frame β last frame:
Prompt + Keyframe 1 + Keyframe 2 + (Custom or Default audio)First β middle β last frame:
Prompt + Keyframe 1 + Keyframe 2 + Keyframe 3 + (Custom or Default audio)Character animation with custom voice:
Prompt + Reference image + ID LoRA + ControlNet + Default audio
COMFYUI SECURITY ERROR FIX
If you hit a security level error while trying to install the some custom nodes from ComfyUI manager:
You need to temporarily change the security level in your config.ini file.
If you are using the portable version, the file is located at:
ComfyUI/user/__manager/config.iniChange the value to:
security_level = weak
IMPORTANT:
Do NOT forget to restore it back to its original value, you should restore it afterward for safety reasons.
Perform a hard restart of ComfyUI (completely stop it, then start it again).
Install the custom node(s) using ComfyUI manager and double-check that it is the official one.
Restart ComfyUI and check if the node(s) work(s) properly.
Once everything is working properly, restore your original security level in the config.ini file and restart ComfyUI one final time.
Detailed instructions are contained in the workflow itself:
Red nodes are instructions and useful notes.
Yellow nodes are configurable elements you can adjust to your needs.

Description
First version release
FAQ
Comments (12)
Beautiful switching logic. I'm not a fan of AIOs generally, but I think you've laid this out as practically as one can considering the scope of what is being integrated here. So easy for this stuff to become an undecipherable mess. You certainly have fast action buttons working- I could never get the damn node to do what I wanted... Probably a smart move allowing resolution master to be bypassed, that one is another head-scratcher. Powerful, but good god it took me ages to figure out, such strange non-intuitive behavior. Probably the auto-detect overriding values. Haven't used it in a while, LTX being so finicky about latent sizes. Whatever, point of the comment is that I've been experimenting with every 2.3 control model that I can find and this is an excellent way to iterate variables whilst reducing the confounders, both of which are infinite. Very easy to import/export modules between WFs as well. That's the danger of keeping everything separate, it becomes impossible to keep track of progress. Anyway, thanks for sharing.
Yeah, I was hesitant to share this workflow because I'm not a fan of all-in-ones myself. It's not that I dislike the ones others create; it just takes me time to figure them out. I guess I figured that it might be useful for someone willing to figure it out, though, so I ended up sharing it.
Regarding the latent thing, yeah, IC LoRA is especially sensitive to wrong sizes for example (source latent dimensions should even); this workflow should manage it automatically, though; I made specific calculations to adjust the dimensions on the fly to comply with what the models like to work with.
This workflow is seriously awesome!
The Keyframe feature lets me fine-tune the whole thing so much better β it keeps the model from going off track and gives me way more control.
Huge thanks for creating and sharing this, it's a game-changer for me. Keep up the great work! π
Thanks for the comment, appreciate it.
was there an update today? what changes?
Nah, I just fixed the fast action buttons and stuff, but honestly the reason I updated the file was because CivitAI is buggy lately, so I had to re-upload the file again.
Node 'ID #5575' has no class_type. The workflow may be corrupted or a custom node is missing.
What node was this?
The node is the "Get Image Size" node, located in the "Save video" group, the last stage of the video generation, where it is decoded. It belongs to the masquarade nodes pack, if it is giving you promlems, you can change it for any other node that gets the image size, for example:
- "π§ Get Image Size" from the essentials pack
- "Get Image Size" (core node)
- "ImageSize" of the easy use pack
This is structured so insanely beautiful. The programming, the flow, the layout. Perfection! chefs kiss
Thanks :)
How to fix?
TypeError: Compex types (LATENT/IMAGE) need to reference their width/height, e.g. b.width
File "C:\Users\Shadow\ComfyUI\execution.py", line 534, in execute
output_data, output_ui, has_subgraph, has_pending_tasks = await get_output_data(prompt_id, unique_id, obj, input_data_all, execution_block_cb=execution_block_cb, pre_execute_cb=pre_execute_cb, v3_data=v3_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\Shadow\ComfyUI\execution.py", line 334, in get_output_data
return_values = await asyncmap_node_over_list(prompt_id, unique_id, obj, input_data_all, obj.FUNCTION, allow_interrupt=True, execution_block_cb=execution_block_cb, pre_execute_cb=pre_execute_cb, v3_data=v3_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\Shadow\ComfyUI\execution.py", line 308, in asyncmap_node_over_list
await process_inputs(input_dict, i)
File "C:\Users\Shadow\ComfyUI\execution.py", line 296, in process_inputs
result = f(**inputs)
^^^^^^^^^^^
File "C:\Users\Shadow\ComfyUI\custom_nodes\comfyui-custom-scripts\py\math_expression.py", line 241, in evaluate
r = eval_expr(node)
^^^^^^^^^^^^^^^
File "C:\Users\Shadow\ComfyUI\custom_nodes\comfyui-custom-scripts\py\math_expression.py", line 185, in eval_expr
return eval_op(node, node.left, node.right)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\Shadow\ComfyUI\custom_nodes\comfyui-custom-scripts\py\math_expression.py", line 175, in eval_op
l = eval_expr(l)
^^^^^^^^^^^^
File "C:\Users\Shadow\ComfyUI\custom_nodes\comfyui-custom-scripts\py\math_expression.py", line 218, in eval_expr
args.append(eval_expr(arg))
^^^^^^^^^^^^^^
File "C:\Users\Shadow\ComfyUI\custom_nodes\comfyui-custom-scripts\py\math_expression.py", line 185, in eval_expr
return eval_op(node, node.left, node.right)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\Shadow\ComfyUI\custom_nodes\comfyui-custom-scripts\py\math_expression.py", line 176, in eval_op
r = eval_expr(r)
^^^^^^^^^^^^
File "C:\Users\Shadow\ComfyUI\custom_nodes\comfyui-custom-scripts\py\math_expression.py", line 185, in eval_expr
return eval_op(node, node.left, node.right)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\Shadow\ComfyUI\custom_nodes\comfyui-custom-scripts\py\math_expression.py", line 175, in eval_op
l = eval_expr(l)
^^^^^^^^^^^^
File "C:\Users\Shadow\ComfyUI\custom_nodes\comfyui-custom-scripts\py\math_expression.py", line 202, in eval_expr
raise TypeError(
The error message is incomplete; but this error happens when you connect an image to a math expression node. It seems to me that you tried to modify the workflow and accidentally connected (directly or indirectly) an image output into one of the inputs of a Math expression node. This most likely could happen at the moment of creating the latent or in the keyframe segments. As I see it two things can be happening:
1.- Either you tried to add a new keyframe or edited one of the keyframe connections and accidentally connected the source image to the math expression node, or...
2.- You are bypassing (or you deleted) the "ImageSize" node inside the "SAFE RES. ADJUSTMENT" sub-graph, in the "Video settings" group.