OpenRouter Studio · Resume Video
Reclaim a video job after ComfyUI dies
- video
- poster
- local job id
- provider job id
- metadata JSON
- actual cost USD
You queued a video, ComfyUI froze or you hit interrupt, and now there's a half-finished job still running - and billing - on someone else's server. Resume Video is the node you grab instead of re-queuing and paying twice. It re-attaches to an existing OpenRouter video task, polls it to completion, and downloads the finished clip. It never submits a new generation request. That's the entire point, and it's the pack's best idea.
Why this exists: the Video node is interruption-safe by design. The moment OpenRouter accepts a task, its provider job ID is written to a private SQLite ledger in your ComfyUI user directory. So "resume" isn't guesswork - the job is on disk, and this node just needs its identifier. Both IDs work in the job_id field: the local Studio job ID (a UUID) or the raw OpenRouter provider job ID (the job-... string). Paste either one, and it looks up the ledger, resumes polling, and fetches the video when the provider is done.
How it works
Give it job_id, set poll_interval_seconds (default 5) and poll_timeout_seconds (default 3600), and let it run. prefer_local_completed_file (default on) reuses a completed local artifact when it still exists instead of re-downloading from OpenRouter - handy when you're re-running a workflow and the file is already on disk. When the task completes you get a native ComfyUI VIDEO value plus a poster IMAGE, same as the generating node would hand you.
Inputs and outputs
Inputs: job_id, poll_interval_seconds, poll_timeout_seconds, prefer_local_completed_file. That's the whole set - no model, no prompt, no seed. Outputs: video (VIDEO), poster (IMAGE), local job id, provider job id, metadata JSON, and actual cost USD.
When you actually need it
- Your Video node's polling was interrupted and the error said the remote job may continue - resume with the provider ID.
- ComfyUI was closed mid-job; on restart you want the result without re-generating.
- You started a video in Studio Mode (or an earlier workflow) and want the finished file pulled back into a graph now.
The README's rule of thumb: resume by job ID. Do not queue a second generation unless you have checked that the first provider task failed definitively. That discipline is exactly what this node exists to enforce.
Install
Same shared install as the rest of the pack - ComfyUI 0.28.0+, ComfyUI Manager → search OpenRouter Studio → Install → restart → paste your OpenRouter key on the first-run screen. No model downloads; dependencies are light.
Troubleshooting
- "Enter a local or OpenRouter video job ID": the field was left blank. Find the ID in the Job & Asset Center history, or copy the
job-...string from OpenRouter activity. - Invalid ID: if the ID isn't in the local ledger and isn't a recognizable provider ID, the node can't locate the task. A mistyped provider ID resolves to nothing useful - check OpenRouter's activity page to confirm the real one.
- The job failed upstream: resume will report that status honestly. It can't restart a dead task - that would be a new submission, which is the one thing this node refuses to do.
- It won't speed anything up: it polls at your interval and waits out the timeout. Long video renders take as long as they take.
This is the least glamorous node in the pack and one of the most useful. It's the safety net that lets you treat a metered, no-cancel video API as something you can afford to leave running - because when it breaks, you don't pay twice.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| job_id | STRING | Accepts a local Studio job ID or the OpenRouter provider job ID. | |
| poll_interval_seconds | FLOAT | 5.01–60 | — |
| poll_timeout_seconds | INT | 360060–86400 | — |
| prefer_local_completed_file | BOOLEAN | true | Reuse a completed local artifact when it still exists; otherwise fetch from OpenRouter. |
Outputs (6)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| poster | IMAGE | — |
| local job id | STRING | — |
| provider job id | STRING | — |
| metadata JSON | STRING | — |
| actual cost USD | FLOAT | — |