Claude — нативный формат Messages API

Модели Claude (Opus, Sonnet, Haiku) доступны через MegaAPI.ru в двух форматах: нативном Anthropic Messages API (/v1/messages) и OpenAI-совместимом (/v1/chat/completions). Нативный формат открывает кэширование промпта, уровни effort и adaptive thinking — то, что недоступно в OpenAI-режиме.

Когда какой формат Если вы пишете на OpenAI SDK и кэширование вам не критично — просто подставьте имя Claude-модели в обычный /v1/chat/completions, миграция нулевая. Но для Claude Code, Cline, Cursor и любых высокочастотных/длинноконтекстных сценариев используйте нативный /v1/messages — только он включает Prompt Caching и снижает счёт.

Доступные модели

СемействоМодельКогда использовать
Opusclaude-opus-4-8Сложное программирование, глубокое рассуждение, агенты
Sonnetclaude-sonnet-4-6Универсальный баланс цена/качество, повседневный код
Haikuclaude-haiku-4-5-20251001Быстрые ответы, высокая нагрузка, дешёвые задачи

Доступны и предыдущие версии (Opus 4.7/4.6/4.5, Sonnet 4.5/4) — полный список с актуальными ценами в каталоге. У многих моделей есть вариант с суффиксом -thinking (напр. claude-sonnet-4-6-thinking), который включает режим размышления без правки тела запроса.

Эндпоинт и заголовки

Нативный эндпоинтPOST https://megaapi.ru/v1/messages
OpenAI-совместимыйPOST https://megaapi.ru/v1/chat/completions
x-api-keyВаш ключ sk-nexus-... (вместо Authorization: Bearer)
anthropic-version2023-06-01 — обязательный заголовок версии
content-typeapplication/json

Вызов: нативный формат

curl https://megaapi.ru/v1/messages \
  -H "content-type: application/json" \
  -H "anthropic-version: 2023-06-01" \
  -H "x-api-key: sk-nexus-..." \
  -d '{
    "model": "claude-sonnet-4-6",
    "max_tokens": 1024,
    "messages": [
      {"role": "user", "content": "Привет, расскажи о себе."}
    ]
  }'
# pip install anthropic
import anthropic

client = anthropic.Anthropic(
    api_key="sk-nexus-...",
    base_url="https://megaapi.ru",   # без /v1 — SDK сам добавит /v1/messages
)

msg = client.messages.create(
    model="claude-opus-4-8",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Напиши quicksort на Python."}],
)
print(msg.content[0].text)

Вызов: OpenAI-совместимый формат

from openai import OpenAI
client = OpenAI(api_key="sk-nexus-...", base_url="https://megaapi.ru/v1")

resp = client.chat.completions.create(
    model="claude-sonnet-4-6",
    messages=[{"role": "user", "content": "Привет!"}],
)
print(resp.choices[0].message.content)

Уровни усилия (effort)

Параметр effort определяет, сколько токенов модель готова потратить на результат — компромисс между «тщательностью» и «скоростью/стоимостью». Он влияет на все токены: основной ответ, вызовы инструментов и расширенное мышление.

Где лежит effort effort кладётся в верхнеуровневый объект output_config, не внутрь thinking — иначе вернётся 400. Beta-заголовок не нужен. Значение по умолчанию — high (равно «не передавать effort вовсе»).
{
  "model": "claude-opus-4-8",
  "max_tokens": 16000,
  "output_config": { "effort": "medium" },
  "messages": [{ "role": "user", "content": "Сравни микросервисы и монолит." }]
}
УровеньОписаниеСценарий
lowМаксимальная экономия, способности чуть нижеПростые задачи, высокая нагрузка, суб-агенты
mediumБаланс, умеренная экономия токеновКомпромисс для большинства агентских воркфлоу
highПо умолчанию, высокая способностьСложное рассуждение, тяжёлый код, чувствительность к качеству
xhighДлинная автономная работа (между high и max)Длительные сессии кодинга/агентов (30+ минут)
maxМаксимум без ограниченийДействительно сложные задачи, самое глубокое рассуждение
Для Opus 4.8 на коде/агентах начинайте с xhigh, для прочих интеллектуальных задач — high. При xhigh/max ставьте max_tokens с запасом (от 64k), чтобы хватило места и на мышление, и на ответ.

Adaptive thinking (расширенное мышление)

Opus 4.7/4.8 используют адаптивное мышление: модель сама решает, когда и сколько думать, а глубину регулирует effort.

{
  "model": "claude-opus-4-8",
  "max_tokens": 16000,
  "thinking": { "type": "adaptive", "display": "summarized" },
  "output_config": { "effort": "xhigh" },
  "messages": [{ "role": "user", "content": "Найди корень бага в проде по шагам." }]
}
Opus 4.7/4.8 не поддерживают старый формат thinking.type: "enabled" + budget_tokens (вернёт 400). Используйте adaptive + effort.

