Чат и текст

POST /v1/chat/completions — OpenAI-совместимый эндпоинт. Тело запроса и ответ повторяют формат OpenAI, так что существующий код меняется только в baseURL и ключе.

POST /v1/chat/completions синхронный или потоковый ответ модели

Запрос

Обязательное поле одно — messages. Остальные поля OpenAI (temperature, max_tokens, top_p, stop и прочие) прокидываются провайдеру как есть: шлюз их не интерпретирует и не валидирует.

ПолеТипОписание
messagesarrayОбязательное. Сообщения в формате OpenAI: role + content. Пустой или отсутствующий массив → 400.
modelstringИдентификатор модели из каталога, например gpt-5 или gpt-5-mini. По умолчанию default — шлюз выберет доступную текстовую модель сам.
streambooleantrue → ответ приходит по SSE. См. раздел «Стриминг».
anyЛюбые другие поля OpenAI передаются провайдеру без изменений.
curl https://mintform.app/v1/chat/completions \
  -H "Authorization: Bearer mf_live_…" \
  -H "Content-Type: application/json" \
  -d '{
  "model": "gpt-5-mini",
  "messages": [
    {
      "role": "user",
      "content": "Объясни circuit breaker одним абзацем"
    }
  ]
}'

Ответ

Это единственный публичный эндпоинт без конверта {success, code, data, error}: и успех, и ошибка приходят в сыром формате OpenAI.

{
  "id": "chatcmpl-…",
  "object": "chat.completion",
  "model": "gpt-5-mini",
  "choices": [
    {
      "index": 0,
      "message": { "role": "assistant", "content": "A circuit breaker trips…" },
      "finish_reason": "stop"
    }
  ],
  "usage": { "prompt_tokens": 24, "completion_tokens": 96, "total_tokens": 120 }
}

Картинки на вход (vision)

Референс передаётся частями content в формате OpenAI-vision. В image_url.url принимается либо http(s)-ссылка, либо inline data-URI — формы взаимозаменяемы и могут смешиваться в одном сообщении.

{
  "model": "gpt-5",
  "messages": [
    {
      "role": "user",
      "content": [
        { "type": "text", "text": "What is on this image?" },
        { "type": "image_url", "image_url": { "url": "https://example.com/photo.png" } }
      ]
    }
  ]
}
{
  "model": "gpt-5",
  "messages": [
    {
      "role": "user",
      "content": [
        { "type": "text", "text": "Describe this reference in detail" },
        { "type": "image_url",
          "image_url": { "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA…" } }
      ]
    }
  ]
}

Ошибки

Ошибки этого эндпоинта тоже в формате OpenAI. Полная карта kind-ов и стратегия повторов — в разделе «Ошибки».

HTTPКогда
400messages отсутствует или не массив.
401Ключ отсутствует, отозван или неверен.
429Превышен rpm, конкурентность или суточная квота тарифа.
502Все подходящие провайдеры ответили ошибкой.
503Нет ни одного здорового текстового провайдера.
{
  "error": {
    "message": "rate limit exceeded (rpm)",
    "type": "invalid_request_error"
  }
}

Токены и usage

В несинхронном ответе поле usage приходит от провайдера. При стриминге usage появляется только если его отдаёт апстрим — не полагайся на него для биллинга: в кабинете расход считается в запросах.