Anthropic Managed Agents в SDK 0.100–0.102: что удалить из Cloudflare

Разбираю миграцию с Cloudflare Workflows на Anthropic Managed Agents: какие 240 строк можно удалить, что оставить и как считать стоимость сессий.

Saturday, September 5, 2026Omid Saffari
Anthropic Managed Agents в SDK 0.100–0.102: что удалить из Cloudflare

За восемь дней Anthropic Python SDK получил сразу три релиза: 0.100.0 — 6 мая, 0.101.0 — 11 мая, а 0.102.0 — 13 мая. Вместе они превратили Anthropic Managed Agents в облачную среду выполнения со встроенными outcomes, вебхуками и мультиагентной оркестрацией. Я разобрал собственный стек на Cloudflare из 6 Durable Objects, чтобы понять, что именно заменяет client.beta.managed_agents.sessions.create(). Честный ответ: около 280 строк кода с повторами и опросом статуса в двух шагах воркфлоу. Всё остальное остаётся.

Что появилось в Anthropic Managed Agents и SDK 0.100–0.102

Три релиза за восемь дней — и поверхность API Python SDK изменилась сильнее, чем за предыдущие шесть месяцев. Даты здесь важны: все, кто зафиксировал в продакшене зависимость anthropic==0.99.x, за один спринт пропустили всю среду выполнения Managed Agents.

В v0.100.0 (6 мая 2026 года) в пространство имён beta добавили поддержку мультиагентных сценариев, outcomes, вебхуков и проверку vault. Главный для нас интерфейс выглядит так: client.beta.managed_agents.sessions.create(thread=..., outcome=..., metadata=...) возвращает session_id и асинхронно выполняется в инфраструктуре Anthropic. Цикл оркестрации больше не приходится поддерживать самостоятельно.

В v0.101.0 (11 мая 2026 года) появился AWS-клиент для Claude Platform on AWS, а во всех примерах из cookbook модель заменили на claude-sonnet-4-5-20250929. Для пользователей Bedrock нужен именно этот релиз: поддержка переменной окружения ANTHROPIC_BEDROCK_SERVICE_TIER со значениями default/flex/priority появилась именно здесь, а не в 0.100.

В v0.102.0 (13 мая 2026 года) добавили типы BetaManagedAgentsSearchResultBlock, диагностику кэша для бета-версии prompt cache и раннюю валидацию итераторов Pydantic. Поверхность типов блоков всё ещё меняется — это главная причина, по которой я пока не переношу свой мультиагентный код.

Ключевая возможность — outcomes. Вы задаёте рубрику, отдельный агент-оценщик сверяет с ней результат, а основной агент повторяет попытку, пока не пройдёт проверку. По внутренней оценке Anthropic, успешность выполнения задач вырастает до +10 пунктов по сравнению со стандартными циклами промптинга; для генерации docx прирост составляет +8.4%, для pptx — +10.1%. Это совпадает с тем, что я вижу на собственном Critic Durable Object: один повторный промпт с замечаниями судьи даёт примерно такой же прирост качества, как переход на модель классом выше.

Вторая половина обновления — вебхуки. На URL, зарегистрированный в Claude Console, приходят восемь событий сессии: session.status_run_started, session.status_idled, session.status_rescheduled, session.status_terminated, session.thread_created, session.thread_idled, session.thread_terminated и самое важное — session.outcome_evaluation_ended. Секрет подписи имеет формат whsec_… и показывается только один раз при создании. Проверка выполняется через client.webhooks.unwrap(payload, signature, secret).

Мультиагентная оркестрация тоже вошла в релиз, но доступна лишь после отдельной заявки на research preview. Ниже объясню, почему пока не включаю её.

Что это меняет для основателей без технического бэкграунда

Теперь Anthropic запускает агента за вас. Вы описываете критерии в рубрике — например: «в статье есть 2,000 слов, приведены три первичных источника и пройдена проверка по de-AI regex». Агент-оценщик Anthropic проверяет результат и перезапускает основного агента, пока тот не выполнит условия. Инженеру больше не нужно писать цикл повторных попыток.

