Cyberdelia Prompt Controls — Presets
Type your prompt once, wire it everywhere
- mode
- prompt
- use_vision
- active_system_prompt
Fair warning before anything else: this node does nothing. No LLM call, no network request, no CLIP, no image decoding. route() takes its four widgets and hands them straight back out as four outputs - it's the same species as ComfyUI's own Primitive and PrimitiveStringMultiline, the "one source, many consumers" value nodes that exist so a prompt lives in one place instead of being retyped into three boxes and mismatched in the third.
That sounds underwhelming until you're running two Prompt Engineer nodes at once. The pack ships Prompt Engineer - Text (plain STRING out, for Krea2, external encoders, metadata) and Prompt Engineer - Conditioning (positive/negative out, if you want the CLIP encoding done for you), and both want the same text, mode, use_vision and system prompt. With the controls node you edit your concept in one field and fan it out. The Presets variant is the one worth adding, because it also gives you a system-prompt picker and a fourth socket.
What the preset half is really doing
The dropdown is a frontend-only widget - it doesn't serialize into the workflow, so it never fights with widgets_values - and it fetches the preset list from the pack's own routes: /cyberdelia/z-engineer/presets for system presets, /cyberdelia/z-engineer/vision-presets when Vision mode is on. It follows the node's own use_vision toggle, which is the polite way of saying it can't see what the downstream engineer node is set to.
Pick a preset and its entire text is copied into the active_system_prompt field. Not the name - the text. That's a deliberate design choice and a good one: the actual prompt lives in the workflow, so a later edit to the preset file can't silently change what an old workflow generates. Same text goes out the fourth socket, into the engineer node's matching active_system_prompt input, and once that wire carries something non-empty it replaces the engineer's local system_prompt or vision_system_prompt entirely (that's a straight prompt_override or (...) in z_engineer.py - the local field is simply ignored).
Inputs and outputs
Four of each, same names in the same order:
mode(BOOLEAN, default on = "✨ engineered (LLM)") → the engineer'smode. Off means raw passthrough, no LLM, no network at all.prompt(multilineSTRING) → the engineer'stext. This is the seed idea.use_vision(BOOLEAN, optional) → the engineer'suse_vision.active_system_prompt(multilineSTRING, optional) → the engineer'sactive_system_prompt.
Nothing is required for runtime - the node is inert, so it can't fail on its own.
Install and wire it
ComfyUI Manager, search Cyberdelia, or:
cd ComfyUI/custom_nodes
git clone https://github.com/cyberdeliaAI/comfyui-cyberdelia-z-engineer.git
pip install -r comfyui-cyberdelia-z-engineer/requirements.txt
Then restart ComfyUI. The only dependency is requests; the legacy repo name is kept on purpose so existing installs update in place. It's MIT, by Cyberdelia AI Lab, forked from BennyDaBall930's ComfyUI-Z-Engineer - which is why the internals, the class IDs, and the preset folder are all still named z_engineer. (The name also collides with the Cyberdelia who ships the CyberRealistic checkpoints. I found nothing tying the two together; don't go looking for checkpoint docs here.)
Wiring means converting widgets to inputs on the engineer node - right-click the text field → Convert Widget to Input, same for mode, use_vision, active_system_prompt - then connect:
Cyberdelia Prompt Controls - Presets
mode ─────────────────► Prompt Engineer (mode)
prompt ───────────────► Prompt Engineer (text)
use_vision ───────────► Prompt Engineer (use_vision)
active_system_prompt ─► Prompt Engineer (active_system_prompt)
Personal presets are plain UTF-8 .txt files. Filename becomes the label, whole file becomes the prompt:
ComfyUI/user/z_engineer/presets/ # system presets
ComfyUI/user/z_engineer/vision_presets/ # vision presets
Hit ↻ Refresh presets after adding one. Name clashes with a bundled preset get a (User) suffix, and there are two built-ins: Cyberdelia Detailed 200–250 and Cyberdelia Faithful Image Caption.
Where people get burned
The connected active_system_prompt wins silently. Leave it wired and the engineer node's own preset dropdown still looks live - you can still click it - but its text goes nowhere. Disconnect or empty the wire if you want the local fields back.
Keep use_vision in sync. The controls node's picker offers text presets or vision presets based on its toggle. If the controls node says text and the engineer node says vision, you're feeding prose instructions into an image-description request, and the output will be mysteriously bad rather than error out.
No frontend, no picker. If the JS doesn't load or the routes fail to register, the widget degrades to [presets unavailable] and the node is just a text box. The text still passes through fine - presets are convenience, not mechanism.
One engineer node? You don't need this. Four wires and a conversion ritual to save typing one prompt field. The honest use case is the shared-prompt one, or a preset you apply across several engineer nodes from a single click.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| mode | BOOLEAN | true | — |
| prompt | STRING | — | |
| use_visionopt | BOOLEAN | false | — |
| active_system_promptopt | STRING | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| mode | BOOLEAN | — |
| prompt | STRING | — |
| use_vision | BOOLEAN | — |
| active_system_prompt | STRING | — |