Тема
Язык

Структурированные выводы

Принудительный вывод JSON с помощью response_format. Два режима: json_object (любой корректный JSON) и json_schema (строгое соответствие схеме). Примеры на curl и Python.

Параметр response_format заставляет модель возвращать валидный JSON. Поддерживаются два режима.

json_object mode

Модель гарантирует, что выходные данные являются корректным JSON. Структуру вы задаёте в системном промпте.

curl https://getvibeapi.com/v1/chat/completions \
  -H "Authorization: Bearer $GETVIBE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-6.1-sol",
    "response_format": { "type": "json_object" },
    "messages": [
      {"role": "system", "content": "Reply with JSON with fields: name (string), score (number)."},
      {"role": "user", "content": "Rate this answer: very good"}
    ]
  }'

json_schema mode

Строгое соответствие JSON Schema — модель заполняет ровно указанные поля. Поддерживается GPT-5.x и совместимыми моделями.

curl https://getvibeapi.com/v1/chat/completions \
  -H "Authorization: Bearer $GETVIBE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-6.1-sol",
    "response_format": {
      "type": "json_schema",
      "json_schema": {
        "name": "review",
        "strict": true,
        "schema": {
          "type": "object",
          "properties": {
            "name": { "type": "string" },
            "score": { "type": "number", "minimum": 1, "maximum": 10 },
            "summary": { "type": "string" }
          },
          "required": ["name", "score", "summary"],
          "additionalProperties": false
        }
      }
    },
    "messages": [
      {"role": "user", "content": "Rate this product: fast delivery, careful packaging"}
    ]
  }'
С strict: true шлюз направляет запрос только к тем вариантам модели, которые действительно соблюдают схему, и делает так при каждой попытке — включая переключение на резервного поставщика. Если подходящего варианта сейчас нет, вы получите явную ошибку structured_output_unsupported вместо простого текста там, где запрашивался JSON. Эта защита построена на измерениях и охватывает только измеренные варианты: на неизмеренном варианте поставщик всё ещё может молча отбросить схему.
Модели по-разному удерживают JSON — проверьте свою. Измерено 2026-09-12 на deepseek-v4-flash-0731, по 10 вызовов на ячейку: json_object распарсил 10/10 на вариантах :cxa и :cxbc и 8/10 на :network, тогда как строгий json_schema распарсил 0/10 на обоих вариантах (:cxa отвечает 400, :cxbc — 200 с обычным текстом) и 3/10 на :network. У собственного API DeepSeek нет режима json_schema — используйте json_object, а когда нужна ровно одна форма, принудительный вызов функции (tools + tool_choice) вернул разбираемые аргументы 10/10 на всех вариантах. Числа по вариантам лежат в поле structuredOutput файла GET /v1/model-capabilities. Каждое из них — разовое измерение со своей датой (measurement: "point-in-time"), а не обещание: поставщик за вариантом может смениться, и мы не перемеряем по расписанию.

Пример ответа

{
  "id": "chatcmpl-...",
  "choices": [{
    "message": {
      "role": "assistant",
      "content": "{\"name\":\"product X\",\"score\":9,\"summary\":\"Fast and convenient\"}"
    },
    "finish_reason": "stop"
  }],
  "usage": { "prompt_tokens": 42, "completion_tokens": 18, "total_tokens": 60 }
}
Структурированные ответы в GetVibe API — JSON Schema, json_object, Python | GetVibe API