На стоимость это влияет в двух направлениях. Во-первых, в кодовой базе становится меньше самописной логики повторов, а значит, старшие инженеры тратят меньше времени на её поддержку. Во-вторых, внутри сессии Anthropic может быть больше повторных запусков; каждый оплачивается по ставке $0.08 за час сессии сверх стоимости токенов. Выгоден ли такой обмен, целиком зависит от продолжительности сессий.

Если говорить прямо: в агентном продукте версии v1 Managed Agents заменяет примерно 40% кода оркестрации, который иначе пришлось бы писать старшему инженеру. В уже работающем продукте доля будет меньше, зато вебхуки устраняют цикл опроса, который почти наверняка где-то есть.

Вопрос, который стоит задать CTO на этой неделе: «Мы всё ещё опрашиваем статус завершения или уже перешли на session.outcome_evaluation_ended Если ответ — «опрашиваем», то рефакторинг на полдня одновременно снизит инфраструктурные расходы и задержку запросов.

Как сегодня устроен мой стек на Cloudflare

Чтобы было понятно, что именно можно удалить, кратко опишу архитектуру. Один воркер на Hono в Cloudflare Workers с целевой версией ES2021 и привязкой Static Assets обслуживает шесть Durable Objects — по одному на каждый издательский процесс: Editorial, Discovery, Writer, Distribution, Maintenance и Manager. Есть и седьмой — ManualIntake, на котором работает административный интерфейс.

Каждый процесс запускается через один из шести Cloudflare Workflows: PublishWorkflow, WriteArticle, PublishArticle, EnrichIdea, DiscoverIdeas, DistributeArticle. Больше всего работы выполняет PublishWorkflow: это цепочка из восьми идемпотентных шагов — validate, ground, generate, clean, persist, index, cover, publish. Каждый шаг с вводом-выводом обёрнут в:

TypeScript
const result = await step.do(
  "generate-article",
  { retries: { limit: 3, backoff: "exponential" } },
  async () => env.WRITER.generate(brief)
);

В D1 хранится каноническое состояние: editorial_brief.status проходит переходы dispatcheddraftingpublished / failed. Vectorize отвечает за эмбеддинги отдельных блоков в асимметричном формате поиска (Gemini-2, 768d). Все платные вызовы моделей идут через единую точку контроля callAi(env, ctx, runner). Она пишет в ai_call_log поля agent_id, workflow_instance_id и idea_id, чтобы агрегировать расходы, а также устанавливает дневной лимит $20 и лимит $1 на один экземпляр.

Это архитектура с 6 DO, которую я разбирал ранее. Для миграции на Managed Agents важно, где находится логика повторов. Таких мест два:

  1. Повторы шагов Workflow — дешёвый механизм, который ничего не стоит, если базовый вызов завершился успешно: он нужен при сетевых сбоях, ограничениях частоты и временных ошибках 5xx у внешних провайдеров.
  2. Самописный цикл «проверить и повторить» в clean.ts: запустить Writer, затем Critic; если score < 0.75, повторить промпт с замечаниями Critic, но не более 3 попыток.

Managed Agents заменяет второй механизм. Первый остаётся.

Какие 280 строк позволяет удалить SDK 0.100

Цикл проверки и повторов в src/worker/workflows/publish/clean.ts — самое прямое соответствие механизму outcomes. Сейчас оркестрация занимает примерно 120 строк: вызвать Writer, запустить Critic с рубрикой из editorial_brief.rubric_md, разобрать оценку, сравнить её с порогом, добавить замечания в системный блок нового промпта и повторить — максимум три раза. Код самого Critic — это ещё 80 строк Durable Object: хуки гибернации, отдельная SQLite для истории рубрик в каждом экземпляре и ключи идемпотентности для каждой попытки. Наконец, ещё 40 строк приходится на агрегацию вызовов в ai_call_log внутри callAi.ts, потому что каждая попытка записывается отдельно, а панель затем сводит их вместе.

Все три блока заменяет один вызов Managed Agents:

