обычный ответ модели — свободный текст. разбирать его программно тяжело: сегодня модель напишет «цена: 1200 ₽», завтра — «стоит примерно тысячу двести». структурированный вывод снимает эту проблему: ответ приходит строго в форме, описанной заранее.
два режима
значение response_format | что гарантирует |
|---|---|
{"type": "json_object"} | ответ будет корректным json. какие в нём окажутся поля — на усмотрение модели |
{"type": "json_schema", ...} | ответ будет соответствовать переданной схеме: те же поля, те же типы |
первый режим годится, когда форма ответа некритична и достаточно избавиться от лишних слов вокруг. второй нужен, когда ответ попадает прямо в код или в базу.
схема ответа
схема описывается в формате json schema. флаг strict включает строгую проверку — без него схема считается пожеланием, а не требованием.
curl "https://api.airakurs.ru/v1/chat/completions" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <КЛЮЧ>" \
-d '{
"model": "openai/gpt-5-mini",
"messages": [
{"role": "user", "content": "Ноутбук, 14 дюймов, 89990 рублей, в наличии"}
],
"response_format": {
"type": "json_schema",
"json_schema": {
"name": "product",
"strict": true,
"schema": {
"type": "object",
"properties": {
"title": {"type": "string"},
"price": {"type": "number"},
"in_stock": {"type": "boolean"}
},
"required": ["title", "price", "in_stock"],
"additionalProperties": false
}
}
}
}'
ответ
структура ответа не меняется: json приходит строкой в том же поле choices[0].message.content, что и обычный текст. разница в содержимом — вместо предложения там документ, готовый к разбору.
{"title": "Ноутбук 14 дюймов", "price": 89990, "in_stock": true}
требования к схеме
строгий режим накладывает ограничения, и задаёт их конечный сервис, а не airakurs. общие для большинства моделей:
- все поля перечислены в
required— необязательных нет; - у каждого объекта проставлено
"additionalProperties": false; - поддерживается не весь json schema: часть ключевых слов, вроде ограничений на длину строки, игнорируется.
необязательное поле обычно выражают через тип-объединение: ["string", "null"].
поддержка
строгий режим доступен не у каждой модели. если она его не поддерживает, конечный сервис либо ответит ошибкой 400, либо проигнорирует схему и вернёт обычный текст. поэтому разбор ответа лучше оборачивать в проверку, а не полагаться на формат вслепую.
что дальше
- вызов функций — когда от модели нужен не ответ, а обращение к коду.
- генерация текста — устройство запроса и ответа.
частые вопросы
чем json_schema отличается от json_object?
режим json_object гарантирует только то, что ответ будет корректным json — набор полей модель выбирает сама. режим json_schema закрепляет конкретную структуру: поля, типы и вложенность.
почему в строгой схеме все поля обязательные?
такое требование предъявляет конечный сервис. необязательное поле описывают через объединение типов, разрешая наряду с основным типом значение null, и модель возвращает null, когда значения нет.
почему ответ приходит строкой, а не объектом?
структура ответа api не меняется: json лежит в поле message.content как текст. его нужно разобрать самостоятельно — стандартными средствами языка.
что делать, если модель не поддерживает схему?
ответом будет либо ошибка 400, либо обычный текст вместо json. варианта два: выбрать модель с поддержкой строгого режима или описать нужный формат в системном сообщении и проверять результат на своей стороне.