Почему валидные схемы Draft-07 всё равно вызывают HTTP 400 в LLM API
Движки ограниченного декодирования до начала генерации компилируют JSON Schema в контекстно-свободную грамматику или конечный автомат масок токенов. Чтобы компиляция грамматики оставалась быстрой, OpenAI, Anthropic и Google требуют более строгого подмножества JSON Schema, чем по умолчанию генерируют Ajv, Zod или Pydantic.
Например, режим strict: true в OpenAI отклоняет любой объект без additionalProperties: false или с полями вне массива required — необязательные поля нужно задавать как nullable-объединения (["string", "null"]) и включать в required. Напротив, generationConfig.responseSchema в Google Gemini полностью отклоняет ключевое слово additionalProperties.
| Правило схемы | OpenAI Strict (strict: true) | Строгий инструмент / JSON Anthropic | Gemini responseSchema |
|---|---|---|---|
| Корневой type должен быть "object" | Обязательно | Обязательно | Рекомендуется |
| "additionalProperties": false в каждом объекте | Обязательно (400 при пропуске) | Обязательно (400 при пропуске) | Запрещено (400 при наличии) |
| Все свойства перечислены в "required" | Обязательно ([type, "null"] для опциональных) | Опциональные ключи разрешены | Опциональные ключи разрешены |
| Регулярные выражения pattern / minLength / format | Не поддерживается в строгой грамматике | Ограничено; лучше description + проверка в коде | Большинство строковых format не поддерживается |