TypeScript
const session = await anthropic.beta.managedAgents.sessions.create({
  thread: { messages: [{ role: "user", content: brief.body_md }] },
  outcome: {
    rubric: brief.rubric_md,
    evaluator: "claude-sonnet-4-5-20250929"
  },
  metadata: { brief_id: brief.id, workflow_instance: ctx.instanceId }
});
return { session_id: session.id, status: "pending" };

Вот и всё. Сессия асинхронно выполняется до завершения на стороне Anthropic. Параметр outcome берёт на себя работу Critic DO: отдельный агент-оценщик сверяет результат с рубрикой и перезапускает основного агента, пока проверка не будет пройдена.

Добавить нужно один маршрут /api/admin/webhooks/managed-agents: он проверяет подпись whsec_…, обрабатывает event.type === "session.outcome_evaluation_ended" и записывает результат обратно в D1.

TypeScript
app.post("/api/admin/webhooks/managed-agents", async (c) => {
  const raw = await c.req.text();
  const event = await anthropic.webhooks.unwrap(
    raw, c.req.header("anthropic-signature")!, c.env.WEBHOOK_SECRET
  );

  if (event.type !== "session.outcome_evaluation_ended") {
    return c.json({ ok: true });
  }

  await c.env.DB.update(editorial_brief).set({
    status: event.outcome.passed ? "published" : "failed",
    body_md: event.result.body,
    session_cost_usd: event.session.usage.total_cost_usd
  }).where(eq(editorial_brief.id, event.session.metadata.brief_id));

  return c.json({ ok: true });
});

Сорок строк с проверкой подписи и идемпотентностью по ключу brief_id.

Итоговый diff: минус 240 строк оркестрации. Минус одна привязка Durable Object в wrangler.json. Минус один файл миграции. Плюс 40 строк для обработки вебхука. Плюс один секрет в Cloudflare Secrets Store.

Эндпоинт опроса GET /api/admin/workflows/:id/status продолжает работать. Теперь он читает из D1 состояние сессии, записанное вебхуком, а не вызывает env.PUBLISH_WORKFLOW.get(id).status(). Интерфейс не меняется, и административная панель не замечает разницы.

Важно: обёртки повторов step.do остаются на всех остальных шагах с вводом-выводом. Генерация обложки, ревалидация Vercel, очистка кэша Cloudflare — рубрики outcomes им ничем не помогают, зато всем им полезно безопасное повторное выполнение шагов из кэша Workflows. Не удаляйте то, что уже работает.

Какой файл я оставляю и почему экономика меняется с ростом масштаба

callAi.ts остаётся. Дневной лимит — $20, лимит на экземпляр — $1. Через этот файл проходит каждый платный вызов модели: прямой, через AI Gateway или через Managed Agents.

Вот почему это важно. Managed Agents тарифицируется по трём направлениям: токены по стандартным ценам, плюс $0.08 за час сессии, плюс $10 за 1000 веб-поисков. При моей нагрузке — шесть издательских процессов, по одной статье за запуск и около 3 минут на сессию — время сессии добавляет примерно $0.004 на статью сверх токенов. Сумма несущественная.

Перелом наступает на длинных сессиях. 4-часовая сессия Anthropic Skills стоит $0.32 только за среду выполнения, без учёта токенов. Если запускать по 50 таких сессий в день, получится $480 в месяц только за время сессий. Многошаговая исследовательская сессия простояла час в очереди веб-поиска — это ещё $0.08, которых раньше не было. Ожидание ответа нижестоящего сервиса тоже оплачивается: по документации Anthropic расчёт идёт до миллисекунды, но счётчик всё это время работает.

Единая точка контроля задаёт жёсткий потолок, которого нет в панели Managed Agents. Панель показывает стоимость уже после завершения. А callAi.ts выбрасывает NonRetryableError посреди воркфлоу, ещё до запуска сессии, если предварительная оценка превышает дневной лимит.

Предварительная оценка намеренно консервативна:

