Protoface Wan 3.0 · Reference to Video
Character Consistency Without Training a LoRA
- video
- files
- run id
Want the same face in ten different shots without training anything? That's the pitch of reference-to-video, and on Wan 3.0 base it's the cheapest version of the idea: up to ten images, five videos and five audio clips as conditioning, and a prompt that says what to do with them.
The local alternative is a training run
On open Wan 2.2, consistency means LoRAs - a training run, a dataset, a high/low pair, and a report from someone who actually did it: ninety minutes on a 5090 for a character pair. Then you find out that stacking a speed LoRA on top degrades the very likeness you trained for, which is the exact complaint that produced the community's "speed LoRAs kill everything that's good in it" warning.
Reference conditioning sidesteps the whole pipeline. You don't need twenty curated images and a trainer; you need one good front-on portrait and a prompt. It's less precise than a well-trained LoRA and less reproducible run-to-run, but it takes four minutes instead of an afternoon.
How it works
This node is generated at startup from the bundled Protoface catalog - alibaba/wan-3.0 × video.reference - and runs the same shared HTTP adapter as every other Protoface node in the pack: schema validation first, then upload (content-hash cached), submit, poll, download, decode to a native VIDEO. The request identity is journaled before submission, which is why an unchanged requeue resumes rather than re-bills.
The mechanism you have to internalise is ordering. These are array inputs, and the author's tooltip says reference media are identified by their array order in the prompt. Your prompt is the index. "Image 1" is the first thing in reference_images, and if you reshuffle the connections you've silently rewritten your prompt.
Inputs
prompt - positive prompt, and per above also your addressing scheme.
reference_images, reference_videos, reference_audios - three list fields, each offering native Image/Video/Audio modes, a References mode for a Protoface Asset Reference (existing asset ID or public URL), and Default to send nothing. Slots grow as you connect, and the caps are enforced: ten images, five videos, five audios, with items inside a batch counting toward the limit.
duration - 2–30 seconds, default 5, with one wrinkle: if you feed reference videos, input duration plus output duration must stay under 30 seconds.
resolution - 480p / 720p (default) / 1080p. aspect_ratio - required combo, default 16:9. enable_audio - default true. enable_prompt_expansion - default false, and leave it false; a rewriter that paraphrases your prompt can happily drop the word "image 3". seed - optional.
Outputs
video, a list of native VIDEO results. files, the original download for Protoface Save File. run id, a string for Protoface Resume Run. Save the run id on multi-reference jobs; reconstructing a ten-image setup from memory is nobody's idea of fun.
Install
cd ComfyUI/custom_nodes
git clone --branch v0.1.0 --depth 1 https://github.com/protoface-ai/protoface-comfyui.git protoface
python -m pip install -r protoface/requirements.txt
Manager: search Protoface → protoface-nodes → restart → reload. ComfyUI 0.41.0+, Python 3.10+, four small Python deps (httpx, jsonschema, Pillow, av) and no model weights at all. Paste your key via the Protoface button bottom-right; it's held in memory, so a restart means re-entering it unless you've set PROTOFACE_API_KEY_FILE.
A pattern that works
Load one clean portrait and one environment shot. Connect them in that order. Prompt literally: "the woman from image 1 walks through the space in image 2, medium shot, slow handheld follow, overcast light." Generate at 480p to check whether the identity actually survives; if it does, same prompt, 720p. If the face melts, add a second portrait from a different angle as image 3 and be explicit about it being the same person - more angles, less guessing.
For casting at volume, upload your reference set once and drive the fields through Protoface Asset Reference by asset ID. Re-encoding the same images on every run is wasted time and wasted bandwidth.
Where people get burned
Everything at once. Ten images and three videos in the first attempt is how you get a blurry average of everything. One subject, one environment, then grow.
Unindexed prompts. "The woman in the red coat" when you have four references is a coin flip. Count and name.
Over-budget duration. A 20-second reference video plus a 15-second output is 35 seconds and won't submit. Do the arithmetic before you queue.
Assuming a reference clip is a motion template. These are conditioning inputs, not ControlNet. If you want frame-accurate motion transfer, that's a different tool.
Forgetting that media leaves your machine. This is an API node; every reference you connect is uploaded. Keep that in mind for client work, and note that Comfy Cloud won't run this pack at all.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | The positive prompt for the generation. Reference media are identified by their array order in the prompt. | |
| resolution | COMBO | 720p | The resolution of the generated video. |
| duration | INT | 52–30 | The duration of the generated video in seconds. Default: 5. Without video input, use an integer from 2 to 30. When reference videos are provided, the total input video duration plus the generated output duration must not exceed 30 seconds. |
| aspect_ratio | COMBO | 16:9 | The aspect ratio of the generated video. |
| enable_audio | BOOLEAN | true | Whether to include audio in the generated video. |
| enable_prompt_expansion | BOOLEAN | false | If set to true, the prompt optimizer will be enabled. |
| reference_audios | COMBO | Public URLs, data URIs, or asset ids. | |
| reference_images | COMBO | Public URLs, data URIs, or asset ids. | |
| reference_videos | COMBO | Public URLs, data URIs, or asset ids. | |
| seed | COMBO | The random seed to use for the generation. -1 means a random seed will be used. | |
| generation_id | INT | 00–9007199254740991 | Keep fixed to reuse/resume this paid job. Increment for a fresh paid generation; independent of the model seed. |
| request_scope | STRING | Automatically assigned per node. Headless clients must supply a stable unique workflow/node ID. This is not a secret. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| files | PROTOFACE_FILE | — |
| run id | STRING | — |