к тексту
api

документация api

ответ в заданном формате json

json_object и json_schema: когда достаточно валидного json, а когда нужна схема.

последняя редакция: 18 сентября 2026

обычный ответ модели — свободный текст. разбирать его программно тяжело: сегодня модель напишет «цена: 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. варианта два: выбрать модель с поддержкой строгого режима или описать нужный формат в системном сообщении и проверять результат на своей стороне.

поддержка airakurs.official@gmail.com
© airakurs

20 статей. поддержка airakurs.official@gmail.com