API Reference
API REFERENCE

POST /v1/chat/completions

Создать chat completion. OpenAI-совместимый формат, поддержка стриминга, tool calling, structured outputs, vision.

Главный эндпоинт Hubris — создаёт ответ языковой модели на цепочку сообщений. OpenAI-совместимый формат — без переписывания работают openai Python SDK, OpenAI TypeScript SDK, LangChain, Vercel AI SDK и любые другие клиенты под OpenAI Chat Completions API.

Эндпоинт

POSThttps://api.hubris.pw/v1/chat/completions

Заголовки:

HeaderЗначение
AuthorizationBearer sk-gw-... (обязательно)
Content-Typeapplication/json (обязательно для тела запроса)
Acceptapplication/json или text/event-stream (опционально; при stream: true — SSE)

Тело запроса

Обязательные поля помечены жирным. Остальное — опциональное.

ПолеТипПо умолчаниюОписание
modelstringИдентификатор модели, например anthropic/claude-haiku-4.5. Список доступных — GET /v1/models или каталог.
messagesarray<Message>Цепочка сообщений диалога. Минимум 1. Структура — ниже.
modelsarray<string>До 10 fallback-моделей. Если основная недоступна — пробует следующие по порядку. Биллинг по фактически использованной (см. model в ответе). См. Model fallbacks.
temperaturenumber 0–21Температура сэмплирования. 0 — детерминизм, 2 — максимум разнообразия.
top_pnumber 0–11Nucleus sampling. Альтернатива temperature — обычно меняют что-то одно.
ninteger ≥ 11Сколько вариантов ответа сгенерировать. Каждый вариант оплачивается отдельно.
stopstring | string[]До 4 стоп-последовательностей. Модель прекратит генерацию при их встрече.
max_tokensinteger > 0Лимит токенов в ответе. OpenAI-совместимое имя.
max_completion_tokensinteger > 0Новое имя max_tokens (OpenAI deprecated старое для reasoning-моделей). Можно использовать любой из двух.
frequency_penaltynumber -2…20Штраф за повторение токенов.
presence_penaltynumber -2…20Штраф за повторение тем.
logit_biasobjectКарта token_id → bias (от -100 до 100). Управление вероятностью отдельных токенов.
seedintegerСид для best-effort детерминизма. Не гарантирует идентичности на разных прогонах.
logprobsbooleanfalseВернуть вероятности выбранных токенов.
top_logprobsinteger 0–20Сколько top-альтернатив возвращать вместе с каждым выбранным токеном. Требует logprobs: true.
toolsarray<Tool>Определения функций, которые модель может вызвать. Структура — Tools.
tool_choicestring | object"auto"Принудительный выбор инструмента. "none" / "auto" / "required" или {type:"function", function:{name:"..."}}.
parallel_tool_callsbooleantrueРазрешить модели вызвать несколько tools в одном ответе.
response_formatobject{type:"text"}Формат ответа. text, json_object или json_schema. См. Structured outputs.
modalitiesarray<string>["text"]Какие модальности возвращать. ["image","text"] для image-gen моделей.
image_configobjectПараметры image-gen: aspect_ratio, image_size и model-specific. См. Image generation.
streambooleanfalseСтриминг ответа через SSE. См. Стриминг.
stream_optionsobjectHubris автоматически выставляет include_usage: true для всех стримов. Указывать не обязательно.
userstringИдентификатор конечного пользователя для трекинга абьюза на стороне провайдера.
reasoning_effort"low" | "medium" | "high"Для reasoning-моделей: бюджет «думания». Подробности — Reasoning.

Сообщения

Каждый элемент messages — объект с обязательным полем role и зависящими от роли остальными полями.

system

{ "role": "system", "content": "Ты — лаконичный ассистент." }
ПолеТипОписание
role"system"Роль.
contentstringСистемная инструкция.
namestringОпциональное имя автора.

user

{ "role": "user", "content": "Привет! Как дела?" }

Content может быть строкой ИЛИ массивом мультимодальных частей (текст + картинки):

{
  "role": "user",
  "content": [
    { "type": "text", "text": "Что на картинке?" },
    { "type": "image_url", "image_url": { "url": "https://example.com/photo.jpg" } }
  ]
}

Поддерживаемые type: text, image_url. URL может быть https://... или data:image/<mime>;base64,.... Подробности — Vision.

assistant

{ "role": "assistant", "content": "Привет! Хорошо, спасибо." }

С tool calls:

{
  "role": "assistant",
  "content": null,
  "tool_calls": [
    {
      "id": "call_abc",
      "type": "function",
      "function": { "name": "get_weather", "arguments": "{\"city\":\"Москва\"}" }
    }
  ]
}

tool

Результат вызова функции (отправляется после assistant-сообщения с tool_calls):

{
  "role": "tool",
  "tool_call_id": "call_abc",
  "content": "{\"temp\": -5, \"condition\": \"snow\"}"
}

Tools

Каждый элемент toolsfunction (определение пользовательской функции) или server (server-side tool провайдера: web search, code interpreter и т.д.; зависит от модели).

Function tool

{
  "type": "function",
  "function": {
    "name": "get_weather",
    "description": "Получить текущую погоду по городу",
    "parameters": {
      "type": "object",
      "properties": { "city": { "type": "string" } },
      "required": ["city"]
    },
    "strict": true
  }
}
ПолеТипОписание
type"function"Дискриминатор.
function.namestringИмя функции. Только латиница, цифры, _ и -.
function.descriptionstringОписание для модели — что делает функция и когда её вызывать.
function.parametersobjectJSON Schema аргументов функции.
function.strictbooleanЕсли true, модель гарантированно вернёт arguments, валидные по схеме.

