From 4653053cfe485313245848e52c42538841b4f724 Mon Sep 17 00:00:00 2001 From: pinokio Date: Mon, 12 Jan 2026 22:52:03 +0100 Subject: [PATCH 1/2] Fix dependency installation and port conflicts - Install all custom node dependencies into main app/env venv instead of creating separate venvs for each custom node - Use dynamic port assignment to avoid address-already-in-use errors Co-Authored-By: Claude Opus 4.5 --- install.js | 130 +++++++++++++++++++++++++++++++++++++++++++++++++++++ start.js | 31 +++++++++++++ 2 files changed, 161 insertions(+) create mode 100644 install.js create mode 100644 start.js diff --git a/install.js b/install.js new file mode 100644 index 0000000..a8a969d --- /dev/null +++ b/install.js @@ -0,0 +1,130 @@ +module.exports = { + run: [ + // Clone ComfyUI + { + method: "shell.run", + params: { + message: [ + "git clone https://github.com/comfyanonymous/ComfyUI app", + ] + } + }, + // Clone ComfyUI-Manager + { + method: "shell.run", + params: { + message: [ + "git clone https://github.com/ltdrdata/ComfyUI-Manager", + ], + path: "app/custom_nodes" + } + }, + // Clone ComfyUI-WanVideoWrapper (required for SVI) + { + method: "shell.run", + params: { + message: [ + "git clone https://github.com/kijai/ComfyUI-WanVideoWrapper", + ], + path: "app/custom_nodes" + } + }, + // Clone ComfyUI-KJNodes (required for SVI) + { + method: "shell.run", + params: { + message: [ + "git clone https://github.com/kijai/ComfyUI-KJNodes", + ], + path: "app/custom_nodes" + } + }, + // Clone ComfyUI-VideoHelperSuite (useful for video workflows) + { + method: "shell.run", + params: { + message: [ + "git clone https://github.com/Kosinkadink/ComfyUI-VideoHelperSuite", + ], + path: "app/custom_nodes" + } + }, + // Clone Stable-Video-Infinity for workflows + { + method: "shell.run", + params: { + message: [ + "git clone https://github.com/vita-epfl/Stable-Video-Infinity svi", + ], + path: "workflows" + } + }, + // Install all dependencies into the main app/env venv + { + method: "shell.run", + params: { + venv: "env", + path: "app", + message: [ + "uv pip install -r requirements.txt", + "uv pip install -r custom_nodes/ComfyUI-WanVideoWrapper/requirements.txt", + "uv pip install -r custom_nodes/ComfyUI-KJNodes/requirements.txt", + "uv pip install -r custom_nodes/ComfyUI-VideoHelperSuite/requirements.txt", + ] + } + }, + // Install PyTorch with correct version for platform + { + method: "script.start", + params: { + uri: "torch.js", + params: { + venv: "env", + path: "app", + } + } + }, + // Link model directories for sharing with other Pinokio apps + { + method: "fs.link", + params: { + drive: { + checkpoints: "app/models/checkpoints", + clip: "app/models/clip", + clip_vision: "app/models/clip_vision", + controlnet: "app/models/controlnet", + embeddings: "app/models/embeddings", + loras: "app/models/loras", + upscale_models: "app/models/upscale_models", + vae: "app/models/vae", + diffusers: "app/models/diffusers", + unet: "app/models/unet", + }, + peers: [ + "https://github.com/cocktailpeanut/fluxgym.git", + "https://github.com/cocktailpeanutlabs/automatic1111.git", + "https://github.com/cocktailpeanutlabs/fooocus.git", + "https://github.com/cocktailpeanutlabs/comfyui.git", + "https://github.com/pinokiofactory/stable-diffusion-webui-forge.git" + ] + } + }, + // Link output directory + { + method: "fs.link", + params: { + drive: { + output: "app/output" + } + } + }, + // Copy SVI workflows to ComfyUI workflows folder + { + method: "fs.copy", + params: { + src: "workflows/svi/comfyui_workflow_svi_1.0", + dest: "app/user/default/workflows/svi" + } + }, + ] +} diff --git a/start.js b/start.js new file mode 100644 index 0000000..a26777f --- /dev/null +++ b/start.js @@ -0,0 +1,31 @@ +module.exports = { + daemon: true, + run: [ + { + method: "shell.run", + params: { + venv: "env", + env: { + PYTORCH_ENABLE_MPS_FALLBACK: "1", + TOKENIZERS_PARALLELISM: "false" + }, + path: "app", + message: [ + "{{platform === 'win32' && gpu === 'amd' ? 'python main.py --directml --port ' + port : 'python main.py --port ' + port}}" + ], + on: [{ + // Capture the URL when server starts + event: "/(http:\\/\\/[0-9.:]+)/", + done: true + }] + } + }, + { + // Set the local variable 'url' for the UI + method: "local.set", + params: { + url: "{{input.event[1]}}" + } + } + ] +} From eae327f391a6304a27a12d1930b47ac4805ac633 Mon Sep 17 00:00:00 2001 From: pinokio Date: Mon, 12 Jan 2026 22:53:03 +0100 Subject: [PATCH 2/2] Add Pinokio launcher scripts for Stable Video Infinity - pinokio.js: Dynamic UI with install/start/reset/update/download menus - pinokio.json: App metadata with icon - reset.js: Reset virtual environment and dependencies - update.js: Update launcher and app repositories - torch.js: Cross-platform PyTorch installation - download-svi-lora.js: Download SVI LoRA model - download-wan21-i2v-14b.js: Download Wan2.1 I2V 14B model - icon.png: App icon - Update .gitignore for generated files and cloned repos - Update README.md Co-Authored-By: Claude Opus 4.5 --- .gitignore | 17 +++++- README.md | 32 +++++------ download-svi-lora.js | 12 ++++ download-wan21-i2v-14b.js | 12 ++++ icon.png | Bin 0 -> 9548 bytes pinokio.js | 116 ++++++++++++++++++++++++++++++++++++++ pinokio.json | 5 ++ reset.js | 13 +++++ torch.js | 88 +++++++++++++++++++++++++++++ update.js | 101 +++++++++++++++++++++++++++++++++ 10 files changed, 379 insertions(+), 17 deletions(-) create mode 100644 download-svi-lora.js create mode 100644 download-wan21-i2v-14b.js create mode 100644 icon.png create mode 100644 pinokio.js create mode 100644 pinokio.json create mode 100644 reset.js create mode 100644 torch.js create mode 100644 update.js diff --git a/.gitignore b/.gitignore index 66318e2..ea1ab45 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,19 @@ videos *.egg-info .gradio weights/* -__pycache__ \ No newline at end of file +__pycache__ + +# Pinokio launcher dynamic files +app/ +env/ +workflows/ +node_modules/ +.DS_Store +cache/ + +# Model files (downloaded separately) +*.safetensors +*.ckpt +*.pt +*.pth +*.bin \ No newline at end of file diff --git a/README.md b/README.md index a3507fc..f20d962 100644 --- a/README.md +++ b/README.md @@ -333,7 +333,7 @@ conda install -c conda-forge libiconv ### Download Wan 2.1 I2V 14B ```bash -huggingface-cli download Wan-AI/Wan2.1-I2V-14B-480P --local-dir ./weights/Wan2.1-I2V-14B-480P +hf download Wan-AI/Wan2.1-I2V-14B-480P --local-dir ./weights/Wan2.1-I2V-14B-480P ``` ### Download SVI Family @@ -359,7 +359,7 @@ For this model, you can try the sample in [100-prompt-sample](data/toy_test/svi_ ```bash # This uses the SVI-Shot inference script and workflow, supporting both 5 and 1 motion frames -huggingface-cli download vita-video-gen/svi-model version-2.0/SVI_Wan2.1-I2V-14B_lora_v2.0.safetensors --local-dir ./weights/Stable-Video-Infinity +hf download vita-video-gen/svi-model version-2.0/SVI_Wan2.1-I2V-14B_lora_v2.0.safetensors --local-dir ./weights/Stable-Video-Infinity ``` @@ -367,30 +367,30 @@ huggingface-cli download vita-video-gen/svi-model version-2.0/SVI_Wan2.1-I2V-14B ### SVI-1.0 ```bash # login with your fine-grained token -huggingface-cli login +hf login # Option 1: Download SVI Family bucket! -huggingface-cli download vita-video-gen/svi-model --local-dir ./weights/Stable-Video-Infinity --include "version-1.0/*" +hf download vita-video-gen/svi-model --local-dir ./weights/Stable-Video-Infinity --include "version-1.0/*" # Option 2: Download individual models -# huggingface-cli download vita-video-gen/svi-model version-1.0/svi-shot.safetensors --local-dir ./weights/Stable-Video-Infinity -# huggingface-cli download vita-video-gen/svi-model version-1.0/svi-film-opt-10212025.safetensors --local-dir ./weights/Stable-Video-Infinity -# huggingface-cli download vita-video-gen/svi-model version-1.0/svi-film.safetensors --local-dir ./weights/Stable-Video-Infinity -# huggingface-cli download vita-video-gen/svi-model version-1.0/svi-film-transitions.safetensors --local-dir ./weights/Stable-Video-Infinity -# huggingface-cli download vita-video-gen/svi-model version-1.0/svi-tom.safetensors --local-dir ./weights/Stable-Video-Infinity -# huggingface-cli download vita-video-gen/svi-model version-1.0/svi-talk.safetensors --local-dir ./weights/Stable-Video-Infinity -# huggingface-cli download vita-video-gen/svi-model version-1.0/svi-dance.safetensors --local-dir ./weights/Stable-Video-Infinity +# hf download vita-video-gen/svi-model version-1.0/svi-shot.safetensors --local-dir ./weights/Stable-Video-Infinity +# hf download vita-video-gen/svi-model version-1.0/svi-film-opt-10212025.safetensors --local-dir ./weights/Stable-Video-Infinity +# hf download vita-video-gen/svi-model version-1.0/svi-film.safetensors --local-dir ./weights/Stable-Video-Infinity +# hf download vita-video-gen/svi-model version-1.0/svi-film-transitions.safetensors --local-dir ./weights/Stable-Video-Infinity +# hf download vita-video-gen/svi-model version-1.0/svi-tom.safetensors --local-dir ./weights/Stable-Video-Infinity +# hf download vita-video-gen/svi-model version-1.0/svi-talk.safetensors --local-dir ./weights/Stable-Video-Infinity +# hf download vita-video-gen/svi-model version-1.0/svi-dance.safetensors --local-dir ./weights/Stable-Video-Infinity ``` ### Download Multitalk Cross-Attention for SVI-Talk Training/Test ```bash # Download audio encoder -huggingface-cli download TencentGameMate/chinese-wav2vec2-base --local-dir ./weights/chinese-wav2vec2-base -huggingface-cli download TencentGameMate/chinese-wav2vec2-base model.safetensors --revision refs/pr/1 --local-dir ./weights/chinese-wav2vec2-base +hf download TencentGameMate/chinese-wav2vec2-base --local-dir ./weights/chinese-wav2vec2-base +hf download TencentGameMate/chinese-wav2vec2-base model.safetensors --revision refs/pr/1 --local-dir ./weights/chinese-wav2vec2-base # Download multitalk weight -huggingface-cli download MeiGen-AI/MeiGen-MultiTalk --local-dir ./weights/MeiGen-MultiTalk +hf download MeiGen-AI/MeiGen-MultiTalk --local-dir ./weights/MeiGen-MultiTalk # Link Multitalk ln -s $PWD/weights/MeiGen-MultiTalk/multitalk.safetensors weights/Wan2.1-I2V-14B-480P/ @@ -399,7 +399,7 @@ ln -s $PWD/weights/MeiGen-MultiTalk/multitalk.safetensors weights/Wan2.1-I2V-14B ### Download UniAnimate-DiT LoRA for SVI-Dance Training ```bash -huggingface-cli download ZheWang123/UniAnimate-DiT --local-dir ./weights/UniAnimate-DiT +hf download ZheWang123/UniAnimate-DiT --local-dir ./weights/UniAnimate-DiT ``` ### Check Model @@ -561,7 +561,7 @@ The following is the training data we used for SVI family. | **Human Dancing** | Train | [🤗 Dataset](https://www.kaggle.com/datasets/yasaminjafarian/tiktokdataset) | TikTok | ```bash -huggingface-cli download --repo-type dataset vita-video-gen/svi-benchmark --local-dir ./data/svi-benchmark +hf download --repo-type dataset vita-video-gen/svi-benchmark --local-dir ./data/svi-benchmark ``` ## 📋 TODO List diff --git a/download-svi-lora.js b/download-svi-lora.js new file mode 100644 index 0000000..1c0467f --- /dev/null +++ b/download-svi-lora.js @@ -0,0 +1,12 @@ +module.exports = { + run: [{ + method: "shell.run", + params: { + venv: "env", + message: [ + "hf download vita-video-gen/svi-model --include \"version-2.0/*\" --local-dir models/loras/SVI-LoRA" + ], + path: "app" + } + }] +} diff --git a/download-wan21-i2v-14b.js b/download-wan21-i2v-14b.js new file mode 100644 index 0000000..cdf684a --- /dev/null +++ b/download-wan21-i2v-14b.js @@ -0,0 +1,12 @@ +module.exports = { + run: [{ + method: "shell.run", + params: { + venv: "env", + message: [ + "hf download Wan-AI/Wan2.1-I2V-14B-480P --local-dir models/diffusers/Wan2.1-I2V-14B-480P" + ], + path: "app" + } + }] +} diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1b74e8b6046013ed555486765ab7005eee8304de GIT binary patch literal 9548 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 D=p|mt literal 0 HcmV?d00001 diff --git a/pinokio.js b/pinokio.js new file mode 100644 index 0000000..1de2cd3 --- /dev/null +++ b/pinokio.js @@ -0,0 +1,116 @@ +module.exports = { + version: "5.0", + title: "Stable Video Infinity", + description: "Infinite-length video generation with ComfyUI. Generate ANY-length videos with high temporal consistency using Wan 2.1 and SVI LoRA.", + icon: "icon.png", + menu: async (kernel, info) => { + let installed = info.exists("app/env") + let running = { + install: info.running("install.js"), + start: info.running("start.js"), + update: info.running("update.js"), + reset: info.running("reset.js") + } + let downloading = [ + "download-wan21-i2v-14b.js", + "download-svi-lora.js" + ] + let is_downloading = null + for (let item of downloading) { + let d = info.running(item) + if (d === true) { + is_downloading = item + break + } + } + + if (running.install) { + return [{ + default: true, + icon: "fa-solid fa-plug", + text: "Installing", + href: "install.js", + }] + } else if (installed) { + if (running.start) { + let local = info.local("start.js") + if (local && local.url) { + return [{ + default: true, + icon: "fa-solid fa-rocket", + text: "Open Web UI", + popout: true, + href: local.url, + }, { + icon: "fa-solid fa-terminal", + text: "Terminal", + href: "start.js", + }] + } else { + return [{ + default: true, + icon: "fa-solid fa-terminal", + text: "Terminal", + href: "start.js", + }] + } + } else if (is_downloading) { + return [{ + default: true, + icon: "fa-solid fa-terminal", + text: "Downloading", + href: is_downloading, + }] + } else if (running.update) { + return [{ + default: true, + icon: "fa-solid fa-terminal", + text: "Updating", + href: "update.js", + }] + } else if (running.reset) { + return [{ + default: true, + icon: "fa-solid fa-terminal", + text: "Resetting", + href: "reset.js", + }] + } else { + return [{ + default: true, + icon: "fa-solid fa-power-off", + text: "Start", + href: "start.js", + }, { + icon: "fa-solid fa-download", + text: "Download Models", + menu: [{ + icon: "fa-solid fa-download", + text: "Wan 2.1 I2V 14B (Required)", + href: "download-wan21-i2v-14b.js", + }, { + icon: "fa-solid fa-download", + text: "SVI LoRA Weights", + href: "download-svi-lora.js", + }] + }, { + icon: "fa-solid fa-plug", + text: "Update", + href: "update.js", + }, { + icon: "fa-regular fa-circle-xmark", + text: "Reset", + href: "reset.js", + confirm: "Are you sure you wish to reset? This will delete the app and all installed dependencies." + }] + } + } else { + return [{ + default: true, + icon: "fa-solid fa-plug", + text: "Install", + href: "install.js", + }] + } + } +} diff --git a/pinokio.json b/pinokio.json new file mode 100644 index 0000000..0a312de --- /dev/null +++ b/pinokio.json @@ -0,0 +1,5 @@ +{ + "title": "Stable Video Infinity", + "description": "Generate infinite-length videos with high temporal consistency using ComfyUI, Wan 2.1, and SVI LoRA. Features include multi-scene short films, single-scene animations, and controllable streaming storylines.", + "icon": "icon.png" +} diff --git a/reset.js b/reset.js new file mode 100644 index 0000000..a749855 --- /dev/null +++ b/reset.js @@ -0,0 +1,13 @@ +module.exports = { + run: [{ + method: "fs.rm", + params: { + path: "app" + } + }, { + method: "fs.rm", + params: { + path: "workflows" + } + }] +} diff --git a/torch.js b/torch.js new file mode 100644 index 0000000..5dcafa2 --- /dev/null +++ b/torch.js @@ -0,0 +1,88 @@ +module.exports = { + run: [ + // nvidia windows + { + "when": "{{gpu === 'nvidia' && platform === 'win32'}}", + "method": "shell.run", + "params": { + "venv": "{{args && args.venv ? args.venv : null}}", + "path": "{{args && args.path ? args.path : '.'}}", + "message": [ + "uv pip install torch==2.7.0 torchvision==0.22.0 torchaudio==2.7.0 {{args && args.xformers ? 'xformers==0.0.30' : ''}} --index-url https://download.pytorch.org/whl/cu128 --force-reinstall --no-deps", + "{{args && args.triton ? 'uv pip install triton-windows==3.3.1.post19' : ''}}", + "{{args && args.sageattention ? 'uv pip install https://huggingface.co/cocktailpeanut/wheels/resolve/main/sageattention-2.1.1%2Bcu128torch2.7.1-cp310-cp310-win_amd64.whl' : ''}}", + "{{args && args.flashattention ? 'uv pip install https://huggingface.co/cocktailpeanut/wheels/resolve/main/flash_attn-2.8.2%2Bcu128torch2.7-cp310-cp310-win_amd64.whl' : ''}}" + ] + }, + "next": null + }, + // nvidia linux + { + "when": "{{gpu === 'nvidia' && platform === 'linux'}}", + "method": "shell.run", + "params": { + "venv": "{{args && args.venv ? args.venv : null}}", + "path": "{{args && args.path ? args.path : '.'}}", + "message": [ + "uv pip install torch==2.7.0 torchvision==0.22.0 torchaudio==2.7.0 {{args && args.xformers ? 'xformers==0.0.30' : ''}} --index-url https://download.pytorch.org/whl/cu128 --force-reinstall", + "{{args && args.triton ? 'uv pip install triton' : ''}}", + "{{args && args.sageattention ? 'uv pip install https://huggingface.co/cocktailpeanut/wheels/resolve/main/sageattention-2.1.1%2Bcu128torch2.7.1-cp310-cp310-linux_x86_64.whl' : ''}}", + "{{args && args.flashattention ? 'uv pip install https://huggingface.co/cocktailpeanut/wheels/resolve/main/flash_attn-2.8.3%2Bcu128torch2.7-cp310-cp310-linux_x86_64.whl' : ''}}" + ] + }, + "next": null + }, + // amd windows + { + "when": "{{gpu === 'amd' && platform === 'win32'}}", + "method": "shell.run", + "params": { + "venv": "{{args && args.venv ? args.venv : null}}", + "path": "{{args && args.path ? args.path : '.'}}", + "message": "uv pip install torch torch-directml torchaudio torchvision numpy==1.26.4 --force-reinstall" + }, + "next": null + }, + // amd linux (rocm) + { + "when": "{{gpu === 'amd' && platform === 'linux'}}", + "method": "shell.run", + "params": { + "venv": "{{args && args.venv ? args.venv : null}}", + "path": "{{args && args.path ? args.path : '.'}}", + "message": "uv pip install torch==2.7.0 torchvision==0.22.0 torchaudio==2.7.0 --index-url https://download.pytorch.org/whl/rocm6.3 --force-reinstall --no-deps" + }, + "next": null + }, + // apple silicon mac + { + "when": "{{platform === 'darwin' && arch === 'arm64'}}", + "method": "shell.run", + "params": { + "venv": "{{args && args.venv ? args.venv : null}}", + "path": "{{args && args.path ? args.path : '.'}}", + "message": "uv pip install torch==2.7.0 torchvision==0.22.0 torchaudio==2.7.0 --index-url https://download.pytorch.org/whl/cpu --force-reinstall --no-deps" + }, + "next": null + }, + // intel mac + { + "when": "{{platform === 'darwin' && arch !== 'arm64'}}", + "method": "shell.run", + "params": { + "venv": "{{args && args.venv ? args.venv : null}}", + "path": "{{args && args.path ? args.path : '.'}}", + "message": "uv pip install torch==2.2.2 torchvision==0.17.2 torchaudio==2.2.2 --index-url https://download.pytorch.org/whl/cpu --force-reinstall --no-deps" + } + }, + // cpu fallback + { + "method": "shell.run", + "params": { + "venv": "{{args && args.venv ? args.venv : null}}", + "path": "{{args && args.path ? args.path : '.'}}", + "message": "uv pip install torch==2.7.0 torchvision==0.22.0 torchaudio==2.7.0 --index-url https://download.pytorch.org/whl/cpu --force-reinstall --no-deps" + } + } + ] +} diff --git a/update.js b/update.js new file mode 100644 index 0000000..890bfa9 --- /dev/null +++ b/update.js @@ -0,0 +1,101 @@ +module.exports = { + run: [ + // Update launcher scripts + { + method: "shell.run", + params: { + message: "git pull" + } + }, + // Update ComfyUI + { + method: "shell.run", + params: { + path: "app", + message: "git pull" + } + }, + // Update ComfyUI-Manager + { + method: "shell.run", + params: { + path: "app/custom_nodes/ComfyUI-Manager", + message: "git pull" + } + }, + // Update ComfyUI-WanVideoWrapper + { + method: "shell.run", + params: { + path: "app/custom_nodes/ComfyUI-WanVideoWrapper", + message: "git pull" + } + }, + // Update ComfyUI-KJNodes + { + method: "shell.run", + params: { + path: "app/custom_nodes/ComfyUI-KJNodes", + message: "git pull" + } + }, + // Update ComfyUI-VideoHelperSuite + { + method: "shell.run", + params: { + path: "app/custom_nodes/ComfyUI-VideoHelperSuite", + message: "git pull" + } + }, + // Update Stable-Video-Infinity workflows + { + method: "shell.run", + params: { + path: "workflows/svi", + message: "git pull" + } + }, + // Reinstall dependencies + { + method: "shell.run", + params: { + path: "app", + venv: "env", + message: [ + "uv pip install -r requirements.txt" + ] + } + }, + // Reinstall custom node dependencies + { + method: "shell.run", + params: { + venv: "env", + path: "app/custom_nodes/ComfyUI-WanVideoWrapper", + message: [ + "uv pip install -r requirements.txt" + ] + } + }, + { + method: "shell.run", + params: { + venv: "env", + path: "app/custom_nodes/ComfyUI-KJNodes", + message: [ + "uv pip install -r requirements.txt" + ] + } + }, + { + method: "shell.run", + params: { + venv: "env", + path: "app/custom_nodes/ComfyUI-VideoHelperSuite", + message: [ + "uv pip install -r requirements.txt" + ] + } + } + ] +}