# Cache Rebuild (Перебудова кешу)

## Передумови

Механізм prompt caching від Anthropic послідовно об'єднує system → tools → messages (до cache breakpoint) у запиті для формування ключа кешу. Коли ключ кешу повністю збігається з попереднім запитом, API повертає `cache_read_input_tokens` (влучання в кеш); коли ключ кешу змінюється, API створює кеш заново і повертає велику кількість `cache_creation_input_tokens`, тобто відбувається перебудова кешу.

Перебудова кешу означає додаткову тарифікацію токенів (ціна cache creation вища за cache read), тому визначення причини перебудови має пряму цінність для оптимізації витрат.

## Класифікація причин перебудови кешу

cc-viewer порівнює тіла двох послідовних запитів MainAgent для точного визначення причини перебудови кешу:

| reason | Значення | Спосіб визначення |
|--------|----------|-------------------|
| `ttl` | Кеш протермінувався | З моменту попереднього запиту MainAgent минуло більше 5 хвилин |
| `system_change` | Зміна system prompt | `JSON.stringify(prev.system) !== JSON.stringify(curr.system)` |
| `tools_change` | Зміна визначень інструментів | `JSON.stringify(prev.tools) !== JSON.stringify(curr.tools)` |
| `model_change` | Зміна моделі | `prev.model !== curr.model` |
| `msg_truncated` | Стек повідомлень обрізано | Кількість messages у поточному запиті менша за попередній, зазвичай спричинено переповненням контекстного вікна |
| `msg_modified` | Історичні повідомлення змінено | Вміст префіксних повідомлень не збігається (при нормальному додаванні префікс повинен бути ідентичним) |
| `key_change` | Невідома зміна ключа | Fallback, коли жодна з вищезазначених умов не збігається |

## Пріоритет визначення

1. Спочатку перевіряється часовий інтервал — якщо минуло більше 5 хвилин, одразу визначається як `ttl`, порівняння body не виконується
2. Потім послідовно перевіряються model, system, tools, messages
3. Один запит може одночасно мати кілька причин (наприклад, зміна моделі + зміна system prompt), у цьому випадку масив `reasons` містить усі збіги, tooltip відображає їх порядково

## Типові сценарії

- **`ttl`**: Користувач призупинив роботу більш ніж на 5 хвилин і потім продовжив, кеш природно протермінувався
- **`system_change`**: Claude Code оновив system prompt (наприклад, завантажено новий CLAUDE.md, змінилися project instructions)
- **`tools_change`**: Підключення/відключення MCP server призвело до зміни списку доступних інструментів
- **`model_change`**: Користувач змінив модель командою `/model`
- **`msg_truncated`**: Занадто довга розмова спричинила управління контекстним вікном, Claude Code обрізав ранні повідомлення
- **`msg_modified`**: Claude Code відредагував історичні повідомлення (наприклад, `/compact` стиснення замінило оригінальні повідомлення зведенням)
