Nodes/Prompt Helpers/Parse Lines
ComfyUI Node

Parse Lines

Human-readable prompt files, machine-ready JSON

By Pauan·Created 8 months ago·Updated 5 months ago· 3
Parse Lines
    • JSON
    text

    ComfyUI's default prompt box is fine until you have a prompt that needs structure - separate sections, weighted lines, a chunk that only belongs in the negative, or a prompt stored in an external file so you can edit it without touching the graph. Parse Lines is the node that takes plain, readable text and converts it into the structured JSON that this pack's prompt pipeline runs on. It's the front end of a small idea: your prompt text stays human-first, and the machine gets what it needs.

    The output is a JSON value (an EZ_JSON object) that plugs into the pack's EZ Prompt node, which turns it into conditioning. So the chain is: Parse Lines → EZ Prompt → KSampler. Parse Lines alone doesn't generate anything - it's the parsing half.

    What the text format can do

    Each line is a prompt line, optionally weighted by appending * 1.2 (or any number). Beyond that, a few keywords unlock structure:

    • BREAK (or ---) ends the current chunk. For CLIP-based models with a 75-token limit, this is how you get more than 75 tokens in, or keep "blue eyes and dress belong to the girl, green eyes and jacket belong to the boy" from bleeding together.
    • BUNDLE: name groups lines into a named bundle, and <bundle:name> / <bundle-inline:name> reference it - reuse the same tag set in multiple places without repeating it.
    • FILE: path includes another prompt file (resolved against ComfyUI/models/prompts), so your prompt library can live in text files, not node widgets.
    • REGION: {x, y, width, height, ...} and MASK-REGION: name {strength, isolated} tag lines for regional or masked prompting - the pack's EZ Mask Regions nodes consume those.
    • <lora:name> declares a LoRA to apply, with * weight on the line.
    • // and # start comments (escape with \ if you need a literal one), and the parser cleans up stray whitespace.

    That's a lot of surface area, but you can ignore 90% of it - most people just use weighted lines, BREAK, and maybe FILE:. The parser errors loudly on syntax it doesn't recognize (like a BREAK buried in the middle of a line), which beats silent misbehavior.

    Inputs and outputs

    • text (multiline STRING) - paste the prompt text or wire it in.
    • JSON output (EZ_JSON) - feed to EZ Prompt.

    Install

    Part of the Prompt Helpers pack by Pauan. ComfyUI Manager → search "Prompt Helpers", or:

    cd ComfyUI/custom_nodes
    git clone https://github.com/Pauan/comfyui-prompt-helpers
    

    Restart ComfyUI. Dependencies are just PyYAML and desktop-notifier; no models. The pack requires ComfyUI 0.8.0+ (Nodes 2.0 API), so update ComfyUI if the nodes don't appear.

    Where people get burned

    • FILE: paths are relative to ComfyUI/models/prompts, not the workflow folder. Drop your prompt files there, and note that FILE: forces the node to re-run every time - a deliberate hack (there's a GitHub discussion about it) so edited files actually take effect.
    • A missing file is a hard error: File not found: ..., right in the middle of a queue.
    • The 75-token reasoning is a CLIP-era rule. If you're on a modern LLM-encoded model (Flux, Anima, Z-Image), there's no 75-token chunk boundary, so BREAK is meaningless there - it won't hurt, it just won't do anything. This node is aimed squarely at SD 1.5/SDXL-lineage prompting.

    The honest pitch: if you're still hand-writing every prompt in a ComfyUI text box, this node feels like overhead. If you're managing a library of prompts - weighted, sectioned, shared across workflows - Parse Lines is what makes that work without a mountain of node widgets.

    Categoryprompt_helpers/prompt

    Inputs (1)

    NameTypeDefaultDescription
    textSTRING

    Outputs (1)

    NameTypeDescription
    JSONEZ_JSON