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 type {RgthreeModelInfo} from "typings/rgthree.js"; | |
| export type ModelInfoType = "loras" | "checkpoints"; | |
| type ModelsOptions = { | |
| type: ModelInfoType; | |
| files?: string[]; | |
| }; | |
| type GetModelsOptions = ModelsOptions & { | |
| type: ModelInfoType; | |
| files?: string[]; | |
| format?: null | "details"; | |
| }; | |
| type GetModelsInfoOptions = GetModelsOptions & { | |
| light?: boolean; | |
| }; | |
| type GetModelsResponseDetails = { | |
| file: string; | |
| modified: number; | |
| has_info: boolean; | |
| image?: string; | |
| }; | |
| class RgthreeApi { | |
| private baseUrl!: string; | |
| private comfyBaseUrl!: string; | |
| getCheckpointsPromise: Promise<string[]> | null = null; | |
| getSamplersPromise: Promise<string[]> | null = null; | |
| getSchedulersPromise: Promise<string[]> | null = null; | |
| getLorasPromise: Promise<GetModelsResponseDetails[]> | null = null; | |
| getWorkflowsPromise: Promise<string[]> | null = null; | |
| constructor(baseUrl?: string) { | |
| this.setBaseUrl(baseUrl); | |
| } | |
| setBaseUrl(baseUrlArg?: string) { | |
| let baseUrl = null; | |
| if (baseUrlArg) { | |
| baseUrl = baseUrlArg; | |
| } else if (window.location.pathname.includes("/rgthree/")) { | |
| // Try to find how many relatives paths we need to go back to hit ./rgthree/api | |
| const parts = window.location.pathname.split("/rgthree/")[1]?.split("/"); | |
| if (parts && parts.length) { | |
| baseUrl = parts.map(() => "../").join("") + "rgthree/api"; | |
| } | |
| } | |
| this.baseUrl = baseUrl || "./rgthree/api"; | |
| // Calculate the comfyUI api base path by checkin gif we're on an rgthree independant page (as | |
| // we'll always use '/rgthree/' prefix) and, if so, assume the path before `/rgthree/` is the | |
| // base path. If we're not, then just use the same pathname logic as the ComfyUI api.js uses. | |
| const comfyBasePathname = location.pathname.includes("/rgthree/") | |
| ? location.pathname.split("rgthree/")[0]! | |
| : location.pathname; | |
| this.comfyBaseUrl = comfyBasePathname.split("/").slice(0, -1).join("/"); | |
| } | |
| apiURL(route: string) { | |
| return `${this.baseUrl}${route}`; | |
| } | |
| fetchApi(route: string, options?: RequestInit) { | |
| return fetch(this.apiURL(route), options); | |
| } | |
| async fetchJson(route: string, options?: RequestInit) { | |
| const r = await this.fetchApi(route, options); | |
| return await r.json(); | |
| } | |
| async postJson(route: string, json: any) { | |
| const body = new FormData(); | |
| body.append("json", JSON.stringify(json)); | |
| return await rgthreeApi.fetchJson(route, {method: "POST", body}); | |
| } | |
| getLoras(force = false) { | |
| if (!this.getLorasPromise || force) { | |
| this.getLorasPromise = this.fetchJson("/loras?format=details", {cache: "no-store"}); | |
| } | |
| return this.getLorasPromise; | |
| } | |
| async fetchApiJsonOrNull<T>(route: string, options?: RequestInit) { | |
| const response = await this.fetchJson(route, options); | |
| if (response.status === 200 && response.data) { | |
| return (response.data as T) || null; | |
| } | |
| return null; | |
| } | |
| /** | |
| * Fetches the lora information. | |
| * | |
| * @param light Whether or not to generate a json file if there isn't one. This isn't necessary if | |
| * we're just checking for values, but is more necessary when opening an info dialog. | |
| */ | |
| async getModelsInfo(options: GetModelsInfoOptions): Promise<RgthreeModelInfo[]> { | |
| const params = new URLSearchParams(); | |
| if (options.files?.length) { | |
| params.set("files", options.files.join(",")); | |
| } | |
| if (options.light) { | |
| params.set("light", "1"); | |
| } | |
| if (options.format) { | |
| params.set("format", options.format); | |
| } | |
| const path = `/${options.type}/info?` + params.toString(); | |
| return (await this.fetchApiJsonOrNull<RgthreeModelInfo[]>(path)) || []; | |
| } | |
| async getLorasInfo(options: Omit<GetModelsInfoOptions, "type"> = {}) { | |
| return this.getModelsInfo({type: "loras", ...options}); | |
| } | |
| async getCheckpointsInfo(options: Omit<GetModelsInfoOptions, "type"> = {}) { | |
| return this.getModelsInfo({type: "checkpoints", ...options}); | |
| } | |
| async refreshModelsInfo(options: ModelsOptions) { | |
| const params = new URLSearchParams(); | |
| if (options.files?.length) { | |
| params.set("files", options.files.join(",")); | |
| } | |
| const path = `/${options.type}/info/refresh?` + params.toString(); | |
| const infos = await this.fetchApiJsonOrNull<RgthreeModelInfo[]>(path); | |
| return infos; | |
| } | |
| async refreshLorasInfo(options: Omit<ModelsOptions, "type"> = {}) { | |
| return this.refreshModelsInfo({type: "loras", ...options}); | |
| } | |
| async refreshCheckpointsInfo(options: Omit<ModelsOptions, "type"> = {}) { | |
| return this.refreshModelsInfo({type: "checkpoints", ...options}); | |
| } | |
| async clearModelsInfo(options: ModelsOptions) { | |
| const params = new URLSearchParams(); | |
| if (options.files?.length) { | |
| // encodeURIComponent ? | |
| params.set("files", options.files.join(",")); | |
| } | |
| const path = `/${options.type}/info/clear?` + params.toString(); | |
| await this.fetchApiJsonOrNull<RgthreeModelInfo[]>(path); | |
| return; | |
| } | |
| async clearLorasInfo(options: Omit<ModelsOptions, "type"> = {}) { | |
| return this.clearModelsInfo({type: "loras", ...options}); | |
| } | |
| async clearCheckpointsInfo(options: Omit<ModelsOptions, "type"> = {}) { | |
| return this.clearModelsInfo({type: "checkpoints", ...options}); | |
| } | |
| /** | |
| * Saves partial data sending it to the backend.. | |
| */ | |
| async saveModelInfo( | |
| type: ModelInfoType, | |
| file: string, | |
| data: Partial<RgthreeModelInfo>, | |
| ): Promise<RgthreeModelInfo | null> { | |
| const body = new FormData(); | |
| body.append("json", JSON.stringify(data)); | |
| return await this.fetchApiJsonOrNull<RgthreeModelInfo>( | |
| `/${type}/info?file=${encodeURIComponent(file)}`, | |
| {cache: "no-store", method: "POST", body}, | |
| ); | |
| } | |
| async saveLoraInfo( | |
| file: string, | |
| data: Partial<RgthreeModelInfo>, | |
| ): Promise<RgthreeModelInfo | null> { | |
| return this.saveModelInfo("loras", file, data); | |
| } | |
| async saveCheckpointsInfo( | |
| file: string, | |
| data: Partial<RgthreeModelInfo>, | |
| ): Promise<RgthreeModelInfo | null> { | |
| return this.saveModelInfo("checkpoints", file, data); | |
| } | |
| /** | |
| * [🤮] Fetches from the ComfyUI given a similar functionality to the real ComfyUI API | |
| * implementation, but can be available on independant pages outside of the ComfyUI UI. This is | |
| * because ComfyUI frontend stopped serving its modules independantly and opted for a giant bundle | |
| * instead which no longer allows us to load its `api.js` file separately. | |
| */ | |
| fetchComfyApi(route: string, options?: any): Promise<any> { | |
| const url = this.comfyBaseUrl + "/api" + route; | |
| options = options || {}; | |
| options.headers = options.headers || {}; | |
| options.cache = options.cache || "no-cache"; | |
| return fetch(url, options); | |
| } | |
| /** | |
| * A way to log to the terminal from JS. | |
| */ | |
| print(messageType: string) { | |
| this.fetchApi(`/print?type=${messageType}`, {}) | |
| } | |
| } | |
| export const rgthreeApi = new RgthreeApi(); | |