Назад в блог

Оптимизация расходовИнструкция

Токены Claude Code: как не пускать вывод тулов в контекст

Как хук PreToolUse и плагин context-mode убирают тестовые логи из контекста Claude Code, и во сколько обходится длинная сессия с фильтрацией и без.

Автор: CheapTokens TeamОпубликовано 5 мин чтения

Терминал: команда тестов пропущена через grep и head, к Claude Code доходят только падения
Содержание
  1. Почему один лог оплачивается много раз
  2. Способ 1: хук PreToolUse, который фильтрует вывод тестов
  3. Способ 2: context-mode для больших результатов тулов
  4. Сколько стоит длинная сессия с фильтром и без
  5. Claude Code на модели CheapTokens
  6. Короткий чек-лист

Агент трижды прогнал тесты, а счёт получился больше, чем сама задача. Дело редко в написанном коде. Дело в логах тестов: как только результат тула попал в контекст Claude Code, его получает каждый следующий запрос. Лечится это сжатием вывода до того, как его увидит модель. Официальный способ — хук PreToolUse на Bash, сторонний — плагин context-mode. Оба разобраны ниже, плюс расчёт стоимости длинной сессии на модели CheapTokens.

Почему один лог оплачивается много раз#

По странице о расходах Claude Code (https://code.claude.com/docs/en/costs, проверено 23 октября 2026) Claude Code отправляет с каждым запросом всю переписку, а каждый вызов тула порождает новый запрос с его результатами. Кэширование промпта читает историю по сниженной цене, но токены никуда не деваются.

Допустим, агент запустил npm test и получил лог на 10 000 строк. В документации сказано, что такой лог — десятки тысяч токенов. Возьмём 30 000. Что бы вы ни делали дальше, эти 30 000 токенов входят во вход шага 11, шага 12, шага 13 и так до /clear или сжатия. И вот тут подвох: лог нужен на один шаг, а платите вы за него на тридцати.

Способ 1: хук PreToolUse, который фильтрует вывод тестов#

На той же странице хуки предлагают как предобработку: PreToolUse на Bash переписывает команды тестов (npm test, pytest, go test) так, чтобы вывод шёл через grep -A 5 -E '(FAIL|ERROR|error:)' | head -100. Агент видит только падения и пару строк вокруг, а не 10 000 строк зелёных точек. По документации, десятки тысяч токенов превращаются в сотни.

Что видит агент до и после хука
Сырой вывод npm test и только падения

Это скрипт со страницы документации (проверено 23 октября 2026). Нужен jq. Создайте папку командой mkdir -p ~/.claude/hooks, сохраните скрипт как ~/.claude/hooks/filter-test-output.sh и выполните chmod +x:

bash
#!/bin/bash
input=$(cat)
cmd=$(echo "$input" | jq -r '.tool_input.command')

pattern='^(npm test|pytest|go test)( [^;&|<>`$#\\[:cntrl:]]*)?$'

if [[ "$cmd" =~ $pattern ]]; then
  filtered_cmd="$cmd 2>&1 | grep -A 5 -E '(FAIL|ERROR|error:)' | head -100"
  echo "$input" | jq --arg filtered "$filtered_cmd" '{hookSpecificOutput: {hookEventName: "PreToolUse", updatedInput: (.tool_input + {command: $filtered})}}'
else
  echo "{}"
fi

Дальше подключите его в ~/.claude/settings.json:

json
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [{ "type": "command", "command": "~/.claude/hooks/filter-test-output.sh" }]
      }
    ]
  }
}

Проверить просто: откройте в Claude Code /hooks и найдите запись PreToolUse, либо запустите claude --debug-file ./claude-debug.txt и попросите агента выполнить npm test. Если хук переписал команду, в файле появится строка modified tool input keys с полем command. Если тесты зелёные, вывод пустой, и агент получает тихий успех; если ваш раннер пишет ошибки иначе, поправьте шаблон.

Способ 2: context-mode для больших результатов тулов#

