LC H3 Reference Assembler (BETA) πΌοΈ
Nine reference pictures, each with a job β the part H3 actually reads
- images
- refs
- ref_text
- sheet
- warnings
Every video model with a reference input eventually teaches you the same lesson: the pictures aren't the hard part, the instructions are. Dump a face, a room and a cup into H3 and it will happily blend all three - you get a person who looks a bit like a pier. H3 reads up to nine reference pictures, addresses them as <Picture 1> through <Picture 9>, and what makes references land is telling it what to take from which.
LC H3 Reference Assembler (BETA) is that worksheet. Each connected picture gets a role and a name, and the node writes the sentences that tell H3 what to lift from each one.
What it does under the hood
The images input is an autogrow socket group - image_1, image_2, and so on, a new one appearing as you fill the last, up to nine. A small JS front-end (web/lc_h3_refs.js) turns those into a form with one row per wired picture: its <Picture n> number, a role, a name, and an optional note. Those rows are stored in the hidden references STRING widget as JSON, keyed by socket number, so unplugging a picture doesn't lose its row.
Roles are the whole point: cast face, cast full body, setting, prop, style, and off (connected but not sent). Each one generates different language. A person becomes "Lonecat is the person shown in <Picture 1>: the same face and hair, exactly as shown, but not the background." A setting gets "take only the place and its light from <Picture 2>, none of its people" - which is the sentence that stops you inheriting a crowd of strangers into every shot. A prop gets "the same shape, colors and any printed text". A style gets "its colors, light and grain. Take nothing else."
Pictures are renumbered in slot order, so if you disconnect slot 2, the old slot 3 becomes <Picture 2>. That's not cosmetic: it means a later node can hand H3 only the references one shot needs, renumbered from 1, with the sentences rewritten to match.
Inputs and outputs
images is the autogrow group. references is the JSON the form writes - leave it alone and fill the rows on the node; hand-edit it into invalid JSON and you get a clear "undo the last change, or delete the node and add a new one", which is the author admitting this is fragile.
Four outputs, and all four earn their place. refs is an LC_H3_REFS bundle that goes into LC H3 Segment's refs input - each segment then gets only the references its shot names. ref_text is the sentences themselves as one string: put it at the start of your prompt, not buried mid-action. sheet is a contact strip image with every picture labelled with its number, role and name - preview it, because reading the JSON to check what slot 4 is set to is a waste of your afternoon. warnings is a STRING that's empty when everything looks fine.
The warnings are more useful than warnings usually are. Nameless cast gets flagged (shots find people by name), as do nameless settings and props. More than nine pictures gets flagged and truncated. And a full-body picture with no matching face close-up gets called out, because a face close-up holds identity far better than a distant body shot - the single biggest quality lever with reference conditioning, and the one most people skip.
Install
Manager β search "ComfyUI LC Audio_Video Nodes", or:
cd ComfyUI/custom_nodes
git clone https://github.com/lonecatone23/ComfyUI_LC_AV_nodes
Restart, in the ComfyUI folder's console you want [LC AV] total β¦ nodes. __init__.py has to sit directly in the pack folder; a nested folder of the same name loads nothing and looks like the pack silently vanished.
Two things specific to this node. It's written on ComfyUI's newer node API - comfy_api.latest schemas plus io.Autogrow - so it needs a reasonably current ComfyUI; on an older build it won't import and the autogrow sockets won't appear. And hard-refresh the browser after install or any pack update, or the role/name form won't render and you'll be staring at a bare JSON widget wondering why nothing has a role.
Where people get burned
The default role is cast face. If a picture is connected and its row has no role, it's treated as somebody's face, silently. Point a picture of a kitchen at a node with no role set and H3 gets told the kitchen is a person.
Names are the join key across your whole project, so decide them once: "Lonecat", "the fishing pier", "red cup". Rename the character halfway through and each shot's include-list stops matching.
And nine is a ceiling, not a target. Every picture costs context. Two good face close-ups, one setting and one prop beat nine scattered images.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| references | STRING | {"items": [{"slot": 1, "role": "cast face", "name": "Lonecat", "note": ""}, {"slot": 2, "role": "setting", "name": "the fishing pier", "note": ""}]} | The roles and names as JSON. Fill them in on the node. |
| images | COMFY_AUTOGROW_V3 | Reference pictures. A new socket appears as you fill the last one (9 at most). |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| refs | LC_H3_REFS | The references with their roles, for the H3 nodes. |
| ref_text | STRING | The sentences that tell H3 what to take from each picture. Put them at the start of a prompt. |
| sheet | IMAGE | Every picture with its <Picture n> number, role and name. |
| warnings | STRING | What to fix. Empty when it all looks good. |