Instructions to use saik0s/comfy_backup with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- llama-cpp-python
How to use saik0s/comfy_backup with llama-cpp-python:
# !pip install llama-cpp-python from llama_cpp import Llama llm = Llama.from_pretrained( repo_id="saik0s/comfy_backup", filename="ComfyUI/models/text_encoders/gemma-3-12b-it-q2_k.gguf", )
llm.create_chat_completion( messages = "No input example has been defined for this model task." )
- Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- llama.cpp
How to use saik0s/comfy_backup with llama.cpp:
Install (macOS, Linux)
curl -LsSf https://llama.app/install.sh | sh # Start a local OpenAI-compatible server with a web UI: llama serve -hf saik0s/comfy_backup:Q4_K_S # Run inference directly in the terminal: llama cli -hf saik0s/comfy_backup:Q4_K_S
Install from WinGet (Windows)
winget install llama.cpp # Start a local OpenAI-compatible server with a web UI: llama serve -hf saik0s/comfy_backup:Q4_K_S # Run inference directly in the terminal: llama cli -hf saik0s/comfy_backup:Q4_K_S
Use pre-built binary
# Download pre-built binary from: # https://github.com/ggerganov/llama.cpp/releases # Start a local OpenAI-compatible server with a web UI: ./llama-server -hf saik0s/comfy_backup:Q4_K_S # Run inference directly in the terminal: ./llama-cli -hf saik0s/comfy_backup:Q4_K_S
Build from source code
git clone https://github.com/ggerganov/llama.cpp.git cd llama.cpp cmake -B build cmake --build build -j --target llama-server llama-cli # Start a local OpenAI-compatible server with a web UI: ./build/bin/llama-server -hf saik0s/comfy_backup:Q4_K_S # Run inference directly in the terminal: ./build/bin/llama-cli -hf saik0s/comfy_backup:Q4_K_S
Use Docker
docker model run hf.co/saik0s/comfy_backup:Q4_K_S
- LM Studio
- Jan
- Ollama
How to use saik0s/comfy_backup with Ollama:
ollama run hf.co/saik0s/comfy_backup:Q4_K_S
- Unsloth Studio
How to use saik0s/comfy_backup with Unsloth Studio:
Install Unsloth Studio (macOS, Linux, WSL)
curl -fsSL https://unsloth.ai/install.sh | sh # Run unsloth studio unsloth studio -H 0.0.0.0 -p 8888 # Then open http://localhost:8888 in your browser # Search for saik0s/comfy_backup to start chatting
Install Unsloth Studio (Windows)
irm https://unsloth.ai/install.ps1 | iex # Run unsloth studio unsloth studio -H 0.0.0.0 -p 8888 # Then open http://localhost:8888 in your browser # Search for saik0s/comfy_backup to start chatting
Using HuggingFace Spaces for Unsloth
# No setup required # Open https://huggingface.co/spaces/unsloth/studio in your browser # Search for saik0s/comfy_backup to start chatting
- Pi
How to use saik0s/comfy_backup with Pi:
Start the llama.cpp server
# Install llama.cpp: brew install llama.cpp # Start a local OpenAI-compatible server: llama serve -hf saik0s/comfy_backup:Q4_K_S
Configure the model in Pi
# Install Pi: npm install -g @mariozechner/pi-coding-agent # Add to ~/.pi/agent/models.json: { "providers": { "llama-cpp": { "baseUrl": "http://localhost:8080/v1", "api": "openai-completions", "apiKey": "none", "models": [ { "id": "saik0s/comfy_backup:Q4_K_S" } ] } } }Run Pi
# Start Pi in your project directory: pi
- Hermes Agent new
How to use saik0s/comfy_backup with Hermes Agent:
Start the llama.cpp server
# Install llama.cpp: brew install llama.cpp # Start a local OpenAI-compatible server: llama serve -hf saik0s/comfy_backup:Q4_K_S
Configure Hermes
# Install Hermes: curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash hermes setup # Point Hermes at the local server: hermes config set model.provider custom hermes config set model.base_url http://127.0.0.1:8080/v1 hermes config set model.default saik0s/comfy_backup:Q4_K_S
Run Hermes
hermes
- Atomic Chat new
- OpenClaw new
How to use saik0s/comfy_backup with OpenClaw:
Start the llama.cpp server
# Install llama.cpp: brew install llama.cpp # Start a local OpenAI-compatible server: llama serve -hf saik0s/comfy_backup:Q4_K_S
Configure OpenClaw
# Install OpenClaw: npm install -g openclaw@latest # Register the local server and set it as the default model: openclaw onboard --non-interactive --mode local \ --auth-choice custom-api-key \ --custom-base-url http://127.0.0.1:8080/v1 \ --custom-model-id "saik0s/comfy_backup:Q4_K_S" \ --custom-provider-id llama-cpp \ --custom-compatibility openai \ --custom-text-input \ --accept-risk \ --skip-health
Run OpenClaw
openclaw agent --local --agent main --message "Hello from Hugging Face"
- Docker Model Runner
How to use saik0s/comfy_backup with Docker Model Runner:
docker model run hf.co/saik0s/comfy_backup:Q4_K_S
- Lemonade
How to use saik0s/comfy_backup with Lemonade:
Pull the model
# Download Lemonade from https://lemonade-server.ai/ lemonade pull saik0s/comfy_backup:Q4_K_S
Run and chat with the model
lemonade run user.comfy_backup-Q4_K_S
List all available models
lemonade list
| import { app } from "../../scripts/app.js"; | |
| app.registerExtension({ | |
| name: "INT8.PreLoraLoader", | |
| async beforeRegisterNodeDef(nodeType, nodeData, app) { | |
| if (nodeData.name === "INT8PreLoraLoader") { | |
| const parseSavedLoras = (values) => { | |
| const pairs = []; | |
| if (!Array.isArray(values)) { | |
| return pairs; | |
| } | |
| for (let i = 0; i < values.length; i++) { | |
| const name = values[i]; | |
| const strength = values[i + 1]; | |
| if (name === "Add LoRA" || name === "Remove LoRA") { | |
| continue; | |
| } | |
| if (typeof name === "string" && typeof strength === "number") { | |
| pairs.push({ name, strength }); | |
| i++; | |
| } | |
| } | |
| return pairs; | |
| }; | |
| const getLoraOptions = (node) => { | |
| for (let i = 0; i < node.widgets.length; i++) { | |
| const w = node.widgets[i]; | |
| if (w && w.name && w.name.startsWith("lora_name_")) { | |
| return w.options?.values || []; | |
| } | |
| } | |
| return []; | |
| }; | |
| const getStrengthOptions = (node) => { | |
| for (let i = 0; i < node.widgets.length; i++) { | |
| const w = node.widgets[i]; | |
| if (w && w.name === "lora_strength_1") { | |
| const options = Object.assign({}, w.options); | |
| options.precision = 2; | |
| return { | |
| options, | |
| callback: w.callback || (() => {}), | |
| }; | |
| } | |
| } | |
| return { | |
| options: { min: -10.0, max: 10.0, step: 0.01, precision: 2 }, | |
| callback: () => {}, | |
| }; | |
| }; | |
| const countLoraRows = (node) => { | |
| let maxIndex = 0; | |
| for (let i = 0; i < node.widgets.length; i++) { | |
| const match = node.widgets[i]?.name?.match(/^lora_name_(\d+)$/); | |
| if (match) { | |
| maxIndex = Math.max(maxIndex, parseInt(match[1])); | |
| } | |
| } | |
| return maxIndex; | |
| }; | |
| const addLoraRow = (node, index, name = null, strength = 1.0) => { | |
| const loraOptions = getLoraOptions(node); | |
| const strengthConfig = getStrengthOptions(node); | |
| const combo = node.addWidget("combo", `lora_name_${index}`, name ?? loraOptions[0] ?? "None", () => {}, { values: loraOptions }); | |
| const number = node.addWidget("number", `lora_strength_${index}`, strength, strengthConfig.callback, strengthConfig.options); | |
| return { combo, number }; | |
| }; | |
| const ensureLoraRows = (node, count) => { | |
| for (let i = countLoraRows(node) + 1; i <= count; i++) { | |
| addLoraRow(node, i); | |
| } | |
| }; | |
| const applySavedLoras = (node, pairs) => { | |
| for (let i = 0; i < pairs.length; i++) { | |
| const index = i + 1; | |
| const nameWidget = node.widgets.find((w) => w?.name === `lora_name_${index}`); | |
| const strengthWidget = node.widgets.find((w) => w?.name === `lora_strength_${index}`); | |
| if (nameWidget) { | |
| nameWidget.value = pairs[i].name; | |
| } | |
| if (strengthWidget) { | |
| strengthWidget.value = pairs[i].strength; | |
| } | |
| } | |
| }; | |
| const onNodeCreated = nodeType.prototype.onNodeCreated; | |
| nodeType.prototype.onNodeCreated = function () { | |
| const r = onNodeCreated ? onNodeCreated.apply(this, arguments) : undefined; | |
| this.updateRemoveBtn = () => { | |
| let maxIndex = 0; | |
| for (let i = 0; i < this.widgets.length; i++) { | |
| const w = this.widgets[i]; | |
| if (w && w.name) { | |
| const match = w.name.match(/lora_name_(\d+)/); | |
| if (match) { | |
| maxIndex = Math.max(maxIndex, parseInt(match[1])); | |
| } | |
| } | |
| } | |
| if (maxIndex > 1) { | |
| if (!this.removeBtn) { | |
| this.removeBtn = this.addWidget("button", "Remove LoRA", "Remove LoRA", () => { | |
| let mIdx = 0; | |
| let maxNameWidget = null; | |
| let maxStrengthWidget = null; | |
| for (let i = 0; i < this.widgets.length; i++) { | |
| const w = this.widgets[i]; | |
| if (w && w.name) { | |
| const match = w.name.match(/lora_name_(\d+)/); | |
| if (match) { | |
| const idx = parseInt(match[1]); | |
| if (idx > mIdx) { | |
| mIdx = idx; | |
| maxNameWidget = w; | |
| } | |
| } | |
| const matchStr = w.name.match(/lora_strength_(\d+)/); | |
| if (matchStr) { | |
| const idx = parseInt(matchStr[1]); | |
| if (idx === mIdx) { | |
| maxStrengthWidget = w; | |
| } | |
| } | |
| } | |
| } | |
| if (mIdx > 1) { // Never remove the first lora | |
| if (maxNameWidget) { | |
| this.widgets.splice(this.widgets.indexOf(maxNameWidget), 1); | |
| } | |
| if (maxStrengthWidget) { | |
| this.widgets.splice(this.widgets.indexOf(maxStrengthWidget), 1); | |
| } | |
| this.updateRemoveBtn(); | |
| const sz = this.computeSize(); | |
| this.size[0] = Math.max(this.size[0], sz[0]); | |
| this.size[1] = sz[1]; | |
| this.setDirtyCanvas(true, true); | |
| } | |
| }); | |
| this.removeBtn.serialize = false; | |
| } else { | |
| // Ensure it's at the bottom | |
| const idx = this.widgets.indexOf(this.removeBtn); | |
| if (idx !== -1) { | |
| this.widgets.splice(idx, 1); | |
| this.widgets.push(this.removeBtn); | |
| } | |
| } | |
| } else { | |
| if (this.removeBtn) { | |
| const idx = this.widgets.indexOf(this.removeBtn); | |
| if (idx !== -1) { | |
| this.widgets.splice(idx, 1); | |
| } | |
| this.removeBtn = null; | |
| } | |
| } | |
| }; | |
| const addBtn = this.addWidget("button", "Add LoRA", "Add LoRA", () => { | |
| const nextIndex = countLoraRows(this) + 1; | |
| addLoraRow(this, nextIndex); | |
| this.updateRemoveBtn(); | |
| const sz = this.computeSize(); | |
| this.size[0] = Math.max(this.size[0], sz[0]); | |
| this.size[1] = Math.max(this.size[1], sz[1]); | |
| this.setDirtyCanvas(true, true); | |
| }); | |
| addBtn.serialize = false; | |
| this.addBtn = addBtn; | |
| // Move addBtn to top | |
| this.widgets.splice(this.widgets.indexOf(addBtn), 1); | |
| this.widgets.unshift(addBtn); | |
| // Fix the precision of the initial lora_strength_1 to display 2 decimals | |
| for (let i = 0; i < this.widgets.length; i++) { | |
| if (this.widgets[i] && this.widgets[i].name === "lora_strength_1") { | |
| this.widgets[i].options.precision = 2; | |
| } | |
| } | |
| // Initially call update RemoveBtn to ensure correct state (should be hidden) | |
| this.updateRemoveBtn(); | |
| return r; | |
| }; | |
| const onConfigure = nodeType.prototype.onConfigure; | |
| nodeType.prototype.onConfigure = function (info) { | |
| const savedLoras = parseSavedLoras(info?.widgets_values); | |
| if (info && info.widgets_values) { | |
| ensureLoraRows(this, savedLoras.length); | |
| if (this.updateRemoveBtn) { | |
| this.updateRemoveBtn(); | |
| } | |
| } | |
| const r = onConfigure ? onConfigure.apply(this, arguments) : undefined; | |
| applySavedLoras(this, savedLoras); | |
| if (this.addBtn) { | |
| this.addBtn.value = "Add LoRA"; | |
| } | |
| if (this.removeBtn) { | |
| this.removeBtn.value = "Remove LoRA"; | |
| } | |
| if (this.updateRemoveBtn) { | |
| this.updateRemoveBtn(); | |
| } | |
| const sz = this.computeSize(); | |
| this.size[0] = Math.max(this.size[0], sz[0]); | |
| this.size[1] = sz[1]; | |
| return r; | |
| }; | |
| } | |
| } | |
| }); | |