Nodes/crypswolfy69 nodes/✦ ALCHEMIST // ANY ENGINE
ComfyUI Node

✦ ALCHEMIST // ANY ENGINE

One Node, Three Prompt Engineers, and a Wall of Widgets

By babydjac·Created 26 days ago·Updated 9 days ago· 1
✦ ALCHEMIST // ANY ENGINE
  • source_image
  • control_image
  • prompt
  • reasoning
  • model_used
  • status
◄actionidle►
◄providerxAI / Grok►
◄modelgrok-4.20-non-reasoning►
◄reasoningprovider default►
◄target_enginekrea2►
◄simple_prompta woman standing in neon rain►
◄nsfwtrue►
◄caption_moderegular►
◄lora_kindcharacter►
◄trigger_word►
◄caption_words45►
◄omit_terms►
◄controlnet_lockauto►
◄edit_instruction►
◄clip_seconds8.0►
◄h3_aspect16:9►
◄h3_musicauto►
◄extra_direction►
◄api_key►
◄temperature0.80►
◄max_tokens1400►
◄remember_keytrue►
◄custom_base_url►
◄reroll0►

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 a control_image with caption_mode set and it goes into ControlNet mode, where the geometry is treated as immovable and the LLM only restyles materials, light and mood. controlnet_lock says which geometry is locked; auto reads it off whether a control image is attached.
  • krea2_lora - the training-caption recipe. lora_kind decides what gets omitted so it binds to the trigger; trigger_word goes first in every caption; caption_words, omit_terms and extra_direction tune the output.
  • h3 - the MiniMax H3 three-field document. clip_seconds, h3_aspect and h3_music feed the format; edit_instruction lets 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.

Categoryprompting/alchemist

Inputs (26)

NameTypeDefaultDescription
actionCOMBOidleRuns in the browser and resets to idle. Never queues a generation.
providerCOMBOxAI / GrokWhich LLM answers. Use FETCH MODELS after switching.
modelCOMBOgrok-4.20-non-reasoningModel id. FETCH MODELS repopulates this from the live API.
reasoningCOMBOprovider defaultOnly bites on reasoning models, where it is the difference between 9s and 42s. Ignored elsewhere.
target_engineCOMBOkrea23 options: krea2, krea2_lora, h3
simple_promptSTRINGa woman standing in neon rain—
nsfwBOOLEANtrueNSFW allows all explicit adult content. SFW keeps it non-explicit.
source_imageoptIMAGE—
control_imageoptIMAGE—
caption_modeoptCOMBOregular2 options: regular, controlnet
lora_kindoptCOMBOcharacter4 options: character, body concept, style, clothing or object
trigger_wordoptSTRING—
caption_wordsoptINT4520–70—
omit_termsoptSTRING—
controlnet_lockoptCOMBOauto7 options: auto, depth, pose, depth+pose, canny, lineart, +1
edit_instructionoptSTRING—
clip_secondsoptFLOAT8.04–15—
h3_aspectoptCOMBO16:95 options: 16:9, 9:16, 1:1, 4:3, 21:9
h3_musicoptCOMBOauto5 options: auto, none, tense strings, warm piano, synth pulse
extra_directionoptSTRING—
api_keyoptSTRINGLeave empty to use the vaulted key or the provider env var.
temperatureoptFLOAT0.800–2—
max_tokensoptINT140064–32000—
remember_keyoptBOOLEANtrue—
custom_base_urloptSTRINGOverride the provider endpoint. Required for the Custom provider.
rerolloptINT00–4294967295Output is cached while inputs are unchanged, so repeat queues are free. Bump this to force a fresh call.

Outputs (4)

NameTypeDescription
promptSTRING—
reasoningSTRING—
model_usedSTRING—
statusSTRING—