Nodes/ComfyUI_EmAySee_CustomNodes/EmAySee Text Combiner
ComfyUI Node

EmAySee Text Combiner

Join up to 50 strings with newlines before they hit your prompt encoder

By EmAySee·Created about a year ago·Updated 4 months ago· 2
EmAySee Text Combiner
    • text
    text_1
    text_2
    text_3
    text_4
    text_5
    text_6
    text_7
    text_8
    text_9
    text_10
    text_11
    text_12
    text_13
    text_14
    text_15
    text_16
    text_17
    text_18
    text_19
    text_20
    text_21
    text_22
    text_23
    text_24
    text_25
    text_26
    text_27
    text_28
    text_29
    text_30
    text_31
    text_32
    text_33
    text_34
    text_35
    text_36
    text_37
    text_38
    text_39
    text_40
    text_41
    text_42
    text_43
    text_44
    text_45
    text_46
    text_47
    text_48
    text_49
    text_50

    ComfyUI workflows have a habit of growing string sources like weeds: a wildcard picker, an LLM output, a fixed style block, a tag list, a negative-prompt section. At some point they all need to land in the same CLIP Text Encode, and a single STRING input takes one string. EmAySee Text Combiner is the gather node for that job: up to fifty optional string inputs, joined with newlines, one string out. It's the "collect all the prompt parts" node in this pack, and for prompt-assembly workflows it's genuinely the right tool.

    The fifty-cap matters more than it sounds like it should. Most text-combiner nodes top out around five or ten inputs; this one lets you wire a whole prompt architecture - subject, style, quality tags, lighting, camera, artist block, negative section - without stringing multiple combiners in series. Newlines are the separator (not commas, not spaces), so it suits multi-line prompt styles. If you want commas, join first with the pack's Text Replace or do it in a different combiner.

    How it works

    Every one of text_1 through text_50 is optional and force-input (you can't type into them - they're meant to be wired). The node walks them in order, skips any that are None or empty, and joins the rest with "\n":

    return ("\n".join(text_list),)
    

    That's the entire mechanism. Order is preserved, empty inputs are silently dropped, and the output is a single text string.

    The inputs that matter

    Honestly, none of them are special - they're all "text_N" and they all behave identically. What matters is the discipline you bring: keep a convention for which slot does what (slots 1-5 for subject blocks, 6-10 for style, etc.) so a workflow stays readable. The output, text, wires into your CLIP Text Encode's prompt input, or into another text node upstream of it.

    One thing to know: because every input is forceInput, you can't use this node to hand-type a fixed string into a slot. If you want to include a constant block, pipe it through a simple text node first - which, in this pack, means running a string literal through any string passthrough or the Text Replace node with empty find/replace pairs.

    Installing it

    Standard for this pack: ComfyUI_EmAySee_CustomNodes via ComfyUI Manager, or git clone https://github.com/EmAySee/ComfyUI_EmAySee_CustomNodes into custom_nodes/, restart. No dependencies, no models - pure string joining.

    Where people get burned

    The newline separator is the main gotcha: if your downstream expects comma-separated tags, this node will hand you newline-separated output, which some tag consumers choke on. Route through a join/transform node if you need commas. Also, fifty inputs is a lot of widget noise on the graph - for most workflows you'll use five or six slots and leave the rest empty, and empties are skipped, so that's fine. But a stray space or line-break in a single input will land in the middle of your joined prompt, so keep your source strings clean upstream. If your combiner output starts with a blank line, check for a source node that outputs whitespace.

    CategoryEmAySee/Text

    Inputs (50)

    NameTypeDefaultDescription
    text_1optSTRING
    text_2optSTRING
    text_3optSTRING
    text_4optSTRING
    text_5optSTRING
    text_6optSTRING
    text_7optSTRING
    text_8optSTRING
    text_9optSTRING
    text_10optSTRING
    text_11optSTRING
    text_12optSTRING
    text_13optSTRING
    text_14optSTRING
    text_15optSTRING
    text_16optSTRING
    text_17optSTRING
    text_18optSTRING
    text_19optSTRING
    text_20optSTRING
    text_21optSTRING
    text_22optSTRING
    text_23optSTRING
    text_24optSTRING
    text_25optSTRING
    text_26optSTRING
    text_27optSTRING
    text_28optSTRING
    text_29optSTRING
    text_30optSTRING
    text_31optSTRING
    text_32optSTRING
    text_33optSTRING
    text_34optSTRING
    text_35optSTRING
    text_36optSTRING
    text_37optSTRING
    text_38optSTRING
    text_39optSTRING
    text_40optSTRING
    text_41optSTRING
    text_42optSTRING
    text_43optSTRING
    text_44optSTRING
    text_45optSTRING
    text_46optSTRING
    text_47optSTRING
    text_48optSTRING
    text_49optSTRING
    text_50optSTRING

    Outputs (1)

    NameTypeDescription
    textSTRING