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.
Эндпоинт
https://api.hubris.pw/v1/chat/completionsЗаголовки:
| Header | Значение |
|---|---|
Authorization | Bearer sk-gw-... (обязательно) |
Content-Type | application/json (обязательно для тела запроса) |
Accept | application/json или text/event-stream (опционально; при stream: true — SSE) |
Тело запроса
Обязательные поля помечены жирным. Остальное — опциональное.
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
model | string | — | Идентификатор модели, например anthropic/claude-haiku-4.5. Список доступных — GET /v1/models или каталог. |
messages | array<Message> | — | Цепочка сообщений диалога. Минимум 1. Структура — ниже. |
models | array<string> | — | До 10 fallback-моделей. Если основная недоступна — пробует следующие по порядку. Биллинг по фактически использованной (см. model в ответе). См. Model fallbacks. |
temperature | number 0–2 | 1 | Температура сэмплирования. 0 — детерминизм, 2 — максимум разнообразия. |
top_p | number 0–1 | 1 | Nucleus sampling. Альтернатива temperature — обычно меняют что-то одно. |
n | integer ≥ 1 | 1 | Сколько вариантов ответа сгенерировать. Каждый вариант оплачивается отдельно. |
stop | string | string[] | — | До 4 стоп-последовательностей. Модель прекратит генерацию при их встрече. |
max_tokens | integer > 0 | — | Лимит токенов в ответе. OpenAI-совместимое имя. |
max_completion_tokens | integer > 0 | — | Новое имя max_tokens (OpenAI deprecated старое для reasoning-моделей). Можно использовать любой из двух. |
frequency_penalty | number -2…2 | 0 | Штраф за повторение токенов. |
presence_penalty | number -2…2 | 0 | Штраф за повторение тем. |
logit_bias | object | — | Карта token_id → bias (от -100 до 100). Управление вероятностью отдельных токенов. |
seed | integer | — | Сид для best-effort детерминизма. Не гарантирует идентичности на разных прогонах. |
logprobs | boolean | false | Вернуть вероятности выбранных токенов. |
top_logprobs | integer 0–20 | — | Сколько top-альтернатив возвращать вместе с каждым выбранным токеном. Требует logprobs: true. |
tools | array<Tool> | — | Определения функций, которые модель может вызвать. Структура — Tools. |
tool_choice | string | object | "auto" | Принудительный выбор инструмента. "none" / "auto" / "required" или {type:"function", function:{name:"..."}}. |
parallel_tool_calls | boolean | true | Разрешить модели вызвать несколько tools в одном ответе. |
response_format | object | {type:"text"} | Формат ответа. text, json_object или json_schema. См. Structured outputs. |
modalities | array<string> | ["text"] | Какие модальности возвращать. ["image","text"] для image-gen моделей. |
image_config | object | — | Параметры image-gen: aspect_ratio, image_size и model-specific. См. Image generation. |
stream | boolean | false | Стриминг ответа через SSE. См. Стриминг. |
stream_options | object | — | Hubris автоматически выставляет include_usage: true для всех стримов. Указывать не обязательно. |
user | string | — | Идентификатор конечного пользователя для трекинга абьюза на стороне провайдера. |
reasoning_effort | "low" | "medium" | "high" | — | Для reasoning-моделей: бюджет «думания». Подробности — Reasoning. |
Сообщения
Каждый элемент messages — объект с обязательным полем role и зависящими от роли остальными полями.
system
{ "role": "system", "content": "Ты — лаконичный ассистент." }| Поле | Тип | Описание |
|---|---|---|
role | "system" | Роль. |
content | string | Системная инструкция. |
name | string | Опциональное имя автора. |
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
Каждый элемент tools — function (определение пользовательской функции) или 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.name | string | Имя функции. Только латиница, цифры, _ и -. |
function.description | string | Описание для модели — что делает функция и когда её вызывать. |
function.parameters | object | JSON Schema аргументов функции. |
function.strict | boolean | Если 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
}
}Поля ответа
| Поле | Тип | Описание |
|---|---|---|
id | string | Уникальный идентификатор completion. Префикс chatcmpl-. |
object | "chat.completion" | Тип объекта. Для стрима — "chat.completion.chunk". |
created | integer | Unix-timestamp (секунды). |
model | string | Фактически использованная модель (отличается от запрошенной при срабатывании models fallback). |
choices[] | array<Choice> | Варианты ответа. Длина равна n из запроса (по умолчанию 1). |
choices[].index | integer | Индекс варианта (0-based). |
choices[].message | object | Сообщение модели с role: "assistant", content и/или tool_calls. |
choices[].finish_reason | string | Почему генерация завершилась: stop / length / tool_calls / content_filter / function_call. |
choices[].logprobs | object | Если в запросе был logprobs: true. |
usage.prompt_tokens | integer | Токены ввода. |
usage.completion_tokens | integer | Токены вывода. |
usage.total_tokens | integer | Сумма. |
usage.cost | integer | Стоимость запроса в копейках. Hubris-расширение поверх стандартного OpenAI ответа. |
system_fingerprint | string | Метка конфигурации модели у провайдера (для отладки воспроизводимости). |
Стриминг
С 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.
Обновлено: