anthropic

Вывод в Claude Code стоит примерно в 5 раз дороже ввода

Claude News

anthropic

В блоге Claude разобрали, из чего складывается счёт за сессию Claude Code: вывод оценивается примерно в пять раз дороже ввода. Причина в том, что запрос проходит по GPU в две фазы, и decode, на котором модель пишет ответ, занимает ускоритель дольше, чем чтение контекста на prefill.

Коротко

  • На prefill модель читает системный промпт, CLAUDE.md, сообщение и всё, что добавилось в переписку, а на decode пишет по одному токену за проход: ответ в 200 токенов означает 200 последовательных прогонов.
  • Чтение из кеша стоит 0,1 от цены ввода, запись обходится дороже обычного ввода, до двух раз, а сам кеш живёт час на подписке и пять минут на API-ключе; переменная ENABLE_PROMPT_CACHING_1H=1 растягивает срок до часа.
  • Всё, что попало в переписку, уходит на сервер снова на каждом следующем ходу и оплачивается как чтение из кеша; на подписке эти цены не видны, но лимиты расходуют ровно те же запросы.

Почему это важно Экономика сессии, судя по разбору, определяется не формулировками промпта, а структурой работы: сколько токенов оседает в контексте, сколько ходов они там живут и сколько контекстов идёт параллельно. Из этого следует, что дорогие ошибки выглядят безобидно: переключение модели посреди длинного разговора или многочасовая сессия без /clear стоят заметно больше, чем кажется по интерфейсу, где счёт напрямую не показывается. Для работы на подписке это переводится в скорость выработки лимитов.

Одно исправление теста укладывается в пять запросов, и в каждом уходит вся переписка

Claude Code собирает первый запрос из системного промпта с определениями инструментов, CLAUDE.md и сообщения пользователя. Кеш пуст, поэтому всё это проходит prefill и записывается в кеш. Модель отвечает вызовом Read для utils.test.ts, файл дописывается в переписку, и запрос уходит целиком заново.

Дальше по той же схеме: второй Read, Edit с результатом применения и запуск npm test. Тесты проходят, модель отвечает коротким резюме без вызова инструмента, дописывать нечего, шестого запроса нет. По полной цене в каждом запросе считается только новая часть, остальное читается из кеша по 0,1 от цены ввода.

Типичный ход перекошен: на входе десятки тысяч токенов, на выходе несколько сотен. Значительная часть выходных токенов приходится на размышления, их объём задаёт уровень /effort, а переменная MAX_THINKING_TOKENS=0 отключает размышления на одну сессию, кроме Fable 5, и это ступень ниже /effort low.

Кеш привязан к модели, уровню /effort и быстрому режиму, и смена посреди разговора сбрасывает его

Совпадение должно начинаться с самого начала запроса, а порядок всегда один: определения инструментов, системный промпт, затем переписка с CLAUDE.md в начале. Любое изменение ближе к началу заставляет заново прегружать всё, что стоит за ним, поэтому результат инструмента, дописанный в конец, обходится дешевле всего.

У каждой модели свой кеш, поэтому /model перекладывает всю переписку в полную цену на следующем ходу; то же делает opusplan, меняющий модель при каждом входе в режим плана и выходе из него. Уровень /effort и быстрый режим входят в ключ кеша, причём повторный prefill после включения быстрого режима считается по его тарифу.

Команда /compact заменяет переписку более короткой, и совпадений в ней не остаётся, хотя системный промпт впереди сохраняется; написание самого резюме дёшево, пока старая переписка ещё в кеше. Если последние ходы ушли не туда, /rewind отрезает только их и ничего не стоит, потому что всё предыдущее остаётся закешированным.

После 30 000 символов вывод команды уходит в файл, а всё, что ниже порога, остаётся в контексте

Крупный вывод команды Claude Code записывает в файл и оставляет в переписке только короткий предпросмотр и путь; порог задаётся переменной BASH_MAX_OUTPUT_LENGTH. Проблема в том, что ниже него: прогон тестов, печатающий 400 успешных проверок построчно, укладывается в лимит, и эти 400 строк едут в каждом оставшемся ходу.

@-упоминание файла прикрепляет его к сообщению до отправки, так что вызов Read не нужен, но повторное упоминание на следующем ходу обычно добавляет вторую копию. В документации есть хук, который переписывает шумные команды до запуска, а тихие флаги можно один раз зафиксировать в CLAUDE.md.

Ещё один способ не тащить лишнее в основной контекст: субагент получает собственное окно с системным промптом, инструментами и CLAUDE.md, но без переписки, и возвращает только ответ. В определении субагента можно указать model: haiku или sonnet, иначе он работает на модели основной сессии.

Что дальше Пользователям моделей с окном в 1M вернуть автосжатие на прежнюю отметку помогает команда /autocompact 200k, она требует Claude Code версии 2.1.221 или новее. Отдельного внимания требуют ходы, которые происходят без участия человека: /loop выполняется как полноценный ход в той сессии, где он заведён, и тащит с собой всю её переписку, а после часового перерыва добавляется ещё и промах мимо кеша. В разборе предлагается запускать такие циклы из отдельной сессии в другом терминале.

Комментарии

Пока никто не написал. Будьте первым.

Присоединяйтесь к разговору

Войдите через Google, чтобы оставить комментарий. Имя и аватар подставятся из вашего профиля Google, а комментарий появится после модерации.

Из Google мы используем только имя и аватар. Почту не сохраняем.