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 { $el, ComfyDialog } from "../../../../scripts/ui.js"; | |
| import { api } from "../../../../scripts/api.js"; | |
| import { addStylesheet } from "./utils.js"; | |
| addStylesheet(import.meta.url); | |
| class MetadataDialog extends ComfyDialog { | |
| constructor() { | |
| super(); | |
| this.element.classList.add("pysssss-model-metadata"); | |
| } | |
| show(metadata) { | |
| super.show( | |
| $el( | |
| "div", | |
| Object.keys(metadata).map((k) => | |
| $el("div", [ | |
| $el("label", { textContent: k }), | |
| $el("span", { textContent: typeof metadata[k] === "object" ? JSON.stringify(metadata[k]) : metadata[k] }), | |
| ]) | |
| ) | |
| ) | |
| ); | |
| } | |
| } | |
| export class ModelInfoDialog extends ComfyDialog { | |
| constructor(name, node) { | |
| super(); | |
| this.name = name; | |
| this.node = node; | |
| this.element.classList.add("pysssss-model-info"); | |
| } | |
| get customNotes() { | |
| return this.metadata["pysssss.notes"]; | |
| } | |
| set customNotes(v) { | |
| this.metadata["pysssss.notes"] = v; | |
| } | |
| get hash() { | |
| return this.metadata["pysssss.sha256"]; | |
| } | |
| async show(type, value) { | |
| this.type = type; | |
| const req = api.fetchApi("/pysssss/metadata/" + encodeURIComponent(`${type}/${value}`)); | |
| this.info = $el("div", { style: { flex: "auto" } }); | |
| this.img = $el("img", { style: { display: "none" } }); | |
| this.imgWrapper = $el("div.pysssss-preview", [this.img]); | |
| this.main = $el("main", { style: { display: "flex" } }, [this.info, this.imgWrapper]); | |
| this.content = $el("div.pysssss-model-content", [$el("h2", { textContent: this.name }), this.main]); | |
| const loading = $el("div", { textContent: "ℹ️ Loading...", parent: this.content }); | |
| super.show(this.content); | |
| this.metadata = await (await req).json(); | |
| this.viewMetadata.style.cursor = this.viewMetadata.style.opacity = ""; | |
| this.viewMetadata.removeAttribute("disabled"); | |
| loading.remove(); | |
| this.addInfo(); | |
| } | |
| createButtons() { | |
| const btns = super.createButtons(); | |
| this.viewMetadata = $el("button", { | |
| type: "button", | |
| textContent: "View raw metadata", | |
| disabled: "disabled", | |
| style: { | |
| opacity: 0.5, | |
| cursor: "not-allowed", | |
| }, | |
| onclick: (e) => { | |
| if (this.metadata) { | |
| new MetadataDialog().show(this.metadata); | |
| } | |
| }, | |
| }); | |
| btns.unshift(this.viewMetadata); | |
| return btns; | |
| } | |
| getNoteInfo() { | |
| function parseNote() { | |
| if (!this.customNotes) return []; | |
| let notes = []; | |
| // Extract links from notes | |
| const r = new RegExp("(\\bhttps?:\\/\\/[^\\s]+)", "g"); | |
| let end = 0; | |
| let m; | |
| do { | |
| m = r.exec(this.customNotes); | |
| let pos; | |
| let fin = 0; | |
| if (m) { | |
| pos = m.index; | |
| fin = m.index + m[0].length; | |
| } else { | |
| pos = this.customNotes.length; | |
| } | |
| let pre = this.customNotes.substring(end, pos); | |
| if (pre) { | |
| pre = pre.replaceAll("\n", "<br>"); | |
| notes.push( | |
| $el("span", { | |
| innerHTML: pre, | |
| }) | |
| ); | |
| } | |
| if (m) { | |
| notes.push( | |
| $el("a", { | |
| href: m[0], | |
| textContent: m[0], | |
| target: "_blank", | |
| }) | |
| ); | |
| } | |
| end = fin; | |
| } while (m); | |
| return notes; | |
| } | |
| let textarea; | |
| let notesContainer; | |
| const editText = "✏️ Edit"; | |
| const edit = $el("a", { | |
| textContent: editText, | |
| href: "#", | |
| style: { | |
| float: "right", | |
| color: "greenyellow", | |
| textDecoration: "none", | |
| }, | |
| onclick: async (e) => { | |
| e.preventDefault(); | |
| if (textarea) { | |
| this.customNotes = textarea.value; | |
| const resp = await api.fetchApi("/pysssss/metadata/notes/" + encodeURIComponent(`${this.type}/${this.name}`), { | |
| method: "POST", | |
| body: this.customNotes, | |
| }); | |
| if (resp.status !== 200) { | |
| console.error(resp); | |
| alert(`Error saving notes (${req.status}) ${req.statusText}`); | |
| return; | |
| } | |
| e.target.textContent = editText; | |
| textarea.remove(); | |
| textarea = null; | |
| notesContainer.replaceChildren(...parseNote.call(this)); | |
| this.node?.["pysssss.updateExamples"]?.(); | |
| } else { | |
| e.target.textContent = "💾 Save"; | |
| textarea = $el("textarea", { | |
| style: { | |
| width: "100%", | |
| minWidth: "200px", | |
| minHeight: "50px", | |
| }, | |
| textContent: this.customNotes, | |
| }); | |
| e.target.after(textarea); | |
| notesContainer.replaceChildren(); | |
| textarea.style.height = Math.min(textarea.scrollHeight, 300) + "px"; | |
| } | |
| }, | |
| }); | |
| notesContainer = $el("div.pysssss-model-notes", parseNote.call(this)); | |
| return $el( | |
| "div", | |
| { | |
| style: { display: "contents" }, | |
| }, | |
| [edit, notesContainer] | |
| ); | |
| } | |
| addInfo() { | |
| const usageHint = this.metadata["modelspec.usage_hint"]; | |
| if (usageHint) { | |
| this.addInfoEntry("Usage Hint", usageHint); | |
| } | |
| this.addInfoEntry("Notes", this.getNoteInfo()); | |
| } | |
| addInfoEntry(name, value) { | |
| return $el( | |
| "p", | |
| { | |
| parent: this.info, | |
| }, | |
| [ | |
| typeof name === "string" ? $el("label", { textContent: name + ": " }) : name, | |
| typeof value === "string" ? $el("span", { textContent: value }) : value, | |
| ] | |
| ); | |
| } | |
| async getCivitaiDetails() { | |
| const req = await fetch("https://civitai.com/api/v1/model-versions/by-hash/" + this.hash); | |
| if (req.status === 200) { | |
| return await req.json(); | |
| } else if (req.status === 404) { | |
| throw new Error("Model not found"); | |
| } else { | |
| throw new Error(`Error loading info (${req.status}) ${req.statusText}`); | |
| } | |
| } | |
| addCivitaiInfo() { | |
| const promise = this.getCivitaiDetails(); | |
| const content = $el("span", { textContent: "ℹ️ Loading..." }); | |
| this.addInfoEntry( | |
| $el("label", [ | |
| $el("img", { | |
| style: { | |
| width: "18px", | |
| position: "relative", | |
| top: "3px", | |
| margin: "0 5px 0 0", | |
| }, | |
| src: "https://civitai.com/favicon.ico", | |
| }), | |
| $el("span", { textContent: "Civitai: " }), | |
| ]), | |
| content | |
| ); | |
| return promise | |
| .then((info) => { | |
| content.replaceChildren( | |
| $el("a", { | |
| href: "https://civitai.com/models/" + info.modelId, | |
| textContent: "View " + info.model.name, | |
| target: "_blank", | |
| }) | |
| ); | |
| const allPreviews = info.images?.filter((i) => i.type === "image"); | |
| const previews = allPreviews?.filter((i) => i.nsfwLevel <= ModelInfoDialog.nsfwLevel); | |
| if (previews?.length) { | |
| let previewIndex = 0; | |
| let preview; | |
| const updatePreview = () => { | |
| preview = previews[previewIndex]; | |
| this.img.src = preview.url; | |
| }; | |
| updatePreview(); | |
| this.img.style.display = ""; | |
| this.img.title = `${previews.length} previews.`; | |
| if (allPreviews.length !== previews.length) { | |
| this.img.title += ` ${allPreviews.length - previews.length} images hidden due to NSFW level.`; | |
| } | |
| this.imgSave = $el("button", { | |
| textContent: "Use as preview", | |
| parent: this.imgWrapper, | |
| onclick: async () => { | |
| // Convert the preview to a blob | |
| const blob = await (await fetch(this.img.src)).blob(); | |
| // Store it in temp | |
| const name = "temp_preview." + new URL(this.img.src).pathname.split(".")[1]; | |
| const body = new FormData(); | |
| body.append("image", new File([blob], name)); | |
| body.append("overwrite", "true"); | |
| body.append("type", "temp"); | |
| const resp = await api.fetchApi("/upload/image", { | |
| method: "POST", | |
| body, | |
| }); | |
| if (resp.status !== 200) { | |
| console.error(resp); | |
| alert(`Error saving preview (${req.status}) ${req.statusText}`); | |
| return; | |
| } | |
| // Use as preview | |
| await api.fetchApi("/pysssss/save/" + encodeURIComponent(`${this.type}/${this.name}`), { | |
| method: "POST", | |
| body: JSON.stringify({ | |
| filename: name, | |
| type: "temp", | |
| }), | |
| headers: { | |
| "content-type": "application/json", | |
| }, | |
| }); | |
| app.refreshComboInNodes(); | |
| }, | |
| }); | |
| $el("button", { | |
| textContent: "Show metadata", | |
| parent: this.imgWrapper, | |
| onclick: async () => { | |
| if (preview.meta && Object.keys(preview.meta).length) { | |
| new MetadataDialog().show(preview.meta); | |
| } else { | |
| alert("No image metadata found"); | |
| } | |
| }, | |
| }); | |
| const addNavButton = (icon, direction) => { | |
| $el("button.pysssss-preview-nav", { | |
| textContent: icon, | |
| parent: this.imgWrapper, | |
| onclick: async () => { | |
| previewIndex += direction; | |
| if (previewIndex < 0) { | |
| previewIndex = previews.length - 1; | |
| } else if (previewIndex >= previews.length) { | |
| previewIndex = 0; | |
| } | |
| updatePreview(); | |
| }, | |
| }); | |
| }; | |
| if (previews.length > 1) { | |
| addNavButton("‹", -1); | |
| addNavButton("›", 1); | |
| } | |
| } else if (info.images?.length) { | |
| $el("span", { style: { opacity: 0.6 }, textContent: "⚠️ All images hidden due to NSFW level setting.", parent: this.imgWrapper }); | |
| } | |
| return info; | |
| }) | |
| .catch((err) => { | |
| content.textContent = "⚠️ " + err.message; | |
| }); | |
| } | |
| } | |