Local LLM
A GGUF that loads for one answer and then gets off your GPU
- text
- thinking
The name is boringly literal: one prompt in, one answer out, from a language model on your own machine. No API key, no cloud. What earns it a place in a music-production pack is the memory behaviour - a GGUF file is run by llama.cpp for the length of the call and then gone, so the VRAM goes back to YuE2 or MiniMax for the render. If you've ever restarted ComfyUI because Ollama was squatting on your card, that design choice is for you.
It's also a general node - usable anywhere a string is needed. It lives in this pack because Plenio's song templates write their drafts with a language model, and you might already own a good one.
Two ways in
A file. Entries like models/LLM · whatever.gguf, other ... files labels, and HF cache · ... are GGUF files. Plenio starts a llama.cpp server for the draft, has ComfyUI free enough GPU memory for the file plus its context before it starts, and stops the server afterwards. Loading costs a few seconds per draft; a fixed draft seed keeps the cached draft, so a song you're iterating on is written once. On a single 16 GB card this is the path to use.
An app's model. LM Studio · ..., Ollama · ..., llama.cpp · ..., vLLM, Jan, KoboldCpp - served by a running app, which manages its own memory. With keep loaded off, Plenio asks Ollama, and LM Studio for models LM Studio loaded itself, to unload after answering. A model you loaded by hand in LM Studio stays put - a favourite way to surprise yourself mid-render.
GGUF files need a llama.cpp server program somewhere. Plenio checks PLENIO_LLAMA_SERVER (or [llm] llama_server in config.toml), then llama-server on your PATH - winget install llama.cpp on Windows, brew install llama.cpp on macOS/Linux - then the build Unsloth Studio installs, then llama-cpp-python as a last resort. LM Studio's bundled llama.cpp is not a standalone server. The System Check template tells you which one it found rather than leaving you to guess.
The inputs that matter
- prompt - the request. Type it or wire Compose Writing Prompt / Compose Arrangement's prompt into it.
- model - the list. Press R after dropping a file in or starting an app.
- seed - fixed by default, and with reuse answers on it means the same seed, prompt and settings give the same answer straight out of Plenio's cache in
user/plenio/cache/llm, without asking the model. Delete that folder to forget everything. - max_tokens (6144) and context (12288) - room for a long draft plus a reasoning model's thoughts. An answer that runs out of room stops the run with a message instead of being silently lopped in half.
- temperature (0.8), system_prompt - the usual knobs.
- thinking (off) - let a reasoning model think first. Slower, needs more tokens, and the thoughts come out on the separate
thinkingoutput. - keep_loaded (off) - on keeps the model resident for the next run: faster, but now both models need the memory.
Two more punch above their weight. schema takes a JSON schema - Compose Arrangement hands over one - and GGUF files, LM Studio, Ollama and vLLM are held to it while they write, so the answer cannot leave the format. Keep thinking off when you use a schema; a reasoner can't deliberate inside a grammar. And reuse_answers is why re-running a graph after changing a slider that didn't touch this prompt doesn't cost you another generation.
Outputs
text is the answer, thoughts stripped out. thinking is the reasoning, if the model shared any. That separation is the valuable part, and it's the fix for the classic LLM-in-ComfyUI failure (docs/knowledge/llm-in-comfyui.md): an unconstrained chat model emits role delimiters, "Here is your prompt:" preamble and markdown scaffolding straight into your conditioning.
Installing it
cd ComfyUI/custom_nodes
git clone https://github.com/jplenio/Plenio-Music-Production-System
Manager: search Plenio Music Production System. The pack installs no Python packages, so there's no dependency roulette here. Put your GGUFs in ComfyUI/models/LLM and restart. ComfyUI 0.37.0+.
When it misbehaves
The model list showing only (choose a model) means it found nothing: no GGUF in models/LLM, no writer in models/text_encoders, and no local LLM app server answering on its default port. Add a file or start an app, then press R.
No llama.cpp runtime was found - install llama.cpp or set PLENIO_LLAMA_SERVER. unknown model architecture while loading - your llama.cpp build is older than the model; update it or point the variable at a newer llama-server.
The answer was cut off after N tokens is usually thinking on: raise max_tokens and context, or turn thinking off. On quality, the pack is honest in its own docs - 4B to 12B instruction-tuned models follow the layout best. Small and obedient beats large and clever for this job; a reasoner spends tokens deliberating and is likelier to leak its scratch work into your song.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | The request (connect Compose Writing Prompt, or type). | |
| model | COMBO | 'models/LLM · file.gguf' and other '... files' / 'HF cache' entries are GGUF files, run by llama.cpp for the call; 'LM Studio · ...', 'Ollama · ...' are models of a running app. | |
| seed | INT | 00–18446744073709550000 | Same seed, same prompt, same settings: the same answer - taken from Plenio's answer cache without asking the model again (see reuse_answers). Change it for a new answer. |
| max_tokens | INT | 614416–131072 | Longest answer in tokens; a cut-off answer stops the run with a message. |
| temperature | FLOAT | 0.800–2 | 0 = always the most likely words; higher = more varied. |
| thinking | BOOLEAN | false | Let a reasoning model think first (Qwen, Gemma, DeepSeek ...); the thoughts come out separately. Slower; needs more max tokens. |
| context | INT | 122881024–262144 | Context length in tokens (prompt + answer) for GGUF files and Ollama. Other apps use the length set in the app. |
| keep_loaded | BOOLEAN | false | Off: the model's memory is freed after the answer, so ComfyUI's models have the GPU. On: the model stays loaded for the next run (faster, needs the memory for both). |
| system_prompt | STRING | Optional standing instructions sent before the prompt. | |
| reuse_answersopt | BOOLEAN | true | On: a request answered before (same model, prompt, seed and settings) is answered from Plenio's cache (user/plenio/cache/llm), also after a restart. Off: always ask the model. |
| schemaopt | STRING | Optional JSON schema of the answer (Compose Arrangement provides one): GGUF files, LM Studio, Ollama and vLLM keep to it while they write; other apps answer freely. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| text | STRING | The answer (thoughts removed). |
| thinking | STRING | The model's thoughts, if it shared any. |