SSD Nodes Learn
Руководства Matt ConnorАвтор: Matt Connor · Обновлено 2026-07-24

Как контролировать расходы AI agent на VPS

Узнайте, как ограничить циклы, использовать prompt caching и batching, чтобы автономный агент не израсходовал весь бюджет на токены при работе на VPS.

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

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

Данный метод применим к уже созданному агенту, который вызывает Messages API с вашего сервера. Руководство Building an AI agent with Claude on a VPS содержит описание механизмов работы.

Почему стоимость автономного агента имеет иной характер

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

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

Агент также расходует ресурсы на задачи, которые не характерны для окна чата.

  • Определения инструментов (tool definitions) включаются в каждый запрос. Системный промпт для использования инструментов занимает 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 kB составляет примерно 2 500 токенов, а исследовательский PDF-файл размером 500 kB — примерно 125 000 токенов. max_content_tokens обрезает только текстовые данные, так как это «применяется к текстовому контенту, а не к бинарному контенту, такому как PDF». Вместо этого используйте связку max_uses и allowed_domains для PDF.
  • Веб-поиск тарифицируется за каждый поиск по цене $10 за 1 000 поисков, независимо от количества полученных результатов. Ошибочный поиск не оплачивается.

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

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

Применяется max_tokens. Это жесткий лимит на общий объем одного запроса, включая текст размышлений и текст ответа. Claude никогда не выходит за этот предел, при этом модель не видит это число. При достижении лимита возникает stop_reason: "max_tokens" и ответ обрезается. Проблема для агентов: каждый запрос в цикле использования инструментов (tool-use loop) имеет собственный 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 в каждом последующем запросе, измененное значение делает недействительным любой кэшированный префикс, содержащий это значение. Установите его один раз при первом запросе.

Бюджеты задач находятся в режиме beta в 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 не обязательна.

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

Основная проблема заключается в конфликте параметра 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 раза дороже базовой цены ввода для 5-минутного кэша и в 2 раза дороже для 1-часового кэша. Чтение из кэша стоит в 0.1 раза дешевле. Таким образом, «кэширование становится выгодным уже после одного чтения для 5-минутного кэша (запись 1.25x) или после двух чтений для 1-часового кэша (запись 2x)».

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

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

Изменяющийся префикс. «Кэш-префиксы создаются в следующем порядке: tools, system, затем messages». Любое изменение байта в более ранней позиции аннулирует все последующие данные. Редактирование определений инструментов (tool definitions) также аннулирует весь кэш. Типичная ошибка — использование временной метки (timestamp) или идентификатора запуска (run id) в системном промпте: каждый запрос получает новый префикс, создает новую запись стоимостью 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 позиций на каждую точку разрыва (breakpoint) и затем останавливается. В приведенном примере ход, содержащий 35 блоков с точкой разрыва на 35-м блоке, проверяет блоки с 35 по 16. Запись предыдущего хода на 15-м блоке выходит за пределы окна, поэтому попадания в кэш не происходит. Если агент добавляет по несколько блоков использования инструментов (tool-use) и результатов инструментов (tool-result) за ход, лимит в 20 блоков будет превышен за два или три хода. На каждый запрос приходится четыре точки разрыва, поэтому используйте одну из них для последних сообщений.

Отправляйте задачи, которые могут подождать, через Batches API

Стоимость всех операций составляет 50% от стандартных цен API как для входных, так и для выходных данных. Пакетная обработка является асинхронной. Большинство пакетов завершается менее чем за 1 час. Результаты доступны после завершения всех запросов или через 24 часа, в зависимости от того, что наступит раньше. Это типичный показатель, а не гарантированное время.

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

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

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

Вы не сможете распределить расходы, если не будете их записывать. Каждый ответ содержит данные о стоимости.

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 при большом промпте, это не значит, что запрос был дешевым: остальная часть пришла из кэша.

Считайте токены перед отправкой. Подсчет токенов бесплатен, а его лимиты (rate limits) не связаны с созданием сообщений. Используйте 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 key, используйте фильтр api_key_ids[] и разделите отчет по ключам с помощью group_by[]=api_key_id. Фильтр имеет множественное число, а измерение группировки — единственное. Храните ключи в переменных окружения (environment), а не в коде, как это реализовано в первом приложении 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 ограничивает только один ответ, а модели лишь сообщается бюджет задачи.

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

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

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

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

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

FAQ

Какова стоимость работы постоянно включенного AI-агента на VPS?

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

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

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

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

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

Как остановить бесконечный цикл AI-агента?

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

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

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

#claude#ai#agents#api#cost