Sora Text-To-Video
Type a prompt, get a clip — provided you've got the key
- job_id
- status
- result
SoraTextToVideo is the simplest node in the comfyui-sora-node pack, and the one to reach for when you have a prompt and nothing else. Give it text, it hands the job to a Sora-compatible API, and a short generated clip comes back. The catch is right there in the name: nothing runs locally. This is an API client, not a model - no weights, no VRAM, no downloads, and no way around needing an API key. If you expected a local alternative to Wan or LTX Video, that's not what this is.
The honest use case: you already have a Sora key (or access to a Sora-compatible backend) and want to fire off clips from inside a ComfyUI graph instead of a separate website. It's also the least fiddly of the three nodes in the pack because there's no file to upload - it's a pure JSON request, so the only thing that can go wrong on your side is the prompt or the key. Text-to-video is where prompt quality matters most, too; the model has nothing but your words to anchor on.
How it works
The whole pack is a thin REST client written in Python's standard library (urllib, no requests, no torch), and this node is its simplest mode. It builds a JSON payload with your prompt and settings, POSTs it to base_url + endpoint (defaults: https://api.openai.com/v1/sora and /videos), gets a job id back, then polls GET /videos/<job_id> until the status flips to succeeded. If you set download_path, it grabs the resulting video and saves it as <job_id>.mp4.
Key resolution follows a strict priority: the api_key field, then the SORA_API_KEY env var, then OPENAI_API_KEY. Since a text prompt is the only required input, this node is effectively "one prompt string in, one JSON status blob out."
The inputs that matter
prompt(required) - the only thing you must supply. The default,"A cinematic drone shot of waves crashing.", is a fine starting point to prove the plumbing works.duration_seconds(5),aspect_ratio(16:9),fps(24),guidance_scale(7.5) - the generation knobs. Want a 9:16 clip for reels? Changeaspect_ratio.negative_prompt- forwarded to the API, though whether the backend actually honors it is up to the backend, not the node.seed- a string field, so type your seed as text. Leave blank for random.api_key- set the env var instead; more on that below.max_wait_secondsanddownload_path- the two that will actually bite you.
The outputs are three strings: job_id, status, and result. result is JSON containing the job id, status, downloaded file path (if any), and the raw API response. There's no preview - you open the file the node saved.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/maxczc/comfyui-sora-node sora
Then fully restart ComfyUI - closing and reopening the server, not refreshing the browser tab, per the README. ComfyUI Manager can install it too if you search the pack title. There's no requirements.txt and nothing to download; Pillow and numpy are optional and only matter for the sibling nodes that handle images.
Where people get burned
- Timeout. Generation rarely finishes within the default 120-second
max_wait_seconds. Hit aTimeoutError? Raise it. Long prompts and long durations make this more likely. - No key. You'll see
Provide a Sora API key via the node input or SORA_API_KEY/OPENAI_API_KEY env vars.Nothing runs until that's sorted. - Key in the workflow. Pasting the key into the field stores it in plaintext in your saved workflow. Prefer the env var; it keeps the key out of any .json you share.
- Expecting local control. This isn't Wan - no sampler overrides, no ControlNet, no local LoRAs. You get what the API gives you. If you want to actually steer generation, you're on the wrong pack.
It's a small, anonymous pack with essentially no community footprint, but the code is clean and dependency-free. As a way to call Sora from a graph, it works. Just don't confuse it with the local video ecosystem that most of r/comfyui actually runs on.
Inputs (16)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | A cinematic drone shot of waves crashing. | — |
| api_keyopt | STRING | — | |
| negative_promptopt | STRING | — | |
| duration_secondsopt | FLOAT | 5.0 | — |
| aspect_ratioopt | STRING | 16:9 | — |
| seedopt | STRING | — | |
| fpsopt | INT | 24 | — |
| guidance_scaleopt | FLOAT | 7.5 | — |
| base_urlopt | STRING | https://api.openai.com/v1/sora | — |
| endpointopt | STRING | /videos | — |
| metadataopt | STRING | — | |
| webhook_urlopt | STRING | — | |
| wait_for_resultopt | BOOLEAN | true | — |
| poll_intervalopt | FLOAT | 3.00 | — |
| max_wait_secondsopt | FLOAT | 120.00 | — |
| download_pathopt | STRING | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| job_id | STRING | — |
| status | STRING | — |
| result | STRING | — |