Sora Video Generation Skill
Defaults to sora-2 via the OpenAI Video API. Prefers the bundled CLI (scripts/sora.py) for deterministic runs. Note: $sora is a skill tag in prompts, not a shell command.
When to use
- Generate a new video clip from a prompt
- Remix an existing video by ID
- Poll status, list jobs, or download assets (video/thumbnail/spritesheet)
- Batch runs (many prompts or variants)
Decision tree (create vs remix vs status/download vs batch)
- If the user has a video id and wants a change → remix
- If the user has a video id and wants status or assets → status/poll/download
- If the user needs many prompts/assets → create-batch
- If the user asks for two versions with a small change (same shot, different subject/detail) → create the base, then remix for the variation
- Otherwise → create (or create-and-poll if they need a ready asset in one step)
Workflow
- Decide intent: create vs remix vs status/download vs batch.
- Collect inputs: prompt, model, size, seconds, and any input reference image.
- If batch: write a temporary JSONL under tmp/ (one job per line), run once, then delete the JSONL.
- Prefer CLI augmentation flags (
--use-case, --scene, --camera, etc.) instead of pre-writing a structured prompt. If you already produced a structured prompt file, pass --no-augment to avoid double-wrapping.
- Run the bundled CLI (
scripts/sora.py) with sensible defaults (see references/cli.md). For long prompts, prefer --prompt-file to avoid shell-escaping issues; pair with --no-augment if the prompt is already structured.
- For async jobs, poll until complete (or use create-and-poll).
- Download assets (video/thumbnail/spritesheet) and save locally.
- Remove intermediate files created during invocation (for example
prompt.txt, remix_job.json, temp JSONL). If the sandbox blocks rm, skip cleanup or truncate the files without surfacing an error.
- Iterate with a single targeted change per prompt.
Authentication
OPENAI_API_KEY must be set for live API calls.
If the key is missing, give the user these steps:
- Create an API key in the OpenAI platform UI: https://platform.openai.com/api-keys
- Set
OPENAI_API_KEY as an environment variable in their system.
- Offer to guide them through setting the environment variable for their OS/shell if needed.
- Never ask the user to paste the full key in chat. Ask them to set it locally and confirm when ready.
Defaults & rules
- Default model:
sora-2 (use sora-2-pro for higher fidelity).
- Default size:
1280x720.
- Default seconds:
4 (allowed: "4", "8", "12" as strings).
- Always set size and seconds via API params; prose will not change them.
- Use the OpenAI Python SDK (
openai package); do not use raw HTTP.
- Require
OPENAI_API_KEY before any live API call.
- If uv cache permissions fail, set
UV_CACHE_DIR=/tmp/uv-cache.
- Input reference images must be jpg/png/webp and should match target size.
- Download URLs expire after about 1 hour; copy assets to your own storage.
- Prefer the bundled CLI; treat
scripts/sora.py as read-only unless the user asks for changes.
- Sora can generate audio; if a user requests voiceover/audio, specify it explicitly in the
Audio: and Dialogue: lines and keep it short.
API limitations
- Models are limited to
sora-2 and sora-2-pro.
- API access to Sora models requires an organization-verified account.
- Duration is limited to 4/8/12 seconds and must be set via the
seconds parameter.
- The API expects
seconds as a string enum ("4", "8", "12").
- Output sizes are limited by model (see
references/video-api.md for the supported sizes).
- Video creation is async; you must poll for completion before downloading.
- Rate limits apply by usage tier (do not list specific limits).
- Content restrictions are enforced by the API (see Guardrails below).
Content Guardrails
- Only content suitable for audiences under 18.
- No copyrighted characters or copyrighted music.
- No real people (including public figures).
- Input images with human faces are rejected.
Prompt augmentation
Reformat prompts into a structured, production-oriented spec. Only make implicit details explicit; do not invent new creative requirements.
Template (include only relevant lines):
Use case: <where the clip will be used>
Primary request: <user's main prompt>
Scene/background: <location, time of day, atmosphere>
Subject: <main subject>
Action: <single clear action>
Camera: <shot type, angle, motion>
Lighting/mood: <lighting + mood>
Color palette: <3-5 color anchors>
Style/format: <film/animation/format cues>
Timing/beats: <counts or beats>
Audio: <ambient cue / music / voiceover if requested>
Text (verbatim): "<exact text>"
Dialogue:
<dialogue>
- Speaker: "Short line."
</dialogue>
Constraints: <must keep/must avoid>
Avoid: <negative constraints>
Augmentation rules:
- Keep it short; add only details the user already implied or provided elsewhere.
- For remixes, explicitly list invariants ("same shot, change only X").
- If any critical detail is missing and blocks success, ask a question; otherwise proceed.
- If you pass a structured prompt file to the CLI, add
--no-augment to avoid the tool re-wrapping it.
Examples
Generation example (single shot)
Use case: product teaser
Primary request: a close-up of a matte black camera on a pedestal
Action: slow 30-degree orbit over 4 seconds
Camera: 85mm, shallow depth of field, gentle handheld drift
Lighting/mood: soft key light, subtle rim, premium studio feel
Constraints: no logos, no text
Remix example (invariants)
Primary request: same shot and framing, switch palette to teal/sand/rust with warmer backlight
Constraints: keep the subject and camera move unchanged
Prompting best practices (short list)
- One main action + one camera move per shot.
- Use counts or beats for timing ("two steps, pause, turn").
- Keep text short and the camera locked-off for UI or on-screen text.
- Add a brief avoid line when artifacts appear (flicker, jitter, fast motion).
- Shorter prompts are more creative; longer prompts are more controlled.
- Put dialogue in a dedicated block; keep lines short for 4-8s clips.
- State invariants explicitly for remixes (same shot, same camera move).
- Iterate with single-change follow-ups to preserve continuity.
Guidance by asset type
Use these modules when the request is for a specific artifact. They provide targeted templates and defaults.
- Cinematic shots:
references/cinematic-shots.md
- Social ads:
references/social-ads.md
CLI + environment notes
- CLI commands + examples:
references/cli.md
- API parameter quick reference:
references/video-api.md
- Prompting guidance:
references/prompting.md
- Sample prompts:
references/sample-prompts.md
- Troubleshooting:
references/troubleshooting.md
- Network/sandbox tips:
references/codex-network.md
Reference map
references/cli.md: how to run create/poll/remix/download/batch via scripts/sora.py.
references/video-api.md: API-level knobs (models, sizes, duration, variants, status).
references/prompting.md: prompt structure and iteration guidance.
references/sample-prompts.md: copy/paste prompt recipes (examples only; no extra theory).
references/cinematic-shots.md: templates for filmic shots.
references/social-ads.md: templates for short social ad beats.
references/troubleshooting.md: common errors and fixes.
references/codex-network.md: network/approval troubleshooting.
1---2name: sora3description: Use when the user asks to generate, remix, poll, list, download, or delete Sora videos via OpenAI’s video API using the bundled CLI (`scripts/sora.py`), including requests like “generate AI video,” “Sora,” “video remix,” “download video/thumbnail/spritesheet,” and batch video generation; requires `OPENAI_API_KEY` and Sora API access.4---56# Sora Video Generation Skill78Defaults to `sora-2` via the OpenAI Video API. Prefers the bundled CLI (`scripts/sora.py`) for deterministic runs. Note: `$sora` is a skill tag in prompts, not a shell command.910## When to use11- Generate a new video clip from a prompt12- Remix an existing video by ID13- Poll status, list jobs, or download assets (video/thumbnail/spritesheet)14- Batch runs (many prompts or variants)1516## Decision tree (create vs remix vs status/download vs batch)17- If the user has a **video id** and wants a change → **remix**18- If the user has a **video id** and wants status or assets → **status/poll/download**19- If the user needs many prompts/assets → **create-batch**20- If the user asks for two versions with a small change (same shot, different subject/detail) → **create** the base, then **remix** for the variation21- Otherwise → **create** (or **create-and-poll** if they need a ready asset in one step)2223## Workflow241. Decide intent: create vs remix vs status/download vs batch.252. Collect inputs: prompt, model, size, seconds, and any input reference image.263. If batch: write a temporary JSONL under tmp/ (one job per line), run once, then delete the JSONL.274. Prefer CLI augmentation flags (`--use-case`, `--scene`, `--camera`, etc.) instead of pre-writing a structured prompt. If you already produced a structured prompt file, pass `--no-augment` to avoid double-wrapping.285. Run the bundled CLI (`scripts/sora.py`) with sensible defaults (see references/cli.md). For long prompts, prefer `--prompt-file` to avoid shell-escaping issues; pair with `--no-augment` if the prompt is already structured.296. For async jobs, poll until complete (or use create-and-poll).307. Download assets (video/thumbnail/spritesheet) and save locally.318. Remove intermediate files created during invocation (for example `prompt.txt`, `remix_job.json`, temp JSONL). If the sandbox blocks `rm`, skip cleanup or truncate the files without surfacing an error.329. Iterate with a single targeted change per prompt.3334## Authentication35- `OPENAI_API_KEY` must be set for live API calls.3637If the key is missing, give the user these steps:381. Create an API key in the OpenAI platform UI: https://platform.openai.com/api-keys392. Set `OPENAI_API_KEY` as an environment variable in their system.403. Offer to guide them through setting the environment variable for their OS/shell if needed.41- Never ask the user to paste the full key in chat. Ask them to set it locally and confirm when ready.4243## Defaults & rules44- Default model: `sora-2` (use `sora-2-pro` for higher fidelity).45- Default size: `1280x720`.46- Default seconds: `4` (allowed: "4", "8", "12" as strings).47- Always set size and seconds via API params; prose will not change them.48- Use the OpenAI Python SDK (`openai` package); do not use raw HTTP.49- Require `OPENAI_API_KEY` before any live API call.50- If uv cache permissions fail, set `UV_CACHE_DIR=/tmp/uv-cache`.51- Input reference images must be jpg/png/webp and should match target size.52- Download URLs expire after about 1 hour; copy assets to your own storage.53- Prefer the bundled CLI; treat `scripts/sora.py` as read-only unless the user asks for changes.54- Sora can generate audio; if a user requests voiceover/audio, specify it explicitly in the `Audio:` and `Dialogue:` lines and keep it short.5556## API limitations57- Models are limited to `sora-2` and `sora-2-pro`.58- API access to Sora models requires an organization-verified account.59- Duration is limited to 4/8/12 seconds and must be set via the `seconds` parameter.60- The API expects `seconds` as a string enum ("4", "8", "12").61- Output sizes are limited by model (see `references/video-api.md` for the supported sizes).62- Video creation is async; you must poll for completion before downloading.63- Rate limits apply by usage tier (do not list specific limits).64- Content restrictions are enforced by the API (see Guardrails below).6566## Content Guardrails67- Only content suitable for audiences under 18.68- No copyrighted characters or copyrighted music.69- No real people (including public figures).70- Input images with human faces are rejected.7172## Prompt augmentation73Reformat prompts into a structured, production-oriented spec. Only make implicit details explicit; do not invent new creative requirements.7475Template (include only relevant lines):76```77Use case: <where the clip will be used>78Primary request: <user's main prompt>79Scene/background: <location, time of day, atmosphere>80Subject: <main subject>81Action: <single clear action>82Camera: <shot type, angle, motion>83Lighting/mood: <lighting + mood>84Color palette: <3-5 color anchors>85Style/format: <film/animation/format cues>86Timing/beats: <counts or beats>87Audio: <ambient cue / music / voiceover if requested>88Text (verbatim): "<exact text>"89Dialogue:90<dialogue>91- Speaker: "Short line."92</dialogue>93Constraints: <must keep/must avoid>94Avoid: <negative constraints>95```9697Augmentation rules:98- Keep it short; add only details the user already implied or provided elsewhere.99- For remixes, explicitly list invariants ("same shot, change only X").100- If any critical detail is missing and blocks success, ask a question; otherwise proceed.101- If you pass a structured prompt file to the CLI, add `--no-augment` to avoid the tool re-wrapping it.102103## Examples104105### Generation example (single shot)106```107Use case: product teaser108Primary request: a close-up of a matte black camera on a pedestal109Action: slow 30-degree orbit over 4 seconds110Camera: 85mm, shallow depth of field, gentle handheld drift111Lighting/mood: soft key light, subtle rim, premium studio feel112Constraints: no logos, no text113```114115### Remix example (invariants)116```117Primary request: same shot and framing, switch palette to teal/sand/rust with warmer backlight118Constraints: keep the subject and camera move unchanged119```120121## Prompting best practices (short list)122- One main action + one camera move per shot.123- Use counts or beats for timing ("two steps, pause, turn").124- Keep text short and the camera locked-off for UI or on-screen text.125- Add a brief avoid line when artifacts appear (flicker, jitter, fast motion).126- Shorter prompts are more creative; longer prompts are more controlled.127- Put dialogue in a dedicated block; keep lines short for 4-8s clips.128- State invariants explicitly for remixes (same shot, same camera move).129- Iterate with single-change follow-ups to preserve continuity.130131## Guidance by asset type132Use these modules when the request is for a specific artifact. They provide targeted templates and defaults.133- Cinematic shots: `references/cinematic-shots.md`134- Social ads: `references/social-ads.md`135136## CLI + environment notes137- CLI commands + examples: `references/cli.md`138- API parameter quick reference: `references/video-api.md`139- Prompting guidance: `references/prompting.md`140- Sample prompts: `references/sample-prompts.md`141- Troubleshooting: `references/troubleshooting.md`142- Network/sandbox tips: `references/codex-network.md`143144## Reference map145- **`references/cli.md`**: how to run create/poll/remix/download/batch via `scripts/sora.py`.146- **`references/video-api.md`**: API-level knobs (models, sizes, duration, variants, status).147- **`references/prompting.md`**: prompt structure and iteration guidance.148- **`references/sample-prompts.md`**: copy/paste prompt recipes (examples only; no extra theory).149- **`references/cinematic-shots.md`**: templates for filmic shots.150- **`references/social-ads.md`**: templates for short social ad beats.151- **`references/troubleshooting.md`**: common errors and fixes.152- **`references/codex-network.md`**: network/approval troubleshooting.