Полный гайд с примерами обработки — Tool calling.

Structured outputs

Поле response_format принимает три формы:

{ "type": "text" }
{ "type": "json_object" }
{
  "type": "json_schema",
  "json_schema": {
    "name": "city_info",
    "schema": {
      "type": "object",
      "properties": {
        "name":       { "type": "string" },
        "country":    { "type": "string" },
        "population": { "type": "number" }
      },
      "required": ["name", "country", "population"]
    },
    "strict": true
  }
}

При json_schema модель гарантированно вернёт валидный JSON по вашей схеме. Подробности и примеры — Structured output.

Минимальный пример

curl -s https://api.hubris.pw/v1/chat/completions \-H "Authorization: Bearer sk-gw-..." \-H "Content-Type: application/json" \-d '{  "model": "anthropic/claude-haiku-4.5",  "messages": [{"role": "user", "content": "Привет!"}],  "max_tokens": 50}'
from openai import OpenAIclient = OpenAI(  base_url="https://api.hubris.pw/v1",  api_key="sk-gw-...",)response = client.chat.completions.create(  model="anthropic/claude-haiku-4.5",  messages=[{"role": "user", "content": "Привет!"}],  max_tokens=50,)print(response.choices[0].message.content)
import OpenAI from "openai";const client = new OpenAI({baseURL: "https://api.hubris.pw/v1",apiKey: "sk-gw-...",});const response = await client.chat.completions.create({model: "anthropic/claude-haiku-4.5",messages: [{ role: "user", content: "Привет!" }],max_tokens: 50,});console.log(response.choices[0].message.content);

Ответ

{
  "id": "chatcmpl-abc123",
  "object": "chat.completion",
  "created": 1714000000,
  "model": "anthropic/claude-haiku-4.5",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "Привет! Чем могу помочь?"
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 12,
    "completion_tokens": 7,
    "total_tokens": 19,
    "cost": 24
  }
}

Поля ответа

ПолеТипОписание
idstringУникальный идентификатор completion. Префикс chatcmpl-.
object"chat.completion"Тип объекта. Для стрима — "chat.completion.chunk".
createdintegerUnix-timestamp (секунды).
modelstringФактически использованная модель (отличается от запрошенной при срабатывании models fallback).
choices[]array<Choice>Варианты ответа. Длина равна n из запроса (по умолчанию 1).
choices[].indexintegerИндекс варианта (0-based).
choices[].messageobjectСообщение модели с role: "assistant", content и/или tool_calls.
choices[].finish_reasonstringПочему генерация завершилась: stop / length / tool_calls / content_filter / function_call.
choices[].logprobsobjectЕсли в запросе был logprobs: true.
usage.prompt_tokensintegerТокены ввода.
usage.completion_tokensintegerТокены вывода.
usage.total_tokensintegerСумма.
usage.costintegerСтоимость запроса в копейках. Hubris-расширение поверх стандартного OpenAI ответа.
system_fingerprintstringМетка конфигурации модели у провайдера (для отладки воспроизводимости).

Стриминг

С stream: true ответ приходит chunk-ами через Server-Sent Events:

curl -N -s https://api.hubris.pw/v1/chat/completions \
  -H "Authorization: Bearer sk-gw-..." \
  -H "Content-Type: application/json" \
  -d '{
    "model": "anthropic/claude-haiku-4.5",
    "messages": [{"role": "user", "content": "Расскажи короткую историю"}],
    "stream": true
  }'

Формат каждого chunk, отслеживание usage и обработка [DONE] — на странице Стриминг.

Tool calling

curl -s https://api.hubris.pw/v1/chat/completions \
  -H "Authorization: Bearer sk-gw-..." \
  -H "Content-Type: application/json" \
  -d '{
    "model": "anthropic/claude-haiku-4.5",
    "messages": [{"role": "user", "content": "Какая погода в Москве?"}],
    "tools": [{
      "type": "function",
      "function": {
        "name": "get_weather",
        "description": "Получить текущую погоду по городу",
        "parameters": {
          "type": "object",
          "properties": {"city": {"type": "string"}},
          "required": ["city"]
        }
      }
    }]
  }'

Модель вернёт tool_calls вместо обычного content — выполните функцию у себя и отправьте результат вторым запросом с role: "tool". Полный сценарий — Tool calling.

Vision

curl -s https://api.hubris.pw/v1/chat/completions \
  -H "Authorization: Bearer sk-gw-..." \
  -H "Content-Type: application/json" \
  -d '{
    "model": "anthropic/claude-haiku-4.5",
    "messages": [{
      "role": "user",
      "content": [
        {"type": "text", "text": "Что на картинке?"},
        {"type": "image_url", "image_url": {"url": "https://example.com/photo.jpg"}}
      ]
    }]
  }'

Поддерживается только моделями с image в input_modalities — см. GET /v1/models и страницу Vision.

HTTP-коды

КодКогдаПолный список —
200Успешный ответ
400Тело запроса не соответствует схемеОшибки
401Ключ отсутствует / отозван / невалиденОшибки
402Недостаточно средств на балансеБиллинг
404Модели с таким model не существуетКаталог
429Превышен дневной лимит на ключеRate limits
502 / 503 / 504Транзиентные сбои у провайдера или курса ЦБОбработка ошибок

Формат тела ошибки и стратегия retry — Ошибки.

Что дальше

  • Стриминг — формат SSE и обработка в клиенте.
  • Tool calling — пошаговый сценарий с многократными итерациями.
  • Structured output — JSON Schema validation.
  • Ошибки — таблица всех кодов и retry-стратегий.
  • Цены — как считается usage.cost.

Обновлено:

POST /v1/chat/completions · Hubris