Instructions to use hgjc/ltx-ugc-bundle with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- LTX.io
How to use hgjc/ltx-ugc-bundle with LTX.io:
# Install the LTX-2 pipelines git clone https://github.com/Lightricks/LTX-2.git cd LTX-2 uv sync --frozen
# Download the weights from this repo, plus the Gemma text encoder hf download hgjc/ltx-ugc-bundle --local-dir models/ltx-ugc-bundle hf download google/gemma-3-12b-it-qat-q4_0-unquantized --local-dir models/gemma-3-12b
# Fast pipeline (distilled model, no distilled LoRA needed) uv run python -m ltx_pipelines.distilled \ --distilled-checkpoint-path models/ltx-ugc-bundle/<distilled-checkpoint>.safetensors \ --spatial-upsampler-path models/ltx-ugc-bundle/<spatial-upsampler>.safetensors \ --gemma-root models/gemma-3-12b \ --prompt "A beautiful sunset over the ocean" \ --output-path output.mp4 # For image-to-video, add: --image path/to/image.jpg 0 0.8# HQ pipeline (two-stage, higher quality) uv run python -m ltx_pipelines.ti2vid_two_stages_hq \ --checkpoint-path models/ltx-ugc-bundle/<checkpoint>.safetensors \ --distilled-lora models/ltx-ugc-bundle/<distilled-lora>.safetensors 0.8 \ --spatial-upsampler-path models/ltx-ugc-bundle/<spatial-upsampler>.safetensors \ --gemma-root models/gemma-3-12b \ --prompt "A beautiful sunset over the ocean" \ --output-path output.mp4 # For image-to-video, add: --image path/to/image.jpg 0 0.8 - Notebooks
- Google Colab
- Kaggle
| from typing import Any, Mapping | |
| from .vec import VEC2_ZERO, VEC3_ZERO, VEC4_ZERO | |
| from .types import Number, Vec2, Vec3, Vec4 | |
| class BoolToInt: | |
| def INPUT_TYPES(cls) -> Mapping[str, Any]: | |
| return {"required": {"a": ("BOOLEAN", {"default": False})}} | |
| RETURN_TYPES = ("INT",) | |
| FUNCTION = "op" | |
| CATEGORY = "math/conversion" | |
| def op(self, a: bool) -> tuple[int]: | |
| return (int(a),) | |
| class IntToBool: | |
| def INPUT_TYPES(cls) -> Mapping[str, Any]: | |
| return {"required": {"a": ("INT", {"default": 0})}} | |
| RETURN_TYPES = ("BOOLEAN",) | |
| FUNCTION = "op" | |
| CATEGORY = "math/conversion" | |
| def op(self, a: int) -> tuple[bool]: | |
| return (a != 0,) | |
| class FloatToInt: | |
| def INPUT_TYPES(cls) -> Mapping[str, Any]: | |
| return {"required": {"a": ("FLOAT", {"default": 0.0, "round": False})}} | |
| RETURN_TYPES = ("INT",) | |
| FUNCTION = "op" | |
| CATEGORY = "math/conversion" | |
| def op(self, a: float) -> tuple[int]: | |
| return (int(a),) | |
| class IntToFloat: | |
| def INPUT_TYPES(cls) -> Mapping[str, Any]: | |
| return {"required": {"a": ("INT", {"default": 0})}} | |
| RETURN_TYPES = ("FLOAT",) | |
| FUNCTION = "op" | |
| CATEGORY = "math/conversion" | |
| def op(self, a: int) -> tuple[float]: | |
| return (float(a),) | |
| class IntToNumber: | |
| def INPUT_TYPES(cls) -> Mapping[str, Any]: | |
| return {"required": {"a": ("INT", {"default": 0})}} | |
| RETURN_TYPES = ("NUMBER",) | |
| FUNCTION = "op" | |
| CATEGORY = "math/conversion" | |
| def op(self, a: int) -> tuple[Number]: | |
| return (a,) | |
| class NumberToInt: | |
| def INPUT_TYPES(cls) -> Mapping[str, Any]: | |
| return {"required": {"a": ("NUMBER", {"default": 0.0})}} | |
| RETURN_TYPES = ("INT",) | |
| FUNCTION = "op" | |
| CATEGORY = "math/conversion" | |
| def op(self, a: Number) -> tuple[int]: | |
| return (int(a),) | |
| class FloatToNumber: | |
| def INPUT_TYPES(cls) -> Mapping[str, Any]: | |
| return {"required": {"a": ("FLOAT", {"default": 0.0, "round": False})}} | |
| RETURN_TYPES = ("NUMBER",) | |
| FUNCTION = "op" | |
| CATEGORY = "math/conversion" | |
| def op(self, a: float) -> tuple[Number]: | |
| return (a,) | |
| class NumberToFloat: | |
| def INPUT_TYPES(cls) -> Mapping[str, Any]: | |
| return {"required": {"a": ("NUMBER", {"default": 0.0})}} | |
| RETURN_TYPES = ("FLOAT",) | |
| FUNCTION = "op" | |
| CATEGORY = "math/conversion" | |
| def op(self, a: Number) -> tuple[float]: | |
| return (float(a),) | |
| class ComposeVec2: | |
| def INPUT_TYPES(cls) -> Mapping[str, Any]: | |
| return { | |
| "required": { | |
| "x": ("FLOAT", {"default": 0.0, "round": False}), | |
| "y": ("FLOAT", {"default": 0.0, "round": False}), | |
| } | |
| } | |
| RETURN_TYPES = ("VEC2",) | |
| FUNCTION = "op" | |
| CATEGORY = "math/conversion" | |
| def op(self, x: float, y: float) -> tuple[Vec2]: | |
| return ((x, y),) | |
| class FillVec2: | |
| def INPUT_TYPES(cls) -> Mapping[str, Any]: | |
| return { | |
| "required": { | |
| "a": ("FLOAT", {"default": 0.0, "round": False}), | |
| } | |
| } | |
| RETURN_TYPES = ("VEC2",) | |
| FUNCTION = "op" | |
| CATEGORY = "math/conversion" | |
| def op(self, a: float) -> tuple[Vec2]: | |
| return ((a, a),) | |
| class BreakoutVec2: | |
| def INPUT_TYPES(cls) -> Mapping[str, Any]: | |
| return {"required": {"a": ("VEC2", {"default": VEC2_ZERO})}} | |
| RETURN_TYPES = ("FLOAT", "FLOAT") | |
| FUNCTION = "op" | |
| CATEGORY = "math/conversion" | |
| def op(self, a: Vec2) -> tuple[float, float]: | |
| return (a[0], a[1]) | |
| class ComposeVec3: | |
| def INPUT_TYPES(cls) -> Mapping[str, Any]: | |
| return { | |
| "required": { | |
| "x": ("FLOAT", {"default": 0.0}), | |
| "y": ("FLOAT", {"default": 0.0}), | |
| "z": ("FLOAT", {"default": 0.0}), | |
| } | |
| } | |
| RETURN_TYPES = ("VEC3",) | |
| FUNCTION = "op" | |
| CATEGORY = "math/conversion" | |
| def op(self, x: float, y: float, z: float) -> tuple[Vec3]: | |
| return ((x, y, z),) | |
| class FillVec3: | |
| def INPUT_TYPES(cls) -> Mapping[str, Any]: | |
| return { | |
| "required": { | |
| "a": ("FLOAT", {"default": 0.0}), | |
| } | |
| } | |
| RETURN_TYPES = ("VEC3",) | |
| FUNCTION = "op" | |
| CATEGORY = "math/conversion" | |
| def op(self, a: float) -> tuple[Vec3]: | |
| return ((a, a, a),) | |
| class BreakoutVec3: | |
| def INPUT_TYPES(cls) -> Mapping[str, Any]: | |
| return {"required": {"a": ("VEC3", {"default": VEC3_ZERO})}} | |
| RETURN_TYPES = ("FLOAT", "FLOAT", "FLOAT") | |
| FUNCTION = "op" | |
| CATEGORY = "math/conversion" | |
| def op(self, a: Vec3) -> tuple[float, float, float]: | |
| return (a[0], a[1], a[2]) | |
| class ComposeVec4: | |
| def INPUT_TYPES(cls) -> Mapping[str, Any]: | |
| return { | |
| "required": { | |
| "x": ("FLOAT", {"default": 0.0}), | |
| "y": ("FLOAT", {"default": 0.0}), | |
| "z": ("FLOAT", {"default": 0.0}), | |
| "w": ("FLOAT", {"default": 0.0}), | |
| } | |
| } | |
| RETURN_TYPES = ("VEC4",) | |
| FUNCTION = "op" | |
| CATEGORY = "math/conversion" | |
| def op(self, x: float, y: float, z: float, w: float) -> tuple[Vec4]: | |
| return ((x, y, z, w),) | |
| class FillVec4: | |
| def INPUT_TYPES(cls) -> Mapping[str, Any]: | |
| return { | |
| "required": { | |
| "a": ("FLOAT", {"default": 0.0}), | |
| } | |
| } | |
| RETURN_TYPES = ("VEC4",) | |
| FUNCTION = "op" | |
| CATEGORY = "math/conversion" | |
| def op(self, a: float) -> tuple[Vec4]: | |
| return ((a, a, a, a),) | |
| class BreakoutVec4: | |
| def INPUT_TYPES(cls) -> Mapping[str, Any]: | |
| return {"required": {"a": ("VEC4", {"default": VEC4_ZERO})}} | |
| RETURN_TYPES = ("FLOAT", "FLOAT", "FLOAT", "FLOAT") | |
| FUNCTION = "op" | |
| CATEGORY = "math/conversion" | |
| def op(self, a: Vec4) -> tuple[float, float, float, float]: | |
| return (a[0], a[1], a[2], a[3]) | |
| NODE_CLASS_MAPPINGS = { | |
| "CM_BoolToInt": BoolToInt, | |
| "CM_IntToBool": IntToBool, | |
| "CM_FloatToInt": FloatToInt, | |
| "CM_IntToFloat": IntToFloat, | |
| "CM_IntToNumber": IntToNumber, | |
| "CM_NumberToInt": NumberToInt, | |
| "CM_FloatToNumber": FloatToNumber, | |
| "CM_NumberToFloat": NumberToFloat, | |
| "CM_ComposeVec2": ComposeVec2, | |
| "CM_ComposeVec3": ComposeVec3, | |
| "CM_ComposeVec4": ComposeVec4, | |
| "CM_BreakoutVec2": BreakoutVec2, | |
| "CM_BreakoutVec3": BreakoutVec3, | |
| "CM_BreakoutVec4": BreakoutVec4, | |
| } | |