Output schema 400 missing_items: an array node needs items
A Format output_schema with an array and no items fails with 400 and rule missing_items before anything runs. The bad schema, the fix, the violation.

If a Format run answers 400 output_schema_invalid and one of the entries in details.violations[] has the rule missing_items, you declared a node with "type": "array" and no items. Add an items schema to that array and send the request again. Sume checks the schema at submit, before anything runs, and charges nothing for the rejected call (Structured output).
Plain JSON Schema allows an array with no items, which means an array of anything. The strict subset that Sume enforces does not, because Sume only fills a schema it can satisfy mechanically.
Bad and fixed
The first schema is rejected. The second names the element type, so it passes the check.
// rejected: rule missing_items at #/properties/captions
{
"type": "object",
"additionalProperties": false,
"required": ["captions"],
"properties": { "captions": { "type": "array" } }
}
// accepted
{
"type": "object",
"additionalProperties": false,
"required": ["captions"],
"properties": { "captions": { "type": "array", "items": { "type": "string" } } }
}Read the rule, not the message
Each violation is { path, rule, message }. The path is a JSON-Pointer-style location such as #/properties/scenes/items/properties/clip. The message is text for a person and can change, while rule is a stable lowercase token you can switch on. Sume reports every problem in one response, so one 400 is usually enough to fix the whole schema.
| rule | What it flags |
|---|---|
| missing_items | An array node with no items. |
| missing_type | A node with no type, $ref or anyOf. |
| unsupported_type | A type outside the seven allowed types. |
| additional_properties_false | An object node without additionalProperties: false. |
| required_completeness | A declared property missing from required, or the reverse. |
If the items are objects
An items object is itself a node, so it needs additionalProperties: false, every property in required, and a type on each property. For repeated shapes, put the object under root $defs and point items at #/$defs/<name>. The same rules apply on a schedule, where you paste the schema into the dashboard, and on an Agent Completion.
Sources
Related posts
More in Formats
- Output schema unsupported_ref: $defs must live at the schema root
A $ref to a nested $defs, an external URL or a missing name fails with unsupported_ref in a Sume output_schema. Move $defs to the root and fix the pointer.
- Output schema max_enum_values: 1,000 values per enum, then what
Sume refuses an enum of more than 1,000 values with rule max_enum_values. Use a string with a pattern or format, or split the list into two enums.
- Output schema max_depth: 10 levels, and $defs recursion is free
Sume's output_schema allows 10 levels of literal nesting. Past that you get max_depth. A self-referencing $defs entry does not add to the depth count.
- Output schema max_string_length: descriptions use a 120,000 budget
A big Format output_schema can fail with max_string_length although no field is long. The 120,000-character budget covers every key, name and string in it.
Written by Sume