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="models/text_encoders/Qwen3VL-8B-Uncensored-HauhauCS-Aggressive-Q8_0.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:Q8_0 # Run inference directly in the terminal: llama cli -hf saik0s/comfy_backup:Q8_0
Install from WinGet (Windows)
winget install llama.cpp # Start a local OpenAI-compatible server with a web UI: llama serve -hf saik0s/comfy_backup:Q8_0 # Run inference directly in the terminal: llama cli -hf saik0s/comfy_backup:Q8_0
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:Q8_0 # Run inference directly in the terminal: ./llama-cli -hf saik0s/comfy_backup:Q8_0
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:Q8_0 # Run inference directly in the terminal: ./build/bin/llama-cli -hf saik0s/comfy_backup:Q8_0
Use Docker
docker model run hf.co/saik0s/comfy_backup:Q8_0
- LM Studio
- Jan
- Ollama
How to use saik0s/comfy_backup with Ollama:
ollama run hf.co/saik0s/comfy_backup:Q8_0
- 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:Q8_0
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:Q8_0" } ] } } }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:Q8_0
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:Q8_0
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:Q8_0
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:Q8_0" \ --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:Q8_0
- Lemonade
How to use saik0s/comfy_backup with Lemonade:
Pull the model
# Download Lemonade from https://lemonade-server.ai/ lemonade pull saik0s/comfy_backup:Q8_0
Run and chat with the model
lemonade run user.comfy_backup-Q8_0
List all available models
lemonade list
| import type { | |
| INodeInputSlot, | |
| INodeOutputSlot, | |
| LGraphCanvas, | |
| LGraphEventMode, | |
| LGraphNode, | |
| LLink, | |
| Vector2, | |
| ISerialisedNode, | |
| } from "@comfyorg/frontend"; | |
| import {app} from "scripts/app.js"; | |
| import { | |
| PassThroughFollowing, | |
| addConnectionLayoutSupport, | |
| changeModeOfNodes, | |
| getConnectedInputNodesAndFilterPassThroughs, | |
| getConnectedOutputNodesAndFilterPassThroughs, | |
| } from "./utils.js"; | |
| import {wait} from "rgthree/common/shared_utils.js"; | |
| import {BaseCollectorNode} from "./base_node_collector.js"; | |
| import {NodeTypesString, stripRgthree} from "./constants.js"; | |
| import {fitString} from "./utils_canvas.js"; | |
| import {rgthree} from "./rgthree.js"; | |
| const MODE_ALWAYS = 0; | |
| const MODE_MUTE = 2; | |
| const MODE_BYPASS = 4; | |
| const MODE_REPEATS = [MODE_MUTE, MODE_BYPASS]; | |
| const MODE_NOTHING = -99; // MADE THIS UP. | |
| const MODE_TO_OPTION = new Map([ | |
| [MODE_ALWAYS, "ACTIVE"], | |
| [MODE_MUTE, "MUTE"], | |
| [MODE_BYPASS, "BYPASS"], | |
| [MODE_NOTHING, "NOTHING"], | |
| ]); | |
| const OPTION_TO_MODE = new Map([ | |
| ["ACTIVE", MODE_ALWAYS], | |
| ["MUTE", MODE_MUTE], | |
| ["BYPASS", MODE_BYPASS], | |
| ["NOTHING", MODE_NOTHING], | |
| ]); | |
| const MODE_TO_PROPERTY = new Map([ | |
| [MODE_MUTE, "on_muted_inputs"], | |
| [MODE_BYPASS, "on_bypassed_inputs"], | |
| [MODE_ALWAYS, "on_any_active_inputs"], | |
| ]); | |
| const logger = rgthree.newLogSession("[NodeModeRelay]"); | |
| /** | |
| * Like a BaseCollectorNode, this relay node connects to a Repeater node and _relays_ mode changes | |
| * changes to the repeater (so it can go on to modify its connections). | |
| */ | |
| class NodeModeRelay extends BaseCollectorNode { | |
| override readonly inputsPassThroughFollowing: PassThroughFollowing = PassThroughFollowing.ALL; | |
| static override type = NodeTypesString.NODE_MODE_RELAY; | |
| static override title = NodeTypesString.NODE_MODE_RELAY; | |
| override comfyClass = NodeTypesString.NODE_MODE_RELAY; | |
| static "@on_muted_inputs" = { | |
| type: "combo", | |
| values: ["MUTE", "ACTIVE", "BYPASS", "NOTHING"], | |
| }; | |
| static "@on_bypassed_inputs" = { | |
| type: "combo", | |
| values: ["BYPASS", "ACTIVE", "MUTE", "NOTHING"], | |
| }; | |
| static "@on_any_active_inputs" = { | |
| type: "combo", | |
| values: ["BYPASS", "ACTIVE", "MUTE", "NOTHING"], | |
| }; | |
| constructor(title?: string) { | |
| super(title); | |
| this.properties["on_muted_inputs"] = "MUTE"; | |
| this.properties["on_bypassed_inputs"] = "BYPASS"; | |
| this.properties["on_any_active_inputs"] = "ACTIVE"; | |
| this.onConstructed(); | |
| } | |
| override onConstructed() { | |
| this.addOutput("REPEATER", "_NODE_REPEATER_", { | |
| color_on: "#Fc0", | |
| color_off: "#a80", | |
| shape: LiteGraph.ARROW_SHAPE, | |
| }); | |
| setTimeout(() => { | |
| this.stabilize(); | |
| }, 500); | |
| return super.onConstructed(); | |
| } | |
| override onModeChange(from: LGraphEventMode | undefined, to: LGraphEventMode) { | |
| super.onModeChange(from, to); | |
| // If we aren't connected to anything, then we'll use our mode to relay when it changes. | |
| if (this.inputs.length <= 1 && !this.isInputConnected(0) && this.isAnyOutputConnected()) { | |
| const [n, v] = logger.infoParts(`Mode change without any inputs; relaying our mode.`); | |
| console[n]?.(...v); | |
| // Pass "to" since there may be other getters in the way to access this.mode directly. | |
| this.dispatchModeToRepeater(to); | |
| } | |
| } | |
| override onDrawForeground(ctx: CanvasRenderingContext2D, canvas: LGraphCanvas): void { | |
| if (this.flags?.collapsed) { | |
| return; | |
| } | |
| if ( | |
| this.properties["on_muted_inputs"] !== "MUTE" || | |
| this.properties["on_bypassed_inputs"] !== "BYPASS" || | |
| this.properties["on_any_active_inputs"] != "ACTIVE" | |
| ) { | |
| let margin = 15; | |
| ctx.textAlign = "left"; | |
| let label = `*(MUTE > ${this.properties["on_muted_inputs"]}, `; | |
| label += `BYPASS > ${this.properties["on_bypassed_inputs"]}, `; | |
| label += `ACTIVE > ${this.properties["on_any_active_inputs"]})`; | |
| ctx.fillStyle = LiteGraph.WIDGET_SECONDARY_TEXT_COLOR; | |
| const oldFont = ctx.font; | |
| ctx.font = "italic " + (LiteGraph.NODE_SUBTEXT_SIZE - 2) + "px Arial"; | |
| ctx.fillText(fitString(ctx, label, this.size[0] - 20), 15, this.size[1] - 6); | |
| ctx.font = oldFont; | |
| } | |
| } | |
| override computeSize(out: Vector2) { | |
| let size = super.computeSize(out); | |
| if ( | |
| this.properties["on_muted_inputs"] !== "MUTE" || | |
| this.properties["on_bypassed_inputs"] !== "BYPASS" || | |
| this.properties["on_any_active_inputs"] != "ACTIVE" | |
| ) { | |
| size[1] += 17; | |
| } | |
| return size; | |
| } | |
| override onConnectOutput( | |
| outputIndex: number, | |
| inputType: string | -1, | |
| inputSlot: INodeInputSlot, | |
| inputNode: LGraphNode, | |
| inputIndex: number, | |
| ): boolean { | |
| let canConnect = super.onConnectOutput?.( | |
| outputIndex, | |
| inputType, | |
| inputSlot, | |
| inputNode, | |
| inputIndex, | |
| ); | |
| let nextNode = getConnectedOutputNodesAndFilterPassThroughs(this, inputNode)[0] ?? inputNode; | |
| return canConnect && nextNode.type === NodeTypesString.NODE_MODE_REPEATER; | |
| } | |
| override onConnectionsChange( | |
| type: number, | |
| slotIndex: number, | |
| isConnected: boolean, | |
| link_info: LLink, | |
| ioSlot: INodeOutputSlot | INodeInputSlot, | |
| ): void { | |
| super.onConnectionsChange(type, slotIndex, isConnected, link_info, ioSlot); | |
| setTimeout(() => { | |
| this.stabilize(); | |
| }, 500); | |
| } | |
| stabilize() { | |
| // If we aren't connected to a repeater, then theres no sense in checking. And if we are, but | |
| // have no inputs, then we're also not ready. | |
| if (!this.graph || !this.isAnyOutputConnected() || !this.isInputConnected(0)) { | |
| return; | |
| } | |
| const inputNodes = getConnectedInputNodesAndFilterPassThroughs( | |
| this, | |
| this, | |
| -1, | |
| this.inputsPassThroughFollowing, | |
| ); | |
| let mode: LGraphEventMode | -99 | undefined = undefined; | |
| for (const inputNode of inputNodes) { | |
| // If we haven't set our mode to be, then let's set it. Otherwise, mode will stick if it | |
| // remains constant, otherwise, if we hit an ALWAYS, then we'll unmute all repeaters and | |
| // if not then we won't do anything. | |
| if (mode === undefined) { | |
| mode = inputNode.mode; | |
| } else if (mode === inputNode.mode && MODE_REPEATS.includes(mode)) { | |
| continue; | |
| } else if (inputNode.mode === MODE_ALWAYS || mode === MODE_ALWAYS) { | |
| mode = MODE_ALWAYS; | |
| } else { | |
| mode = undefined; | |
| } | |
| } | |
| this.dispatchModeToRepeater(mode); | |
| setTimeout(() => { | |
| this.stabilize(); | |
| }, 500); | |
| } | |
| /** | |
| * Sends the mode to the repeater, checking to see if we're modifying our mode. | |
| */ | |
| private dispatchModeToRepeater(mode?: LGraphEventMode | -99 | null) { | |
| if (mode != null) { | |
| const propertyVal = this.properties?.[MODE_TO_PROPERTY.get(mode) || ""]; | |
| const newMode = OPTION_TO_MODE.get(propertyVal as string); | |
| mode = (newMode !== null ? newMode : mode) as LGraphEventMode | -99; | |
| if (mode !== null && mode !== MODE_NOTHING) { | |
| if (this.outputs?.length) { | |
| const outputNodes = getConnectedOutputNodesAndFilterPassThroughs(this); | |
| for (const outputNode of outputNodes) { | |
| changeModeOfNodes(outputNode, mode); | |
| wait(16).then(() => { | |
| outputNode.setDirtyCanvas(true, true); | |
| }); | |
| } | |
| } | |
| } | |
| } | |
| } | |
| override getHelp() { | |
| return ` | |
| <p> | |
| This node will relay its input nodes' modes (Mute, Bypass, or Active) to a connected | |
| ${stripRgthree(NodeTypesString.NODE_MODE_REPEATER)} (which would then repeat that mode | |
| change to all of its inputs). | |
| </p> | |
| <ul> | |
| <li><p> | |
| When all connected input nodes are muted, the relay will set a connected repeater to | |
| mute (by default). | |
| </p></li> | |
| <li><p> | |
| When all connected input nodes are bypassed, the relay will set a connected repeater to | |
| bypass (by default). | |
| </p></li> | |
| <li><p> | |
| When any connected input nodes are active, the relay will set a connected repeater to | |
| active (by default). | |
| </p></li> | |
| <li><p> | |
| If no inputs are connected, the relay will set a connected repeater to its mode <i>when | |
| its own mode is changed</i>. <b>Note</b>, if any inputs are connected, then the above | |
| will occur and the Relay's mode does not matter. | |
| </p></li> | |
| </ul> | |
| <p> | |
| Note, you can change which signals get sent on the above in the <code>Properties</code>. | |
| For instance, you could configure an inverse relay which will send a MUTE when any of its | |
| inputs are active (instead of sending an ACTIVE signal), and send an ACTIVE signal when all | |
| of its inputs are muted (instead of sending a MUTE signal), etc. | |
| </p> | |
| `; | |
| } | |
| } | |
| app.registerExtension({ | |
| name: "rgthree.NodeModeRepeaterHelper", | |
| registerCustomNodes() { | |
| addConnectionLayoutSupport(NodeModeRelay, app, [ | |
| ["Left", "Right"], | |
| ["Right", "Left"], | |
| ]); | |
| LiteGraph.registerNodeType(NodeModeRelay.type, NodeModeRelay); | |
| NodeModeRelay.category = NodeModeRelay._category; | |
| }, | |
| }); | |