В POST /v1/chat/completions передайте model, messages и при необходимости max_tokens (1–32768, по умолчанию 2048), temperature (0–2), stream. Доступные параметры также зависят от подтверждённых возможностей модели.

import OpenAI from 'openai';
const client = new OpenAI({apiKey: process.env.KVANTORA_API_KEY,
  baseURL: process.env.KVANTORA_BASE_URL + '/v1', maxRetries: 0});
const answer = await client.chat.completions.create({
  model: 'PUBLIC_API_ID',
  messages: [{role: 'user', content: 'Ответь кратко'}], max_tokens: 256
}, {headers: {'Idempotency-Key': process.env.REQUEST_ID}});
if (answer.object === 'chat.completion') {
  console.log(answer.choices[0]?.message.content);
} else {
  console.log('Обработка ещё не завершена:', answer);
}

Function tools описываются через type=function и function.name/description/parameters. До 128 функций, уникальные имена из букв ASCII, цифр, дефиса и подчёркивания, длина 1–64. tool_choice: auto, none, required или имя объявленной функции. Вызываемый инструмент выполняет ваше приложение; Kvantora не запускает произвольный код функции.

Parameters: ограниченная JSON Schema глубиной до 6, корень object. Допустимы type, description, properties, required, additionalProperties, items, enum. Ссылки, внешние схемы, pattern и combinators отклоняются. Ответ инструмента передавайте сообщением role=tool с tool_call_id. content=null у assistant допустим только с tool_calls.

Для JSON-объекта используйте response_format={"type":"json_object"}. Успешный результат проверяется как JSON-объект. При ошибке после отправки исход уточняется; отсутствие валидного JSON само по себе не означает освобождение резерва.

Изображения на входе

POST /v1/chat/completions принимает изображения во входных сообщениях пользователя (vision). Сообщение role=user может быть массивом частей {"type":"text","text":"..."} и {"type":"image_url","image_url":{"url":"kvantora-file:FILE_ID"}}; detail необязателен: auto, low или high.

Изображение передаётся только ссылкой kvantora-file:<id> на ваш готовый файл. Ссылки https:// на внешние адреса и data-URL (data:image/png;base64,...) не принимаются: запрос с ними отклоняется до резерва денег. Так каждая картинка проходит проверку типа, размера и антивирус до отправки модели, а читать файл может только его владелец.

  1. Загрузите файл по инструкции: POST /v1/files, PUT байтов, POST /v1/files/ID/complete. Подойдёт PNG (image/png), JPEG (image/jpeg) или WebP (image/webp) до 10 МиБ.
  2. Дождитесь status=ready (файл прошёл проверку) и возьмите его id.
  3. Передайте kvantora-file:<id> в части image_url.
const answer = await client.chat.completions.create({
  model: 'PUBLIC_API_ID', // у модели chat_features.image_input = true
  messages: [{role: 'user', content: [
    {type: 'text', text: 'Что изображено на картинке?'},
    {type: 'image_url', image_url: {url: `kvantora-file:${process.env.FILE_ID}`, detail: 'auto'}}
  ]}], max_tokens: 256
}, {headers: {'Idempotency-Key': process.env.REQUEST_ID}});

Лимиты: в одном сообщении до 9 частей (текст и изображения вместе), во всём запросе не более 32 изображений. Изображения принимает только chat/completions; POST /v1/responses и POST /v1/messages работают с текстом.

Модель должна принимать изображения: смотрите chat_features.image_input в каталоге. Конкретный список меняется вместе с каталогом, поэтому проверяйте поле перед отправкой; иначе ответ 400 unsupported_parameter.

Файлы проверяются до резерва денег: неподходящий тип или размер — 400 invalid_input_file, чужой или отсутствующий файл — 404 file_not_found, ещё не прошедший проверку — 409 file_not_ready, с истёкшим сроком хранения — 410 file_expired. Изображение отправляется модели заново в каждом запросе диалога. Для резерва оно учитывается как 6 000 входных токенов, а списываются фактические токены. Цену до запуска называет POST /v1/chat/quote с тем же телом.

Рассуждения

reasoning_effort принимает none, minimal, low, medium, high, xhigh или max, но только значения из chat_features.reasoning_efforts выбранной модели. Недопустимое значение отклоняется до резерва с 400 unsupported_parameter.

Оценка и предел цены

POST /v1/chat/quote принимает то же тело, что и /v1/chat/completions, и возвращает оценку резерва без вызова модели и списания; см. оплату. Поле max_cost_microrub ограничивает допустимую оценку: если она выше, запрос отклоняется с 409 quote_exceeds_limit до резервирования.

В примере PUBLIC_API_ID — место для public_api_id из каталога, а не имя существующей модели. Выбирайте модель с доступной операцией.