✦ ALCHEMIST // ANY ENGINE
One Node, Three Prompt Engineers, and a Wall of Widgets
- source_image
- control_image
- prompt
- reasoning
- model_used
- status
Most node packs give you one node per job, which is tidy until you're the person switching between jobs. ANY ENGINE is the opposite bet: every Alchemist engine behind a single target_engine dropdown, all the widgets present at once, one node to keep in a workflow you reuse.
Honest verdict up front: the pack author agrees with you. The focused KREA 2, LORA CAPTION and MINIMAX H3 nodes exist precisely because this one is a lot of node. Use this if you switch engines mid-session or you're carrying a workflow over from the older standalone ComfyUI-Alchemist pack, where this was the node.
What's actually in it
target_engine picks between three jobs, and the widgets for the other two don't disappear, which is the whole cost:
- krea2 - expand a lazy caption into one natural-language Krea 2 paragraph, or describe a
source_image. Add acontrol_imagewithcaption_modeset and it goes into ControlNet mode, where the geometry is treated as immovable and the LLM only restyles materials, light and mood.controlnet_locksays which geometry is locked;autoreads it off whether a control image is attached. - krea2_lora - the training-caption recipe.
lora_kinddecides what gets omitted so it binds to the trigger;trigger_wordgoes first in every caption;caption_words,omit_termsandextra_directiontune the output. - h3 - the MiniMax H3 three-field document.
clip_seconds,h3_aspectandh3_musicfeed the format;edit_instructionlets you steer a rewrite.
Engine names are normalised, so lora, caption, minimax, hailuo and video all resolve to the right engine - handy when you load somebody else's workflow and it was saved by an older build of the node.
Everything else is shared: the provider/model/reasoning trio, the nsfw toggle, and an advanced layer (temperature, max_tokens, api_key, custom_base_url, remember_key, reroll) that's marked advanced so the frontend tucks it away instead of burying the three fields you actually set.
Outputs are prompt, reasoning, model_used and status - the same four on every Alchemist node, so swapping between them doesn't break your wiring. prompt goes to your text encoder; status is worth a note node when you're comparing providers.
Why the LLM list is the interesting part
Twelve providers, twelve keys' worth of choice, one dropdown: xAI/Grok (the default), OpenAI, Anthropic, Google, OpenRouter, DeepSeek, Groq, Mistral, Together, Ollama, a local vLLM/LM Studio server, and a Custom OpenAI-compatible endpoint via custom_base_url. Three request dialects sit underneath, so an OpenAI-compatible server you host yourself is a first-class citizen, not a hack.
That matters because the LLM job here selects for small and obedient, not large and clever - and because of who refuses what. OpenAI, Anthropic and Google all decline explicit content. xAI's Grok is the loosest of the hosted options. Ollama and vLLM cost nothing per call and filter nothing, which is the whole reason the local tier is in a dropdown next to three frontier labs. A reasoning model is wasted on this job; it's slower and more likely to leak its thinking into your prompt.
Switching provider re-fetches the model list for it and tells you in a toast whether a key is ready. The action widget handles the rest - vault a key, list models, or run a text-only preview without queuing anything.
Install
ComfyUI Manager, search crypswolf69. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/babydjac/crypswolf69.git
pip install -r crypswolf69/requirements.txt
Restart, hard-refresh the browser. aiohttp is the only dependency and this node downloads nothing. Paste a key into api_key, run the action widget to vault it (or set XAI_API_KEY and friends), and you're done.
Where people get burned
The widget soup is the feature and the problem. Irrelevant widgets are still live-looking. Setting clip_seconds while target_engine is krea2 does exactly nothing, silently. If that ambiguity is what's slowing you down, switch to the focused node for the job you're actually doing.
Nothing shows up in the node list. This pack is written against ComfyUI's newer backend node API, and it defines no NODE_CLASS_MAPPINGS - on a current ComfyUI that's normal, on an old one it means the nodes never register. Update ComfyUI.
Know what you're installing. It's MIT, it's short enough to read, and it does the one honest thing here: the API nodes phone home by design, so an unexpected network call is exactly what you'd expect from this shape of node. The author has no community track record I could find - nothing on Reddit, no third-party reviews - so read the provider list and the vault behaviour yourself rather than trusting a reputation.
A key that vanishes. The vault is a fixed path (/workspace/.config/llm_vault/<provider>.key, mode 0600). If the ComfyUI process can't write there, vaulting fails quietly and the node complains about a missing key on the next run. Use the env var instead.
Inputs (26)
| Name | Type | Default | Description |
|---|---|---|---|
| action | COMBO | idle | Runs in the browser and resets to idle. Never queues a generation. |
| provider | COMBO | xAI / Grok | Which LLM answers. Use FETCH MODELS after switching. |
| model | COMBO | grok-4.20-non-reasoning | Model id. FETCH MODELS repopulates this from the live API. |
| reasoning | COMBO | provider default | Only bites on reasoning models, where it is the difference between 9s and 42s. Ignored elsewhere. |
| target_engine | COMBO | krea2 | 3 options: krea2, krea2_lora, h3 |
| simple_prompt | STRING | a woman standing in neon rain | — |
| nsfw | BOOLEAN | true | NSFW allows all explicit adult content. SFW keeps it non-explicit. |
| source_imageopt | IMAGE | — | |
| control_imageopt | IMAGE | — | |
| caption_modeopt | COMBO | regular | 2 options: regular, controlnet |
| lora_kindopt | COMBO | character | 4 options: character, body concept, style, clothing or object |
| trigger_wordopt | STRING | — | |
| caption_wordsopt | INT | 4520–70 | — |
| omit_termsopt | STRING | — | |
| controlnet_lockopt | COMBO | auto | 7 options: auto, depth, pose, depth+pose, canny, lineart, +1 |
| edit_instructionopt | STRING | — | |
| clip_secondsopt | FLOAT | 8.04–15 | — |
| h3_aspectopt | COMBO | 16:9 | 5 options: 16:9, 9:16, 1:1, 4:3, 21:9 |
| h3_musicopt | COMBO | auto | 5 options: auto, none, tense strings, warm piano, synth pulse |
| extra_directionopt | STRING | — | |
| api_keyopt | STRING | Leave empty to use the vaulted key or the provider env var. | |
| temperatureopt | FLOAT | 0.800–2 | — |
| max_tokensopt | INT | 140064–32000 | — |
| remember_keyopt | BOOLEAN | true | — |
| custom_base_urlopt | STRING | Override the provider endpoint. Required for the Custom provider. | |
| rerollopt | INT | 00–4294967295 | Output is cached while inputs are unchanged, so repeat queues are free. Bump this to force a fresh call. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| prompt | STRING | — |
| reasoning | STRING | — |
| model_used | STRING | — |
| status | STRING | — |