← РазборыТема 07 · Архитектура агента
Code w/ Claude · воркшопархитектуралатентностьбезопасность

Руки отдельно от мозга

Главное архитектурное решение Claude Managed Agents: агентный цикл крутится на сервере, а инструменты выполняются у тебя. Из этого следуют сразу три вещи — безопасность кредов, −90% ко времени первого токена и живучесть при падении исполнителя.

Источник: Code w/ Claude — «Ship your first Managed Agent», Isabella He (Applied AI, Anthropic). Расшарено @isamquintero · 37 мин.

Зачем нам это, если мы не используем CMA

Прямо мы Claude Managed Agents не используем — у нас свой оркестратор. Но воркшоп ценен тем, что это чек-лист того, что обязано быть у production-агента, собранный людьми, которые эти агенты и строят. А развилка «руки/мозг» напрямую ложится на наш губернатор.

Три поколения интерфейсов

Что берёт на себя каждое поколение — переключи
Даёт: сырой доступ к модели. Токены внутрь, токены наружу. Первый способ строить на Claude программно.

На тебе: вообще всё — управление контекстом, сам агентный цикл, компакция, кэширование.

Почему тогда это было нормально: агенты просто меньше могли, и примитивы были проще.

Аргумент, который стоит запомнить: обвязка устаревает вместе с моделью

Живой пример из доклада

У Sonnet 4.5 обнаружили поведение под названием context anxiety: Claude начинал сворачивать задачу рано, хотя в контекстном окне ещё было полно места. В обвязку добавили меры против этого раннего останова.

Вышел Opus 4.5 — поведение исчезло само. Вся проделанная работа стала бесполезной, потому что Claude перерос то, что обвязка пыталась компенсировать.

На наш завод

Это предупреждение против накопления костылей в наших промптах и скиллах. Каждая строчка вида «не останавливайся раньше времени», «обязательно проверь, что...», «не забудь дописать» — это заплатка под поведение конкретной модели. Модель обновится — заплатка станет мусором, который активно вредит (см. гигиену контекста).

Практика: помечать такие заплатки датой и моделью, под которую они введены, и при апдейте модели проверять, нужны ли они ещё. У нас в Gotchas уже есть авто-метки вида _[auto 2026-06-30]_ — тот же приём, надо распространить на поведенческие правила.

Четыре примитива

Из чего собирается агент — тапни блок
AGENT — «мозг» модель · системный промпт · MCP · скиллы · инструменты крутится на сервере Anthropic SESSION связывает агента и среду, монтирует данные ENVIRONMENT — «руки» контейнер, где реально выполняются действия сетевой allow-list FILES — логи, метрики
Тапни блок — что в нём задаётся.
Правило подбора инструментов

Дать агенту те же материалы, что были бы у человека-разработчика. Разработчик при инциденте лезет в метрики, логи и деплои — значит ровно эти инструменты и даём. Не больше и не меньше.

Расцепление: три следствия

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

Сцеплено vs расцеплено — переключи
Цикл и инструменты в одной коробке.

🔴 Креды. Агент имеет доступ к файловой системе — значит и к учётным данным.
🔴 Латентность. Контейнер надо поднимать на каждую сессию — прямая добавка ко времени до первого токена.
🔴 Отказ. Упал контейнер — вместе с ним падает агентный цикл, всё сначала.

Когда это всё же правильно: Claude Code — агенту действительно нужны твои файлы.

Форма кода: стрим открывается первым

Порядок операций неочевидный и важный — сначала открыть стрим, потом отправить сообщение, иначе первые события потеряются:

with client.beta.sessions.events.stream(session_id) as stream:   # открыть ПЕРВЫМ
    client.beta.sessions.events.send(session_id, events=[        # потом отправить
        {"type": "user.message", "content": [{"type": "text", "text": q}]}
    ])
    for ev in stream:
        if ev.type == "agent.custom_tool_use":                    # облако → тебе
            result = handle_tool(ev.name, ev.input)
            client.beta.sessions.events.send(session_id, events=[ # тебе → облако
                {"type": "user.custom_tool_result",
                 "custom_tool_use_id": ev.id,
                 "content": [{"type": "text", "text": result}]}
            ])
        yield ev

Двенадцать строк, и в них видна вся модель: агент в облаке просит вызвать инструмент, инструмент выполняется у тебя, результат уходит обратно как ещё одно событие.

На наш завод — параллель прямая

У нас это разделение уже есть, просто мы его так не называли: resource-governor — брокер «рук», а claude -p внутри слота brain — «мозг». Что забрать:

Демо: что реально сделал агент

Сценарий — инцидент, P99-латентность в 10 раз выше базовой. Агент:

  1. запустил sandbox-команду, посмотрел приложенные логи;
  2. вызвал инструменты недавних деплоев, метрик и диффа;
  3. вернул диагноз: исчерпание пула соединений к БД, вызванное конкретным коммитом — рефакторингом сборщика сводки заказов, который добавил запрос, выедающий пул;
  4. исключил другие причины и выдал рекомендованные действия.

Явно проговорено, куда это доводится: дать агенту доступ к Claude Code — и он пойдёт в кодовую базу, предложит фикс и откроет PR. Человек остаётся надзором.

Два приёма из демо

На наш завод

«Скилл с runbook'ами» — это наши Gotchas, только правильно устроенные. Разница: у нас это плоский список внутри SKILL.md, висящий в контексте всегда. Runbook-скилл — это отдельные документы, которые агент подтягивает, когда попал в похожую ситуацию.

Наш error-bank уже собирает симптомы. Следующий шаг очевиден: когда генератор падает, агент сначала ищет похожий случай в банке, и только потом отлаживает с нуля.

Что применить
Предыдущая← Гигиена контекста Следующая темаСобытия и зрелость агента →