Add opt-in strict JSON Schema output for OpenAI models
Problem
The OpenAI integrations currently send JSON schemas without enabling strict Structured Outputs:
- Chat Completions omits
json_schema.strict. - Responses API explicitly sets
strict: false.
Consequently, supplying a schema does not guarantee schema-conforming output. We have observed successful responses containing:
- Arrays violating
minItems - Strings where objects were required
- Unexpected properties despite
additionalProperties: false - Incorrectly named fields
These responses are valid JSON, but fail downstream Pydantic validation.
Proposed solution
Add an opt-in OpenAI model option such as:
llm -m gpt-4o -o strict_schema true --schema schema.json "..."And its Python equivalent:
model.prompt(
prompt,
schema=OutputModel,
strict_schema=True,
)When enabled, the OpenAI adapter would send:
{
"type": "json_schema",
"json_schema": {
"name": "output",
"schema": {},
"strict": true
}
}The Responses API equivalent should also use strict: true.
The option could default to false for backwards compatibility.
Schema compatibility
OpenAI strict mode requires a restricted JSON Schema shape, including:
additionalProperties: falseon objects- Every property listed as required
- Only supported JSON Schema keywords
Possible behavior:
- Convert Pydantic models using the same strict-schema normalization used by the OpenAI Python SDK, or
- Validate the supplied schema and return a clear error when it is incompatible.
Silently weakening the schema would be undesirable.
Response handling
It would also be useful to preserve or expose:
- Safety refusals
finish_reason- Incomplete/truncated response status
These are documented cases where strict Structured Outputs may not return a schema-conforming result.
Reproduction
A schema containing object restrictions and a non-empty array constraint can occasionally return output that violates those constraints:
{
"type": "object",
"properties": {
"items": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"properties": {
"name": {"type": "string"}
},
"required": ["name"],
"additionalProperties": false
}
}
},
"required": ["items"],
"additionalProperties": false
}Without strict: true, responses such as {"items": []} or
{"items": ["example"]} remain possible.
Environment
llm0.29- OpenAI
gpt-4o - Python API with a Pydantic model passed as
schema
Source: simonw/llm