Nodes/crypswolfy69 nodes/✦ ALCHEMIST // KREA 2
ComfyUI Node

✦ ALCHEMIST // KREA 2

Krea 2 Wants a Paragraph, Not a Tag Soup

By babydjac·Created 26 days ago·Updated 8 days ago· 1
✦ ALCHEMIST // KREA 2
  • source_image
  • control_image
  • prompt
  • reasoning
  • model_used
  • status
◄actionidle►
◄providerxAI / Grok►
◄modelgrok-4.20-non-reasoning►
◄reasoningprovider default►
◄simple_prompta woman standing in neon rain►
◄nsfwtrue►
◄caption_moderegular►
◄controlnet_lockauto►
◄edit_instruction►
◄extra_direction►
◄api_key►
◄temperature0.80►
◄max_tokens1400►
◄remember_keytrue►
◄custom_base_url►
◄reroll0►

Krea 2 reads prose. Not masterpiece, best quality, (cinematic:1.3) - a plain paragraph describing what's in the frame, in the order a photographer would say it. That's exactly the part most people are bad at, so Alchemist's KREA 2 node takes your lazy one-liner ("a woman standing in neon rain") and hands back the paragraph.

The name is doing some work here: Alchemist is the prompting half of the crypswolf69 pack, and this node doesn't generate anything. It calls an LLM - xAI/Grok by default - and gives you a string to wire into your text encoder.

How it works

The node ships a hand-written system prompt that encodes a working Krea 2 recipe: natural language only, no weight syntax, no negative prompt (Krea 2 has neither); describe subject and action, then spatial layout, then framing and lens, then light and its direction, then materials, then medium and mood. It names the medium explicitly, because otherwise the model drifts to its default house style, and it adds specific imperfection - a chipped mug rim, flyaway hair - because that's what stops an image reading as AI.

The interesting rule is faithfulness: expand only what the seed implies, never add people or props it didn't ask for. Enhancers earn their name by adding detail, and an unconstrained one adds detail you didn't want - the classic subject-drift failure of every prompt enhancer.

Then it makes one chat call and returns the text. No local model, no weights, no GPU.

Plug an image into source_image and the job flips: the LLM reads the picture and describes what's actually there instead of expanding your text. Images are resized down before they go out, so you're not paying tokens on a 4K upload.

There's also a ControlNet mode. Set caption_mode and attach control_image, and the system prompt switches to "the geometry is locked, describe only what's repaintable" - materials, clothing, colour, light. controlnet_lock says which geometry is immovable, and auto infers it from whether a control image is attached. That combination is genuinely useful when you want a new look on a pose you already like.

Inputs that matter, and the outputs

You'll set four things: provider, model, simple_prompt, and nsfw. That's it on day one. Everything else - temperature, max_tokens, api_key, custom_base_url, reroll - is marked advanced and tucked away with the same defaults the author tuned. reasoning only does anything on reasoning models, and there it's the difference between roughly nine seconds and forty; leave it at the provider default.

Outputs are prompt (wire it into your Krea 2 text encode), reasoning (the model's scratch thinking - ignore it, or log it if a prompt came out weird), model_used (handy, because providers silently serve a dated snapshot of a model id), and status, a one-line summary worth feeding into a note node.

reroll looks like an odd widget until you know the caching story: while the inputs are unchanged the node's output is cached, so re-queuing costs nothing. Bump reroll for a genuinely fresh call. Its little control_after_generate dropdown decides whether that number moves after a run.

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 ComfyUI and hard-refresh the browser. The only dependency is aiohttp, and there are no model downloads for this node. The pack is written against ComfyUI's newer comfy_api.latest node API, so it needs a reasonably current ComfyUI - on an old build you get no nodes and no error.

Then get a key: paste it into api_key and run the node's action widget (it fires in the browser and drops back to idle - it never queues a generation). The key is vaulted to disk per provider, 0600, and env vars like XAI_API_KEY work too if you'd rather not store it.

Where people get burned

Refusals. OpenAI, Anthropic and Google all decline explicit adult content, and the node doesn't paper over it - you get an error instead of a caption. The provider defaults exist for a reason: xAI's Grok has the loosest policy of the hosted options, OpenRouter reaches uncensored community models, and Ollama or a local vLLM server costs nothing per call and doesn't filter at all.

No vision. source_image is useless on DeepSeek - that provider is text-only.

Not enough to work from. Give it a simple_prompt, a source_image, or an edit_instruction. Two of three empty gets you a plain "Nothing to work from" error, which is at least honest.

One thing this node can't fix: Krea 2's own trained-in refusal and its flat facial expression are properties of the weights, not of your prompt. Better prompt text helps; it does not unlock the craters.

Categoryprompting/alchemist

Inputs (18)

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.
simple_promptSTRINGa woman standing in neon rain—
nsfwBOOLEANtrueNSFW allows all explicit adult content. SFW keeps it non-explicit.
source_imageoptIMAGE—
control_imageoptIMAGEOnly used when caption_mode is controlnet.
caption_modeoptCOMBOregular2 options: regular, controlnet
controlnet_lockoptCOMBOauto7 options: auto, depth, pose, depth+pose, canny, lineart, +1
edit_instructionoptSTRING—
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—