Кэширование промптов
Платите меньше за повторяющиеся префиксы запросов
KodikRouter — прозрачный шлюз. Никаких специальных заголовков не требуется: кэширование управляется телом запроса, как в нативных SDK от OpenAI / Anthropic / Google. Мы пробрасываем поля cache_control и любые расширения на блоках контента без изменений, а в ответе считаем корректную стоимость с учётом скидки кэша.
Два режима
cache_control в блоки контента5 мин по умолчанию или 1 ч cache_control мы передаём провайдеру дословно.Implicit caching
Достаточно держать начало messages одинаковым между запросами в одной сессии. Провайдер сам хэширует префикс и переиспользует его. В следующем запросе prompt_tokens_details.cached_tokens вырастет — это и есть попадание в кэш.
Минимальный размер промпта
Запросы короче порога не кэшируются — это аппаратное ограничение провайдеров, не KodikRouter.
Explicit caching: cache_control
Для Anthropic, Gemini explicit и Qwen используйте структурированный формат сообщений (массив блоков типизированного контента вместо строки) и расставьте контрольные точки кэша.
Anthropic — auto-cache для чата (рекомендуется)
Верхнеуровневый cache_control в запросе говорит Anthropic автоматически продвигать точку кэширования по мере роста диалога — лучший вариант для чатов.
Anthropic — точечный breakpoint
Если нужен ручной контроль, ставьте cache_control на конкретный блок. Максимум 4 точки на запрос.
1-часовой TTL
По умолчанию кэш живёт 5 минут. Для долгих сессий укажите ttl: "1h" — запись в кэш стоит 2x от входа, зато повторное чтение остаётся дешёвым весь час.
Gemini и Qwen
Тот же синтаксис: cache_control: { "type": "ephemeral" } на блоке контента. Gemini уважает только последний breakpoint в запросе — ставьте его в конец префикса, который хотите закэшировать.
Что делает KodikRouter
cache_control (top-level)cache_control (на блоке контента)ttl: "1h"Мы не валидируем и не переписываем cache_control — sticky-маршрутизация до того же узла с прогретым кэшем делается шлюзом автоматически по хэшу промпта. Мы только корректно тарифицируем ответ с учётом скидки.
Чтение информации из ответа
В каждом ответе (стриминг и не-стриминг) есть блок usage:
prompt_tokensprompt_tokens_details.cached_tokensprompt_tokens_details.cache_write_tokenscostcached_tokens и cache_write_tokens — это подмножества prompt_tokens, а не отдельные категории. «Свежие» токены = prompt_tokens − cached_tokens − cache_write_tokens.В стриминговых ответах блок usage приходит в последнем SSE-чанке (с finish_reason).
Стоимость
Ничего не меняется в форме ответа: поля cost_rub и cost_usd уже содержат курс, наценку и скидку кэша. При наличии авторитетной стоимости от провайдера (usage.cost) мы используем её, иначе — считаем сами по тарифам из каталога модели с раздельным учётом cached / cache-write / fresh.
