Protoface FLUX.3 Video · Interpolate Video
Two Stills, One Shot, No Morphing
- video
- files
- run id
Two images, one clip: give FLUX 3 a start_image and an end_image and it generates the motion that connects them. This is the operation I'd reach for first with any FLUX 3 node, because it converts the model's weakest trait - inventing a consistent shot from scratch - into a problem it's much better at.
Why keyframes beat free-running video
The consistent criticism of FLUX 3 Video in the KB's coverage is shot-to-shot and action-to-action coherence. You can't prompt your way around that reliably. What you can do is remove the ambiguity: a start frame and an end frame pin down composition, subject, palette and light at both ends of the clip, and the model's job becomes interpolation - the thing diffusion is genuinely good at.
It's also the cheapest way to control a client deliverable. Generate the two stills anywhere you like - locally, with Qwen, with FLUX.2 Pro - composite exactly the before and after you want, then spend one video generation making it happen.
Note that on FLUX 3 this is a separate operation from image-to-video: the Image to Video node has only a single image input and no last-frame field. So keyframing lives here, not there.
How it works
Protoface bundles a catalog of model/task request schemas and generates native ComfyUI V3 nodes from them at startup; this is black-forest-labs/flux-3 × video.interpolate. All the generated nodes share one adapter - encode the images to PNG, upload anything not already cached by content hash, validate the payload against the schema before submission, submit, poll with a progress bar, download the result, decode it into a native VIDEO.
Because two images and a long duration are involved, the journal is worth understanding: the request identity (account, request_scope, node id, generation_id, model, schema fingerprint, payload hash including your image bytes) is recorded before the request goes out. Requeue an unchanged graph after a browser hiccup and it resumes the recorded run rather than buying a second one.
Controls
prompt - describe the transition, not the endpoints. "Slow push in as the light shifts from dusk to interior tungsten" is a prompt. Re-describing both stills in detail tends to produce a clip that looks like a soft dissolve between two unrelated photos.
start_image and end_image - both are mode-picking fields, not bare sockets. Set each to Image and connect a Load Image or any IMAGE producer, or to References and feed a Protoface Asset Reference. Batches get rejected: one asset per field.
duration - 5 to 20 seconds. This is how much time the model takes to travel from A to B, so it's a pacing control as much as a length one. Five seconds reads as a cut; twenty reads as a slow reveal, and gives the model more room to invent detail in between.
resolution - 720p or 1080p, default 720p. aspect_ratio - optional; unset, the model picks, which is usually wrong if your two stills are portrait. Set it explicitly.
generate_audio - default true. Sound generated across a transition tends to work better than sound generated next to a hard cut, which is one argument for interpolate over stitching two clips.
Still no seed on FLUX 3. Reproducibility = fixed generation_id + unchanged graph.
Outputs
video - a list of native VIDEO objects for preview, combine or further extension. files - the original download as a PROTOFACE_FILE, for Protoface Save File. run id - a string; keep it, especially on 1080p jobs where re-running is not free.
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
Or Manager → search Protoface → install protoface-nodes → restart → reload. ComfyUI 0.41.0+, Python 3.10+, with httpx, jsonschema, Pillow and av installed into ComfyUI's own interpreter. No weights, no GPU work. Paste your key via the Protoface button bottom-right; it's held in memory and won't survive a restart unless you set PROTOFACE_API_KEY_FILE.
What goes wrong
A morph instead of a move. The two stills share almost nothing - different framing, different light, different wardrobe. The model can't invent a physical path between them, so it crossfades. Match the frame and the subject; vary only what should change.
Portrait stills, landscape output. Set aspect_ratio rather than trusting the default with mismatched inputs.
Two images in one batch. A Load Image with batch_size 2 into start_image throws "expects one asset; split the image/audio batch first". Split with ImageFromBatch upstream.
Queueing a second pass to "fix" the first. You'll pay twice and, without a seed, get a different sample. Adjust the prompt and stills, accept that each attempt is fresh.
Deleting ~/.cache/protoface-comfyui mid-job. That directory holds the job journal and upload cache. Losing it while a submission is unresolved can turn one charge into two.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | The text prompt describing the video you want to generate. | |
| resolution | COMBO | 720p | Resolution of the generated video. |
| duration | INT | 55–20 | Video length in seconds (5-20). |
| aspect_ratio | COMBO | The aspect ratio of the generated media. | |
| end_image | COMBO | A public URL, a data URI, or an asset id. | |
| generate_audio | BOOLEAN | true | Whether to generate audio for the video. |
| start_image | COMBO | A public URL, a data URI, or an asset id. | |
| 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 | — |