API Reference
API REFERENCE

POST /v1/messages

Эндпоинт, совместимый с Anthropic Messages API. Используется Claude Code и любым SDK Anthropic.

/v1/messages — эндпоинт, совместимый с Anthropic Messages API. Через него работают Claude Code, официальные SDK Anthropic для Python/TypeScript и любые инструменты, которые ожидают именно этот формат запросов.

Когда использовать

  • Вы подключаете Claude Code или другой инструмент, поддерживающий только Anthropic-формат.
  • Вам нужно нативное prompt caching (cache_control: { "type": "ephemeral" }).
  • Вам удобнее работать с Anthropic-style блоками контента (text, image, tool_use, tool_result).

Для типичных задач — POST /v1/chat/completions проще и поддерживает больше моделей.

Эндпоинт

POSThttps://api.hubris.pw/v1/messages

Аутентификация

Принимаются оба заголовка:

ЗаголовокКогда используется
Authorization: Bearer sk-gw-...Claude Code (ANTHROPIC_AUTH_TOKEN), произвольные cURL-запросы.
x-api-key: sk-gw-...Anthropic Python/TypeScript SDK по умолчанию.

Если переданы оба — приоритет у Authorization. Подойдут API-ключи Hubris формата sk-gw-…, созданные на /keys.

Также нужен anthropic-version: 2023-06-01 (Anthropic-спека) и Content-Type: application/json.

Тело запроса

ПолеТипПо умолчаниюОписание
modelstringИдентификатор модели. Принимает Anthropic-имена (claude-sonnet-4-5) и каноничные Hubris-имена (anthropic/claude-sonnet-4.6). См. Имена моделей.
max_tokensinteger > 0Лимит токенов в ответе. Обязательное (Anthropic-спека).
messagesarray<Message>Цепочка сообщений. Минимум 1. role: "user" | "assistant".
systemstring | Block[]Системная инструкция (отдельно от messages, как в Anthropic).
toolsarray<Tool>Anthropic Tool Use. См. ниже.
tool_choiceobject{type:"auto"}{type:"auto" | "any" | "tool", name?}.
temperaturenumber 0–11Температура сэмплирования.
top_pnumber 0–1Nucleus sampling.
top_kinteger ≥ 0Top-K sampling.
stop_sequencesstring[]До 4 стоп-последовательностей.
streambooleanfalseAnthropic SSE. См. Потоковая передача.
metadata.user_idstringAnthropic-метка пользователя для трекинга абьюза.

Минимальный запрос

curl https://api.hubris.pw/v1/messages \-H "x-api-key: sk-gw-..." \-H "anthropic-version: 2023-06-01" \-H "Content-Type: application/json" \-d '{  "model": "anthropic/claude-sonnet-4.5",  "max_tokens": 1024,  "messages": [    { "role": "user", "content": "Привет!" }  ]}'
from anthropic import Anthropicclient = Anthropic(  base_url="https://api.hubris.pw",  api_key="sk-gw-...",)message = client.messages.create(  model="anthropic/claude-sonnet-4.5",  max_tokens=1024,  messages=[{"role": "user", "content": "Привет!"}],)print(message.content[0].text)
import Anthropic from "@anthropic-ai/sdk";const client = new Anthropic({baseURL: "https://api.hubris.pw",apiKey: "sk-gw-...",});const message = await client.messages.create({model: "anthropic/claude-sonnet-4.5",max_tokens: 1024,messages: [{ role: "user", content: "Привет!" }],});console.log(message.content[0].text);

max_tokens — обязательное поле (Anthropic-спека). Если не указать, вернётся 400 invalid_request_error.

Имена моделей

Эндпоинт принимает три формы записи имени модели:

ФормаПримерКуда маппится
Каноничная (с префиксом провайдера)anthropic/claude-sonnet-4.6без изменений
Стабильная (без даты)claude-sonnet-4-5, claude-haiku-4-5anthropic/claude-sonnet-4.5, anthropic/claude-haiku-4.5
С суффиксом даты или -latestclaude-3-5-sonnet-20241022, claude-haiku-4-5-latestсоответствующая каноничная версия

Список активных Claude-моделей доступен через /v1/models с фильтром provider=anthropic.

Ответ

