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

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

Опубликовано

Автор
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 проходит переходы dispatched → drafting → published / 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. Сохраните единую точку контроля расходов.

Опубликовано
Категория
Build
Похожие статьи
LLM как судья: ежедневная проверка качества ИИ-агентов

LLM как судья: ежедневная проверка качества ИИ-агентов

Как оценивать ИИ-агентов с помощью LLM: примеры промптов, калибровка по ручной разметке, проверка предвзятости и ежедневные тесты без ручной оценки ответа.15 окт. 2026 г.Build
KV-кэш в LLM: от обработки промпта до экономии на API

KV-кэш в LLM: от обработки промпта до экономии на API

Как KV-кэш ускоряет обработку промптов и влияет на расход памяти. Правила кэширования Anthropic, OpenAI и Google, а также способы оптимизации в vLLM.15 окт. 2026 г.Build
DSPy на практике: от сигнатур до оптимизации промптов

DSPy на практике: от сигнатур до оптимизации промптов

Как устроен DSPy: сигнатуры, модули, метрики и оптимизаторы. Примеры на Python, расчёт стоимости первого эксперимента и критерии выбора вместо ручных промптов.15 окт. 2026 г.Build
Навыки ИИ-агентов: как перенести Agent Skills между инструментами

Навыки ИИ-агентов: как перенести Agent Skills между инструментами

Как устроены навыки ИИ-агентов: стандарт SKILL.md, поддержка в разных инструментах, пример еженедельного отчёта, затраты контекста и границы безопасности.15 окт. 2026 г.Build
Модели эмбеддингов в 2026 году: что выбрать для поиска и RAG

Модели эмбеддингов в 2026 году: что выбрать для поиска и RAG

Сравниваем модели эмбеддингов OpenAI, Gemini, Voyage, Cohere и открытые модели для поиска и RAG: цены, языки, развёртывание и затраты на миграцию индекса.15 окт. 2026 г.Build
LangSmith vs Langfuse: что выбрать для LLM-приложений

LangSmith vs Langfuse: что выбрать для LLM-приложений

Сравнение LangSmith и Langfuse: трассировка, оценка качества LLM, датасеты, промпты и размещение на своих серверах. Выберите платформу под задачи команды.14 окт. 2026 г.Build
Закрытие OpenAI AgentKit: что и когда переносить

Закрытие OpenAI AgentKit: что и когда переносить

Что отключат в OpenAI AgentKit и как перенести процессы Agent Builder, бэкенд ChatKit, оценки Evals и сохранённые промпты до дедлайнов 2026 года.14 окт. 2026 г.Build
Альтернативы Base44 в 2026 году: 7 сервисов для разных задач

Альтернативы Base44 в 2026 году: 7 сервисов для разных задач

Сравниваем 7 альтернатив Base44: Lovable, Bolt, Replit и другие. Цены, бесплатные тарифы, экспорт кода, базы данных, хостинг и выпуск мобильных приложений.14 окт. 2026 г.Build
Рассылка

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

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