⊟
LLM Structured Output Dialects
One JSON Schema, converted into what OpenAI, Claude, and Gemini each actually accept, with every dropped or rewritten constraint listed. The worst failure across all three is not an error — it is accepting your constraint and never running it.
Runs in browserAI devSchema
Loading tool…
How to use
- Paste a JSON Schema and get what all three providers actually accept, with every dropped or rewritten constraint listed by path. Everything runs in your browser; the schema never leaves this page.
- “Accepted but ignored” is the real risk. The worst failure mode across all three providers is not an error — it is accepting your constraint and never running it. The request succeeds, the model returns an out-of-range value anyway, and you believed it was validated. That is why every dropped constraint is listed with its path instead of silently downgraded.
- Optional fields become nullable under OpenAI. strict mode requires every field in required, and the correct expression of “optional” is to move it into required and add null to its type — which changes the distinction between “this field may be absent” and “this field may be null”. Copying another provider's output gives you a model where every field must have a value.
- This is not a schema validator. It only rewrites dialects and reports differences; it does not validate instances. Use a full implementation such as ajv for that — turning this into a validator would be both bloated and inaccurate.
- The keyword matrix records its basis and version date. Provider documentation changes, so each handling is annotated with the doc version it came from, making it easy to spot when it goes stale.
- The keyword matrix starts collapsed, because most of the time you only want the result for your own schema; expand it when you need to check keyword by keyword.