Nodes/comfyui-llm-bikeshed/LLM Generate (Basic)
ComfyUI Node

LLM Generate (Basic)

The node that actually calls your LLM

By VirusShell·Created 4 months ago·Updated 3 days ago· 1
LLM Generate (Basic)
  • provider
  • text
  • meta
◄temperature0.70►
◄max_tokens1024►
◄seed0►
◄system_prompt►
◄prompt—►

LLM Generate (Basic) is the payoff node of the comfyui-llm-bikeshed pack. Everything else - the providers, the options, the lifecycle nodes - exists to feed this one a backend and a question, and this is the node that gets an answer back. It's the one you reach for when you just want text out of a local model with minimal ceremony: wire a provider in, type a prompt, and the text output carries whatever your model says.

The mental model that makes this pack make sense: it never runs a model inside ComfyUI. Like an API-wrapper node, it's an HTTP client wearing a node costume (the KB's external-api-nodes.md frames the pattern exactly). Under the hood it builds a chat message list - your system_prompt first if it's non-empty, then your prompt as the user turn - and sends it over POST /v1/chat/completions to whatever server your provider node points at. LM Studio, oobabooga Textgen, llama.cpp, and OpenAI all speak that dialect, which is the whole trick of the pack: one generation node, many backends. This is the "LLM as a tool in the graph" pattern from llm-in-comfyui.md - the language model doing a job upstream of the sampler, not the frozen text encoder inside your checkpoint. Different thing, easy to conflate.

The inputs that matter

The required provider input is non-negotiable: it takes an LLM_PROVIDER object from LLM Provider: OAI Compatible or LLM Provider: Textgen, and without it the node has nothing to talk to. Everything else is ordinary:

  • prompt - your actual request. Multiline, so paste as much as you like.
  • system_prompt - optional role instructions ("You are a prompt engineer…"). Leave it empty and the pack simply omits it from the request.
  • temperature - default 0.7. Low for deterministic, high for creative.
  • max_tokens - default 1024, the ceiling on the reply.
  • seed - default -1 means "don't send a seed," which most local backends treat as random. Set a real number for reproducibility - and mind the control_after_generate dropdown ComfyUI attaches to every INT widget, which will happily randomize your seed each run until you set it to fixed.

The outputs

  • text (STRING) - the model's reply. Wire it to a text preview/display node to see it in the graph, or into the next step of your pipeline.
  • meta (LLM_META) - a compact bundle carrying the provider and the options that were actually sent. Its real use is chaining: connect it to the next generation node's meta input and the model stays loaded across the chain, unloading only after the last node. That's the pack's VRAM management doing its job - you're telling it "more generations are coming."

One quirk worth knowing: the node's IS_CHANGED returns NaN, the ComfyUI "always rerun" idiom (comfyui-node-plumbing.md). It never lets the cache skip it, which is right for a node talking to a live server, but it does cost you the cache for everything upstream.

Installing it

Same as every node in this pack:

cd ComfyUI/custom_nodes
git clone https://github.com/VirusShell/comfyui-llm-bikeshed.git
cd comfyui-llm-bikeshed
pip install -r requirements.txt

then restart ComfyUI - or just search "comfyui-llm-bikeshed" in ComfyUI Manager. Dependencies are only pyyaml and requests, which ComfyUI core already ships, so requirements.txt is nearly empty and there are no model downloads: the models live in your external server (LM Studio / Textgen), not in this pack.

Where people get burned

The most common failure is an empty or erroring output because the backend isn't actually running - ComfyUI will happily sit on a dead http://localhost:1234 for the request timeout (120s by default) before failing. Point the provider at the right port, make sure a model is actually loaded in LM Studio or Textgen, and confirm the model dropdown refreshed. Also remember the node is synchronous: your whole queue blocks while the LLM thinks. That's expected with local generation, but it means a slow model makes a run feel frozen. And if you're on Textgen and hitting auth errors, the key belongs in config.yaml (or an env var) - never in the workflow JSON.

CategoryLLM Bikeshed/generation

Inputs (6)

NameTypeDefaultDescription
providerLLM_PROVIDER—
temperatureFLOAT0.700–2—
max_tokensINT10240–128000Output token cap only (not prompt + completion). 0 omits this face limit so the host default applies; an Options or meta limit is kept. 1 or more is sent. No prompt cap; you own timeout and OOM.
seedINT00–18446744073709550000—
system_promptSTRING—
promptSTRING—

Outputs (2)

NameTypeDescription
textSTRING—
metaLLM_METACarries provider + options for chaining to downstream generation nodes.