Skip to main content

Как спящий терминал стоил мне 1000 долларов за ночь

Разбор полётов Claude Code: фоновые демоны, кэширование промптов и бесконечные циклы агентов, и как строгий лимит расходов не помог спасти мой счёт.

· 3 мин чтения

Закрыл крышку ноутбука вечером. Утром проснулся со счётом за API на $1,025 — при том что в панели биллинга были выставлены строгие лимиты расходов. Я в этот момент рефакторил большой монорепозиторий через Claude Code.

После разбора логов хронология сложилась. Виновники: фоновые демоны, бесконечные циклы агентов и сам механизм кэширования промптов.

Исходные условия

Я работал над проектом с огромной кодовой базой. Каждый запрос к Claude захватывал примерно 250 000 токенов контекста.

В качестве обёртки для Claude Code я использовал AgentDeck — удобный инструмент, который работает как мост и создаёт собственный PTY-терминал под управлением фонового демона. Именно с этого демона всё и началось.

Ловушка кэширования промптов

Многие думают, что чтение токенов из кэша почти бесплатно. Это не так.

Сам кэш работал как положено. В логах сессии было всё ожидаемо:

  • input_tokens: 1
  • cache_read_input_tokens: 242,304

Но чтение из кэша всё равно тарифицируется за каждый токен. Для Claude 3 Opus чтение 1 млн закэшированных токенов стоит $1.50. Это значит, что каждый отдельный ответ в этой сессии стоил примерно $0.37 — ещё до учёта выходных токенов.

Даже скидка 90% на 250 000 токенов быстро превращается в заметные деньги, если что-то обращается к модели по кругу.

«Призрачная» сессия

Обычно, когда вы закрываете окно терминала, процесс завершается. Но из-за демона AgentDeck процесс Claude вместо этого остался жить в фоне.

Когда ноутбук уходил в сон, сессия приостанавливалась. Однако macOS периодически будит машину для фоновых задач через Power Nap. Демон каждый раз исправно оживлял сессию — в логах это выглядело как System wake detected.

В какой-то момент агент застрял в цикле. Он пытался завершить задачу и снова и снова перепроверял статус.

Сохранившийся фрагмент лога рассказал остальное:

  • messageCount: 330
  • durationMs: 929,873 (~15,5 минуты)

Агент делал примерно один запрос каждые 3 секунды. Каждый такой запрос стоил около $0.37 только на чтении из кэша.

Итоговая скорость расхода: около $120–$140 в час — для терминала, который, как мне казалось, был закрыт.

Лимит Anthropic не сработал

Самое неприятное: у меня подписка Claude for Work (Team) со строгим hard limit, настроенным в веб-консоли организации. Лимит не сработал.

Позже поддержка подтвердила, что существовал баг: лимиты API-биллинга игнорировались для запросов Claude Code.

Вдобавок внутри самой CLI claude флаг extraUsage был установлен в true, что фактически давало агенту карт-бланш на списания с моей карты.

Выводы

Если вы используете автономных агентов для разработки, вот чек-лист, которым я теперь пользуюсь:

  1. Не доверяйте демонам. Если вы используете обёртки вроде AgentDeck или Warp Agent, убедитесь, что они действительно завершают сессии при закрытии окна. Я AgentDeck удалил.
  2. Завершайте сессии явно. Не оставляйте терминал висеть. Вводите /exit или нажимайте Ctrl+D.
  3. Ставьте жёсткие лимиты там, где они действительно применяются. Сейчас это веб-консоль, а не конфигурация Claude Code. Если вы обнаружили, что лимит не срабатывает, исходите из того, что он и дальше не сработает.
  4. Проверяйте субагентов. Команда /subagents показывает, не оставили ли вы тихого агента работать в фоне.
  5. Осторожнее с --auto. Бесконечная автономия в большом монорепозитории может сжечь месячный бюджет за час, если агент застрянет в цикле исправления ошибок.

В итоге трату в $1000 остановил только выход из CLI. Слабая защита для инструмента, который умеет тратить деньги с такой скоростью.