Эффективная автоматизация AI-агентов: архитектура, память и безопасные запуски
Автоматизация с AI-агентами хороша ровно до первого тихого сбоя: источник перестал отвечать, токен истёк, а утренний дайджест бодро сообщает, что новостей нет. На практике надёжный агент — не «умный чат», а аккуратно собранный процесс с памятью, ограничениями и понятным способом восстановиться после ошибки.
В этом разборе — эталонный сценарий Claude Managed Agents: по расписанию агент читает Slack и GitHub, замечает изменения с прошлого запуска и публикует короткую сводку в Slack. Подход применим и шире — при разработке AI-агентов и автоматизации внутренних процессов, где цена пропущенного сигнала иногда неприятно высока.
Получить код
Исходная эталонная реализация доступна в репозитории Anthropic. Для пошаговой настройки в Claude Code используйте навык claude-api:
/claude-api managed-agents-onboard https://claude.dev/blog/building-effective-agent-automations/Для примера понадобятся Slack-приложение и персональный токен GitHub. Конфигурация описывается набором файлов: агент, развёртывание, разрешённые сетевые адреса, два хранилища памяти и vault с секретами. Команда ant apply создаёт эти ресурсы в рабочем пространстве Claude API и сохраняет их идентификаторы в claude-lock.json.
daily-brief/
├── agent.md
├── deployment.md
├── environment.yaml
├── memory_store_preferences.yaml
├── memory_store_state.yaml
├── vault.yaml
├── claude-lock.json
└── slack/manifest.yamlПосле развёртывания автоматизация работает в инфраструктуре Anthropic по расписанию. Держать локальный процесс запущенным не нужно — и это, честно говоря, одна из самых приятных частей схемы.
Обзор
У этой автоматизации шесть опорных элементов. Их лучше проектировать вместе: слабое место одного быстро портит весь контур.
- Источники — явный перечень систем, откуда агент читает данные.
- Назначение — единственный контролируемый канал публикации.
- Агент — модель, инструменты и рабочие инструкции из
agent.md. - Расписание — cron-правило, часовой пояс и параметры запуска.
- Память — пользовательские предпочтения и рабочее состояние агента.
- Ограничители — права доступа, сетевой allowlist и лимит бюджета.
Такая архитектура AI-агентов кажется избыточной лишь на бумаге. Когда агент начинает действовать без человека в цикле, она становится обычной гигиеной.
Источники
В примере агент читает каналы Slack и pull request’ы GitHub. Список каналов и репозиториев хранится в файле пользовательских предпочтений, а не зашивается в промпт. Хотите подключить Jira, CRM или внутреннюю базу знаний — добавляйте отдельный источник с собственными правилами доступа и состоянием.
Используйте отдельные секреты с минимальными правами
В Managed Agents учётные данные помещаются в vault. Агент может ссылаться на секрет, но не получает его исходное значение внутри sandbox. Для GitHub запросы идут через MCP-прокси; для Slack агент вызывает API через curl, а реальный токен подставляется платформой только при обращении к разрешённому хосту.
Vault создаётся командой:
ant apply vault.yamlПосле этого добавьте секреты через SDK и укажите идентификатор vault в deployment.md. Принцип простой: агенту не следует выдавать ключ «на все случаи жизни». Дайте ровно то, что нужно для конкретной задачи. Это базовое требование для безопасности AI-агентов, а не факультативная перестраховка — и первое, что мы смотрим, когда проводим аудит доступов, секретов и ограничителей агента.
Читайте от закладки, а не «за последние 24 часа»
Фиксированное временное окно подводит. Если запуск задержался, часть событий выпадет; если стартовал раньше обычного — появятся дубли. Вместо этого агент хранит для каждого источника закладку, например "slack": "2026-09-14T13:02:11Z", и на следующем запуске читает всё, что появилось после неё.
Закладки лежат в хранилище state, которое монтируется в /mnt/memory/ при каждом запуске. Туда же удобно складывать журнал обработанных элементов и записи о выполнении. По сути, это практичная агентная память: не абстрактная «долгая память», а проверяемое состояние с понятной ролью каждого файла.
Не путайте сбой чтения с отсутствием новостей
Недоступный MCP-сервер или истёкший токен не должны превращаться в фразу «ничего нового». Агент обязан оставить закладку проблемного источника на месте, собрать сводку по доступным данным и явно написать, что именно не удалось прочитать. Иначе спокойный отчёт окажется просто вежливой маскировкой поломки.
Назначение
В эталонном шаблоне результат публикуется в один Slack-канал. Для каждого дня создаётся отдельное сообщение с датированным заголовком. Один канал назначения проще контролировать, аудировать и, если понадобится, отключить без танцев с бубном.
Сообщение отправляется через Slack API:
curl -s https://slack.com/api/chat.postMessage \
-H "Authorization: Bearer $SLACK_BOT_TOKEN" \
-H "Content-Type: application/json; charset=utf-8" \
-d '{"channel":"C0123456789","text":"Daily brief, Tue Sep 15 ..."}'Сначала подтвердите публикацию, потом меняйте состояние
Порядок здесь критичен. Агент обновляет закладки и журнал только после ответа Slack с "ok": true и идентификатором сообщения ts. До этого он не имеет права считать выпуск доставленным.
Перед отправкой полезно проверить, нет ли в канале уже опубликованной сегодняшней сводки. Если ответ API неоднозначен, запуск помечается как «возможно опубликовано», а состояние не меняется. Лучше вручную разобрать редкий спорный случай, чем навсегда потерять события или дважды разослать одно и то же сообщение.
Агент
В Claude Managed Agents агент — это версионируемая конфигурация: выбранная модель, системный промпт, MCP-серверы и набор инструментов. Она хранится в agent.md. В инструкциях важно описывать не только желаемый итог, но и последовательность решений: прочитать предпочтения, получить новые данные, отфильтровать, перепроверить, опубликовать, затем сохранить состояние.
Для GitHub MCP-инструментов можно указать always_allow, если подтверждать действия во время фонового запуска некому. Но компенсировать это следует токеном только для чтения. Автономность без рамок — это не зрелость, это авантюра.
Делайте сводку короткой и пригодной к действию
Включайте пункт лишь тогда, когда читатель может или должен отреагировать сегодня либо когда событие влияет на решение, которое он сейчас принимает. Открытый вопрос, о котором уже сообщали, лучше вести одной строкой — «всё ещё ожидает решения, день 3» — а не пересказывать заново. Закрытые вопросы обычно исчезают из дайджеста без фанфар.
Проверяйте статус прямо перед отправкой
Мир успевает измениться за несколько минут чтения источников. Поэтому перед публикацией агент заново проверяет каждый пункт: закрытый — удаляет, изменившийся — уточняет, неподтверждённый — исключает и фиксирует в записи запуска. Одна устаревшая фраза «ждём вашего решения» способна подорвать доверие сильнее, чем десяток не включённых мелочей.
Расписание
Сам агент ничего не запускает: это делает deployment. В deployment.md задаются агент, окружение, расписание, vault, хранилища памяти, стартовое сообщение и бюджет. Каждое срабатывание cron создаёт новую сессию.
schedule:
type: cron
expression: "32 7 * * 1-5"
timezone: America/New_YorkСоздать deployment можно так:
ant apply deployment.mdДля ручной проверки используйте ant beta:deployments run --deployment-id <id>, подставив ID из claude-lock.json.
Считайте даты в часовом поясе читателя
Поле timezone определяет момент запуска, но агенту нужно отдельно сообщить, в каком часовом поясе вычислять «сегодня», день недели и дату в заголовке. Иначе утренний выпуск в Нью-Йорке вполне может назвать себя вчерашним. Мелочь? Получателю так не кажется.
Память
Каждый запуск начинается в новом sandbox. Без внешнего состояния агент не знает, что уже писал и какие правила пользователь изменил вчера вечером. Но память должна быть разделена по назначению.
- preferences — пользовательское хранилище только для чтения: источники, исключения, максимальная длина, канал назначения, правила остановки.
- state — рабочее хранилище агента с правами чтения и записи: закладки, журнал, заметки об источниках и записи запусков.
Файл предпочтений следует перечитывать при каждом запуске. Если он недоступен, агенту разумнее остановиться и сообщить о проблеме, а не молча действовать по старой или выдуманной конфигурации.
В ledger.md храните дату, источник, стабильный идентификатор объекта и последний известный статус. Например:
2026-09-09 slack:C0123456789 1788963600.000100 клиент ждёт решения
2026-09-11 github 481 ревью заблокировано, день 2
2026-09-11 slack:C0234567891 1789117333.000300 эскалация: назначен ответственныйОграничители
Фоновый агент читает сообщения и задачи, написанные людьми. В таких данных может встретиться вредоносная инструкция — не только в явном виде, кстати. Поэтому надо ограничивать не то, что агент «может понять», а то, что он физически способен сделать.
Минимизируйте доступные действия
В рассматриваемой схеме GitHub-токен и preferences доступны только для чтения, а сеть ограничена allowlist’ом. Инъекция всё ещё способна повлиять на текст сводки, но не должна позволить агенту редактировать репозиторий, менять предпочтения или обращаться к случайным адресам. Slack остаётся исключением, поскольку тот же бот публикует результат; добавляйте его лишь в действительно нужные каналы.
Ставьте бюджет по данным реальных запусков
Лимит расходов защищает от неуправляемой стоимости. Начните с трёх-пятикратной цены типичного запуска, затем скорректируйте порог по фактической статистике. Слишком низкий бюджет не всегда выглядит как ошибка: сводка может просто внезапно оборваться.
budget:
type: limit
max_list_cost:
amount: "500"
currency: USDЗдесь "500" означает 500 центов, то есть 5 долларов США. При достижении лимита запуск приостанавливается с причиной budget_reached.
Начало работы
Надёжная агентная автоматизация держится на шести правилах:
- Читайте каждый источник от сохранённой закладки, а не по скользящему окну времени.
- Явно сообщайте о недоступном источнике.
- Перепроверяйте каждый включаемый в сводку элемент перед публикацией.
- Обновляйте журнал и закладки только после подтверждённой доставки.
- При каждом запуске заново читайте защищённые пользовательские предпочтения.
- Выдавайте минимальные права и ограничивайте бюджет отдельного запуска.
Сначала обновите Claude Code:
claude updateЗатем запустите навык claude-api и адаптируйте шаблон под свои источники, канал доставки и правила памяти. Не пытайтесь сразу сделать «универсального сотрудника». Начните с одного повторяемого процесса, измерьте качество, проверьте сбои — и только потом расширяйте контур.
Если нужен такой же фоновый агент под ваши системы — 1С, Битрикс24, почту или внутренний чат, — соберём автоматизацию процесса на AI-агентах с закладками, журналом доставки и лимитом бюджета.
Источник: claude.dev
