SSD Nodes Learn Hosting plans →
Руководства Matt ConnorАвтор: Matt Connor · Обновлено 2026-08-25

Как ограничить расходы AI-агента на VPS

Узнайте, как контролировать бюджет автономного AI-агента. В статье разобраны методы установки жестких лимитов, использование prompt caching, пакетная обработка и мониторинг токенов.

Как предотвратить чрезмерные расходы при работе постоянно запущенного AI-агента

Контроль расходов на AI-агента на VPS (виртуальном выделенном сервере) сводится к установке лимитов до запуска агента, так как никто не следит за счетчиком в процессе его работы. Ограничивайте каждый ответ параметром max_tokens, задавайте границы итераций цикла в собственном коде, кэшируйте неизменяемые части промпта и записывайте в лог показатели использования для каждого запроса, чтобы понимать, какая задача расходует средства. Аренда сервера — это фиксированная ежемесячная плата. API модели тарифицируется за токен, и автоматизированный цикл очень эффективно расходует токены в фоновом режиме.

Данное руководство предполагает, что агент уже существует и вызывает Messages API с вашего сервера. В статье Создание AI-агента с Claude на VPS описана техническая реализация.

Почему автономный агент имеет другую структуру затрат

Интерактивная сессия подразумевает участие человека. Если модель выбирает неверный путь или начинает читать лог на 40 000 строк, наблюдатель останавливает её. У автономного агента такого тормоза нет: он работает до завершения цикла, после чего таймер запускает его снова.

Частота — это множитель, который многие упускают из виду. Задача, выполняемая каждые пять минут, запускается 288 раз в день и около 8 640 раз в месяц. Стоимость одного запуска — это число, на которое нужно умножить итоговые затраты. Многим «постоянно работающим» агентам не нужно быть активными всё время. Им достаточно отвечать в течение нескольких минут, что подразумевает работу по расписанию.

Агент также оплачивает ресурсы, которые не требуются для обычного окна чата.

  • Определения инструментов передаются с каждым запросом. Системный промпт для использования инструментов занимает 290 токенов в Claude Opus 4.8 с tool_choice из auto или none, и 410 с any или tool. Инструмент bash добавляет ещё 325 токенов. Каждый подключенный MCP server увеличивает этот объем за счет своих схем, так как MCP — это model context protocol.
  • Результаты работы инструментов — это входные токены. Команда, выводящая 8 000 строк, добавляет 8 000 строк в следующий запрос и во все последующие запросы в рамках этого цикла.
  • Загруженные страницы — это входные токены. Веб-страница среднего размера в 10 кБ — это примерно 2 500 токенов, а исследовательский PDF на 500 кБ — около 125 000. max_content_tokens обрезает только текстовые данные, так как это «применимо к текстовому контенту, а не к бинарному, например, к PDF». Ограничивайте PDF с помощью max_uses и allowed_domains.
  • Веб-поиск оплачивается за каждый запрос, по цене $10 за 1 000 поисковых запросов, независимо от количества полученных результатов. Поиск, завершившийся ошибкой, не тарифицируется.

Ничто из этого не является дорогим при однократном выполнении. Всё это становится дорогим при 8 640 запусках.

Жесткие и мягкие лимиты решают разные задачи

max_tokens является принудительным. Это жесткое ограничение на общий объем вывода одного запроса, включая текст размышлений и ответ. Claude никогда не генерирует текст сверх этого объема, при этом модель не видит данное число. Достижение лимита приводит к stop_reason: "max_tokens" и обрыву ответа. Важный нюанс для агентов: каждый запрос в цикле использования инструментов несет свой собственный max_tokens, поэтому он ограничивает один ответ, а не всю задачу целиком. Десять вызовов инструментов по 4,000 токенов означают потолок в 40,000 токенов на итерацию.

Бюджет задачи носит рекомендательный характер. task_budget находится внутри output_config и сообщает модели, сколько токенов ей доступно на весь агентный цикл, включая размышления, вызовы инструментов, результаты работы инструментов и итоговый вывод.

resp = client.beta.messages.create(
    model="claude-opus-4-8",
    max_tokens=4096,
    betas=["task-budgets-2026-03-13"],
    output_config={"task_budget": {"type": "tokens", "total": 64000}},
    messages=messages,
)

«Бюджеты задач — это мягкая подсказка, а не жесткое ограничение». Claude может превысить его в процессе выполнения действия, при этом принудительный лимит на вывод по-прежнему составляет max_tokens. «Обратный отсчет виден только модели», а ответы не содержат поля с оставшимся бюджетом. Минимально допустимое значение task_budget.total составляет 20,000 токенов, при меньшем значении возвращается ошибка 400. Слишком маленький бюджет для выполнения работы приводит к поведению, похожему на отказ, поэтому модель сокращает объем задачи или останавливается раньше времени.

