Runway Agent long videos in Final Cut vs a Sume run deadline

Runway Agent has no hard length limit and joins clips in Final Cut. A Sume Format run has a 90-minute deadline. How to plan a long video on each.

6 min readSume
All posts

Runway Agent has no hard duration limit: a video longer than the chosen model's limit generates as separate clips, which Agent joins in the Final Cut tab. A Sume Format run is one unattended agent turn with a deadline, expires_at, set 90 minutes after created_at. For long video on Sume, plan scenes inside that window and retry only the scene that failed with previous_run_id.

Length and time limits

Long video limits (read 2026-10-04)
QuestionRunway AgentSume Format run
Maximum lengthNo hard limit; split into clipsSet by the recipe; the run must finish before expires_at
Where clips are joinedFinal Cut, automaticallyInside the run, by the recipe's timeline step
Time ceilingNot stated on the page I read90 minutes from created_at, or sooner if older than 25 minutes and silent for 10
Typical long-form timeNot stated15 to 30 minutes of work for long-form host video, per the docs
Resolution480p, 720p or 1080p; upscale to 4K afterwardsChosen by the models the recipe calls

Runway's cost habit

Runway's page suggests iterating at 720p to save credits, then upscaling the final version to 4K with the Upscale Video app. It also says very long conversations may see degraded performance and recommends a new session when you switch projects.

Use expires_at as your ceiling

On Sume, a non-terminal receipt carries the deadline after which the run is force-finalized as failed. Set your own timeout from it instead of inventing one, and back off while you wait: double the gap up to a minute. A 429 or 503 during polling is transient because the run keeps executing.

import json, os, sys, time, urllib.request

def get_run(run_id: str) -> dict:
    req = urllib.request.Request(
        f"https://api.sume.com/v1/format-runs/{run_id}",
        headers={"Authorization": "Bearer " + os.environ["SUME_API_KEY"]},
    )
    with urllib.request.urlopen(req) as resp:
        return json.load(resp)["data"]

def wait(run_id: str) -> dict:
    delay = 5
    while True:
        run = get_run(run_id)
        if run["status"] not in ("queued", "processing"):
            return run
        print("waiting; deadline", run.get("expires_at"))
        time.sleep(delay)
        delay = min(delay * 2, 60)

if __name__ == "__main__":
    done = wait(sys.argv[1])
    print(done["status"], done.get("primary_output_url"))

Retry one scene, not the show

If one scene is wrong, send previous_run_id on a new run with an instruction that names only that scene. A continuation is a new run with its own cap and receipt; the original never changes, and artifacts[] lists everything the thread generated while usage stays per run.

Sources

Related posts

More in Comparisons

All Comparisons posts

Written by Sume