← На главную

claude-thermos греет prompt cache и убирает 20% счёта

23.07.2026 17:06 · hackernews

Больше не нужно платить за пересборку prompt cache в Claude Code. Когда основной агент ждёт подагента дольше пяти минут, его кэш молча истекает, и следующий шаг перекодирует весь разговор по ставке записи вместо дешёвого чтения. На длинных сессиях с кучей подагентов это выливается примерно в 20% счёта. claude-thermos поддерживает кэш тёплым и убирает этот скрытый налог.

Запускается всё одной командой — uvx claude-thermos вместо обычного claude. Любые аргументы передаются напрямую, например uvx claude-thermos -p "fix the bug". Требуется Python 3.11+ и claude CLI в PATH. Прогрев работает в фоне автоматически, а отключить его для одного запуска можно флагом CLAUDE_WARMER_DISABLE=1. Доступны опции тонкой настройки: --idle (секунды простоя основного агента до начала прогрева, по умолчанию 270), --interval (интервал между циклами прогрева, 270), --max-cycles (максимум прогревочных запросов за один эпизод, 4 или auto для неограниченного) и --subagent-window (секунды, в течение которых подагент считается ещё активным, 540).

Почему кэш вообще истекает. У prompt cache в Claude Code TTL пять минут. Пока кэш жив, история читается по цене 0.1x от входного тарифа. Провал происходит, когда основной агент блокируется подагентом, работающим дольше пяти минут. У подагента другой системный промпт и набор инструментов, поэтому его запросы имеют иной cache prefix и не обновляют основной. Как только подагент заканчивает, основная история осталась побайтово идентичной, но кэш уже пропал — приходится перекодировать всё по ставке записи 1.25x. К тому моменту история обычно большая (200–500 тысяч токенов), и такие пересборки, по замерам на 185 локальных сессиях, съедают около 22% общего счёта.

claude-thermos запускает Claude Code за небольшим локальным обратным прокси. Он выставляет ANTHROPIC_BASE_URL на loopback-порт и весь трафик всё равно идёт в настоящий Anthropic API. Прокси отслеживает вызовы /v1/messages, группирует их в сессии и lineages — линии кэша по модели, набору инструментов и системному тексту. Первая lineage с инструментами считается основной, остальные — подагентами. Как только основная lineage простаивает и при этом активен подагент, префикс главного агента рискует истечь. Прокси с интервалом меньше пяти минут отправляет warm request — повтор последнего реального запроса с тем же кэшируемым префиксом, но с max_tokens: 1 и без стриминга. Этот запрос идёт напрямую в API, минуя прокси, и только освежает кэш, не мешая реальному трафику. Когда подагент завершает работу, кэш основного агента остаётся тёплым, и возобновление обходится дёшево — чтением вместо перезаписи. Каждый прогрев стоит 0.1x (cache read), а предотвращённая перезапись обошлась бы в 1.25x на гораздо большем префиксе — выгода очевидна.

Все данные пишутся в ~/.claude-thermos/logs/<session_id>/. events.jsonl хранит построчный поток событий: каждый запрос и решение о прогреве (warm_fired, warm_result, cap_reached, resume_detected и т.д.). summary.json даёт сводку: количество отправленных warm‑запросов (warms_fired), токены, прочитанные кэшем (cache_read_total), количество эпизодов с успешным возобновлением (episodes), токены, перезапись которых удалось избежать (rewrite_avoided_tokens), стоимость прогрева (warm_cost) и сэкономленных перезаписей (rewrite_avoided_cost), а также чистую экономию (net_savings) — всё в base-input-token units. Чтобы перевести net_savings в доллары, умножьте на цену за входной токен. При цене $3 за 1M токенов сбережения в 1 200 000 единиц — это примерно $3.60 за сессию.

Читать оригинал →