ComfyUI Node

Job Event Emitter

The Node That Tells Your App a Render Finished

By sammykumar·Created 5 months ago·Updated 5 months ago· 0
Job Event Emitter
  • video
  • sampler
  • video
job_id
events_url
event_token
negative_prompt
guidance_scale0.0
steps0
seed0

This one does nothing to pixels. Job Event Emitter (class JobEventFinished) is a webhook node: when the graph run completes, it POSTs a JSON payload to a URL of your choosing, telling some external thing "that job you queued is done, here's the output file." You reach for it when you're building an app or a job queue around ComfyUI - the classic production setup where a backend hands ComfyUI a job ID and needs a callback to know when to pick up the result. It ships in the same ImageGen-Toolkit-Dev-Utils pack as the URL loaders, and it's clearly the author's own integration glue (the code talks about posting to "the TanStack app") that they've published in case it's useful elsewhere.

How it works

It's an output node, which is the load-bearing detail: ComfyUI always executes output nodes, so this fires at the end of every run the way Save Image does - no caching tricks to defeat. When it runs it assembles a payload with event_type: "job_completed", a UTC timestamp, and whatever metadata you fed it, then POSTs it to events_url with an Authorization: Bearer <event_token> header and a 15-second timeout.

The clever bit is how it gets the output file. You wire the video input from a video-save node, and the emitter digs through that VHS_FILENAMES payload - checking filename/subfolder/type keys, and nested lists - to extract the rendered file's name. Best effort: it logs whether the payload came out "structured," "filename_only," or "none" so you can tell what your endpoint will actually receive.

Crucially, a failure never takes down your render. A blank URL or token just logs a warning and skips; a 4xx or 5xx from your endpoint is logged, not raised. The node returns its video input untouched, so you can chain it after a save node and still pass the filename payload onward.

The inputs that matter

  • job_id - your app's durable ID for this job. Lands in the payload as-is.
  • video - required, and it wants a VHS_FILENAMES type, which in practice means wiring it from a VideoHelperSuite video-save/combine node. Slight irony for a pack that brags about not needing VHS for its loader: this node quietly assumes VideoHelperSuite is installed to produce that input.
  • events_url and event_token - your webhook endpoint and bearer token. Leave blank and the node does nothing (no error, just a warning).
  • The metadata widgets - negative_prompt, guidance_scale, steps, sampler, seed - get forwarded to the payload. Defaults of 0/empty are omitted, so only fill what your endpoint cares about.

Outputs

One output: video, the same VHS_FILENAMES you fed in, passed through unchanged. This is a reporting node, not a transformation node.

Installing it

Search ImageGen Toolkit Dev Utils in ComfyUI Manager and install - that's the supported path (the README explicitly steers away from plain git clone; the dev flow needs npm install && npm run build plus the Python deps from pyproject.toml, since there's no requirements.txt). The README also insists on a current frontend (1.24.4 at the time of writing), so update that if anything looks odd. One thing to know going in: this pack is a brand-new, small personal project (GPL v3, by Sam Kumar) with essentially no community footprint, and this node's payload shape is whatever the author's own app expects. If you're building your own integration, treat the exact JSON contract as a starting point you'll likely adapt - not a standard anyone else is validating against.

Common issues

  • Nothing fires and no error shows. Check events_url and event_token are both filled; either being blank silently skips the post. Also confirm you're on a recent frontend - an old one can hide this node's behavior.
  • The payload is missing the output file. The emitter can only extract what the VHS_FILENAMES payload contains. If your save node hands it a bare filename with no subfolder/type, you get "filename_only" completeness - that's a save-node quirk, not this node's fault.
  • Your endpoint returns an error. It's logged with the HTTP status and a snippet of the response, but the render continues. Check ComfyUI's console output rather than the canvas for those messages.
CategoryImageGen Toolkit Dev Utils/Events

Inputs (9)

NameTypeDefaultDescription
job_idSTRING
videoVHS_FILENAMES
events_urlSTRING
event_tokenSTRING
negative_promptSTRING
guidance_scaleFLOAT0.0
stepsINT0
samplerSAMPLER
seedINT0

Outputs (1)

NameTypeDescription
videoVHS_FILENAMES