Anthropic-нативный формат:

{
  "id": "msg_01XYZ",
  "type": "message",
  "role": "assistant",
  "content": [
    { "type": "text", "text": "Привет!" }
  ],
  "model": "claude-sonnet-4-5",
  "stop_reason": "end_turn",
  "stop_sequence": null,
  "usage": {
    "input_tokens": 17,
    "output_tokens": 5,
    "cache_creation_input_tokens": 0,
    "cache_read_input_tokens": 0
  }
}

Поле model в ответе содержит то имя, которое вы прислали в запросе (а не каноничное), — это удобно для согласованности логов и совместимости со старыми SDK.

Потоковая передача

Параметр stream: true включает Anthropic SSE в нативном формате:

event: message_start
data: {"type":"message_start","message":{...,"usage":{"input_tokens":17}}}

event: content_block_start
data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Привет"}}

event: content_block_stop
data: {"type":"content_block_stop","index":0}

event: message_delta
data: {"type":"message_delta","delta":{"stop_reason":"end_turn"},"usage":{"output_tokens":5}}

event: message_stop
data: {"type":"message_stop"}

event: data
data: [DONE]

Финальное usage приходит в событии message_delta. Если клиент разорвал соединение раньше — Hubris всё равно дочитывает апстрим до конца и списывает стоимость с баланса.

Использование инструментов (tools)

Поддерживается полный набор Anthropic Tool Use: tools, tool_choice, блоки tool_use в ответе, блоки tool_result во входе. Параметры передаются без изменений на провайдера:

curl https://api.hubris.pw/v1/messages \
  -H "Authorization: Bearer sk-gw-..." \
  -d '{
    "model": "claude-sonnet-4-5",
    "max_tokens": 1024,
    "tools": [{
      "name": "get_weather",
      "description": "Возвращает погоду в указанном городе",
      "input_schema": {
        "type": "object",
        "properties": { "city": { "type": "string" } },
        "required": ["city"]
      }
    }],
    "messages": [
      { "role": "user", "content": "Какая погода в Москве?" }
    ]
  }'

Vision (изображения на вход)

Блоки image в content[] принимают и base64, и URL-источник:

{
  "role": "user",
  "content": [
    { "type": "text", "text": "Что на картинке?" },
    {
      "type": "image",
      "source": {
        "type": "base64",
        "media_type": "image/png",
        "data": "iVBORw0KGgoAAAA..."
      }
    }
  ]
}

Кэширование промптов

cache_control: { "type": "ephemeral" } ставится на блок контента или инструмента так же, как и в нативном Anthropic API. Hubris передаёт поле без изменений; биллинг учитывает cache_creation_input_tokens и cache_read_input_tokens по фактической стоимости, которую вернул провайдер.

{
  "role": "user",
  "content": [
    {
      "type": "text",
      "text": "<длинный системный контекст>",
      "cache_control": { "type": "ephemeral" }
    },
    { "type": "text", "text": "Вопрос пользователя" }
  ]
}

Ошибки

Возвращаются в нативном Anthropic-формате:

{
  "type": "error",
  "error": {
    "type": "invalid_request_error",
    "message": "max_tokens: Required"
  }
}
HTTPerror.typeЧто значит
400invalid_request_errorНеверное тело запроса (нет max_tokens, пустые messages и т.д.).
401authentication_errorНевалидный API-ключ или проблемы у апстрима.
402billing_errorБаланс ниже минимума. Пополните на /billing.
404not_found_errorМодель не найдена в каталоге или имя не парсится.
429rate_limit_errorПревышен дневной лимит ключа или лимит апстрима.
500 / 502api_errorВнутренняя ошибка апстрима.
504timeout_errorАпстрим не ответил в отведённое время.

Privacy Mode

На этом эндпоинте Privacy Mode (маскирование PII) пока не поддерживается — для запросов с маскированием используйте POST /v1/chat/completions. Это ограничение MVP, поддержка планируется.

Тарификация

Считаем по usage.cost, который провайдер возвращает в ответе (включая поправку на cache hit / cache write). В редком случае, когда cost отсутствует, переключаемся на расчёт по токенам и каталожной цене модели. Подробности — в Биллинге.

Что дальше

Обновлено:

POST /v1/messages · Hubris