Omni Node
Ask a language model to write your node for you
- output_1
- output_2
- output_3
- output_4
- output_5
- output_6
- output_7
- output_8
- output_9
- output_10
- output_11
- output_12
- output_13
- output_14
- output_15
- output_16
- output_17
- output_18
- output_19
- output_20
- output_21
- output_22
- output_23
- output_24
The manual Omni Node lets you paste a node class and run it. OmniNodeAPI (display name "Omni Node") removes the pasting part: you type what you want the node to do in plain English, and it gets a language model to write the node class, then runs it. Want a node that takes three images and averages them? Type "a node that blends three images together." The model writes the ComfyUI class, it lands in the node, and on the next run it executes.
Yes, it calls an API. Yes, it needs a key. No, it doesn't need any model weights - this is the pack's one genuinely cloud-dependent node, and it's worth being straight about what that means before you build your whole workflow on it.
How it works
prompt is the only visible input - a multiline string of what you want. Hidden inputs carry the machinery: the node's unique id, the graph prompt, and the previously generated code. When you trigger it, a server route (/rebalance_pack/omni_build) takes your prompt and the graph's configuration and calls OpenRouter's chat completions endpoint with a carefully written system prompt that teaches the model how to write a ComfyUI node class for the Omni runtime - the same class format the manual node accepts. The model's reply is stripped of markdown fences, cached server-side keyed to your node, and pushed to the UI so you can see exactly what it wrote. On execution, the node compiles that generated class and runs it like the manual version does, routing results to its 24 wildcard outputs.
Two things make it less magic than it sounds and more practical than it should be. First, the configuration - API key, model, reasoning effort, service tier - isn't on this node at all. It lives on a companion OmniNodeGuide node that must be present in the same graph; the build route scans the graph for one and reads its settings. So the wiring is: OmniNodeAPI (your request) + OmniNodeGuide (your key and model) = generated node. Second, the default model is openai/gpt-5.6-luna on OpenRouter - pick a coding-capable model that exists on OpenRouter, because the quality of your node is exactly the quality of that model's ComfyUI knowledge.
The inputs that matter
- prompt - your plain-English request. Be specific: name the input types, say what should happen, mention the output. "A node that takes an IMAGE and a FLOAT brightness and returns a brightened IMAGE" gets you a real node; "do something cool" gets you a hallucination.
- output_1 … output_24 - wildcard outputs, filled per the generated class's
RETURN_TYPES.
Install and setup
Part of the Rebalance Pack. ComfyUI Manager: search "ComfyUI-Conditioning-Rebalance" (or "Rebalance Pack"). Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/nova452/ComfyUI-ConditioningKrea2Rebalance
Restart. Then you need the requests package (for the API call) and an OpenRouter API key - a sk-or-v1-... key, which you put in an OmniNodeGuide node in the same graph. The key never leaves your machine; the request goes directly from your ComfyUI server to OpenRouter.
Troubleshooting
The "no generated code yet - press Build" error is the onboarding gotcha: the node needs its Build action triggered before it has anything to execute, and it needs a properly wired OmniNodeGuide with a valid key - the API call fails fast with a clear message if the key is missing or doesn't start with sk-or-. A 502 from the build route means the model call itself failed; check the key, the model name (make sure it exists on OpenRouter), and your network. And the most honest caveat: this costs money per generation, it's slower than a local node, and LLM-written node code is a starting point, not a guarantee. Use it for scaffolding a node you then refine in the manual Omni Node - that pairing is the actual workflow this pack is pushing.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | — |
Outputs (24)
| Name | Type | Description |
|---|---|---|
| output_1 | * | — |
| output_2 | * | — |
| output_3 | * | — |
| output_4 | * | — |
| output_5 | * | — |
| output_6 | * | — |
| output_7 | * | — |
| output_8 | * | — |
| output_9 | * | — |
| output_10 | * | — |
| output_11 | * | — |
| output_12 | * | — |
| output_13 | * | — |
| output_14 | * | — |
| output_15 | * | — |
| output_16 | * | — |
| output_17 | * | — |
| output_18 | * | — |
| output_19 | * | — |
| output_20 | * | — |
| output_21 | * | — |
| output_22 | * | — |
| output_23 | * | — |
| output_24 | * | — |