EmpirioLabs AI Chat
An LLM in your graph without the 16GB download
- image
- text
You want a language model doing a job inside your workflow - rewriting a rough idea into a proper prompt, captioning a training set, sanity-checking outputs. The usual answer is to download a Qwen or a Llama, grab an inference node, and spend an evening on VRAM math. This node skips that: it's an HTTP client wearing a node costume. Type a prompt, get text back, pay per call.
What you'd actually reach for it for
Two jobs, and they're the ones the whole category splits into. The first is prompt enhancement: a rough idea goes in, a structured prompt for your checkpoint comes out, and that feeds your text encoder. The second is captioning or describing - you wire an image into image and get text out, which is how people bootstrap a LoRA dataset without hand-writing 200 captions.
Where it beats the local option is the usual hosted story: no 15GB of weights, no unload/reload dance between captioner and sampler, no dependency fight. Where it loses is the usual too - per-token cost, your prompt and images leaving the machine, and a moderation filter you can't strip, because there are no weights to abliterate. If you need an uncensored small model for one specific job, stay local.
How it works
The node builds an OpenAI-shaped messages array: your system_prompt first if you set one, then a user message. If you connected an image, the user content becomes a list of parts - the text, then one image_url part per image in the batch, each holding a base64 data URI (JPEG at quality 95, PNG when the image has alpha, downscaled if it's bigger than about 4 megapixels). It POSTs that to /v1/chat/completions with streaming off and reads the reply out of the first choice.
That's genuinely all it is. No sampling knobs, no logit tricks - anything past the fields below goes through extra_parameters as raw JSON.
One nice touch: it checks the catalog entry first, so wiring an image into a text-only model fails immediately instead of spending a request.
The inputs that matter
model- a dropdown built from the EmpirioLabs catalog at startup, filtered to chat models. The default,qwen3-8-27b, is also the fallback the pack ships internally so the node still loads when the catalog can't be reached.prompt- the message. Required, and an empty one is an error, not a request.system_prompt(optional) - instructions, sent as the system message. This is where you put "you are a prompt engineer for Flux, output one paragraph, no preamble."image(optional) - one image or a whole batch, for vision-capable models.max_tokens- reply cap.0means the model's own default, which is what you want until you hit truncation.seed- mostly a re-run button. Change it to force a fresh request; models that accept a seed get it, mapped into their supported range.extra_parameters- JSON object for anything else the model takes, e.g.{"temperature": 0.4}. It can't setmodel,messagesorstream; those are the node's own and it'll tell you so.
The output is one thing: text (STRING), ready for an encoder's prompt field or a text-save node.
Install and the API key
Manager → Custom Nodes Manager → search EmpirioLabs AI, install, restart. Or, by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/EmpirioLabs-AI/comfyui-empiriolabs.git
You need ComfyUI 0.3.48 or later - the pack uses the newer comfy_api node class, so on an older build the nodes just don't appear. No extra Python packages: aiohttp and Pillow already ship with ComfyUI.
Keys come from platform.empiriolabs.ai and start sk-empiriolabs-. Either set EMPIRIOLABS_API_KEY and restart ComfyUI, or copy config.example.ini to config.ini in the pack folder and paste the key after api_key = - read every run, so no restart. The folder is custom_nodes/comfyui-empiriolabs after a clone, custom_nodes/empiriolabs after a Manager install; the wrong one is the usual cause of "No EmpirioLabs AI API key was found."
When it goes wrong
"The reply ran out of tokens before any text was written." max_tokens is too tight and the model spent it on preamble. Raise it, or set it back to 0.
A refusal. Surfaced verbatim, and there's no local patch for it - the filter lives in weights you don't have.
Only one model in the dropdown. The startup catalog fetch didn't land - firewall, offline, API hiccup. The node falls back to a single model and retries in the background; reload the browser page to get the list back.
Costs that sneak up. Every run is a request. Leave control-after-generate on randomize and re-queueing bills you again each time; set it to fixed while you iterate on the prompt.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| model | COMBO | qwen3-8-27b | Chat model from the EmpirioLabs AI catalog. Prices and details: https://empiriolabs.ai/models |
| prompt | STRING | The message to send to the model. | |
| max_tokens | INT | 00–1000000 | Maximum length of the reply in tokens. 0 uses the model's default. |
| seed | INT | 00–2147483647 | Change the seed to run the node again. Models that accept a seed also receive it. |
| system_promptopt | STRING | Optional instructions for the model, sent as the system message. | |
| imageopt | IMAGE | Optional image, or a batch of images, for models that accept image input. The images are sent with the prompt. | |
| extra_parametersopt | STRING | Optional request fields as a JSON object, for example {"negative_prompt": "blurry"}. Each model lists the fields it accepts on its page at https://empiriolabs.ai/models. Fields set here take precedence over the dropdowns above. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| text | STRING | The model's reply. |