Anthropic Messages API
Эндпоинт /v1/messages реализует формат Anthropic Messages API. Позволяет отправлять запросы к Claude и другим моделям, поддерживающим этот формат, используя те же структуры данных, что и в оригинальном Anthropic API.
Базовый URL: https://api.ru-openrouter.ru/v1/messages
Аутентификация
Authorization: Bearer sk_ваш_api_ключ
Все запросы требуют API-ключ. Получить ключ можно в личном кабинете.
Создание сообщения
POST /v1/messages
Создаёт сообщение в формате Anthropic Messages API. Поддерживает текст, изображения, PDF, инструменты (tools) и extended thinking.
Тело запроса
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
model | string | Да | ID модели (например, anthropic/claude-sonnet-4) |
messages | array | Да | Массив сообщений в Anthropic-формате |
max_tokens | integer | Да | Максимальное количество токенов в ответе |
stream | boolean | Нет | По умолчанию false. Включить streaming (SSE) |
system | string или array | Нет | Системный промпт (строка или массив content-блоков с text) |
temperature | float | Нет | 0.0–1.0, по умолчанию 1.0 |
top_p | float | Нет | 0.0–1.0, по умолчанию 1.0 |
top_k | integer | Нет | Top-K sampling |
stop_sequences | array | Нет | Массив стоп-последовательностей |
tools | array | Нет | Описание инструментов (function calling) |
tool_choice | object | Нет | Выбор инструмента: auto, any, tool |
thinking | object | Нет | Extended thinking (бюджет токенов для размышлений) |
metadata | object | Нет | Метаданные, включая user_id для идентификации пользователя |
user | string | Нет | Идентификатор пользователя (до 256 символов) |
session_id | string | Нет | Уникальный идентификатор для группировки запросов. Используется для sticky routing — все запросы с одинаковым session_id направляются одному провайдеру для максимизации попадания в промпт-кэш. Максимум 256 символов |
cache_control | object | Нет | Автоматическое управление промпт-кэшированием |
provider | object | Нет | Настройки маршрутизации провайдера |
fallbacks | array | Нет | Модели для fallback (максимум 3) |
models | array | Нет | Альтернативные модели |
plugins | array | Нет | Плагины маршрутизации |
context_management | object | Нет | Управление контекстом |
output_config | object | Нет | Конфигурация выходных данных |
speed | string | Нет | Скорость генерации: standard (по умолчанию) или fast |
service_tier | string | Нет | Уровень обслуживания |
Параметр messages
Каждое сообщение должно содержать role и content:
- role:
userилиassistant - content: строка или массив content-блоков
Типы content-блоков:
| Тип блока | Описание |
|---|---|
text | Текстовое содержимое |
image | Изображение (base64 или URL) |
document | PDF-документ (base64 или URL) |
tool_use | Вызов инструмента (от assistant) |
tool_result | Результат выполнения инструмента (от user) |
thinking | Блок размышлений (extended thinking) |
Параметр thinking
{
"type": "enabled",
"budget_tokens": 16000
}
budget_tokens— бюджет токенов для этапа размышленийdisplay— отображение мыслей:summarized,omitted(опционально)
Параметр provider
Настройки маршрутизации запроса к конкретным провайдерам.
| Поле | Тип | Описание |
|---|---|---|
sort | string | Стратегия сортировки: price, throughput, latency, exacto |
order | array | Упорядоченный список провайдеров (по приоритету) |
ignore | array | Список провайдеров для исключения |
only | array | Список разрешённых провайдеров |
allow_fallbacks | boolean | Разрешить fallback-провайдеров (по умолчанию true) |
data_collection | string | allow (по умолчанию) или deny |
zdr | boolean | Только Zero Data Retention провайдеры |
require_parameters | boolean | Только провайдеры, поддерживающие все переданные параметры |
max_price | object | Максимальная цена за миллион токенов |
preferred_max_latency | number | Предпочтительная максимальная задержка (сек) |
preferred_min_throughput | number | Предпочтительная минимальная пропускная способность (токен/сек) |
quantizations | array | Фильтр по квантованию: int4, fp8, fp16, bf16 и др. |
Суффиксы модели
К имени модели можно добавить суффикс для быстрой настройки маршрутизации:
| Суффикс | Описание |
|---|---|
:nitro | Приоритет скорости (throughput) |
:floor | Приоритет цены (price) |
Пример: anthropic/claude-sonnet-4:nitro
Параметр cache_control
Автоматическое промпт-кэширование. Устанавливается на уровне запроса:
{
"cache_control": {
"type": "ephemeral"
}
}
Также поддерживается на уровне отдельных content-блоков:
{
"type": "text",
"text": "Большой блок текста...",
"cache_control": {
"type": "ephemeral"
}
}
TTL для кэша: 5m (5 минут) или 1h (1 час).
Параметр context_management
Управление контекстом (сжатие при превышении лимита токенов):
{
"edits": [
{
"type": "clear_tool_uses_20250919",
"trigger": { "type": "input_tokens", "value": 100000 },
"keep": { "type": "tool_uses", "value": 5 },
"clear_at_least": { "type": "input_tokens", "value": 50000 },
"clear_tool_inputs": false,
"exclude_tools": ["web_search"]
}
]
}
Параметр output_config
Управление выходными данными:
{
"effort": "medium",
"format": { /* schema structured output */ },
"task_budget": { "type": "tokens", "total": 400000 }
}
effort:low,medium,high,xhigh,maxformat: схема структурированного выводаtask_budget: бюджет для агентного шага (рекомендательный, не жёсткое ограничение)
Параметр fallbacks
Модели для fallback, если основная модель недоступна или отказывает:
{
"fallbacks": [
{ "model": "claude-opus-4.8" }
]
}
Максимум 3 модели. Не сочетается с models.
Заголовки атрибуции
Опциональные заголовки для идентификации вашего приложения в статистике:
| Заголовок | Описание |
|---|---|
HTTP-Referer | URL вашего сайта/приложения |
X-Title | Название вашего приложения |
X-OpenRouter-Title | Альтернативное название |
X-OpenRouter-Metadata | Включить метаданные маршрутизации в ответ (enabled) |
X-OpenRouter-Experimental-Metadata | Legacy-версия X-OpenRouter-Metadata |
Параметр stop_server_tools_when
Условия остановки цикла server-tool агента (логика ИЛИ):
{
"stop_server_tools_when": [
{ "type": "step_count_is", "step_count": 5 },
{ "type": "max_cost", "max_cost_in_dollars": 0.5 }
]
}
Примеры запросов
Простой запрос:
curl https://api.ru-openrouter.ru/v1/messages \
-H "Authorization: Bearer sk_ваш_api_ключ" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-sonnet-4",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": "Привет! Как дела?"
}
]
}'
С изображением:
curl https://api.ru-openrouter.ru/v1/messages \
-H "Authorization: Bearer sk_ваш_api_ключ" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-sonnet-4",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "Что изображено на этом фото?"
},
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/jpeg",
"data": "/9j/4AAQSkZJRg..."
}
}
]
}
]
}'
С инструментами (tools):
curl https://api.ru-openrouter.ru/v1/messages \
-H "Authorization: Bearer sk_ваш_api_ключ" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-sonnet-4",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": "Какая погода в Москве?"
}
],
"tools": [
{
"name": "get_weather",
"description": "Получить погоду в городе",
"input_schema": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "Город"
}
},
"required": ["location"]
}
}
]
}'
С extended thinking:
curl https://api.ru-openrouter.ru/v1/messages \
-H "Authorization: Bearer sk_ваш_api_ключ" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-sonnet-4",
"max_tokens": 32000,
"thinking": {
"type": "enabled",
"budget_tokens": 16000
},
"messages": [
{
"role": "user",
"content": "Реши сложную задачу..."
}
]
}'
С потоковым режимом (streaming):
curl https://api.ru-openrouter.ru/v1/messages \
-H "Authorization: Bearer sk_ваш_api_ключ" \
-H "Content-Type: application/json" \
-N \
-d '{
"model": "anthropic/claude-sonnet-4",
"stream": true,
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": "Напиши короткое стихотворение"
}
]
}'
Ответ
200 OK
{
"id": "msg_abc123",
"type": "message",
"role": "assistant",
"content": [
{
"type": "text",
"text": "Всё отлично! Чем могу помочь?",
"citations": null
}
],
"model": "anthropic/claude-sonnet-4",
"stop_reason": "end_turn",
"stop_sequence": null,
"stop_details": null,
"usage": {
"input_tokens": 12,
"output_tokens": 18,
"cache_creation_input_tokens": null,
"cache_read_input_tokens": null,
"total_cost": 0.1234,
"service_tier": "standard",
"inference_geo": null
}
}
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
id | string | Уникальный идентификатор сообщения |
type | string | Всегда message |
role | string | Всегда assistant |
content | array | Массив content-блоков с ответом модели |
model | string | ID модели, которая сгенерировала ответ |
stop_reason | string | Причина остановки: end_turn, max_tokens, stop_sequence, tool_use, refusal и др. |
stop_sequence | string | Стоп-последовательность, если остановка по ней |
stop_details | object | Детали остановки (при отказе — refusal с категорией и объяснением) |
usage | object | Информация об использовании токенов |
Поля usage
| Поле | Тип | Описание |
|---|---|---|
input_tokens | integer | Количество входных токенов |
output_tokens | integer | Количество выходных токенов |
total_cost | float | Стоимость запроса в рублях (с учётом наценки) |
cache_creation_input_tokens | integer | Токены, записанные в кэш |
cache_read_input_tokens | integer | Токены, прочитанные из кэша |
service_tier | string | Уровень обслуживания: standard |
inference_geo | string | Гео-регион инференса |
Типы content-блоков в ответе
| Тип блока | Описание |
|---|---|
text | Текстовый ответ (содержит text и опционально citations) |
tool_use | Вызов инструмента (содержит name, id, input) |
thinking | Блок размышлений (extended thinking, содержит thinking) |
Content-блок text с цитированием
{
"type": "text",
"text": "Согласно документации, процессор работает на частоте 3.2 ГГц.",
"citations": [
{
"type": "char_location",
"cited_text": "процессор работает на частоте 3.2 ГГц",
"document_index": 0,
"document_title": null,
"file_id": null,
"start_char_index": 0,
"end_char_index": 10
}
]
}
Ошибки
402 Insufficient Balance:
{
"error": {
"message": "Недостаточно средств на балансе. Требуется: 5.00 ₽, Доступно: 1.00 ₽",
"code": "insufficient_balance"
}
}
400 Invalid Request:
{
"error": {
"message": "Missing required parameter: max_tokens",
"code": "missing_max_tokens"
}
}
429 Rate Limit:
{
"error": {
"message": "Too many requests. Please try again in 30 seconds.",
"code": "rate_limit_exceeded",
"retry_after": 30
}
}
Коды ошибок
| HTTP-статус | Код ошибки | Описание |
|---|---|---|
| 400 | missing_model | Не указана модель |
| 400 | missing_messages | Не указаны сообщения |
| 400 | missing_max_tokens | Не указан max_tokens |
| 400 | model_not_found | Модель не найдена или неактивна |
| 400 | invalid_message_role | Недопустимая роль сообщения (допустимы: user, assistant) |
| 400 | invalid_message_format | Некорректный формат сообщения |
| 400 | missing_message_content | Отсутствует content в сообщении |
| 400 | invalid_session_id | session_id превышает 256 символов |
| 400 | input_tokens_exceeded | Входные токены превышают контекст модели |
| 402 | insufficient_balance | Недостаточно средств |
| 415 | unsupported_media_type | Неподдерживаемый Content-Type (только JSON) |
| 429 | rate_limit_exceeded | Превышен лимит запросов |
| 502 | empty_response | Пустой ответ от провайдера |