EnglishРусский Map

Portal от Spotify сократил расход токенов в Claude Code на 90%

title
Portal от Spotify сократил расход токенов в Claude Code на 90%
type
summary
summary
PM из Spotify перенаправляет массовое чтение файлов и бойлерплейт из Claude Code в более дешёвую модель через хуки; 90% касаются чтения, а не всех затрат
tags
claude-code, cost, model-routing, agentic-coding
created
2026-09-13
updated
2026-09-13
lang
ru
source_updated
2026-09-13
translated
2026-09-14
translator
lllm/antigravity/gemini-3.7-flash-medium

Димитри Мазманов, principal product manager в Spotify, отталкивается от наблюдения: большую часть времени агент для написания кода занят вводом-выводом, а не размышлениями. Он читает пять файлов, чтобы ответить на вопрос по одному методу, или пишет тест, копирующий двадцать соседних. В его конфигурации эта работа перенаправляется из claude-code в более дешёвую модель, а передовая модель остаётся для логических рассуждений. Это продуктовая публикация о Portal, коммерческой версии Backstage от Spotify, и слой маршрутизации работает только с экземпляром Portal. Сам механизм всё равно заслуживает фиксации отдельно от продукта.

Оценку затрат во вступлении он заимствует: прогноз Gartner о том, что расходы на написание кода с помощью ИИ превысят среднюю зарплату разработчика к 2028 году, и сообщения руководителей инженерных команд о тратах от 200 до 500 долларов (а иногда более 2000 долларов) на одного разработчика в месяц только на токены.

Режимы

AiKA Modes в Portal - это декларативные агенты в эфемерной среде исполнения: инструкции, модель, параметры вроде temperature и опциональные инструменты MCP, доступные через Portal CLI или API. Автор определяет два таких режима, оба на Gemini 2.5 Flash с temperature 0.2 в его примерах. bulk-reader читает файлы и отвечает на вопрос краткими структурированными пунктами. code-writer генерирует файлы по спецификации и файлу-образцу, повторяя его соглашения, причём вывод ограничен только кодом. Это ограничение важно, отмечает он, иначе исполнитель оборачивает всё в markdown-блоки и пояснения, которые Claude затем приходится читать.

Маршрутизация в три слоя

Первой попыткой были правила маршрутизации в CLAUDE.md. Claude следовал им лишь иногда. Они носили рекомендательный характер, их было легко проигнорировать, и их приходилось копировать в каждый проект.

Текущая версия представляет собой плагин для Claude Code под названием shunt. Его первый слой - два hook'а PreToolUse. check-file-size блокирует любой Read файла длиннее порогового значения (по умолчанию 350 строк, настраивается через SHUNT_MIN_LINES) и предлагает Claude использовать вместо этого skill bulk-reader; операции чтения со смещением и лимитом пропускаются, исходя из того, что Claude уже знает, какая именно часть ему нужна. check-bash-read делает то же самое для cat, head, tail, less и more на больших файлах, пропуская команды с конвейерами (pipe).

{
  "env": {
    "SHUNT_MIN_LINES": "500"
  }
}

Второй слой - два shell-скрипта, являющихся обёртками над Portal CLI. bulk-read оборачивает каждый файл в теги XML и отправляет их вместе с вопросом; файлы уходят исполнителю и вообще не попадают в контекст Claude, поэтому их повторная отправка для уточняющего вопроса ничего не стоит Claude. code-write передаёт спецификацию и обязательный файл-образец, очищает вывод от блоков кода и может писать прямо на диск, так что Claude вообще не видит сгенерированный код.

bulk-read --question "Which methods call the database?" --paths src/Service.java src/Handler.java
code-write --spec "Write tests for UserService" --reference tests/OrderTest.java --target tests/UserTest.java

Третий слой - два файла skill'ов, объясняющих Claude, когда и как вызывать скрипты. Под многоуровневой структурой автор понимает плавную деградацию: если Claude проигнорирует skill, hook всё равно заблокирует дорогостоящее чтение.

О тех самых 90%

Замеры проводились на Java-монорепозитории по четырём сценариям: сравнивалось количество токенов, которые Claude потратил бы на прямое чтение файлов, с количеством токенов в выжимке от bulk-reader. Средняя экономия на массовом чтении составила около 90%. Цифры по отдельным сценариям не опубликованы, качество ответов на основе выжимок ничем не замерялось, а заявление в заголовке ("сократил расход токенов в Claude Code на 90%") гораздо сильнее утверждения "массовое чтение обходится примерно на 90% дешевле", которое только и подтверждается текстом статьи. Экономию от code-write автор называет более сложной для оценки и не приводит для неё количественных данных.

Что, по его словам, не работает

Редактирование нельзя делегировать, поскольку выжимки исполнителя не содержат надёжных номеров строк; Claude по-прежнему читает редактируемый фрагмент, именно поэтому точечные чтения проходят через hook. Рассуждения тоже нельзя делегировать: в его тестах исполнитель находил поверхностные закономерности, но пропустил ошибку потокобезопасности, которую Claude заметил за секунды. Поэтому отладка, архитектурные задачи и критичный для безопасности код исключены из маршрутизации. Кроме того, каждое делегирование - это сетевой запрос длительностью от 10 до 30 секунд (при этом Portal ограничивает выполнение 30 секундами), так что чтение небольших файлов отнимает больше ресурсов, чем экономит. Именно для этого и нужен порог по количеству строк.

Две проблемы автор не затрагивает. Когда code-write сохраняет на диск файлы, которые Claude ни разу не читал, их никто в цепочке не проверяет; они принимаются с меньшим контролем, чем код, написанный основным агентом. А выжимка от bulk-reader становится безусловной истиной для следующего шага Claude, поэтому ошибки понимания более дешёвой модели переходят в решения без какого-либо сигнала о том, что они получены от другой модели. Его собственный пример с потокобезопасностью - это как раз разовый случай обнаружения подобного сбоя.

Связанные страницы

Здесь используется тот же принцип, что и в code-mode-token-savings: данные, которые не попадают в историю диалога, не оплачиваются и не засоряют контекстное окно. Shunt применяет его к содержимому файлов, а не к результатам работы инструментов. Маршрутизация здесь привязана к типу задачи, а не к отдельному запросу, что отличает подход от шлюзов вроде llm-api-routing-layer и от claude-code-router, где слоты перенаправляют запросы целиком другим провайдерам. В отличие от переключения через /model, делегирование сохраняет сессию самого Claude и его кэш промптов нетронутыми, поскольку исполнитель запускается отдельным вызовом. Переход от правил в CLAUDE.md к hook'ам - от рекомендаций к принудительному исполнению - повторяет тему из mcp-vs-skills: skill сообщает агенту, что тот мог бы сделать, а hook определяет, что ему разрешено. Заметка local-ai-is-not-opus приходит к аналогичному выводу с другой стороны: более дешёвая локальная модель хорошо справляется с ограниченным чтением и пасует перед задачами на длинном горизонте. А в ai-token-budget-explosion описана корпоративная проблема растущих расходов, решение которой и предлагает эта публикация.