TypeScript
async function estimateSessionCost(brief: Brief): Promise<number> {
  const tokenEstimate = brief.body_md.length / 3.5;
  const inputCost = (tokenEstimate / 1_000_000) * 3.0;
  const outputCost = (tokenEstimate * 1.5 / 1_000_000) * 15.0;
  const sessionHourEstimate = (brief.expected_minutes / 60) * 0.08;
  const safetyMargin = 1.4;
  return (inputCost + outputCost + sessionHourEstimate) * safetyMargin;
}

Расчёт стоимости часа сессии — первое место, где чаще всего ошибаются в стеках соло-разработчиков. Без жёсткого лимита один вышедший из-под контроля агент — именно такое поведение может спровоцировать цикл повторов outcome при слишком строгой рубрике — съест дневной бюджет раньше, чем вы успеете это заметить. Я с таким сталкивался.

Оставьте единую точку контроля. Пропускайте sessions.create() через неё. Записывайте предварительную оценку до запуска сессии. После завершения сверяйте её с event.session.usage.total_cost_usd из полезной нагрузки вебхука.

Миграция, с которой я пока не спешу: мультиагентная оркестрация

Мультиагентная оркестрация стала главной новостью Anthropic Dev Day. Ведущий агент разбивает задачу и передаёт подзадачи специализированным субагентам, у каждого из которых свои модель, промпт и инструменты. Субагенты параллельно работают в общей файловой системе, а ведущий собирает результат. На бумаге это ровно то, чем сегодня занимается мой Manager DO: параллельно распределяет работу между Writer, Discovery и Distribution через DO RPC; у каждого — собственное состояние SQLite, а общей «файловой системой» служат R2 + D1.

Меня останавливают три причины.

Первая — изменения API. Мультиагентная оркестрация находится в research preview и требует отдельной заявки на доступ. Тип BetaManagedAgentsSearchResultBlock появился только в 0.102. Поверхность типов блоков для мультиагентных результатов продолжает меняться. Если мигрировать сейчас, интеграцию придётся переписывать при каждом обновлении SDK в ближайшие два или три релиза. Интерфейс вебхуков стабилизировался в 0.100, а мультиагентный интерфейс ещё развивается.

Вторая — файловая система существует только внутри сессии и не сохраняется. Общая файловая система Managed Agents исчезает после завершения сессии. R2 и D1, напротив, сохраняют данные между всеми моими процессами, доступны для запросов из любого воркера и переживают сбой сессии. Пока общая файловая система не станет постоянной — или пока R2 нельзя будет смонтировать прямо в песочницу сессии, — для моей нагрузки это будет шаг назад.

Третья — Anthropic жёстко задаёт разделение ведущего агента и субагентов. Роль ведущего фиксирована. Мой Editorial DO в одни дни выступает ведущим, когда запускается издательский процесс, а в другие — равноправным участником, когда административный интерфейс отправляет бриф и Editorial подключается к конвейеру на полпути. Ради размещённой абстракции пришлось бы отказаться от полезной асимметрии.

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