Одна деталь приводит к дополнительным расходам вместо экономии. Если ваш клиент уменьшает task_budget.remaining при каждом последующем запросе, измененное значение делает недействительным любой кэшированный префикс, содержащий его. Устанавливайте это значение один раз, в первом запросе.

Бюджеты задач находятся в стадии бета-тестирования для Claude Fable 5, Claude Opus 4.8 и Claude Opus 4.7. Claude Sonnet 5 и Claude Haiku 4.5 указаны как Not supported, а бюджеты задач не применяются к Claude Code, поэтому сессия Claude Code, отсоединенная в tmux зависит от чистоты сессии.

Третий уровень ограничений находится в Claude Console: предоставьте агенту собственное рабочее пространство, затем установите для него ежемесячный лимит расходов и лимиты частоты запросов в минуту. «Вы не можете устанавливать лимиты для Default Workspace», а «общеорганизационные лимиты действуют всегда, даже если сумма лимитов рабочих пространств их превышает». Настройте уведомления о расходах, чтобы пороговое значение предупреждало вас до того, как сработает лимит.

Выбор модели для каждой задачи и факторы, влияющие на затраты

Выбор модели осуществляется отдельно для каждой задачи. По состоянию на июль 2026 года стоимость за миллион токенов (входные/выходные) составляет: Claude Fable 5 — $10 и $50, Claude Opus 4.8 и Opus 4.7 — $5 и $25, Claude Sonnet 5 — $3 и $15, Claude Haiku 4.5 — $1 и $5. Цена Sonnet 5 сейчас ниже заявленной, так как «вводные тарифы $2/$10 за миллион входных/выходных токенов действуют до 31 августа 2026 года». Для задачи, которая просто классифицирует строки логов, модель Opus не требуется. Бесплатного лимита для обработки большого объема задач также не существует, поскольку у Claude API нет бесплатного уровня, за исключением небольшого кредита, предоставляемого при регистрации.

Вторым рычагом управления является параметр effort. output_config.effort принимает значения low, medium, high, xhigh и max, при этом значением по умолчанию является high, поэтому явное указание high эквивалентно его отсутствию. Снижение уровня effort сокращает не только длительность рассуждений: согласно документации, это заставляет Claude реже обращаться к инструментам и объединять операции в одну. Для агента это дает большую экономию, так как предотвращенный вызов инструмента — это целый запрос, который не был выполнен.

Основная ловушка заключается в том, что параметр effort конфликтует с кэшированием. Изменение этого значения между запросами делает кэш промптов недействительным. В приведенном в документации примере запрос 2 показал cache_read_input_tokens: 3546; запрос 3, в котором effort был изменен с high на medium, показал cache_creation_input_tokens из 3546 и cache_read_input_tokens из 0. Поэтому варьируйте effort для разных рабочих нагрузок, но никогда не меняйте его внутри одной кэшированной беседы. Чтобы управлять глубиной рассуждений, не нарушая работу кэша, делайте это в самом промпте: фраза вроде «Отвечай прямо, без долгих размышлений» в последнем сообщении пользователя сохранит целостность предыдущих точек останова.

Токены рассуждений (thinking tokens) оплачиваются по тарифам выходных токенов и учитываются в max_tokens, поэтому усеченный ответ часто означает, что рассуждения исчерпали бюджет. Значение можно найти в usage.output_tokens_details.thinking_tokens. Статья Из чего на самом деле складывается счет за токены Claude подробно разбирает работу счетчика.

Кэшируйте стабильный префикс и перестаньте случайно его нарушать

Запись в кэш стоит в 1.25 раза дороже базовой цены ввода для пятиминутного кэша и в 2 раза для часового. Чтение из кэша стоит 0.1 от базовой цены, поэтому «кэширование окупается уже после одного чтения для 5-минутного интервала (1.25x запись) или после двух чтений для 1-часового интервала (2x запись)».

Одна фраза объясняет, почему это подходит для постоянно работающего агента: «Кэш обновляется без дополнительных затрат каждый раз, когда используется кэшированный контент». Задача, запускаемая каждые две минуты с пятиминутным кэшем, поддерживает префикс в актуальном состоянии весь день всего за одну операцию записи.

Три способа потерять кэш, не заметив этого.

Префикс, который меняется. «Префиксы кэша создаются в следующем порядке: tools, system, затем messages». Любое изменение байтов в начале этой последовательности делает недействительным всё, что идет после, а редактирование определений инструментов аннулирует весь кэш. Типичная ошибка — включение метки времени или идентификатора запуска в системный промпт: тогда каждый запрос несет другой префикс, записывает новую запись с коэффициентом 1.25x и ничего не считывает обратно. Признаком этого является usage.cache_read_input_tokens, равный 0 при идентичных на вид вызовах. Перенесите изменяемый текст в самое последнее сообщение пользователя.

