System One Map
The Label-to-Prompt Translator That Isn't AI
- value
Here's the plot twist: System One Map touches no model, calls no API, and needs no key. It takes a label and hands back a string, and it does that in microseconds with a dictionary lookup. It's the most useful node in the pack to understand and the least glamorous.
Its job is closing the loop. System One Choice tells you the prompt wants watercolor; Map turns watercolor into soft wet-on-wet washes, cold-pressed paper texture, muted earth palette - or into an empty string, or into a whole second prompt, or into a filename suffix. Whatever the rest of the graph needs.
How it works
The mapping is a text field, one rule per line, with => between key and value:
photo => photo, 50mm, f/1.8, natural light, sharp focus
anime => cel-shaded anime illustration, clean linework
watercolor => loose wet-on-wet watercolour, visible paper grain
render3d => octane render, subsurface scattering, studio HDRI
* => photo, natural light
You wire the label into key, and the node returns the value for that exact key. Matching is exact-string after stripping whitespace - no wildcards, no case folding, no fuzzy anything. Watercolor and watercolor are different keys, and getting that wrong is the classic first run.
That last line, * => ..., is the default, and it's the reason this node pairs so well with a gated Choice. The model doesn't recognise your prompt, returns the fallback photo, and the map quietly produces the photo keywords anyway. No dead end, no error, no sampling a prompt with half a style tag hanging off it.
Inputs and output
key comes in on a socket - you wire it from whatever produced it, which is the point of the node. mapping is the multiline text field above.
The single output is value (STRING). Feed it into a prompt-concat, a style LoRA trigger word, a switch, or a Save-Image filename prefix.
The boundary cases that raise
This node fails loudly rather than guessing, which is the right call:
- A line without
=>-Mapping line must look like 'key => value': 'watercolor: soft washes'. If you're coming from the Choice node'slabel: descriptionsyntax, this will bite you once. Choice uses colons, Map uses arrows. - Duplicate keys -
Duplicate mapping key: 'anime'. - A key that isn't in the map and no
*line -No mapping for key 'photoreal' and no '* => default' line. Known keys: .... The error even lists the keys you did define, which is how you find the typo without squinting at the widget.
The one gotcha the author warns about himself
The node's own description says it: "For an INT level, convert it to a string first." System One Score's level is an integer, and Map's key is a string. ComfyUI won't quietly coerce an INT socket into a STRING input, so wire the level through something that emits text before it reaches this node - or sidestep it entirely by routing on choice (already a string) and keeping the score for a math comparison instead.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/dante01yoon/ComfyUI-SystemOne
# restart ComfyUI
Or search System One in ComfyUI Manager. Since this node needs no backend and no provider package, it works even on a machine where you never installed laya and never set an API key - it's the one piece of this pack you can use on its own.
Why it earns its place
The general argument for a plumbing node is repetition: one authoritative source, fanned out, instead of the same string typed in four widgets. Map is that with a translation step in the middle. You define your styles once as a table, and now every router in the workflow - style, mood, aspect, whatever the model is judging today - speaks the same vocabulary and lands in the same place.
And because it's a pure lookup with no network hop, there's no latency, no cost, and nothing to break when the API is down. If you're building a System One graph, this is the node you'll keep after you've thrown the rest away.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| key | STRING | — | |
| mapping | STRING | One 'key => value' per line; '* => value' is the default. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| value | STRING | — |