В примере ниже
$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 при этом включает их: не складывайте.
Ставки и минимумы
Авторитетные числа по конкретному запросу — в самом ответе:Python
cached / prompt на двух соседних запросах покажет, работает кэш или нет.
Проектирование стабильного префикса
Чтобы кэш срабатывал, материал в начале запроса должен быть побайтово одинаков от запроса к запросу. Практические правила: Кэшируйте самое тяжёлое и самое стабильное. Справочник, правила, описание домена, few-shot примеры. Переменное — в хвост.Python
cache_control.
Форматируйте детерминированно. Один и тот же текст, собранный по-разному, — другой префикс. Не полагайтесь на порядок ключей при сериализации словарей и на текущее время.
Один кэшируемый блок вместо нескольких мелких. Не размечайте cache_control на каждом абзаце: провайдеры считают точки кэширования, и их число ограничено.
Что ломает кэш
Разделение по арендаторам
В многопользовательском продукте кэшируемый материал почти всегда разный: у каждого арендатора своя база знаний, свой справочник. Два необязательных параметра помогают развести их по разным кэшам:Ключи необязательные и могут не поддерживаться: модель может их проигнорировать. Задавайте их так, чтобы стабильный суффикс соответствовал версии материала: при обновлении справочника меняйте
v7 на v8, и старый кэш перестанет использоваться, вместо того чтобы отдавать устаревшее содержимое.Отладка
cached_read_tokens всегда 0
cached_read_tokens всегда 0
Проверьте по порядку:
cache_control стоит на блоке внутри массива content, а не на сообщении; префикс между запросами не меняется; кэшируемый блок достаточно велик для минимального порога провайдера; модель кэширование вообще поддерживает. Первый запрос не попадает в кэш — сравнивайте второй и третий.Кэш срабатывает, но экономии нет
Кэш срабатывает, но экономии нет
Сравните
cost двух запросов с разным cached_read_tokens. Если разница близка к нулю, провайдер либо не даёт скидки на этой модели, либо вы смотрите на общую стоимость вместе с выходными токенами, которые сопоставимы по величине. Считайте по входной части.Кэш срабатывает у одного арендатора и не у другого
Кэш срабатывает у одного арендатора и не у другого
Проверьте, не попадают ли в кэшируемый блок данные, специфичные для запроса. Добавьте
prompt_cache_isolation_key со значением, стабильным для арендатора.Что дальше
Учёт средств
Как читать
usage и cost по каждому запросуМодели и цены
Ставки за вход и выход
Токены рассуждений
Вторая статья расходов в том же объекте
usageЛимиты
Тарифные квоты поверх кэша