Слишком короткий префикс. У каждой модели есть минимальная длина, пригодная для кэширования; если она меньше, запрос обрабатывается без кэширования, при этом «ошибка не возвращается». Пороговые значения включают 1,024 токена для Claude Opus 4.8 и Claude Sonnet 5, а также 4,096 для Claude Haiku 4.5, поэтому перенос задачи с Sonnet на Haiku может незаметно отключить кэширование.

Диалог, который выходит за пределы окна просмотра. «Окно просмотра составляет 20 блоков». Система проверяет максимум 20 позиций для каждой точки останова, а затем останавливается. В описанном примере ход, содержащий 35 блоков с точкой останова на блоке 35, проверяет блоки с 35 по 16, а запись предыдущего хода на блоке 15 оказывается вне окна, поэтому попадания (hit) не происходит. Агент, добавляющий несколько блоков использования инструментов и результатов инструментов за один ход, превышает лимит в 20 блоков за два или три хода. Вы получаете четыре точки останова на запрос, поэтому используйте одну из них для недавних сообщений.

Отправляйте задачи, не требующие немедленного ответа, через Batches API

«Все операции тарифицируются с 50% скидкой от стандартных цен API» как для входящих, так и для исходящих данных. Пакетная обработка выполняется асинхронно, «большинство пакетов завершаются менее чем за 1 час», а результаты становятся доступны после завершения всех запросов или по истечении 24 часов, в зависимости от того, что наступит раньше. Это типичный, но не гарантированный срок.

Опрашивайте processing_status, пока статус не примет значение ended. Запросы, возвращающие errored, canceled или expired, не тарифицируются. Важное замечание для тех, кто использует лимиты расходов: «пакеты могут незначительно превышать установленный для вашего Workspace лимит затрат».

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

Регистрируйте поля использования каждого ответа в собственном хранилище

Вы не сможете распределить расходы, которые не зафиксировали. Каждый ответ содержит информацию о своей стоимости.

u = resp.usage
row = {
    "job": job_name,
    "model": resp.model,
    "uncached_input": u.input_tokens,
    "cache_write": u.cache_creation_input_tokens,
    "cache_read": u.cache_read_input_tokens,
    "output": u.output_tokens,
    "stop_reason": resp.stop_reason,
}

Добавляйте по одной строке на каждый вызов API в файл формата JSON-lines, помечая её именем вашей задачи. Через неделю вы сможете определить, какие задачи расходуют бюджет, а какие просто создают видимость работы. Следите за cache_read: столбец с нулевыми значениями — самая частая ошибка при расчёте стоимости в self-hosted агентах.

Одно поле легко интерпретировать неверно. input_tokens учитывает только токены после последней точки кэширования, поэтому реальный размер промпта составляет total_input_tokens = cache_read_input_tokens + cache_creation_input_tokens + input_tokens. Агент, сообщающий о input_tokens: 400 при большом промпте, не является дешёвым: остальная часть данных была получена из кэша.

Подсчитывайте токены перед отправкой. Подсчёт токенов бесплатен, а его лимиты не зависят от лимитов на создание сообщений, поэтому используйте count_tokens, чтобы отклонить слишком большое вложение, вместо того чтобы платить за обнаружение этого факта. Результат является оценочным, поэтому проводите замеры для каждой модели отдельно и никогда не используйте значения, полученные с помощью токенизатора другого поставщика. Claude Opus 4.7 и более поздние модели Opus, Claude Fable 5 и Claude Sonnet 5 используют новый токенизатор, который «генерирует примерно на 30% больше токенов для того же текста». Claude Sonnet 4.6 и более ранние версии, включая Claude Haiku 4.5, используют предыдущий токенизатор.

Для получения достоверных данных Admin API предоставляет информацию об использовании по адресу https://api.anthropic.com/v1/organizations/usage_report/messages и о стоимости по адресу https://api.anthropic.com/v1/organizations/cost_report. Для обоих запросов требуется ключ администратора (sk-ant-admin01-...) в качестве x-api-key: $ANTHROPIC_ADMIN_KEY с использованием anthropic-version: 2023-06-01, а также принимаются параметры bucket_width=1d, group_by[]=model и api_key_ids[]=. Ограничение: «Admin API недоступен для индивидуальных учётных записей».

Последний параметр — это простой способ распределения затрат: назначьте каждой задаче свой API-ключ, отфильтруйте данные с помощью api_key_ids[] и разделите отчёт по ключам через group_by[]=api_key_id. Фильтр поддерживает множественные значения, а группировка — только одно. Храните ключи в переменных окружения, а не в коде, как это реализовано в первом приложении для Claude API на VPS.

