Перейти к основному содержанию
Если каждый запрос начинается с одного и того же большого куска текста — системного промпта, справочника, few-shot примеров — провайдеры умеют запоминать этот кусок и тарифицировать его дешевле. Механика называется кэшированием префикса промпта.
В примере ниже $TEXT_MODEL — переменная окружения с идентификатором модели из GET /api/v1/models. Идентификаторы не зашивают в код: состав каталога меняется. Разбор — в разделе Модели и цены.

Как это работает

Кэшируются не отдельные фрагменты, а префикс — начало запроса, вплоть до точки, помеченной явно. Всё, что идёт после точки, в кэш не попадает.
cache_control: {"type": "ephemeral"} ставится на блок контента, а не на сообщение целиком — блок должен быть в массиве content. Единственный поддерживаемый тип сейчас — ephemeral.
cURL
Первый запрос кэш наполняет, но платит по полной ставке. Экономия появляется со второго — при условии, что префикс совпал.

Где видно, что сработало

Единственный достоверный источник — поле usage.prompt_tokens_details.cached_read_tokens в ответе:
cached_read_tokens — сколько входных токенов прочитано из кэша. prompt_tokens при этом включает их: не складывайте.
cached_read_tokens: 0 означает, что кэш не сработал. Причины: префикс изменился, не помечен cache_control, кэш у провайдера истёк, либо модель кэширование не поддерживает. Ошибки не будет — только нулевая экономия.

Ставки и минимумы

Размер скидки, минимальный кэшируемый объём и время жизни кэша задаёт каждый провайдер по-своему, и эти значения меняются. Таблицы множителей нет: она устареет быстрее, чем её успеют сверить.
Авторитетные числа по конкретному запросу — в самом ответе:
Python
Считайте экономию как отношение, а не как вычитание из чеков: cached / prompt на двух соседних запросах покажет, работает кэш или нет.

Проектирование стабильного префикса

Чтобы кэш срабатывал, материал в начале запроса должен быть побайтово одинаков от запроса к запросу. Практические правила: Кэшируйте самое тяжёлое и самое стабильное. Справочник, правила, описание домена, few-shot примеры. Переменное — в хвост.
Python
Не вставляйте в кэшируемый блок то, что меняется. Дата, идентификатор сессии, имя пользователя, номер обращения — всё это ломает совпадение целиком, а не частично. Выносите в соседний блок без cache_control. Форматируйте детерминированно. Один и тот же текст, собранный по-разному, — другой префикс. Не полагайтесь на порядок ключей при сериализации словарей и на текущее время. Один кэшируемый блок вместо нескольких мелких. Не размечайте cache_control на каждом абзаце: провайдеры считают точки кэширования, и их число ограничено.

Что ломает кэш

Самая частая ошибка — вставка переменной в начало кэшируемого блока, например «Сегодня , отвечай…». Кэш перестаёт срабатывать с первого запроса, и вы платите полную ставку, не получая никакой экономии и никакого сообщения об ошибке. Переносите дату и идентификаторы за пределы блока с cache_control.

Разделение по арендаторам

В многопользовательском продукте кэшируемый материал почти всегда разный: у каждого арендатора своя база знаний, свой справочник. Два необязательных параметра помогают развести их по разным кэшам:
Ключи необязательные и могут не поддерживаться: модель может их проигнорировать. Задавайте их так, чтобы стабильный суффикс соответствовал версии материала: при обновлении справочника меняйте v7 на v8, и старый кэш перестанет использоваться, вместо того чтобы отдавать устаревшее содержимое.

Отладка

Проверьте по порядку: cache_control стоит на блоке внутри массива content, а не на сообщении; префикс между запросами не меняется; кэшируемый блок достаточно велик для минимального порога провайдера; модель кэширование вообще поддерживает. Первый запрос не попадает в кэш — сравнивайте второй и третий.
Сравните cost двух запросов с разным cached_read_tokens. Если разница близка к нулю, провайдер либо не даёт скидки на этой модели, либо вы смотрите на общую стоимость вместе с выходными токенами, которые сопоставимы по величине. Считайте по входной части.
Проверьте, не попадают ли в кэшируемый блок данные, специфичные для запроса. Добавьте prompt_cache_isolation_key со значением, стабильным для арендатора.

Что дальше

Учёт средств

Как читать usage и cost по каждому запросу

Модели и цены

Ставки за вход и выход

Токены рассуждений

Вторая статья расходов в том же объекте usage

Лимиты

Тарифные квоты поверх кэша