О ценах. Суммы ниже посчитаны по историческим листовым тарифам Anthropic: так проще увидеть пропорции. В codexkey все Opus и GPT-5 стоят $0.50 / $0.50 за 1M, все Sonnet и gpt-5.6-luna стоят $0.33 / $0.33 за 1M. Реальные счета в 5-30 раз ниже.
Haiku в каталоге тоже есть:
claude-haiku-5.5иclaude-haiku-4.5. Цены смотрите на странице моделей. Они работают в канале Premium, в канале Cheap Haiku их нет.
Почему счёт за Claude API растёт так быстро
Счёт за Claude API состоит из двух частей: входные токены и выходные токены. Команды обычно следят за длиной промпта и не замечают, что настоящие деньги уходят в выход.
Цены на апрель 2026 для трёх основных моделей:
| Модель | Вход (за 1M токенов) | Выход (за 1M токенов) | Соотношение |
|---|---|---|---|
| Claude Opus 4.8 | $0.50 | $0.50 | 5× |
| Claude Sonnet 4.6 | $0.33 | $0.33 | 5× |
| gpt-5.6-luna | $0.33 | $0.33 | 5× |
Выход дороже входа в 5 раз во всей линейке. Ответ в 500 токенов стоит столько же, сколько 2 500 токенов запроса. Если вы генерируете длинные тексты, цепочки рассуждений или раздутый JSON и не ограничиваете длину ответа, счёт взлетает.
Возьмём типичный стартап: 10 миллионов запросов к Sonnet в месяц, в среднем 1 000 входных и 500 выходных токенов на запрос. Он платит так:
- Вход: 10M × 1 000 / 1M × $3.00 = $30 000
- Выход: 10M × 500 / 1M × $15.00 = $75 000
- Итого: $105 000/мес.
Выход занимает 71% счёта. Каждая стратегия ниже делает одно из двух: сокращает число токенов или переводит их на более дешёвый тариф. Часть делает и то и другое.
Стратегия 1: кэширование промптов, минус 90% на повторяющийся контекст
Системный промпт, few-shot примеры и RAG-контекст часто одинаковы у тысяч запросов, а вы каждый раз платите за них полную цену. Кэширование промптов у Anthropic хранит такой префикс на сервере и при повторных обращениях берёт 10% от обычной цены входных токенов.
Как это устроено
Нужные блоки в сообщениях помечаются атрибутом cache_control: {'type': 'ephemeral'}. Первый запрос обходится чуть дороже: запись в кэш идёт с надбавкой 25%. Все последующие запросы в пределах TTL читают эти токены со скидкой 90%. Сейчас TTL равен 5 минутам и продлевается при каждом попадании.
Код на Python
import anthropic
client = anthropic.Anthropic()
# Системный промпт на 4000 токенов, кэшируется после первого вызова
system_blocks = [
{
"type": "text",
"text": LARGE_SYSTEM_PROMPT, # ваш промпт на 4к токенов
"cache_control": {"type": "ephemeral"},
}
]
def ask(question: str) -> str:
response = client.messages.create(
model="claude-sonnet-5",
max_tokens=1024,
system=system_blocks,
messages=[{"role": "user", "content": question}],
)
usage = response.usage
print(f"Токены из кэша: {usage.cache_read_input_tokens}")
print(f"Токены записи в кэш: {usage.cache_creation_input_tokens}")
return response.content[0].text
Код на TypeScript
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic();
const systemBlocks = [
{
type: "text" as const,
text: LARGE_SYSTEM_PROMPT,
cache_control: { type: "ephemeral" as const },
},
];
async function ask(question: string): Promise<string> {
const response = await client.messages.create({
model: "claude-sonnet-5",
max_tokens: 1024,
system: systemBlocks,
messages: [{ role: "user", content: question }],
});
console.log("Из кэша:", response.usage.cache_read_input_tokens);
return response.content[0].type === "text" ? response.content[0].text : "";
}
Сколько это даёт
Системный промпт на 4 000 токенов, 1 000 запросов в час на Sonnet:
- Без кэширования: 4 000 × 1 000 × $3 / 1M = $12.00/час
- С кэшированием: первый запрос по $3.75/M (надбавка за запись), остальные 999 по $0.30/M = ~$1.21/час
- Экономия: ~90%
Ни один другой приём не окупается так быстро. Если из всей статьи вы внедрите что-то одно, пусть это будет кэш.
Стратегия 2: маршрутизация моделей, каждой задаче своя
Opus нужен далеко не каждому запросу, а gpt-5.6-luna справится не со всем. Схема простая: определите тип входящей задачи и отправьте её на самую дешёвую модель, которая с ней справляется.
Рабочее распределение выглядит так:
| Тип задачи | Модель | Почему |
|---|---|---|
| Классификация, тегирование, извлечение | gpt-5.6-luna | Быстрая и дешёвая, точность >95% на структурированных задачах |
| Суммаризация, генерация, ответы RAG | Sonnet | Лучшее соотношение цены и качества для открытой генерации |
| Сложные рассуждения, генерация кода, агентные циклы | Opus | Премия оправдана, только когда качество напрямую влияет на выручку |
Роутер на Python
import anthropic
client = anthropic.Anthropic()
MODEL_MAP = {
"classify": "gpt-5.6-luna",
"generate": "claude-sonnet-5",
"reason": "claude-opus-4.8",
}
def route_and_call(task_type: str, prompt: str, max_tokens: int = 1024) -> str:
model = MODEL_MAP.get(task_type, "claude-sonnet-5")
response = client.messages.create(
model=model,
max_tokens=max_tokens,
messages=[{"role": "user", "content": prompt}],
)
return response.content[0].text
# Классификация: gpt-5.6-luna по $0.80/M на входе
label = route_and_call("classify", "Классифицируй тикет: 'Мой заказ опаздывает'")
# Генерация: Sonnet по $3/M на входе
summary = route_and_call("generate", f"Резюмируй документ: {doc}")
# Сложные рассуждения: Opus по $15/M на входе
analysis = route_and_call("reason", f"Проанализируй риски контракта: {contract}")
Сколько это даёт
Пусть 60% трафика приходится на классификацию, 30% на генерацию и 10% на рассуждения. Сравниваем с вариантом «всё на Sonnet»:
| Сценарий | Месячная стоимость (10M запросов) |
|---|---|
| Всё на Sonnet | $105 000 |
| С маршрутизацией (60% gpt-5.6-luna, 30% Sonnet, 10% Opus) | $55 200 |
| Экономия | ~47% |
Если добавить кэширование, экономия перемножается.
Стратегия 3: Batch API, половина цены за отложенные задачи
Если ответ нужен не сразу, пользуйтесь Batch API. Подходят ночная классификация, оценочные прогоны, разметка данных, модерация контента. Вы отправляете JSONL-файл с запросами, Anthropic обрабатывает их в течение 24 часов, а вы платите ровно половину обычной цены и за входные, и за выходные токены.
Код на Python
import anthropic
import json
client = anthropic.Anthropic()
# Формируем запросы
requests = []
for i, item in enumerate(dataset):
requests.append({
"custom_id": f"item-{i}",
"params": {
"model": "claude-sonnet-5",
"max_tokens": 256,
"messages": [
{"role": "user", "content": f"Классифицируй: {item['text']}"}
],
},
})
# Отправляем батч
batch = client.batches.create(requests=requests)
print(f"Batch ID: {batch.id}, статус: {batch.processing_status}")
# Ждём завершения
import time
while True:
status = client.batches.retrieve(batch.id)
if status.processing_status == "ended":
break
time.sleep(60)
# Забираем результаты
for result in client.batches.results(batch.id):
print(result.custom_id, result.result.message.content[0].text)
Где Batch API подходит
- Оценочные прогоны на сотнях и тысячах тест-кейсов
- Ночная классификация и разметка больших датасетов
- Ежемесячная модерация контента
- Генерация синтетических данных для обучения
Где его лучше не использовать
- Всё, что видит пользователь и требует задержки
<5с - Стриминговые чат-интерфейсы
- Агентные циклы с tool use, где следующий шаг зависит от предыдущего ответа
Batch API работает вместе с кэшированием. Кэшированные токены идут со скидкой 90%, а на остальное действует скидка батча 50%. Дешевле запускать Claude в больших объёмах не получится.
Стратегия 4: бюджет токенов, не платите за лишнее
Самый прямой способ сэкономить на выходе: генерировать меньше. Для этого есть три приёма.
1. Ставьте max_tokens жёстко
Когда ответ состоит из одного слова или короткого JSON, max_tokens на 4096 незачем. Выставьте минимальное разумное значение. Дойдя до лимита, Claude останавливается, и вы перестаёте платить.
# Плохо: платим за потенциальные 4096 выходных токенов
response = client.messages.create(
model="claude-sonnet-5",
max_tokens=4096,
messages=[{"role": "user", "content": "Это спам? Ответь да или нет."}],
)
# Хорошо: платим максимум за 16 выходных токенов
response = client.messages.create(
model="claude-sonnet-5",
max_tokens=16,
messages=[{"role": "user", "content": "Это спам? Ответь да или нет."}],
)
2. Добавьте стоп-последовательности
Попросите модель остановиться, как только она выдаст нужный разделитель. Это особенно удобно при генерации структурированных данных:
response = client.messages.create(
model="claude-sonnet-5",
max_tokens=512,
stop_sequences=["</answer>"],
messages=[{"role": "user", "content": "Ответь в тегах <answer>."}],
)
3. Стримьте и обрывайте досрочно
При стриминге токены приходят по одному, поэтому запрос можно отменить, едва вы получили нужное:
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic();
async function classifyWithEarlyStop(text: string): Promise<string> {
let result = "";
const stream = client.messages.stream({
model: "claude-sonnet-5",
max_tokens: 64,
messages: [{ role: "user", content: `Классифицируй: ${text}` }],
});
for await (const event of stream) {
if (
event.type === "content_block_delta" &&
event.delta.type === "text_delta"
) {
result += event.delta.text;
if (result.includes("\n")) {
await stream.abort(); // прекращаем платить
break;
}
}
}
return result.trim();
}
Все три приёма вместе срезают расходы на выходные токены на 30-60% в задачах классификации и извлечения.
Стратегия 5: префилл ответа, перенос токенов с выхода на вход
В API Claude можно добавить в конец массива сообщение с ролью assistant и так «предзаполнить» начало ответа. Модель продолжит с того места, где вы остановились. Предзаполненные токены считаются входными (дешёвыми), а не выходными (дорогими).
Пример с извлечением JSON
response = client.messages.create(
model="claude-sonnet-5",
max_tokens=256,
messages=[
{"role": "user", "content": f"Извлеки имя, email, компанию из: {text}"},
{"role": "assistant", "content": '{"name": "'},
],
)
# Claude продолжит: Иван Петров", "email": "ivan@example.com", "company": "Acme"}
# Префикс '{"name": "' тарифицирован по ставке входных токенов, а не выходных
Что это даёт
Допустим, JSON-ответ занимает 200 токенов. Если 50 из них (ключи, скобки, форматирование) предзаполнить, 25% стоимости выхода переезжает на входной тариф. На этих токенах цена падает в 4 раза.
Есть и второй плюс: надёжность. Когда Claude уже находится внутри JSON, он гораздо реже оборачивает ответ в маркдаун-блок или пишет вступление.
Стратегия 6: структурированный вывод через tool use
Можно попросить Claude вернуть JSON обычным текстом и разобрать его самому. Это хрупко, и модель тратит лишние токены на пояснения. Надёжнее заставить её выдать структуру через tool use (вызов функций).
Код на Python
import anthropic
client = anthropic.Anthropic()
tools = [
{
"name": "classify_ticket",
"description": "Классифицировать тикет поддержки",
"input_schema": {
"type": "object",
"properties": {
"category": {
"type": "string",
"enum": ["billing", "technical", "general", "urgent"],
},
"priority": {
"type": "integer",
"minimum": 1,
"maximum": 5,
},
"summary": {
"type": "string",
"maxLength": 100,
},
},
"required": ["category", "priority", "summary"],
},
}
]
response = client.messages.create(
model="gpt-5.6-luna",
max_tokens=256,
tools=tools,
tool_choice={"type": "tool", "name": "classify_ticket"},
messages=[
{"role": "user", "content": f"Классифицируй тикет: {ticket_text}"}
],
)
tool_block = next(b for b in response.content if b.type == "tool_use")
result = tool_block.input # {'category': 'billing', 'priority': 3, 'summary': '...'}
Код на TypeScript
const response = await client.messages.create({
model: "gpt-5.6-luna",
max_tokens: 256,
tools: [
{
name: "classify_ticket",
description: "Классифицировать тикет поддержки",
input_schema: {
type: "object",
properties: {
category: {
type: "string",
enum: ["billing", "technical", "general", "urgent"],
},
priority: { type: "integer", minimum: 1, maximum: 5 },
summary: { type: "string", maxLength: 100 },
},
required: ["category", "priority", "summary"],
},
},
],
tool_choice: { type: "tool", name: "classify_ticket" },
messages: [{ role: "user", content: `Классифицируй тикет: ${ticketText}` }],
});
const toolBlock = response.content.find((b) => b.type === "tool_use");
const result = toolBlock?.input;
Что вы получаете по сравнению со свободным JSON:
- Валидный JSON гарантирован: нет ошибок парсинга и повторных запросов
- Выходных токенов меньше: Claude не дописывает пояснения, оговорки и маркдаун-обёртки
- Схема проверяется на стороне API: перечисления, обязательные поля и типы
Команды, которые уходят от «JSON в тексте» к tool use, обычно сокращают выходные токены на 20-40% в задачах извлечения.
Стратегия 7: шлюз без лишних наценок, например codexkey
Шесть стратегий выше уменьшают число токенов. Седьмая работает с ценой за токен: вернее, убирает лишние наценки вокруг неё.
При прямом доступе к Claude API через Anthropic вам понадобится:
- нероссийская банковская карта или платёжный адрес;
- работа с долларовыми счетами и комиссиями за конвертацию;
- выполнение требований по минимальному объёму или предоплате на некоторых тарифах.
codexkey - это OpenAI-совместимый шлюз. Он проксирует запросы к официальному API Anthropic по тем же ценам, без наценки, и добавляет:
- Оплата в рублях: СБП, карты, криптовалюта
- Без минимального порога: платите по факту, даже за небольшой проект
- Совместимость с OpenAI SDK: меняете base URL и оставляете свой код
- Все модели: Sonnet, Opus, gpt-5.6-luna, включая свежие релизы
from openai import OpenAI
# Направляем существующий OpenAI SDK на codexkey
client = OpenAI(
base_url="https://api.codexkey.ru/v1",
api_key="your-codexkey-key",
)
response = client.chat.completions.create(
model="claude-sonnet-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Привет от codexkey!"}],
)
print(response.choices[0].message.content)
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.codexkey.ru/v1",
apiKey: "your-codexkey-key",
});
const response = await client.chat.completions.create({
model: "claude-sonnet-5",
max_tokens: 1024,
messages: [{ role: "user", content: "Привет от codexkey!" }],
});
console.log(response.choices[0].message.content);
Дело не в «более дешёвом» API: цены codexkey совпадают с ценами Anthropic. Дело в трении. Комиссии за конвертацию, запутанный биллинг и географические ограничения незаметно утяжеляют любой рабочий процесс.
Итоговый расчёт: сколько вы платите до и после
Возьмём стартап из начала статьи (10 миллионов запросов к Sonnet в месяц, в среднем 1 000 входных и 500 выходных токенов) и применим все стратегии по очереди.
| Шаг | Стоимость входа | Стоимость выхода | Итого | Экономия vs базовый |
|---|---|---|---|---|
| Базовый (без изменений) | $30 000 | $75 000 | $105 000 | - |
| + Кэширование промптов (70% входа в кэше) | $11 700 | $75 000 | $86 700 | 17% |
| + Маршрутизация моделей (60% на gpt-5.6-luna) | $5 148 | $33 000 | $38 148 | 64% |
| + Бюджет токенов (среднее → 300 токенов) | $5 148 | $19 800 | $24 948 | 76% |
| + Batch API на 30% трафика | $4 378 | $16 830 | $21 208 | 80% |
| + Префилл и tool use (−20% выход) | $4 378 | $13 464 | $17 842 | 83% |
Было $105 000, стало меньше $18 000. Это минус 83%, и промпт-инжиниринг для сокращения входных данных мы даже не трогали.
Точные цифры зависят от вашего набора нагрузок, но закономерность не меняется: каждая следующая стратегия умножается на предыдущие, и экономия нарастает быстрее, чем кажется.
FAQ
Как считается цена при кэшировании промптов?
Запись в кэш на 25% дороже обычных входных токенов ($3.75/M на Sonnet вместо $3.00/M). Чтение из кэша на 90% дешевле ($0.30/M на Sonnet). Кэш живёт 5 минут, и каждое обращение сбрасывает TTL. Если трафик ровный (хотя бы один запрос раз в 5 минут с тем же кэшируемым префиксом), экономия начинается уже с первого цикла.
Совместимо ли кэширование промптов с Batch API?
Да. Скидка за кэш действует на кэшированную часть входных токенов, а скидка 50% за батч покрывает всё остальное. Скидки перемножаются. Кэшированный токен в батч-запросе обходится примерно на 95% дешевле обычного входного.
С какого размера промпт попадает в кэш?
Anthropic требует минимум 1 024 токена в кэш-блоке (2 048 для Opus). Если системный промпт короче, кэш не включится. Добавьте few-shot примеры или подробные инструкции, чтобы пройти порог.
По какому признаку выбирать модель для запроса?
Начните с простого правила. Если у задачи фиксированная схема ответа (классификация, извлечение, да/нет), берите gpt-5.6-luna. Если нужна открытая генерация с умеренным качеством, берите Sonnet. Opus оставьте для задач, где ошибка дорого стоит: юридический анализ, сложная генерация кода, многошаговые агентные рассуждения. Замерьте точность на своём eval-наборе и подвиньте пороги.
Можно ли использовать префилл вместе с tool use?
Нет. Префилл (частичное сообщение assistant) и tool_choice - разные механизмы. Префилл подходит для JSON в свободном тексте, tool use для вывода со схемой и проверкой. В одном запросе их не совмещайте.
Что произойдёт, если батч оборвётся посередине?
Batch API обрабатывает каждый запрос отдельно. Если из 10 000 запросов 5 упадут (скажем, из-за политики контента), остальные 9 995 выполнятся как обычно. Подробности ошибок для упавших запросов лежат в ответном JSONL. Платите вы только за успешные.
Одинаковы ли rate limit у синхронного API и батча?
Батч-запросы в ваши реалтаймовые rate limit не засчитываются. Они идут в отдельную очередь с более высокой суммарной пропускной способностью. Поэтому батч хорошо гасит пиковые нагрузки, под которые иначе пришлось бы поднимать лимиты.
Чем codexkey отличается от прямой работы с Anthropic?
codexkey проксирует запросы к официальному API Anthropic, поэтому поведение модели, задержка и функции (включая кэширование, батчи и tool use) те же. Разница в организации: codexkey принимает местные способы оплаты (СБП, российские карты, криптовалюту), не требует минимального порога и даёт OpenAI-совместимый эндпоинт, так что переключиться можно заменой одной строки с base URL.
Каждую стратегию из статьи можно внедрить за полдня, и все они выдержат продакшен. Начните с кэширования промптов: там больше всего отдачи при минимуме работы. Потом добавьте маршрутизацию, а батчи и бюджет токенов подключайте по мере роста нагрузки.
Хотите начать экономить? Получите API-ключ codexkey и применяйте эти приёмы уже сегодня: оплата в рублях, цены Anthropic без наценки.