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
| // @ts-check | |
| // @ts-ignore | |
| import { ComfyWidgets } from "../../../../scripts/widgets.js"; | |
| // @ts-ignore | |
| import { api } from "../../../../scripts/api.js"; | |
| // @ts-ignore | |
| import { app } from "../../../../scripts/app.js"; | |
| const PathHelper = { | |
| get(obj, path) { | |
| if (typeof path !== "string") { | |
| // Hardcoded value | |
| return path; | |
| } | |
| if (path[0] === '"' && path[path.length - 1] === '"') { | |
| // Hardcoded string | |
| return JSON.parse(path); | |
| } | |
| // Evaluate the path | |
| path = path.split(".").filter(Boolean); | |
| for (const p of path) { | |
| const k = isNaN(+p) ? p : +p; | |
| obj = obj[k]; | |
| } | |
| return obj; | |
| }, | |
| set(obj, path, value) { | |
| // https://stackoverflow.com/a/54733755 | |
| if (Object(obj) !== obj) return obj; // When obj is not an object | |
| // If not yet an array, get the keys from the string-path | |
| if (!Array.isArray(path)) path = path.toString().match(/[^.[\]]+/g) || []; | |
| path.slice(0, -1).reduce( | |
| ( | |
| a, | |
| c, | |
| i // Iterate all of them except the last one | |
| ) => | |
| Object(a[c]) === a[c] // Does the key exist and is its value an object? | |
| ? // Yes: then follow that path | |
| a[c] | |
| : // No: create the key. Is the next key a potential array-index? | |
| (a[c] = | |
| Math.abs(path[i + 1]) >> 0 === +path[i + 1] | |
| ? [] // Yes: assign a new array object | |
| : {}), // No: assign a new plain object | |
| obj | |
| )[path[path.length - 1]] = value; // Finally assign the value to the last key | |
| return obj; // Return the top-level object to allow chaining | |
| }, | |
| }; | |
| /*** | |
| @typedef { { | |
| left: string; | |
| op: "eq" | "ne", | |
| right: string | |
| } } IfCondition | |
| @typedef { { | |
| type: "if", | |
| condition: Array<IfCondition>, | |
| true?: Array<BindingCallback>, | |
| false?: Array<BindingCallback> | |
| } } IfCallback | |
| @typedef { { | |
| type: "fetch", | |
| url: string, | |
| then: Array<BindingCallback> | |
| } } FetchCallback | |
| @typedef { { | |
| type: "set", | |
| target: string, | |
| value: string | |
| } } SetCallback | |
| @typedef { { | |
| type: "validate-combo", | |
| } } ValidateComboCallback | |
| @typedef { IfCallback | FetchCallback | SetCallback | ValidateComboCallback } BindingCallback | |
| @typedef { { | |
| source: string, | |
| callback: Array<BindingCallback> | |
| } } Binding | |
| ***/ | |
| /** | |
| * @param {IfCondition} condition | |
| */ | |
| function evaluateCondition(condition, state) { | |
| const left = PathHelper.get(state, condition.left); | |
| const right = PathHelper.get(state, condition.right); | |
| let r; | |
| if (condition.op === "eq") { | |
| r = left === right; | |
| } else { | |
| r = left !== right; | |
| } | |
| return r; | |
| } | |
| /** | |
| * @type { Record<BindingCallback["type"], (cb: any, state: Record<string, any>) => Promise<void>> } | |
| */ | |
| const callbacks = { | |
| /** | |
| * @param {IfCallback} cb | |
| */ | |
| async if(cb, state) { | |
| // For now only support ANDs | |
| let success = true; | |
| for (const condition of cb.condition) { | |
| const r = evaluateCondition(condition, state); | |
| if (!r) { | |
| success = false; | |
| break; | |
| } | |
| } | |
| for (const m of cb[success + ""] ?? []) { | |
| await invokeCallback(m, state); | |
| } | |
| }, | |
| /** | |
| * @param {FetchCallback} cb | |
| */ | |
| async fetch(cb, state) { | |
| const url = cb.url.replace(/\{([^\}]+)\}/g, (m, v) => { | |
| return PathHelper.get(state, v); | |
| }); | |
| const res = await (await api.fetchApi(url)).json(); | |
| state["$result"] = res; | |
| for (const m of cb.then) { | |
| await invokeCallback(m, state); | |
| } | |
| }, | |
| /** | |
| * @param {SetCallback} cb | |
| */ | |
| async set(cb, state) { | |
| const value = PathHelper.get(state, cb.value); | |
| PathHelper.set(state, cb.target, value); | |
| }, | |
| async "validate-combo"(cb, state) { | |
| const w = state["$this"]; | |
| const valid = w.options.values.includes(w.value); | |
| if (!valid) { | |
| w.value = w.options.values[0]; | |
| } | |
| }, | |
| }; | |
| async function invokeCallback(callback, state) { | |
| if (callback.type in callbacks) { | |
| // @ts-ignore | |
| await callbacks[callback.type](callback, state); | |
| } else { | |
| console.warn( | |
| "%c[🐍 pysssss]", | |
| "color: limegreen", | |
| `[binding ${state.$node.comfyClass}.${state.$this.name}]`, | |
| "unsupported binding callback type:", | |
| callback.type | |
| ); | |
| } | |
| } | |
| app.registerExtension({ | |
| name: "pysssss.Binding", | |
| beforeRegisterNodeDef(node, nodeData) { | |
| const hasBinding = (v) => { | |
| if (!v) return false; | |
| return Object.values(v).find((c) => c[1]?.["pysssss.binding"]); | |
| }; | |
| const inputs = { ...nodeData.input?.required, ...nodeData.input?.optional }; | |
| if (hasBinding(inputs)) { | |
| const onAdded = node.prototype.onAdded; | |
| node.prototype.onAdded = function () { | |
| const r = onAdded?.apply(this, arguments); | |
| for (const widget of this.widgets || []) { | |
| const bindings = inputs[widget.name][1]?.["pysssss.binding"]; | |
| if (!bindings) continue; | |
| for (const binding of bindings) { | |
| /** | |
| * @type {import("../../../../../web/types/litegraph.d.ts").IWidget} | |
| */ | |
| const source = this.widgets.find((w) => w.name === binding.source); | |
| if (!source) { | |
| console.warn( | |
| "%c[🐍 pysssss]", | |
| "color: limegreen", | |
| `[binding ${node.comfyClass}.${widget.name}]`, | |
| "unable to find source binding widget:", | |
| binding.source, | |
| binding | |
| ); | |
| continue; | |
| } | |
| let lastValue; | |
| async function valueChanged() { | |
| const state = { | |
| $this: widget, | |
| $source: source, | |
| $node: node, | |
| }; | |
| for (const callback of binding.callback) { | |
| await invokeCallback(callback, state); | |
| } | |
| app.graph.setDirtyCanvas(true, false); | |
| } | |
| const cb = source.callback; | |
| source.callback = function () { | |
| const v = cb?.apply(this, arguments) ?? source.value; | |
| if (v !== lastValue) { | |
| lastValue = v; | |
| valueChanged(); | |
| } | |
| return v; | |
| }; | |
| lastValue = source.value; | |
| valueChanged(); | |
| } | |
| } | |
| return r; | |
| }; | |
| } | |
| }, | |
| }); | |