Claude — нативный формат Messages API
Модели Claude (Opus, Sonnet, Haiku) доступны через MegaAPI.ru в двух форматах:
нативном Anthropic Messages API (/v1/messages) и OpenAI-совместимом
(/v1/chat/completions). Нативный формат открывает кэширование промпта,
уровни effort и adaptive thinking — то, что недоступно в OpenAI-режиме.
/v1/chat/completions,
миграция нулевая. Но для Claude Code, Cline, Cursor и любых
высокочастотных/длинноконтекстных сценариев используйте нативный /v1/messages —
только он включает Prompt Caching и снижает счёт.
Доступные модели
| Семейство | Модель | Когда использовать |
|---|---|---|
| Opus | claude-opus-4-8 | Сложное программирование, глубокое рассуждение, агенты |
| Sonnet | claude-sonnet-4-6 | Универсальный баланс цена/качество, повседневный код |
| Haiku | claude-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-version | 2023-06-01 — обязательный заголовок версии |
content-type | application/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 кладётся в верхнеуровневый объект 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 | Максимум без ограничений | Действительно сложные задачи, самое глубокое рассуждение |
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": "Найди корень бага в проде по шагам." }]
}
thinking.type: "adaptive"— включает адаптивное мышление (без него модель не думает).thinking.display: "summarized"— вернуть в ответе блок-резюме мыслей; не нужно — уберите.high/xhigh/maxпочти всегда думают глубоко;low/mediumна простых задачах могут пропустить мышление.
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×):
| Тип | Множитель | Пояснение |
|---|---|---|
| Обычный вход | 1× | Некэшированная часть, базовая цена |
| Запись в кэш (TTL 5 мин) | 1.25× | Первая запись дороже на 25% |
| Запись в кэш (TTL 1 час) | 2× | Дольше хранение — дороже запись |
| Чтение из кэша (попадание) | 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.7 | 1024 |
| Sonnet 4.6, ранние Haiku | 2048 |
| Opus 4.5/4.6/4.7, Haiku 4.5 | 4096 |
3. Префикс должен совпадать байт-в-байт. Любой изменённый символ (пробел, порядок полей JSON, таймстамп) считается новым префиксом. Стабильное — в начало, изменяемое — в конец:
# ✓ длинный текст в начале (с меткой), вопрос в конце (без метки)
content = [
{"type": "text", "text": LONG_TEXT, "cache_control": {"type": "ephemeral"}},
{"type": "text", "text": question},
]
Как понять, попало ли в кэш
В каждом ответе в usage три поля:
| Поле | Смысл | Множитель |
|---|---|---|
input_tokens | Некэшированный остаток входа | 1× |
cache_creation_input_tokens | Сколько токенов записано в кэш | 1.25× или 2× |
cache_read_input_tokens | Сколько прочитано из кэша | 0.1× |
Полный вход = сумма трёх. Как только cache_read_input_tokens > 0 — вы экономите.
Поля cache_control в запросе и поля кэша в ответе передаются как есть — адаптация кода под прокси не нужна.
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 Fetch | web_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