Ограничение цикла, так как больше это сделать некому

Ограничение количества итераций здесь обязательно. Цикл ваш, поэтому и счетчик должен быть вашим:

for step in range(MAX_STEPS):          # MAX_STEPS = 12, never "while True"
    resp = client.messages.create(...)
    if resp.stop_reason != "tool_use":
        break
else:
    log.warning("job %s hit MAX_STEPS=%d, giving up", job_name, MAX_STEPS)

Ни один из указанных выше лимитов не сделает это за вас: max_tokens ограничивает только один ответ, а модель лишь получает рекомендацию по бюджету задачи. Облачный сервис остановил бы вас в этом месте, подобно тому как ограничение Claude на вызовы инструментов в рамках одного сеанса прерывает сессию при превышении лимита, но написанный вами цикл не имеет такой защиты, пока вы её не добавите.

Установите второй предохранитель вне процесса. Запускайте задачу через systemd timer вместо постоянного процесса и задайте RuntimeMaxSec= в его сервисном юните. С помощью RuntimeMaxSec=600 зависший процесс будет принудительно завершен через 10 минут, вместо того чтобы выполняться бесконечно, пока вы не заметите проблему. В статье Запуск программы как службы и таймера systemd описано создание самих файлов юнитов. Просматривайте результаты выполнения с помощью journalctl -u triage-agent.service --since "1 hour ago".

Ограничивайте также количество повторных попыток, так как обработчик, который пытается выполнить задачу бесконечно, учитывает каждую попытку. Ошибки 429 или 500 заслуживают нескольких попыток с экспоненциальной задержкой. Ошибки 400 не требуют повтора, так как один и тот же запрос будет приводить к одному и тому же результату.

Контроль расходов на AI-агентов начинается с анализа собственных показателей

Никто не сможет заранее сказать, сколько стоит постоянно работающий агент, так как стоимость складывается из количества токенов за один запуск, умноженного на число запусков в день, а оба этих параметра зависят от вас. Запустите агента один раз, изучите строку использования в логах и умножьте полученное значение на частоту вашего расписания. Через два дня сравните отчет о расходах с этими расчетами. Если данные расходятся, причина почти всегда кроется в неработающем кэше или цикле, который выполнялся дольше, чем вы предполагали.

Данный подход предполагает использование API key, так как агент — это ваша собственная программа, обращающаяся к Messages API. Для интерактивной работы какой тарифный план Claude соответствует вашему стилю работы описывает условия подписки. Все цены и лимиты, приведенные здесь, были проверены по документации Anthropic в июле 2026 года, поэтому перед планированием бюджета повторно ознакомьтесь со страницей с ценами.

FAQ

Сколько стоит работа AI-агента на VPS в режиме 24/7?

Существует два типа расходов, и только один из них предсказуем. Стоимость сервера фиксирована и оплачивается ежемесячно. API модели тарифицируется за токены, поэтому итоговая сумма зависит от потребления за один запуск, умноженного на частоту обращений. Anthropic не публикует данные для постоянно работающих self-hosted агентов, поэтому любые цифры — это лишь предположения. Запишите usage для одного реального запуска и умножьте на количество запланированных операций.

В чем разница между max_tokens и бюджетом задачи?

Параметр max_tokens является принудительным и невидимым для модели. Он ограничивает объем вывода одного запроса, включая процесс «мышления», и при его достижении возвращается ошибка stop_reason: "max_tokens". Бюджет задачи работает иначе: модели сообщают это число, и она соизмеряет с ним цикл работы агента. Однако «бюджеты задач — это мягкая рекомендация, а не жесткое ограничение», а принудительным лимитом остается max_tokens.

Почему значение cache_read_input_tokens для моего агента всегда равно нулю?

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

Как предотвратить бесконечное зацикливание AI-агента?

Считайте итерации в коде цикла и останавливайтесь при достижении фиксированного максимума, так как max_tokens ограничивает только один ответ, а агент выполняет их множество. Добавьте ограничение по времени выполнения вне самого процесса: запускайте задачу через systemd timer с установленным параметром RuntimeMaxSec=, чтобы зависший процесс завершался по расписанию. Также ограничивайте количество повторных попыток, так как цикл ретраев оплачивается за каждую попытку.

Можно ли установить лимит расходов на один API-ключ Claude?

Документированный лимит расходов устанавливается для рабочего пространства (workspace), а не для отдельного ключа. Поэтому создайте для агента отдельное рабочее пространство и ограничьте его ежемесячный бюджет там. «Вы не можете установить лимиты для Default Workspace». Настройте уведомления о расходах, чтобы получать оповещения при достижении порога. Для отслеживания затрат выдавайте каждой задаче свой ключ, а затем группируйте отчеты об использовании с помощью group_by[]=api_key_id.