Точный чек-лист миграции на SDK 0.100–0.102

  1. Закрепите версию SDK

    Bash
    uv add anthropic@0.102.0

    Если uv пока не используется, выполните pip install anthropic==0.102.0. Нет смысла останавливаться на 0.100 или 0.101, если только для Bedrock не нужна именно версия 0.101.

  2. Зарегистрируйте вебхук в Claude Console

    Claude Console → Settings → Webhooks → New endpoint. Укажите адрес https://your-worker.example.com/api/admin/webhooks/managed-agents. Скопируйте секрет whsec_…, который показывается один раз при создании. Сохраните его в Cloudflare Secrets Store — или в AWS Secrets Manager, если Claude Platform on AWS подключена через SDK 0.101.

  3. Добавьте маршрут вебхука

    Создайте /api/admin/webhooks/managed-agents. Проверьте подпись с помощью client.webhooks.unwrap(payload, signature, secret): этот вспомогательный метод появился в v0.95.x и стабилен в 0.100. Один вызов проверяет HMAC, допустимое отклонение времени и тип события. Не пишите собственную проверку HMAC — окно рассинхронизации времени устроено неочевидно.

  4. Перенесите шаг оценки

    Замените цикл проверки и повторов на outcome={rubric: brief.rubric_md, evaluator: "claude-sonnet-4-5-20250929"} в sessions.create(). Удалите Critic DO и оркестрацию повторов. Саму рубрику продолжайте хранить в D1: теперь этот столбец становится важнее, а не наоборот.

  5. Замените опрос чтением из D1

    Теперь эндпоинт статуса читает из D1 по ключу event.session.metadata.brief_id — либо по другому ключу корреляции, который вы передали в metadata при вызове sessions.create(). Вебхук записывает, эндпоинт статуса читает. Обращения к workflow.status() больше не нужны.

  6. Сохраните контроль расходов

    callAi.ts остаётся. До запуска оценивайте стоимость сессии. Если оценка превышает дневной лимит, выбрасывайте NonRetryableError. Фактические расходы после завершения записывайте из event.session.usage в обработчике вебхука. Еженедельно сравнивайте предварительную оценку с фактом; если расхождение превышает 25%, скорректируйте запас безопасности.

  7. Начните с процесса с минимальными рисками

    У меня это был Discovery: сбой миграции не создаёт публичного результата. В течение 72 часов запускайте новый и старый варианты параллельно и сравнивайте результаты. Только после этого переносите Writer.

Можно ли использовать SDK 0.100 с существующей конфигурацией Anthropic Bedrock?

Да, но отдельный AWS-клиент появился в 0.101. Пользователям Bedrock стоит обновиться до версии новее 0.100. В SDK 0.101 также добавили поддержку переменной окружения ANTHROPIC_BEDROCK_SERVICE_TIER со значениями default/flex/priority; в 0.100 её нет.

Вебхуки полностью заменяют API потоковых ответов?

Нет. Вебхуки сообщают о событиях жизненного цикла сессии: запуске, переходе в ожидание, завершении и окончании оценки outcome. Потоковые ответы по-прежнему идут через messages.create(stream=True) и обычный протокол delta. Вебхуки отвечают на вопрос «когда завершилась долгая сессия?», а streaming — на просьбу «показывай токены по мере появления».

Как выглядит секрет подписи и как его проверить?

Он начинается с whsec_… и показывается в Console только один раз при создании. Проверяйте его через client.webhooks.unwrap(raw_body, signature_header, secret): один вызов обрабатывает HMAC, допустимое отклонение времени и тип события. Не записывайте исходный секрет в логи и не передавайте его как параметр строки запроса. Храните его в Cloudflare Secrets Store или аналогичном сервисе.

Можно ли запускать оценку outcomes без Managed Agents, только через Messages API?

Нет. outcome={rubric, evaluator} — параметр только для Managed Agents в sessions.create(). Эквивалент можно самостоятельно построить на Messages API — именно это сейчас делает мой Critic DO, — но тогда вы платите задержкой оркестрации и сами поддерживаете код. Смысл Managed Agents как раз в том, чтобы этого не делать.

Работает ли prompt caching внутри сессии Managed Agents?

Да, при попадании в кэш он снижает стоимость входных токенов до 90%. Диагностика кэша для бета-версии prompt cache появилась в 0.102, поэтому теперь долю попаданий в кэш можно увидеть в полезной нагрузке ответа.

На перенос Discovery уходит половина рабочего дня, на Writer — ещё столько же; затем можно мигрировать остальное. Закрепите 0.102.0. Зарегистрируйте вебхук. Удалите Critic DO. Сохраните единую точку контроля расходов.

Последнее обновление

5 сент. 2026 г.

КатегорияBuild

Сделать этот сайт предпочтительным в Google

Добавить omidsaffari.com как предпочтительный источник в Google Поиске

Отметьте omidsaffari.com как предпочтительный источник — и Google будет поднимать его для вас в Top Stories, AI Overviews и AI Mode.

Ещё из Build

Все статьи Build
Рассылка

Одно письмо, каждое воскресенье. Работающие системы, а не горячие мнения.

Билд-логи, системы в продакшене и полевые заметки из портфеля ИИ-проектов.

Еженедельно. Без спама. Отписка в любой момент.