Разбор ответа

Поле content — массив блоков, различаемых по type:

for block in data["content"]:
    if block["type"] == "thinking":
        print("[резюме мыслей]", block["thinking"])
    elif block["type"] == "text":
        print("[ответ]", block["text"])

Расход токенов — в поле usage (input_tokens, output_tokens). Если stop_reason == "max_tokens", ответ обрезан лимитом (на высоком effort мышление легко его «съедает», и основной текст может оказаться пустым) — увеличьте max_tokens.

Кэширование промпта (Prompt Caching)

Самый прямой способ снизить счёт на Claude. Часть запроса, помеченную как кэшируемую, сервер сохраняет; при следующем запросе с тем же префиксом повторная обработка пропускается, а попавшие в кэш токены тарифицируются примерно в 10 раз дешевле и отвечают быстрее. Кэширование работает только в нативном формате /v1/messages.

Тарифные множители

Относительно обычной цены входного токена (= 1×):

ТипМножительПояснение
Обычный входНекэшированная часть, базовая цена
Запись в кэш (TTL 5 мин)1.25×Первая запись дороже на 25%
Запись в кэш (TTL 1 час)Дольше хранение — дороже запись
Чтение из кэша (попадание)0.1×Каждое последующее обращение дешевле на 90%

Точка окупаемости: при TTL 5 мин префикс достаточно переиспользовать 2 раза (1.25 + 0.1 < 2.0), при TTL 1 час — 3 раза. TTL — скользящее окно: каждое попадание сбрасывает таймер, поэтому активные сессии не «протухают».

Три обязательных условия попадания

1. Явная метка cache_control. content должен быть массивом блоков, метка ставится на нужный блок (чистая строка не кэшируется никогда):

# ✗ строка — не кэшируется
"content": "длинный текст..."

# ✓ блок + cache_control
"content": [
  {"type": "text", "text": "длинный стабильный текст...",
   "cache_control": {"type": "ephemeral"}},
  {"type": "text", "text": "вопрос"}
]

2. Минимальная длина. Короче порога — метка молча игнорируется:

МодельМинимум токенов
Sonnet 4.5 / 4 / 3.71024
Sonnet 4.6, ранние Haiku2048
Opus 4.5/4.6/4.7, Haiku 4.54096

3. Префикс должен совпадать байт-в-байт. Любой изменённый символ (пробел, порядок полей JSON, таймстамп) считается новым префиксом. Стабильное — в начало, изменяемое — в конец:

# ✓ длинный текст в начале (с меткой), вопрос в конце (без метки)
content = [
  {"type": "text", "text": LONG_TEXT, "cache_control": {"type": "ephemeral"}},
  {"type": "text", "text": question},
]

Как понять, попало ли в кэш

В каждом ответе в usage три поля:

ПолеСмыслМножитель
input_tokensНекэшированный остаток входа
cache_creation_input_tokensСколько токенов записано в кэш1.25× или 2×
cache_read_input_tokensСколько прочитано из кэша0.1×

Полный вход = сумма трёх. Как только cache_read_input_tokens > 0 — вы экономите. Поля cache_control в запросе и поля кэша в ответе передаются как есть — адаптация кода под прокси не нужна.

Ограничения На один запрос — максимум 4 точки cache_control; поиск префикса отслеживает только последние 20 content-блоков. Кэш изолирован по модели (смена модели = промах). На простой случай: по одной метке на определения инструментов, системный промпт, длинный документ и последний ход диалога — ровно 4 слота.

Нативный серверный инструмент web_search выполняет поиск на стороне модели. Подключается как инструмент в теле запроса:

{
  "model": "claude-sonnet-4-6",
  "max_tokens": 2048,
  "tools": [{"type": "web_search_20260209", "name": "web_search"}],
  "messages": [{"role": "user", "content": "Что нового вышло у Anthropic? Дай источники."}]
}
ИнструментtypeНазначение
Web Search (рекоменд.)web_search_20260209С динамической фильтрацией, модели 4.6+
Web Search (базовый)web_search_20250305Совместимость с более ранними моделями
Web Fetchweb_fetch_20260209Загрузка содержимого по конкретному URL

Доп. параметры: max_uses (лимит числа поисков), allowed_domains/blocked_domains (фильтр доменов).

Проверяйте, что поиск действительно сработал Если в ответе есть только блоки text, а в usage нет server_tool_use — поиск не выполнялся, и модель ответила по обучающим данным (ошибки при этом не будет, статус 200). Признак реального поиска — блоки server_tool_use и web_search_tool_result в content и счётчик usage.server_tool_use.web_search_requests. Для production-сценариев, где важна предсказуемость, надёжнее подать актуальные данные самостоятельно через RAG или собственный поисковый инструмент (function calling).

Открыть Claude в Студии → Кэширование во всех форматах Все модели Claude