Anthropic Messages API

Эндпоинт /v1/messages реализует формат Anthropic Messages API. Позволяет отправлять запросы к Claude и другим моделям, поддерживающим этот формат, используя те же структуры данных, что и в оригинальном Anthropic API.

Адрес эндпоинта https://api.ru-openrouter.ru/v1/messages
Базовый URL для SDK/клиента https://api.ru-openrouter.ru (без /v1)
Anthropic-клиенты (SDK, Agent SDK, консольные харнессы) дописывают путь /v1/messages к базовому URL сами. Указывайте базой только домен — https://api.ru-openrouter.ru. Если в базовом URL уже есть /v1, клиент соберёт /v1/v1/messages и получит ответ 404 endpoint_not_found.

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

Заголовок с API-ключом принимается в двух формах — достаточно одной из них:

Заголовок Кто так присылает
Authorization: Bearer sk_ваш_api_ключ OpenAI-совместимые клиенты
x-api-key: sk_ваш_api_ключ Anthropic-клиенты (SDK, харнессы)
Authorization: Bearer sk_ваш_api_ключ
x-api-key: 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

Суффикс :online к Anthropic Messages API не применяется. Веб-поиск здесь подключается серверным инструментом в формате Anthropic (результаты приходят блоками web_search_tool_result).

Параметр 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, max
  • format: схема структурированного вывода
  • task_budget: бюджет для агентного шага (рекомендательный, не жёсткое ограничение)

Параметр fallbacks

Модели для fallback, если основная модель недоступна или отказывает:

{
  "fallbacks": [
    { "model": "claude-opus-4.8" }
  ]
}

Максимум 3 модели. Не сочетается с models.

Заголовки атрибуции

Опциональные заголовки для идентификации вашего приложения в статистике OpenRouter:

Заголовок Описание
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 Пустой ответ от провайдера