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 проще и поддерживает больше моделей.
Эндпоинт
https://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.
Тело запроса
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
model | string | — | Идентификатор модели. Принимает Anthropic-имена (claude-sonnet-4-5) и каноничные Hubris-имена (anthropic/claude-sonnet-4.6). См. Имена моделей. |
max_tokens | integer > 0 | — | Лимит токенов в ответе. Обязательное (Anthropic-спека). |
messages | array<Message> | — | Цепочка сообщений. Минимум 1. role: "user" | "assistant". |
system | string | Block[] | — | Системная инструкция (отдельно от messages, как в Anthropic). |
tools | array<Tool> | — | Anthropic Tool Use. См. ниже. |
tool_choice | object | {type:"auto"} | {type:"auto" | "any" | "tool", name?}. |
temperature | number 0–1 | 1 | Температура сэмплирования. |
top_p | number 0–1 | — | Nucleus sampling. |
top_k | integer ≥ 0 | — | Top-K sampling. |
stop_sequences | string[] | — | До 4 стоп-последовательностей. |
stream | boolean | false | Anthropic SSE. См. Потоковая передача. |
metadata.user_id | string | — | Anthropic-метка пользователя для трекинга абьюза. |
Минимальный запрос
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-5 | anthropic/claude-sonnet-4.5, anthropic/claude-haiku-4.5 |
С суффиксом даты или -latest | claude-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"
}
}| HTTP | error.type | Что значит |
|---|---|---|
| 400 | invalid_request_error | Неверное тело запроса (нет max_tokens, пустые messages и т.д.). |
| 401 | authentication_error | Невалидный API-ключ или проблемы у апстрима. |
| 402 | billing_error | Баланс ниже минимума. Пополните на /billing. |
| 404 | not_found_error | Модель не найдена в каталоге или имя не парсится. |
| 429 | rate_limit_error | Превышен дневной лимит ключа или лимит апстрима. |
| 500 / 502 | api_error | Внутренняя ошибка апстрима. |
| 504 | timeout_error | Апстрим не ответил в отведённое время. |
Privacy Mode
На этом эндпоинте Privacy Mode (маскирование PII) пока не поддерживается — для запросов с маскированием используйте POST /v1/chat/completions. Это ограничение MVP, поддержка планируется.
Тарификация
Считаем по usage.cost, который провайдер возвращает в ответе (включая поправку на cache hit / cache write). В редком случае, когда cost отсутствует, переключаемся на расчёт по токенам и каталожной цене модели. Подробности — в Биллинге.
Что дальше
- Подключение Claude Code — подробный гид с настройкой и statusline-скриптом.
- POST /v1/chat/completions — основной эндпоинт, поддерживает больше моделей.
- Каталог моделей — фильтр
provider:anthropicдля списка Claude-моделей. - Ошибки — полная таблица кодов.
Обновлено: