Prompt Caching: Anthropic vs OpenAI в 2026 — математика стоимости и 3 фикса промахов
Гонка скидок на cached input закончилась. Новейшие флагманы Anthropic и OpenAI в 2026 году оба тарифицируют cache-read по 10% от стандартной входной ставки — скидка −90%, которая родилась как фирменная фишка Anthropic и была тихо повторена OpenAI с релизом GPT-5.4. Интересный вопрос теперь не «у кого скидка больше». Интересный вопрос — чья механика кэша переживёт ваши реальные промпт-паттерны, и какие три ошибки в коде тихо удерживают ваш hit rate возле нуля.
Быстрое действие: каждый запрос с prompt caching из этой статьи прогоняйте через ofox.ai — со скидкой ofox для новых пользователей cache-read у Claude Sonnet 4.6 падает прямо до $0,30/M. Один ключ работает и для Anthropic, и для OpenAI — два аккаунта для A/B не нужны.
Эта статья проходит через математику, ранжирует три паттерна cache-miss по частоте в ревью продакшен-кода и заканчивается A/B-харнессом, который можно вставить в Python- или Node-сервис и сравнить обоих провайдеров через каталог моделей ofox, не переписывая cache-логику. Если вы хотите сначала пройти базы — как работает cache_control, как читать usage и какие провайдеры дают сколько — у нас есть отдельный туториал «Prompt Caching: экономия 50–90%». Здесь — сравнительная экономика и продакшен-фиксы.
30-секундный ответ: какой кэш под вашу нагрузку
| Если ваша нагрузка… | Берите | Почему |
|---|---|---|
| Длинный system prompt (≥4k токенов) + RAG-документы, ≥10 попаданий на запись | Anthropic | Явный cache_control отдельно на tools + system + извлечённые документы; 4 cache breakpoint расширяют кэш за пределы system prompt |
| Стабильный префикс-стиль, автокэша достаточно | OpenAI | Не надо управлять cache_control; первый вызов по стандартной входной ставке, без 1,25× платы за запись |
| Mixed multi-provider с фолбэками | Оба, A/B | Через ofox — та же экономика префикса; переключайте по стоимости-за-1k-cached-токенов по часу |
| Текущий cache hit rate <40% | Сначала чините промпт | Выбор провайдера не спасёт, пока вы не закроете три паттерна cache-miss ниже |
Hit rate ниже 40% — выбор провайдера вас не спасёт. Сначала почините паттерны из §3, потом считайте экономику.
TL;DR: реальный месячный счёт на 10M cached токенов/день
Заголовочный вопрос — «Anthropic 90% против OpenAI 50%» — в 2026 году расщепился по поколению модели:
| Нагрузка | Провайдер | Модель | Счёт без кэша | С кэшем (80% hit) | Экономия |
|---|---|---|---|---|---|
| 10M токенов/день кэш-префикс | Anthropic | anthropic/claude-sonnet-4.6 | $90/мес | $25,50/мес | 72% |
| 10M токенов/день кэш-префикс | OpenAI | openai/gpt-5.5 | $1 500/мес | $390/мес | 74% |
| 10M токенов/день кэш-префикс | OpenAI | openai/gpt-4.1 (легаси) | $600/мес | $360/мес | 40% |
Цифры считаются при 80% cache hit rate, TTL 5 минут, одна запись на цикл попаданий. Базовая цена Sonnet 4.6 — иллюстративная; актуальные ставки сверяйте на странице моделей ofox.
Строка с GPT-4.1 — та, на которой команды, оставшиеся в 2026 году с кодом образца 2024-го, чувствуют неловкость. Цена «остаться на старой модели» сегодня — это не задержка, это форма счёта. Если вы хотите системно пройти по всем рычагам стоимости LLM-API за пределами кэша, мы собрали 8 таких рычагов в гайде по снижению стоимости AI API.
Устаревший заголовок: −90% был эксклюзивом Anthropic до GPT-5.4
Anthropic выкатила prompt caching в августе 2024 в виде беты с чистой экономикой: cache-read 0,1× стандартной входной ставки (−90%), cache-write 1,25× стандарта при TTL 5 минут, 2× при TTL 1 час. Скидка −90% на чтение и стала маркетинговым слоганом.
OpenAI запустила автоматический кэш позже в том же году. Скидка стартовала на 50% по семейству gpt-4o — половина цены на cached input, без действий разработчика. Этот зазор и породил консенсус «Anthropic выигрывает по ценам на кэш», который повторили десятки блогов и до сих пор цитируется в 2026 году.
С тех пор изменились две вещи:
- GPT-5.4 и GPT-5.5 опустили cached input до $0,50/M против $5/M стандарта — это −90%, идентично множителю чтения у Anthropic. Скидка движется вместе с поколением модели, а не с платформой.
- Anthropic сохранила плату за запись 1,25×. У автоматического кэша OpenAI отдельной строки за запись нет — первый вызов тарифицируется по стандартной входной ставке, а последующие совпавшие префиксы — дешевле. Плата за запись Anthropic — это разовый налог на каждое обновление TTL.
Следствие: для нагрузок с высоким cache-hit (≥5 попаданий на цикл записи) плата 1,25× Anthropic амортизируется, и провайдеры сравниваются по экономике чтения. Для низкого cache-hit (<3 попаданий на цикл) бесплатная запись OpenAI даёт пару процентов сверху. Для динамических промптов, которые в принципе не держат префикс, ни один кэш вас не спасёт.
Спецификации: Anthropic vs OpenAI Prompt Caching
| Параметр | Anthropic Claude | OpenAI GPT |
|---|---|---|
| Скидка на cache-read | −90% (0,1× input) | −50% (gpt-4o, gpt-4.1) / −90% (gpt-5.4, gpt-5.5) |
| Плата за cache-write | 1,25× input (5 мин), 2× (1 час) | Нет — первый вызов по стандарту |
| Активация | Явная метка cache_control | Автоматически, детекция префикса |
| Минимум токенов | 1024 (Sonnet 4.6, Opus 4.8); 4096 на старых Claude (Opus 4.7/4.6/4.5, Haiku 4.5) | 1024 |
| TTL по умолчанию | 5 мин ephemeral | 5–10 мин неактивности |
| Расширенный TTL | 1 час при 2× плате за запись | До 24 часов (extended retention на GPT-5.4/5.5) |
| Cache breakpoints | До 4 явных меток на запрос | Нет — только автопрефикс |
| Что можно кэшировать | tools, system, messages, images, tool_use/tool_result | Только стабильный текстовый префикс |
| Опциональный routing key | Нет (кэш привязан к org + model) | prompt_cache_key для оптимизации роутинга |
| Сигнал hit в ответе | cache_creation_input_tokens, cache_read_input_tokens | usage.prompt_tokens_details.cached_tokens |
Источники: документация Anthropic по prompt caching, гайд OpenAI по prompt caching. Сверено 10 июня 2026.
Самая важная строка для моделирования затрат — Cache breakpoints. Автокэш OpenAI цепляется за самый длинный стабильный префикс с начала запроса. Anthropic позволяет поставить до четырёх меток cache_control где угодно — это значит, что извлечённый документ, вставленный в середину диалога, тоже попадёт в кэш, а system + tools можно кэшировать отдельным блоком от документа ниже. Для RAG-нагрузок это реальное структурное преимущество. Для чистого чата без ретривала автоматическая модель OpenAI проще и при цене GPT-5.5 экономически эквивалентна.
Реальная математика: проходим день на 10M cached токенов
Допустим следующее: агент обслуживает 10 000 запросов в день, в каждом — system prompt + tools + retrieved context на 5 000 токенов, плюс 500 токенов сообщения пользователя, плюс 1 000 токенов ответа. Первые 5 000 токенов — цель кэширования.
Кэшируемого входа в день: 10 000 запросов × 5 000 токенов = 50M токенов/день. Из них 80% попадают в тёплый кэш и 20% мажут (запись). Это даёт 40M токенов чтения/день и 10M токенов записи/день.
Anthropic Claude Sonnet 4.6 (иллюстративно $3/M вход, $15/M выход)
| Статья | Ставка | Токенов/день | Стоимость/день |
|---|---|---|---|
| Cache reads | $0,30/M (0,1× входа) | 40M | $12,00 |
| Cache writes (5 мин) | $3,75/M (1,25× входа) | 10M | $37,50 |
| Стандартный вход (сообщения пользователя) | $3/M | 5M | $15,00 |
| Выход | $15/M | 10M | $150,00 |
| Итого | $214,50/день |
Без кэша: 50M × $3/M = $150 + $15 пользователя + $150 выхода = $315/день. Экономия — $100,50/день, или ~32% от дневного счёта.
OpenAI GPT-5.5 (сверено: $5/M вход, $30/M выход, $0,50/M cached input)
| Статья | Ставка | Токенов/день | Стоимость/день |
|---|---|---|---|
| Cache reads | $0,50/M | 40M | $20,00 |
| Cache writes (без отдельной платы) | $5/M | 10M | $50,00 |
| Стандартный вход (сообщения пользователя) | $5/M | 5M | $25,00 |
| Выход | $30/M | 10M | $300,00 |
| Итого | $395,00/день |
Без кэша: 50M × $5/M = $250 + $25 пользователя + $300 выхода = $575/день. Экономия — $180/день, ~31% от дневного счёта.
Сравнение
При этом hit rate оба провайдера экономят примерно одинаковую долю (≈31–32%). Абсолютный разрыв между Sonnet 4.6 и GPT-5.5 — это базовые ставки на вход и выход, а не механика кэша. При 80% hit заголовок «−90% на cached read» в реальности оборачивается «~32% от общего счёта», потому что выход доминирует, а запись всё ещё платная.
Рычаг — это hit rate, а не провайдер. На той же нагрузке Sonnet, подняв hit с 80% до 95%, вы скидываете ещё $7/день — около 3% от счёта. Падение с 80% до 40% — это плюс $20/день только на лишние записи. Паттерны в следующем разделе — это разница.
3 паттерна cache-miss, которые надо чинить первыми
Ранжированы по частоте в продакшен-ревью, а не по тяжести. Каждый выглядит правильно при первом чтении и тихо ломается — единственный сигнал — поле cache_read_input_tokens болтается около нуля, а счёт растёт.
| Паттерн | Что делает | Типичный удар по hit rate | Сложность фикса |
|---|---|---|---|
| 1. Мутабельный system prompt | Вставляет timestamp/UUID/имя пользователя в кэшируемый префикс | Падает до 0% | 5 минут |
| 2. Недетерминированная сериализация инструментов | Определения tools рендерятся в разном порядке байтов | 0–40%, зависит от Python/Node | 15 минут |
| 3. Скользящее окно истории | Каждый ход выбрасывает самое старое сообщение, ломая суффикс | Падает до 0% после заполнения окна | 30 минут (требует смены стратегии окна) |
Паттерн 1: мутабельный system prompt
Баг выглядит так:
system_prompt = f"""Ты полезный ассистент.
Текущее время: {datetime.utcnow().isoformat()}
Доступные инструменты: web_search, code_interpreter
User ID: {user.id}
..."""
В каждом вызове другое Текущее время, значит каждый раз другой байтовый префикс. Cache hit rate: 0%. Фикс — вынести динамические значения в конец user message или в отдельный некэшируемый блок:
system_prompt = """Ты полезный ассистент.
Доступные инструменты: web_search, code_interpreter
...""" # статично, кэшируется
user_message = f"Текущее время: {datetime.utcnow().isoformat()}\nUser ID: {user.id}\n\n{actual_question}"
Для Anthropic это позволяет повесить cache_control на блок system. Для OpenAI — автоматический детектор префиксов цепляется за статический контент system. Оба провайдера выигрывают одинаково.
Скрытый вариант того же бага: «статический» шаблон, который рендерится из словаря, чей порядок итерации меняется между версиями Python или после конфиг-релоада. На печати строка выглядит одинаковой; для хэша кэша — нет.
Паттерн 2: недетерминированная сериализация tools
Определения инструментов обычно сериализуются в JSON перед отправкой. Если вы строите их так:
tools = []
for tool_module in plugin_manager.discover_tools():
tools.append({
"name": tool_module.name,
"description": tool_module.description,
"input_schema": tool_module.schema,
})
Порядок plugin_manager.discover_tools() — это то, что вернёт файловая система. На другом воркере, после деплоя или на другой ОС порядок будет другим. Те же tools — другие байты — нет попадания.
Фикс — детерминированная сортировка перед отправкой:
tools = sorted(
[tool_definition(t) for t in plugin_manager.discover_tools()],
key=lambda t: t["name"],
)
И при сериализации — принудительная сортировка ключей:
import json
serialized = json.dumps(payload, sort_keys=True, separators=(",", ":"))
Это важнее для Anthropic (где tools — часть явного кэш-блока), чем для OpenAI (где автодетекция более терпима к низкоуровневой перестановке), но фикс бесплатный и помогает обоим. Мы видели продакшен-системы, которые поднимали hit rate на 30 процентных пунктов одним этим изменением.
Паттерн 3: скользящее окно истории
Естественный способ управлять длинным диалогом — ограничить контекст: держать последние N сообщений, выбрасывать самые старые. Это правильно для бюджета токенов. Это смертельно для hit rate.
Когда вы выбрасываете сообщение 1, чтобы добавить сообщение 12, префикс меняется. Каждый кэшированный байт после первого сообщения теперь в неправильной позиции. Метки cache_control Anthropic на system + tools могут всё ещё попадать; диалоговая часть — нет.
Фикс — три варианта, ни один не бесплатный:
- Кэшируйте только префикс system + tools, смиритесь с тем, что хвост диалога некэшируется. Самый простой. Стоит вам экономии на истории.
- Используйте фиксированный префикс + скользящий хвост: первые K сообщений хранятся постоянно, скольжение начинается только после K+N. Требует выбрать K (обычно 6–10), где старые сообщения всё ещё релевантны или сжаты.
- Сжимайте старые сообщения в system prompt при выбрасывании, рефрешите кэш на обновлении сжатия. Hit rate высокий; system prompt медленно растёт; запись в кэш — на границе сжатия.
Для Anthropic вариант 2 чисто мэппится на метки cache_control на границе фиксированного префикса. Для OpenAI автокэш сам определит стабильный префикс, если вы не мутируете ранние сообщения.
Когда выбирать Anthropic
- Длинный извлечённый контекст (RAG с документами 8k–50k токенов): явный
cache_controlпозволяет кэшировать документ отдельным блоком от system prompt. Автокэш OpenAI не сможет, если позиция документа варьируется. - Агенты с тяжёлым набором tools, 20+ инструментов: Anthropic кэширует определения tools как часть кэш-блока. Попадание на каталог tools в 10k токенов — это реальные деньги.
- Нагрузки с предсказуемым временем жизни кэша ≥30 минут: опция Anthropic с TTL 1 час при 2× плате за запись дешевле, чем переписывать каждые 5 минут.
- Cost-sensitive batch processing: −90% на чтение + амортизированные записи — это учебниковый кейс под Anthropic.
Ссылки на модели: anthropic/claude-sonnet-4.6 — стандартная точка старта для cost-sensitive нагрузок; Opus 4.8 — вариант, когда бюджет не вопрос. Для пользователей из России подключение и оплата собраны в гайде Claude API для России.
Когда выбирать OpenAI
- Чат-стайл нагрузки со стабильным system prompt, без ретривала, без оттока в каталоге tools: автокэш работает из коробки, без изменений в коде.
- Высокий churn записи (cache hit rate <50%): отсутствие платы за запись означает, что вы не платите за промахи. 1,25× Anthropic тут жжёт.
- GPT-5.4 или GPT-5.5 уже в стеке: скидка на чтение догнала Anthropic. Менять провайдера только ради кэша — нет экономической причины.
- Роутинг через много коротких промптов, которые почти-но-не-совсем делят префикс: параметр
prompt_cache_keyпомогает попадать туда, где автодетекция могла бы промахнуться.
openai/gpt-5.5 — модель, на которой скидка чтения у OpenAI догнала Anthropic. Если вы мигрируете с OpenAI SDK — шаги в гайде по миграции OpenAI SDK на ofox.ai.
Когда не помогает ни один (и что использовать вместо)
Есть нагрузки, где prompt caching — не тот инструмент:
- По-настоящему stateless one-shot вызовы под 1024 токена: кэшировать нечего, минимальные пороги обоих провайдеров кусают. Берите модель поменьше и пропускайте кэш.
- Hot-path персонализированные промпты, где каждый байт промпта зависит от пользователя (CRM-выборки, real-time дашборды): префикс действительно динамический. Кэш не спасёт. Перестраивайте промпт так, чтобы персонализация шла после длинной общей рамы, или используйте embedding-ретривал, чтобы не запихивать персонализацию прямо в промпт.
- Кросс-модельные A/B, где кэш протух между прогонами: сравнение нечестное. Используйте единый биллинг ofox для apples-to-apples при равных hit rate, а не на холодном-против-тёплого.
Альтернативные провайдеры, которых стоит знать: Google Gemini даёт ~50–75% скидку на cached input на Gemini 2.5 Pro (через ofox или напрямую); DeepSeek и Qwen кэшируют автоматически с более низкими базовыми ставками, которые могут обогнать обоих по стоимости выхода. Через ofox схема переключения моделей та же. Более широкий набор рычагов — мультимодельный роутинг, стратегии бюджета — в гайде по мультимодельной стратегии оптимизации.
A/B обе модели через ofox в 10 строках кода
И cache_control Anthropic, и автокэш OpenAI доступны через единый OpenAI-совместимый эндпоинт ofox. Строка model ID — единственная разница. Воткните этот харнесс в сервис, чтобы измерять hit rate бок о бок.
Python — A/B обе модели в одном цикле
from openai import OpenAI
import os, json
client = OpenAI(base_url="https://api.ofox.ai/v1", api_key=os.environ["OFOX_API_KEY"])
SYSTEM_PROMPT = open("system.md").read() # 5k+ токенов, статично
def measure(model: str, query: str):
resp = client.chat.completions.create(
model=model,
messages=[
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": query},
],
extra_body={"cache_control": {"type": "ephemeral"}} if "claude" in model else {},
)
usage = resp.usage.model_dump()
return usage.get("prompt_tokens_details", {}).get("cached_tokens") or \
usage.get("cache_read_input_tokens", 0)
for model in ["anthropic/claude-sonnet-4.6", "openai/gpt-5.5"]:
cached = measure(model, "Перепиши этот FastAPI handler на async-вызовы БД.")
print(f"{model}: {cached} cached input токенов")
Node — та же форма
import OpenAI from "openai";
import { readFileSync } from "fs";
const client = new OpenAI({ baseURL: "https://api.ofox.ai/v1", apiKey: process.env.OFOX_API_KEY });
const SYSTEM_PROMPT = readFileSync("system.md", "utf8");
async function measure(model, query) {
const resp = await client.chat.completions.create({
model,
messages: [
{ role: "system", content: SYSTEM_PROMPT },
{ role: "user", content: query },
],
...(model.includes("claude") ? { cache_control: { type: "ephemeral" } } : {}),
});
return resp.usage.prompt_tokens_details?.cached_tokens ??
resp.usage.cache_read_input_tokens ?? 0;
}
for (const model of ["anthropic/claude-sonnet-4.6", "openai/gpt-5.5"]) {
const cached = await measure(model, "Перепиши этот FastAPI handler на async-вызовы БД.");
console.log(`${model}: ${cached} cached input токенов`);
}
Прогоните дважды подряд. Первый вызов пишет кэш; второй должен показать большое значение cached, если префикс действительно стабильный. Если второй раз всё ещё ноль — работает один из трёх паттернов выше.
Бюджет и мониторинг: кэш — это отдельная строка
Если вы всё ещё считаете месячный бюджет LLM как «стандартная входная ставка × токены», то с включённым кэшем модель бюджета надо переделать. Cache-read и cache-write — две отдельные строки. Иначе будет сценарий «мы сэкономили 30%, а в конце месяца перерасход $20 000».
- Выводите
cache_creation_input_tokensиcache_read_input_tokensв metrics отдельно. - Заведите SLO на hit rate для каждой агентной линии (например, чат-агент ≥75%, RAG-агент ≥85%, single-shot — без SLO).
- Если hit rate пробивает SLO 24 часа подряд — автоматический алерт. Это ранний сигнал, что один из трёх паттернов выше тихо проехал в продакшен.
Если у вашей команды нет ещё токен-оптимизации в Claude Code или похожем агенте — гайд по оптимизации токенов в Claude Code описывает приёмы, которые работают и за пределами Claude Code тоже.
FAQ
(См. блок faq во frontmatter выше — он рендерится в schema страницы для AI-поиска и извлечения PAA.)
Источники, проверенные для этого обновления
- Anthropic Prompt Caching API Reference — сверено 10 июня 2026 на множители чтения/записи, минимум токенов по моделям, опции TTL
- OpenAI Prompt Caching Guide — сверено 10 июня 2026 на автоактивацию, минимум 1024 токена, extended retention на GPT-5.4/5.5
- Каталог моделей ofox — сверены живые model ID
anthropic/claude-sonnet-4.6иopenai/gpt-5.5, строки cache read/write присутствуют - Документация prompt caching у ofox — подтверждена прозрачная передача
cache_controlдля Anthropic и автоактивация для OpenAI - Внутренний ревью трёх клиентских агент-сервисов (анонимизировано) — деградация hit rate отслежена до трёх паттернов §3, окно Q1–Q2 2026
Цены и скидки сверены по официальной документации провайдеров на момент публикации. Перед масштабированием любой проекции стоимости обязательно сверьте текущие ставки на странице моделей ofox — модельный прайс меняется ежеквартально, а множитель чтения на моделях класса GPT в 2025–2026 устойчиво идёт вниз. Математика §4 предполагает hit rate 80%; перед запуском перепрогоните на своей реальной нагрузке.


