NodeTool on Comfy — render evidence

Real Comfy runs behind the challenge entry, recorded on 2026-11-03 from a cloud container with a Comfy API key. Every value below comes from a job response or a file on disk. Nothing is estimated.

Job 1: golden render (pinned graph, Comfy API v2 SDK)

Command:

COMFY_API_KEY=... node scripts/comfy-challenge/golden-render.mjs --out <dir>
Field Value
Comfy job id 1864fe95-f7a5-44dd-8542-66c963213e14
Status succeeded
Wall time, submit to terminal 95.3 s
Preset camera.dolly-in v1 (local-wan)
Seed 42
Source recipe-inputs/coffee.jpg, sha256 d9b38864…cf0a9d1f
Workflow sha256 a5c3b998…066f6692
Output H.264 MP4, 1280×704, 121 frames, 24 fps, 5.04 s, 4,353,844 bytes

Direction: “Warm steam rises gently from the ceramic cup under soft morning window light.” The take opens on the still, then drifts into a window scene in the last second. The direction mentions a window that the still does not show, so the default direction is now grounded in what the still contains (below).

Job 2: the NodeTool workflow, headless

Command (the source image is passed as a file:// ref because the CLI run context does not resolve package:// assets):

COMFY_API_KEY=... npm run dev:nodetool -- run \
  "packages/base-nodes/nodetool/examples/nodetool-base/Shot Director.json" \
  --params '{"camera_move":"orbit","seed":7,"source_image":{"type":"image","uri":"file:///<repo>/packages/base-nodes/nodetool/assets/nodetool-base/recipe-inputs/coffee.jpg"}}'
Field Value
Comfy job id 6baae0a5-b49b-4314-b010-af6bb99288e6
Status succeeded
Workflow wall time 88 s (12:46:26 to 12:47:54 UTC)
Preset camera.orbit v1
Seed 7
Direction “Steam curls up from the espresso cup on the dark wooden table among scattered coffee beans, warm low light.”
Comfy output manifest node 58, video/shot-director_00001_.mp4, video/mp4, 5,442,096 bytes
Output H.264 MP4, 1280×704, 121 frames, 24 fps, 5.04 s

comfy_job and run_settings came back as expected. The take output was empty: Comfy Cloud reports the SaveVideo file with type: "image", so the node emitted it on 58:image and the workflow’s 58:video edge never fired. The video above was downloaded from the finished job by id. The fix (outputKind in packages/integration-nodes/src/nodes/comfy-sdk.ts) routes by content type, with a test built from the real manifest. Job 4 below found a second cause.

Two earlier submissions failed in Comfy’s input validation within 3 seconds and rendered nothing (eb10e018-6e6e-4858-9a6d-140b240b9508, c880ece0-832f-40c9-9c64-fabb65f7719f): the source image could not be read, the node skipped it silently, and Comfy rejected the placeholder input.png. The node now refuses to submit when a connected media ref cannot be read.

Job 4: the workflow again, after the output fix

Same command as job 2 with "camera_move":"crane up","seed":11.

Field Value
Comfy job id 1b27be8f-cfb6-4b66-8c05-08897324ac60
Status succeeded
Workflow wall time 106 s (13:08:34 to 13:10:20 UTC)
Preset camera.crane-up v1
Output H.264 MP4, 1280×704, 121 frames, 5.04 s, 2,852,572 bytes

The take was still empty. The job’s event stream ended without any outputReady event, and the node only emitted files from that stream. The node now also emits every output on the finished job that the stream did not deliver. Replaying this finished job through the fixed node, with no new submit, yields 58:video (video/mp4, 2,852,572 bytes) followed by the output manifest. The motion reads as a tilt down into the beans more than a crane up, which is within the “prompt guidance, not camera control” caveat.

Job 3: Comfy Router provider, text to image

ComfyCloudProvider.textToImage from the feat/comfy-router-provider branch, model luma/photon-flash-1, aspect ratio 16:9.

Field Value
Router request id 10e880b4-1f9e-434d-ace9-5bfa3c2f817c
Path POST /v2/models/luma/photon-flash-1/requests 201, 4 status polls, result 200
End to end 13.8 s
Output JPEG, 2048×1152, 116,274 bytes

Job 5: Comfy Router provider, image to video

ComfyCloudProvider.imageToVideo from feat/comfy-router-provider at 3038072d, model byteplus/seedance-1-0-pro-fast-251015, the coffee still as first frame, 5 s, 16:9.

Field Value
Router request id 64e17545-0150-4048-817c-682868f52c65
Request body content[] with the text prompt and the image as first_frame, ratio 16:9, duration 5
Path POST …/requests 201, 8 status polls, result 200, video fetched from the signed URL
End to end 57.5 s
Output H.264 MP4, 1920×1088, 121 frames, 24 fps, 5.04 s, 15,642,432 bytes

The take holds the source still and pushes in on the cup as prompted.

The Router path is a partner API, not part of the open-weights render path.

Job 6: the storyboard clip model through the provider

ComfyCloudProvider.imageToVideo with model comfyui-workflow/wan2.2-ti2v-5b, the path a storyboard shot render takes after generate_media. The prompt was the default direction plus the clause compileCameraPresets(["camera.dolly-in"]) returns for this model, the coffee still, 5 s, 16:9, seed 21.

Field Value
End to end 90.5 s
Output H.264 MP4, 1280×704, 121 frames, 24 fps, 5.04 s, 4,267,129 bytes

The provider does not return the Comfy job id to the caller, so this run has no job id on record.

Job 7: a storyboard shot rendered from the browser

A three-shot board created through storyboards.create, with the coffee still on each shot, camera.dolly-in on shot 2 and the board’s video model set to comfyui-workflow/wan2.2-ti2v-5b. Driven with Playwright against npm run dev: open the board, open Render clip on shot 2, press Render clip.

Field Value
Click to shot status rendered 123.7 s
Shot after the render clip set to a new video asset, clip_versions length 1
Output H.264 MP4, 1280×704, 121 frames, 5.04 s

The render dialog showed the ComfyUI workflow note and Open ComfyUI workflow. Pressing it opened an editable copy of the Shot Director example with 10 nodes, including Run ComfyUI Workflow (Comfy Cloud). The dialog now closes after the copy opens, so the graph is in view.

Jobs 8 and 9: the Wan 2.2 14B and LTX-2.3 graphs

Both graphs submitted through the Comfy API v2 SDK with the coffee still, the compiled camera.dolly-in clause, seed 42.

Model Comfy job id Submit to finished Output
Wan 2.2 I2V A14B, 4-step lightx2v 000d3078-57b1-4a16-8601-10169b3f9289 36.6 s H.264, 832×480, 81 frames, 16 fps, 5.06 s
LTX-2.3 22B, two-pass 3e3e5873-8e1a-4038-8d53-dc9fbca52fe7 42.0 s H.264 1280×704, 121 frames, 24 fps, 5.04 s, plus AAC audio

Wan 14B holds the still and pushes toward the cup. LTX-2.3 adds rising steam and an audio track, and drifts away from the still in its last second.

MiniMax H3 has not been run. Its community license excludes the EU, the UK, the US and South Korea, so its graph is checked against Comfy Cloud’s node schemas and model list only.

Not yet verified

  • The Director agent writing shots from a brief, the timeline following a picked take, and export, all in the browser.
  • A storyboard render with the Wan 2.2 14B or LTX-2.3 models through the provider. Jobs 8 and 9 ran the same graphs straight through the SDK.
  • A full workflow run that shows the take on the take output end to end. The fix is verified by replaying job 4, not by a new run.