Which schema shaped my Format run? output_schema.source explained
Every Sume Format receipt names the schema that shaped output. source is default, action_default or request_override. Here is how each is chosen and checked.

Every Sume Format run receipt carries output_schema: { name, strict, source }, and source says which schema shaped output: default for the built-in schema, action_default for a schema bound to the Format itself, and request_override for the one you sent on this run. A per-request output_schema always overrides the Format's own default.
Reading source first saves debugging time. If the shape of output surprises you, the first question is not what the run did but which contract was applied.
What do the three values mean?
The structured output page defines them. default means nothing was bound, so output is the built-in sume/action-run-output/v1 shape, filled deterministically from the run's media and closing text. action_default is the Format's own bound schema, set in the dashboard. request_override is the output_schema on the request.
The action_ prefix is the wire spelling shared with Scheduled runs, so do not read it as a different kind of Format.
| source | Where the schema came from | Who can change it |
|---|---|---|
| default | Built-in sume/action-run-output/v1 | Nobody; it is the fallback |
| action_default | Bound on the Format in the dashboard | The Format owner |
| request_override | Sent on this run's request | The caller, per run |
Why is the built-in schema the safe fallback?
Because no model is involved, it cannot fail the way a custom schema can. The built-in schema is filled deterministically from the run's generated media and its final text, with text nullable and four arrays (images, videos, audio, files) that are always present and may be empty. A custom schema is filled by the run, or by a projection pass if the run did not submit a valid object, and either can fail the checks.
If you only need the media, the built-in output is already enough to ship on, and it keeps output_schema_unsatisfied out of your error handling entirely.
How do I override the Format's schema for one run?
Send output_schema on the create call. The receipt's source will read request_override, and the Format's own default is untouched for every other caller. The OpenAI-shaped response_format alias is normalized into output_schema on the receipt, so what you read back is always the native spelling; sending both is 400 invalid_request.
Pair it with primary_output_key so the receipt resolves the one thing your UI shows. Resolution order is the key on the request, then the Format's own key, then the first top-level media key.
curl -sS -X POST "https://api.sume.com/v1/formats/acme/promo-hero/runs" \
-H "Authorization: Bearer $SUME_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: sku-1042-hero-v1" \
-d '{"instruction":"One hero image.",
"output_schema":{"name":"acme/hero/v1","strict":true,"schema":{
"type":"object","additionalProperties":false,
"required":["hero_image"],
"properties":{"hero_image":{"$ref":"SumeMediaFile#"}}}},
"primary_output_key":"hero_image"}' \
| jq '.data.output_schema'What should an integration log from this field?
Log output_schema.name and source with the run id. When you bind your own schema, namespace the name and keep it stable, because it appears on every receipt and makes receipts greppable. A run that unexpectedly reports default or action_default tells you your override never reached the call, which is usually a body-building bug on your side rather than a platform problem.
Sources
Related posts
More in Formats
- previous_run_id errors on a Format run: 404, 400 and 409 decoded
Continuing a Sume Format run can fail with previous_run_not_found, format_mismatch, not_terminal or not_resumable. Which are retryable and how to fix each.
- What a Format run receives: instruction order and the input file
A Format run composes the Format pointer, the package, your instruction, an unattended block and an input file at /workspace/inputs. Order and what wins.
- Format run provider_credits_exhausted: not your balance, wait
provider_credits_exhausted means Sume's model provider account ran out of credit, not your balance. Do not retry right away; wait, then use a new key.
- Format run status_url or result_url: which one do I poll?
Poll status_url for a small payload, then read result_url once the run is terminal. result_url answers 409 run_not_completed while the run is in flight.
Written by Sume