Чат и текст
POST /v1/chat/completions — OpenAI-совместимый эндпоинт. Тело запроса и ответ повторяют формат OpenAI, так что существующий код меняется только в baseURL и ключе.
/v1/chat/completions синхронный или потоковый ответ моделиЗапрос
Обязательное поле одно — messages. Остальные поля OpenAI (temperature, max_tokens, top_p, stop и прочие) прокидываются провайдеру как есть: шлюз их не интерпретирует и не валидирует.
| Поле | Тип | Описание |
|---|---|---|
| messages | array | Обязательное. Сообщения в формате OpenAI: role + content. Пустой или отсутствующий массив → 400. |
| model | string | Идентификатор модели из каталога, например gpt-5 или gpt-5-mini. По умолчанию default — шлюз выберет доступную текстовую модель сам. |
| stream | boolean | true → ответ приходит по 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 | Когда |
|---|---|
| 400 | messages отсутствует или не массив. |
| 401 | Ключ отсутствует, отозван или неверен. |
| 429 | Превышен rpm, конкурентность или суточная квота тарифа. |
| 502 | Все подходящие провайдеры ответили ошибкой. |
| 503 | Нет ни одного здорового текстового провайдера. |
{
"error": {
"message": "rate limit exceeded (rpm)",
"type": "invalid_request_error"
}
}Токены и usage
В несинхронном ответе поле usage приходит от провайдера. При стриминге usage появляется только если его отдаёт апстрим — не полагайся на него для биллинга: в кабинете расход считается в запросах.