Хук покрывает только команды, которые можно завернуть в pipe. Снимки страниц Playwright или список из двадцати issue в GitHub приходят из MCP-тулов. Для них и сделан context-mode. По его README (https://github.com/mksglu/context-mode, проверено 23 октября 2026; версии и даты там нет) это MCP-сервер и плагин: он держит сырой вывод тулов вне окна контекста, хранит состояние сессии в SQLite и направляет вызовы тулов через хуки. Нужен Claude Code v1.0.33 или новее, лицензия — Elastic License 2.0, это не OSI-лицензия открытого кода.

Установка внутри Claude Code:

text
/plugin marketplace add mksglu/context-mode
/plugin install context-mode@context-mode

Перезапустите или выполните /reload-plugins, затем проверьте /context-mode:ctx-doctor. Вариант только с MCP — claude mcp add context-mode -- npx -y context-mode — добавляет тулы, но без автоматической маршрутизации.

Проект заявляет большое сжатие: 315 КБ превращаются в 5,4 КБ (98%), снимок страницы 56 КБ — в 299 байт, 986 КБ — в 62 КБ. Это цифры автора: считайте их потолком и мерьте на своей сессии через /context до и после.

Сколько стоит длинная сессия с фильтром и без#

Арифметика на одной условной сессии. Это 40 шагов кодинга при среднем базовом контексте 20 000 токенов, 500 токенов ответа на шаг и трёх прогонах тестов на шагах 10, 20 и 30. Сырой лог — 30 000 токенов, отфильтрованный — 500.

  • Лог с шага 10 уходит заново в 30 следующих запросах: 30 × 30 000 = 900 000 токенов. Шаг 20: 20 × 30 000 = 600 000. Шаг 30: 10 × 30 000 = 300 000. Лишний вход: 900 000 + 600 000 + 300 000 = 1 800 000.
  • С фильтром: (30 + 20 + 10) × 500 = 30 000 лишнего входа.
  • Базовый вход: 40 × 20 000 = 800 000. Выход: 40 × 500 = 20 000.
  • Итого сессия: 800 000 + 1 800 000 = 2 600 000 токенов входа без фильтра и 800 000 + 30 000 = 830 000 с фильтром, выход в обоих случаях 20 000.

В расчёте каждый входной токен идёт по полной цене. Кэш снижает реальную сумму, но в обоих вариантах одинаково. Живые цены MiniMax-M2.7 (MiniMaxAI/MiniMax-M2.7, контекст 180K, до 8 192 токенов в ответе) — модели, которая подходит таким агентным циклам с тяжёлым входом, — на диаграмме ниже.

Стоимость сессии на MiniMax-M2.7, 40 шагов
  • Без фильтра$0.133
  • С хуком$0.0445

Допущения: 40 шагов, базовый контекст 20 000 токенов, 500 токенов ответа на шаг, три прогона тестов по 30 000 токенов (с фильтром — 500).

На MiniMax-M2.7 сессия обходится в $0.133 без фильтра и $0.0445 с фильтром, и в сумме, с учётом входа и выхода, это дешевле референсной цены OpenRouter. Примерно две трети входа в варианте без фильтра — логи, которые агент прочитал один раз.

Точные доллары тут не главное. Главное, что фильтр убирает около 1 770 000 из 2 600 000 входных токенов (2 600 000 − 830 000 = 1 770 000) на любой модели, а дешёвая модель удешевляет каждый оставшийся.

Claude Code на модели CheapTokens#

Claude Code говорит по протоколу Anthropic Messages, и CheapTokens его поддерживает. Адрес для Claude Code — без /v1. Полная настройка — в статье как подключить Claude Code к CheapTokens. Коротко, с ключом-заглушкой:

bash
export ANTHROPIC_BASE_URL=https://api.cheaptokens.dev
export ANTHROPIC_AUTH_TOKEN=YOUR_CHEAPTOKENS_KEY
export ANTHROPIC_MODEL=MiniMaxAI/MiniMax-M2.7
claude

Берите полный id из документации: короткие имена из таблиц цен API не принимает. Цены всех моделей — на странице тарифов. Про остальные привычки, что снижают счёт Claude Code (/clear, /compact, /mcp, субагенты), читайте в как удешевить Claude Code. Как считаются вход и выход на настоящем запросе — в статье сколько токенов тратит запрос к API.

Короткий чек-лист#

  1. В длинной сессии выполните /context и посмотрите, что занимает место.
  2. Добавьте Bash-хук для команд тестов; проверьте подмену в /hooks или в debug-логе.
  3. Если MCP-тулы отдают большие снимки, попробуйте context-mode и сравните /context до и после.
  4. Делайте /clear между несвязанными задачами, чтобы старые логи не ехали дальше.