Sume has no JSON mode: strict false changes nothing, bind a schema

Coming from OpenAI json_object? Sume Format runs have no equivalent. strict false relaxes nothing. Bind a schema or take the built-in output shape.

3 min readSume
All posts

The answer

A Sume Format run has no loose JSON mode. There is no equivalent of {"type": "json_object"}, the option that means valid JSON in any shape. You have two choices: bind your own output_schema, or take the built-in output shape. strict: false is accepted and stored, but it does not relax the schema rules at all.

That matters if you are moving an OpenAI structured-output integration to a Format run this week. The schema subset is the same family as OpenAI's strict mode, but the place where Sume applies it is different.

What maps and what does not

The table compares the OpenAI settings people carry over with what Sume does as of 2026-10-08.

OpenAI structured-output settings and the Sume equivalent, as of 2026-10-08
OpenAI settingSumeNote
response_format.json_schemaoutput_schema, or response_format verbatimChat Completions spelling only
json_schema.strictoutput_schema.strictDefault true; Sume always enforces the subset
{"type": "json_object"}No equivalentBind a schema or use the built-in one
Streamed partial JSONNot applicableoutput appears once, on the terminal receipt

Why strict false does not help

If a schema sits outside the supported subset, Sume rejects it at submit with 400 output_schema_invalid, whether strict is true or false. The response lists details.violations[] with a path, a stable rule token and a message. Nothing runs and nothing is charged.

The subset is an allowlist. oneOf is rejected in favour of anyOf. allOf is rejected, so flatten the branches. Every node needs a type, $ref or anyOf. The root must be a single object type. Every object needs additionalProperties: false. Every declared property must appear in required, so optional fields become nullable unions such as ["string", "null"].

What you get instead of JSON mode

Leave output_schema off and the run returns the built-in shape, sume/action-run-output/v1: the closing text in output.text, plus output.images, output.videos, output.audio and output.files. Media URLs are durable media.sume.com HTTPS URLs.

Send both output_schema and response_format and you get 400 invalid_request. Pick one spelling.

{
  "instruction": "Make one hero image for the linked product.",
  "input": { "product_url": "https://example.com/p" },
  "output_schema": {
    "name": "acme/promo-hero/v1",
    "schema": {
      "type": "object",
      "additionalProperties": false,
      "required": ["headline", "hero_image"],
      "properties": {
        "headline": { "type": "string" },
        "hero_image": { "$ref": "SumeMediaFile#" }
      }
    }
  },
  "primary_output_key": "hero_image"
}

One mental change

With OpenAI you constrain what the model says. With a Format run you constrain how Sume reads back a completed run. The run either submits your object itself (filled_by: "agent") or a post-run pass builds one from its media and closing text (filled_by: "projection"). Your own input values do not reach the projection, so identifiers you sent, such as an order id, will not round-trip unless the run repeats them.

Migrating an existing call

Start from the schema you already send. Strip any keyword outside the subset, make every property required, turn optional fields into nullable unions, and set additionalProperties: false on each object. Then rename the wrapper: Sume reads the Chat Completions spelling, so response_format.json_schema with name and schema is accepted as an alias of output_schema.

Test the schema once with a cheap run and a low generation_spend_cap_usd. A rejection at submit costs nothing, and the violations[] list tells you the exact path and rule to change, so you can fix several problems in one pass instead of one per attempt.

  • Keep names stable and versioned, such as acme/promo-hero/v1, so receipts show which contract produced which output.
  • Use $ref: "SumeMediaFile#" for a media field so Sume fills in the durable URL.

Sources

Related posts

More in Formats

All Formats posts

Written by Sume