hubris

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-спека).
modelsarray<string>Расширение Hubris: до 10 резервных моделей. При 429/5xx/таймауте первого байта у model запрос уходит к следующей; шаги, не принимающие картинки или документы, пропускаются. Биллинг по ответившей модели. См. Model fallbacks.
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": "Какая погода в Москве?" }
    ]
  }'

Серверный веб-поиск Anthropic

Инструмент web_search_20250305 исполняется на стороне провайдера: модель сама решает, когда искать, а в ответ приходят блоки server_tool_use и web_search_tool_result, после них — текст с цитатами. У такого инструмента нет input_schema, только type и name; необязательные max_uses, allowed_domains, blocked_domains и user_location передаются как есть.

{
  "model": "claude-sonnet-5",
  "max_tokens": 1024,
  "tools": [{ "type": "web_search_20250305", "name": "web_search", "max_uses": 3 }],
  "messages": [{ "role": "user", "content": "Курс доллара ЦБ на сегодня?" }]
}

Число обращений к поиску возвращается в usage.server_tool_use.web_search_requests; каждое стоит $0,01 сверх токенов и входит в usage.cost. Тот же поиск в формате Chat Completions описан в разделе Веб-поиск.

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Модель не найдена в каталоге или имя не парсится.
413request_too_largeТело запроса больше 36 МБ.
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 отсутствует, переключаемся на расчёт по токенам и каталожной цене модели. Подробности — в Биллинге.

Что дальше

Обновлено: