Season output schema: episode videos and final cut as SumeMediaFile
Bind an output_schema with SumeMediaFile fields so a Sume run returns typed episode videos. The URL gate, 10% duration check and parts-versus-cut rule.

To get a typed episode back from a Sume Format run, bind an output_schema whose media fields use { "$ref": "SumeMediaFile#" } and name the field you want as primary_output_key. A completed run then returns output in that shape, with primary_output_url pointing at the file. The catch for a series is the rule about wholes and parts: a schema with scenes plus a finished cut must not fill the cut with one of its own scenes.
Everything below is from the structured-output page. The root must be an object, every object sets additionalProperties: false, every property is in required, and optional values are nullable unions.
A schema for one episode
Send it as output_schema on the run with "primary_output_key": "episode_video". Check the supported-keywords list on the structured-output page before using anyOf, and require only what the Format actually makes.
{
"name": "acme/brand-series-episode/v1",
"strict": true,
"schema": {
"type": "object",
"additionalProperties": false,
"required": ["episode_video", "cold_open", "synopsis"],
"properties": {
"episode_video": { "$ref": "SumeMediaFile#" },
"cold_open": { "anyOf": [{ "$ref": "SumeMediaFile#" }, { "type": "null" }] },
"synopsis": { "type": ["string", "null"] }
}
}
}The gates a completed run passes
| Check | What it does |
|---|---|
| URL gate | Every URL must be exactly a URL this run produced; an uploaded file's URL fails the projection |
| Duration check | duration_ms must agree with the recorded artifact within 10%; where nothing was measured, nothing is checked |
| Whole versus parts | With two or more succeeded parts, the finished-cut field may not reuse one part's file |
| Size limits | 10 nesting levels, 5,000 properties, 1,000 enum values, 120,000 string characters |
filled_by tells you how it was built
The receipt reports whether the run submitted your object itself (filled_by: "agent") or a constrained pass reconstructed one from the run's media and its closing text of up to 8,000 characters (filled_by: "projection"). On the projection path your input and instruction are not visible, so titles or ids that come only from the brief come back null while the media fields are full. If you score episodes automatically, read filled_by first, and check the file itself with ffprobe on primary_output_url.
When output is null
output: nullwithoutput_errorset means nothing satisfied your schema; checkoutput_errorbefore readingoutput.- A completed webhook with
outcome: "degraded"is that case: real artifacts inartifacts[], no structured output. - The built-in schema
sume/action-run-output/v1is filled deterministically withtext,images,videos,audioandfiles; use it if you only need the media.
Sources
Related posts
More in Formats
- Series bible for a Format: SKILL.md index, references and run input
Where to keep a series bible in a Sume Format: a short SKILL.md index, detail in references/*, and only the per-episode beat in the run input.
- Slideshow Format: a holiday gift guide from up to 30 product images
Send up to 30 product images to Sume's slideshow Format for a gift-guide clip, then check Pinterest's video ad specs before you promote it.
- Bulk Format runs: 100 items, 16 at once, what completed means
Sume bulk runs take 1 to 100 items at concurrency 1 to 16. A queue marked completed means every item is terminal, not that every item succeeded.
- Format output_schema for partial results: nullable and primary key
How to design a Sume Format output_schema so a run that makes the video but misses a caption still passes: nullable fields, no minItems, and primary_output_key.
Written by Sume