Nodes/comfyui-sora-node/Sora Image-To-Video
ComfyUI Node

Sora Image-To-Video

Animate any ComfyUI image with Sora — no VRAM, just an API key

By maxczc·Created 9 months ago·Updated 9 months ago· 0
Sora Image-To-Video
  • image
  • job_id
  • status
  • result
promptA cinematic video based on this image.
api_key
negative_prompt
duration_seconds5.0
aspect_ratio16:9
seed
fps24
guidance_scale7.5
base_urlhttps://api.openai.com/v1/sora
endpoint/videos
metadata
webhook_url
wait_for_resulttrue
poll_interval3.00
max_wait_seconds120.00
download_path

SoraImageToVideo takes a ComfyUI image, animates it, and hands you back a short video - by shipping the job off to a Sora-compatible API. Before you get excited: nothing runs locally. There are no model files to download, no VRAM burned, no sampler settings to fight. The heavy lifting happens on someone else's server, and that server wants an API key. If you were hoping this was "Sora running on your 3060," stop right there. It's the opposite: a thin API client wearing a ComfyUI costume.

That's not a knock. It earns its place in two situations: you have an OpenAI Sora API key (or a Sora-compatible backend) and want to drive it from inside a graph, or your hardware would take several minutes and every last GB of VRAM to run Wan 2.2 locally and you'd rather pay for a clip. Local video generation is free but heavy; this is the outsource-it path. The pack is just three nodes wrapping the same REST client - this is the image-to-video variant and the most popular of the three.

How it works

The node is pure Python standard library - urllib, no requests, no torch. The README makes a point of saying the core works with no extra packages, and it's telling the truth: there's no requirements.txt in the repo. Pillow and numpy are optional, only for better image handling.

Under the hood it does four things:

  1. Takes your image input and converts it to PNG bytes - it accepts PIL images, numpy arrays, file paths, and base64, so a plain Load Image node just works.
  2. POSTs multipart form-data with your prompt to base_url + endpoint, defaulting to https://api.openai.com/v1/sora + /videos.
  3. Polls the job until the status turns succeeded.
  4. Optionally downloads the mp4 to download_path.

The generation itself is async on the server; the node just waits it out.

The inputs that matter

  • image (required) - wire any ComfyUI image node into this.
  • prompt (required) - what you want the video to do with that image.
  • duration_seconds (5), aspect_ratio (16:9), fps (24), guidance_scale (7.5) - the knobs you'll actually touch.
  • seed - a string, not a number. Type 12345, not 12345-as-int; leave it blank for random.
  • api_key - leave blank and set SORA_API_KEY or OPENAI_API_KEY in your environment instead. The node checks the field first, then the env vars.
  • base_url / endpoint - only touch these if you're pointing at a non-OpenAI Sora-compatible backend.
  • download_path - set this or you never actually see the video.

The three outputs are all strings: job_id, status, and result. result is a JSON blob holding the job id, the status, the downloaded file path (if any), and the raw API response. There's no preview node here - you set download_path and open the mp4 yourself.

Install

cd ComfyUI/custom_nodes
git clone https://github.com/maxczc/comfyui-sora-node sora

Then fully restart ComfyUI - the README is emphatic: shut the server down and start it again, don't just refresh the browser tab. ComfyUI Manager can find it if you search the pack title, but the manual clone is the documented path. No model files to fetch and no pip install unless you want the optional image handling - a genuine relief in a scene where most custom nodes drag in a dependency or six.

Where people get burned

  • Timeout. Video generation routinely takes longer than the default 120-second cap. See a TimeoutError? Crank max_wait_seconds up; that's the first thing I'd change.
  • No key. You'll get Provide a Sora API key via the node input or SORA_API_KEY/OPENAI_API_KEY env vars. That means it can't find a key anywhere.
  • Key in the workflow. Paste it into the api_key field and it's stored in plaintext inside your workflow JSON. Prefer the env var, or a shared .json becomes a leaked paid key.
  • "It worked, but where's the video?" No preview makes it easy to think nothing happened. Point download_path at a folder and clips land as <job_id>.mp4.

Honest summary: it's a small, anonymous pack with no real community footprint, but it's cleanly written and free of dependency hell. If you have a Sora key, it does exactly what it says. If you don't, nothing here helps until you get one.

CategorySora

Inputs (17)

NameTypeDefaultDescription
imageIMAGE
promptSTRINGA cinematic video based on this image.
api_keyoptSTRING
negative_promptoptSTRING
duration_secondsoptFLOAT5.0
aspect_ratiooptSTRING16:9
seedoptSTRING
fpsoptINT24
guidance_scaleoptFLOAT7.5
base_urloptSTRINGhttps://api.openai.com/v1/sora
endpointoptSTRING/videos
metadataoptSTRING
webhook_urloptSTRING
wait_for_resultoptBOOLEANtrue
poll_intervaloptFLOAT3.00
max_wait_secondsoptFLOAT120.00
download_pathoptSTRING

Outputs (3)

NameTypeDescription
job_idSTRING
statusSTRING
resultSTRING