Каждый запрос к модели проходит через GPU в два этапа. На prefill модель читает контекст: system prompt, CLAUDE.md, сообщение и всё добавленное в диалог. Это входные токены. На decode пишет выходные: thinking, вызовы инструментов, текст. Выходные токены генерируются по одному, поэтому decode дольше держит GPU занятым и выход стоит примерно 5x входа. Сколько думать, задаёт /effort; выбор запоминается на следующую сессию. MAX_THINKING_TOKENS=0 отключает thinking на одну сессию (кроме Fable 5) — это шаг ниже /effort low.
Дальше — prompt caching. Если запрос начинается с тех же токенов, что сервер уже видел, общее начало берётся из кэша и префиллится только новое. Чтение из кэша стоит 0.1x входа, запись — до 2x, но пишется один раз, а читается на каждом ходу. Claude Code управляет кэшем сам. Пример: «fix the failing test in utils.test.ts». Первый запрос пишет всё в кэш по полной; после каждого Read, Edit и npm test история отправляется заново, по полной цене — только добавленное. Итого пять запросов.
Кэш совпадает только с начала запроса: порядок — tool definitions, system prompt, диалог с CLAUDE.md в начале. /model и /effort входят в ключ кэша, поэтому смена в середине разговора пересчитывает всё (включая opusplan). Fast mode тоже часть ключа — включать надо с начала. /compact меняет диалог, и старое перестаёт совпадать; само изложение дёшево, пока старый диалог ещё в кэше. Кэш живёт час на подписке и пять минут на API-ключе, а ENABLE_PROMPT_CACHING_1H=1 делает час. Если последние ходы не нужны, /rewind отрезает их бесплатно; /compact всегда стоит.
Ничто не отправляется один раз: всё, что попало в диалог — файлы, вывод команд, — уходит на каждом следующем ходу. Это дёшево из кэша, но занимает контекст. Стоимость сессии = сколько токенов в контексте, сколько ходов они живут и сколько контекстов параллельно. Стартовый контекст виден через /context; лишнее из CLAUDE.md — в skills, ненужный MCP server — в /mcp. Если сказать «тесты падают», Claude начнёт искать и весь мусор останется. Точное имя файла стоит одного Read, а @utils.test.ts — вообще без Read. Большой вывод свыше 30,000 символов Claude Code сбрасывает в файл и оставляет превью (BASH_MAX_OUTPUT_LENGTH), а 400 строк тестов под лимитом будут жить в каждом ходе.
Одна длинная сессия дороже нескольких коротких: ход 40 перечитывает 39 прошлых. Смена задачи — /clear, часть большой задачи готова — /compact. /loop таскает весь диалог и при паузе больше часа даёт кэш-мисс; лучше запускать его из свежей сессии. Субэйджент работает в своём контексте без твоего диалога — в основную сессию возвращается только его ответ. Он может перечитывать уже известное и платит за свои ходы, зато окупается на логах.