Начать пользоваться на www.aijora.ru
AijoraДокументация
Функции

Режим JSON и структурированный вывод

Как заставить модель возвращать строго валидный JSON

Aijora API поддерживает Режим JSON — режим, в котором модель гарантированно возвращает валидный JSON. Это критически важно для надежной интеграции с backend-системами, где нужен предсказуемый формат ответа.

Что такое Режим JSON?

Обычно языковые модели возвращают текст в свободной форме. Даже если попросить "ответь в JSON", модель может добавить пояснения, форматирование или вернуть невалидный JSON.

Режим JSON решает эту проблему:

  • Модель гарантированно возвращает валидный JSON
  • Не добавляет лишний текст до или после JSON
  • Парсинг ответа всегда успешен

Как включить

Добавьте параметр response_format в запрос:

{
  "model": "gpt-4o-mini",
  "messages": [...],
  "response_format": { "type": "json_object" }
}

Важно: В системном промпте или сообщении пользователя обязательно укажите, что нужен JSON-ответ. Иначе модель может вернуть ошибку или некорректный результат.

Базовый пример

Запрос

curl https://api.aijora.com/api/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $AIJORA_API_KEY" \
  -d '{
    "model": "gpt-4o-mini",
    "messages": [
      {
        "role": "system",
        "content": "Ты — ассистент, который всегда отвечает в формате JSON."
      },
      {
        "role": "user",
        "content": "Назови 3 популярных языка программирования с их годом создания"
      }
    ],
    "response_format": { "type": "json_object" }
  }'
const response = await fetch('https://api.aijora.com/api/v1/chat/completions', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': `Bearer ${process.env.AIJORA_API_KEY}`
  },
  body: JSON.stringify({
    model: 'gpt-4o-mini',
    messages: [
      {
        role: 'system',
        content: 'Ты — ассистент, который всегда отвечает в формате JSON.'
      },
      {
        role: 'user',
        content: 'Назови 3 популярных языка программирования с их годом создания'
      }
    ],
    response_format: { type: 'json_object' }
  })
});

const data = await response.json();
const jsonResponse = JSON.parse(data.choices[0].message.content);
console.log(jsonResponse);
import os
import json
import requests

response = requests.post(
    'https://api.aijora.com/api/v1/chat/completions',
    headers={
        'Authorization': f'Bearer {os.getenv("AIJORA_API_KEY")}'
    },
    json={
        'model': 'gpt-4o-mini',
        'messages': [
            {
                'role': 'system',
                'content': 'Ты — ассистент, который всегда отвечает в формате JSON.'
            },
            {
                'role': 'user',
                'content': 'Назови 3 популярных языка программирования с их годом создания'
            }
        ],
        'response_format': {'type': 'json_object'}
    }
)

data = response.json()
json_response = json.loads(data['choices'][0]['message']['content'])
print(json_response)

Ответ модели

{
  "languages": [
    {
      "name": "Python",
      "year": 1991
    },
    {
      "name": "JavaScript",
      "year": 1995
    },
    {
      "name": "Java",
      "year": 1995
    }
  ]
}

Структурированный вывод с JSON Schema

Для более строгого контроля над структурой ответа можно использовать JSON Schema (поддерживается не всеми моделями).

Пример с фиксированной схемой

const response = await fetch('https://api.aijora.com/api/v1/chat/completions', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': `Bearer ${process.env.AIJORA_API_KEY}`
  },
  body: JSON.stringify({
    model: 'gpt-4o-mini',
    messages: [
      {
        role: 'user',
        content: 'Извлеки информацию о пользователе: Иван, 25 лет, живет в Москве, работает разработчиком'
      }
    ],
    response_format: {
      type: 'json_schema',
      json_schema: {
        name: 'user_info',
        strict: true,
        schema: {
          type: 'object',
          properties: {
            name: { type: 'string' },
            age: { type: 'integer' },
            city: { type: 'string' },
            occupation: { type: 'string' }
          },
          required: ['name', 'age', 'city', 'occupation'],
          additionalProperties: false
        }
      }
    }
  })
});

Ответ будет строго соответствовать схеме:

{
  "name": "Иван",
  "age": 25,
  "city": "Москва",
  "occupation": "разработчик"
}

Практические примеры

1. Извлечение данных из текста

Use case: Парсинг резюме, контактов, заказов

async function extractContactInfo(text) {
  const response = await fetch('https://api.aijora.com/api/v1/chat/completions', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${process.env.AIJORA_API_KEY}`
    },
    body: JSON.stringify({
      model: 'gpt-4o-mini',
      messages: [
        {
          role: 'system',
          content: 'Извлеки контактную информацию из текста. Верни JSON с полями: name, email, phone, company.'
        },
        {
          role: 'user',
          content: text
        }
      ],
      response_format: { type: 'json_object' }
    })
  });

  const data = await response.json();
  return JSON.parse(data.choices[0].message.content);
}

// Использование
const contact = await extractContactInfo(
  'Меня зовут Алексей Петров, работаю в ООО "ТехноСервис". ' +
  'Email: a.petrov@techserv.ru, телефон +7 (999) 123-45-67'
);

console.log(contact);
// {
//   "name": "Алексей Петров",
//   "email": "a.petrov@techserv.ru",
//   "phone": "+7 (999) 123-45-67",
//   "company": "ООО \"ТехноСервис\""
// }

2. Классификация и тегирование

Use case: Модерация контента, категоризация товаров

import os
import json
import requests

def classify_text(text):
    response = requests.post(
        'https://api.aijora.com/api/v1/chat/completions',
        headers={
            'Authorization': f'Bearer {os.getenv("AIJORA_API_KEY")}'
        },
        json={
            'model': 'gpt-4o-mini',
            'messages': [
                {
                    'role': 'system',
                    'content': 'Классифицируй текст. Верни JSON: {"category": "...", "sentiment": "positive/negative/neutral", "tags": [...], "confidence": 0.0-1.0}'
                },
                {
                    'role': 'user',
                    'content': text
                }
            ],
            'response_format': {'type': 'json_object'}
        }
    )
    
    data = response.json()
    return json.loads(data['choices'][0]['message']['content'])

# Использование
result = classify_text("Отличный товар! Быстрая доставка, всем рекомендую!")
print(result)
# {
#   "category": "отзыв о товаре",
#   "sentiment": "positive",
#   "tags": ["доставка", "качество", "рекомендация"],
#   "confidence": 0.95
# }

3. Генерация структурированных данных для БД

Use case: Создание записей в базе данных

interface Product {
  name: string;
  description: string;
  price: number;
  category: string;
  tags: string[];
}

async function generateProductData(prompt: string): Promise<Product> {
  const response = await fetch('https://api.aijora.com/api/v1/chat/completions', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${process.env.AIJORA_API_KEY}`
    },
    body: JSON.stringify({
      model: 'gpt-4o-mini',
      messages: [
        {
          role: 'system',
          content: 'Создай структуру товара для базы данных. JSON: name, description, price (число), category, tags (массив строк).'
        },
        {
          role: 'user',
          content: prompt
        }
      ],
      response_format: { type: 'json_object' },
      temperature: 0.7
    })
  });

  const data = await response.json();
  return JSON.parse(data.choices[0].message.content);
}

// Использование
const product = await generateProductData(
  'Беспроводные наушники с шумоподавлением, цена около 15000 рублей'
);

// Сохранение в БД
await db.products.insert(product);