Nodes/ComfyUI-Neo-Nodes/Neo Bundle Expand
ComfyUI Node

Neo Bundle Expand

Neo Bundle Expand

By neoneo-ai·Created 2 months ago·Updated about 13 hours ago· 1
Neo Bundle Expand
    • prompt
    • image_1
    • image_2
    • image_3
    • image_4
    • image_5
    • image_6
    • image_7
    • image_8
    • image_9
    bundle

    Neo Bundle Expand is an adapter, and nothing else. It takes the single BUNDLE wire from Neo Prompt Agent - a string that's secretly a pointer to a generation package sitting in ComfyUI's memory - and unpacks it into one prompt string and up to nine IMAGE tensors, in slot order.

    Why bother? Because H3's reference-to-video mode is why a lot of people installed H3 at all: hand it reference images and it carries a face, an outfit or a location into the clip instead of making you train a LoRA. The official MiniMax H3 Reference to Video node exposes those as autogrow sockets (ref_images.ref_image_0ref_image_8, plus video and audio groups), so the manual route is a prompt box and nine LoadImage nodes, rewired every time your references change. Neo's pack ships a director node that eats a bundle directly; this one is for the official graph.

    How it works

    When Neo Prompt Agent executes, it registers a payload - prompt, references, skill id - in a process-local dict and returns a short id like bnd_3f9c… as its BUNDLE output. That dict is capped at 32 entries with a one-hour TTL, and the references inside are lightweight: base64 data URIs, not tensors. They come from two places, in order - the frames of whatever is wired into the Agent's image input (a batch splits frame by frame), then images attached in the node UI with @-references or a local upload.

    Bundle Expand makes the reverse trip: looks the id up, takes prompts[0] as the prompt, decodes each reference back into a [1,H,W,C] RGB float tensor in 0–1. Unused slots come back as an empty batch - zero frames - so the output count stays at ten whether you have one reference or nine. It also hands the frontend the prompt plus 256px thumbnails, rendered as a read-only grid numbered to match the outputs, so you can see which reference landed in which slot before you blame the model for the wrong face. The autogrow is frontend-side: you get prompt and image_1 at first, and connecting the last visible image output reveals the next, up to nine.

    Inputs and outputs that matter

    bundle is the only input, a forceInput STRING - the widget is hidden, so it must be wired from the Agent's BUNDLE. You can't type or paste an id in.

    prompt is the bundle's first prompt. If the Agent ran a multi-result skill, its PROMPT output is a list of variants, but only the first gets through here.

    image_1image_9 map one-to-one onto H3's reference slots: image_1ref_images.ref_image_0, image_2ref_image_1, and so on. Order isn't cosmetic - a skill's <Picture 1> / <Picture 2> numbering refers to these slots, so swapping two wires puts the room on the person.

    Not here: clip, VAE, width, height, length - model-side settings still yours to set on the H3 node. And only images expand, since the bundle carries no video or audio, so ref_videos and ref_audios stay hand-wired with LoadVideo/LoadAudio.

    Installing it

    ComfyUI Manager → search Neo Nodes (the pack is on the ComfyUI Registry), install, restart. Or:

    cd ComfyUI/custom_nodes
    git clone https://github.com/neoneo-ai/ComfyUI-Neo-Nodes.git
    # restart ComfyUI
    

    The README claims requests/Pillow/PyYAML; the requirements.txt that actually installs is openai, Pillow, PyYAML, pypinyin. llama_cpp_python is optional, only for local GGUF inference, and this node needs nothing beyond torch and Pillow, which ComfyUI already has.

    The prerequisite is upstream: a bundle only exists if the Agent has run in this session, which means picking an LLM provider in its settings first (a remote key, or a GGUF in models/LLM/).

    Where people get burned

    The bundle does not survive a reload. It's a pointer into server RAM with a one-hour TTL, and none of it lives in the workflow file. Open yesterday's workflow and you get an empty prompt and empty images because the id is stale. Re-run the Agent - auto-generate on, or nudge the quick input so its IS_CHANGED fires - and it mints a fresh id on the way through.

    Leave unused slots unwired. Connect image_4 out of habit while the bundle holds two references and downstream receives an empty batch, not nothing - and empty batches aren't None, so nodes that assume one frame fail confusingly. Wire only slots whose thumbnails you can see.

    A blank thumbnail means a dropped reference. A reference that fails to decode is skipped, but slot alignment is kept, so <Picture 3> still points at slot 3 while slot 3 arrives empty. Odd source formats are the usual cause.

    Node missing entirely? It's imported inside a try/except in the pack's __init__.py, so a failure prints [NeoNodes] bundle_expand 节点注册失败 and quietly disables only this node. Read the console before reinstalling the pack.

    One more thing in its favour: it's flagged as an output node, so it runs with nothing wired downstream - a decent inspector for what the Agent is handing your H3 graph.

    CategoryNeo-Nodes

    Inputs (1)

    NameTypeDefaultDescription
    bundleSTRING

    Outputs (10)

    NameTypeDescription
    promptSTRING
    image_1IMAGE
    image_2IMAGE
    image_3IMAGE
    image_4IMAGE
    image_5IMAGE
    image_6IMAGE
    image_7IMAGE
    image_8IMAGE
    image_9IMAGE