Gemini prefixItems tuple schema: Sume rejects it, use an object
Gemini lists prefixItems for tuple-like arrays. Sume's output_schema allowlist omits it and returns unsupported_keyword; model each slot as a named property.

A schema that uses prefixItems for a tuple will fail Sume's output_schema check with 400 output_schema_invalid and a violation whose rule is unsupported_keyword. Replace the tuple with an object that names each slot, or with an array of identical items.
Gemini's Structured outputs page lists prefixItems under array values: "a list of schemas for the first N items, allowing for tuple-like structures" (read 2026-10-02). Sume's page describes an allowlist, not a deny list, so a keyword that is not named is a violation rather than something quietly ignored.
Which array keywords does each page list?
Gemini's page lists items, prefixItems, minItems and maxItems for arrays. Sume's allowlist for arrays is minItems and maxItems, with items under Structure; prefixItems is not on it. A Sume array must also declare items, or the violation is missing_items.
| Keyword | Gemini page | Sume allowlist |
|---|---|---|
items | Listed | Accepted |
prefixItems | Listed | Not accepted: unsupported_keyword |
minItems | Listed | Accepted |
maxItems | Listed | Accepted |
How do I replace a tuple?
If the first slot is a title and the second is a count, make an object with two named properties. A name is also a better prompt to the run than a position, because the description attached to each property tells the run what belongs there.
If the slots are not different kinds of value, use items with one schema and bound the length with minItems and maxItems. Sume's page notes that minItems is genuinely enforced, so leave it off an array you want to receive partially, such as a list of scenes.
{
"name": "acme/range/v1",
"schema": {
"type": "object",
"additionalProperties": false,
"required": ["start_s", "end_s"],
"properties": {
"start_s": { "type": "number" },
"end_s": { "type": "number" }
}
}
}What happens when the schema is rejected?
The rejection happens at submit. Sume's page states that nothing runs, so nothing is charged. The 400 carries details.violations[], each with a JSON-Pointer-style path, a rule and a message. Branch on rule; the page says the message may change.
The same unsupported_keyword rule covers oneOf, allOf, not and if/then/else. Sending both output_schema and response_format is a different error, invalid_request.
What should I check on the receipt?
A run whose schema passed can still finish with output: null. Check output_error before output, and fall back to artifacts[], which is populated either way. See Structured output for the full set of output_error.code values.
Sources
Related posts
More in Developers
- Gemini recursive schema with $ref "#": what Sume accepts instead
Gemini's docs show an org-chart schema that recurses with $ref "#". Sume rejects that root reference; recurse through a named $defs entry instead.
- Check GET /v1/balance before a Sume bulk run: failures land per item
A bulk create returns 202 even if the wallet cannot fund every child; unfunded items fail one by one. Compare GET /v1/balance with your spend caps first.
- Smoke-test a new Sume API key with GET /v1/me before revoking the old
GET /v1/me returns the key's id, prefix and scopes. A TypeScript script fails the deploy if the new key lacks formats:write, so you revoke the old key after.
- GPT Image 2.5 edit changed shape? Use aspect_ratio auto on Sume
On Sume edit and image-to-image calls, aspect_ratio auto is not the same as leaving the field out. How to read the model descriptor and keep the photo's shape.
Written by Sume