на сайт
Claude Code · оркестрация

Dynamic Workflows: сила не в агентах, а в скрипте.

Workflow — это JS-скрипт, который детерминированно управляет роем субагентов: кого поднять, сколько, в каком порядке и с каким промптом у каждого. Не «много агентов ради количества», а control flow — циклы, ветвления, fan-out — зашитый в код. Именно это держит точность там, где объём убивает и обычный скрипт, и одного агента.

~16
агентов одновременно (конкурентность)
1000
суммарный потолок за прогон
4096
элементов на один pipeline/parallel
суть за одну минуту

Почему скрипт, а не markdown-ТЗ

Напиши ту же инструкцию как ТЗ в markdown — на 3–5 агентах сработает. Но на объёме модель-драйвен подход рассыпается: у Клода нет жёсткой памяти состояния между шагами, он интерпретирует ТЗ «как по кайфу» и часть шагов теряет по дороге. Workflow снимает это: control flow исполняет движок, а не модель. Хоть 8, хоть 200 задач — каждая проходит ровно тот путь, что прописан в скрипте.

markdown-ТЗ · model-driven

Модель решает, как исполнять

  • ок на единицах агентов
  • на объёме теряет шаги, «додумывает» порядок
  • нет гарантии, что все N задач пройдут одинаково
  • Клод может просто не поднять столько агентов
workflow · script-driven

Порядок исполняет движок

  • точность на сотнях задач
  • циклы, ветвления, fan-out — детерминированы
  • у каждого агента свой промпт, модель, инструменты
  • переиспользуется одной командой на новой партии
когда включать — и когда точно нет

Workflow — это осознанный опт-ин, а не автопилот

Важное, что теряют в комментариях: workflow не запускается сам «потому что задача большая». Он может поднять десятки агентов и сжечь много токенов, поэтому включается только по явному запросу — когда ты прямо просишь оркестрацию/workflow. Просто крупная задача — недостаточный повод.

повод 1

Охват

Разложить задачу и параллельно покрыть широкий фронт — файлы, разделы, сущности.

повод 2

Уверенность

Несколько независимых мнений + состязательная проверка перед тем, как принять результат.

повод 3

Масштаб

Объём, который не влезает в один контекст: миграции, аудиты, сплошные проходы.

Практика: сначала разведай инлайн (собери список файлов/каналов/диффа), а потом заворачивай в workflow-конвейер. Форму работы не обязательно знать заранее — достаточно знать её до шага оркестрации.
строительные блоки скрипта

Из чего состоит workflow

Скрипт — обычный JS. Начинается с блока meta (имя, описание, фазы), дальше — тело с примитивами:

fan-out

agent()

Поднять субагента. Со schema вернёт валидированный объект — без парсинга строк.

по умолчанию

pipeline()

Каждый элемент проходит все стадии независимо. Без барьера — элемент A уже на стадии 3, пока B на стадии 1.

барьер

parallel()

Запустить пачку и дождаться всех. Только когда стадии реально нужны все результаты сразу.

meta + fan-out с валидацией
export const meta = {
  name: 'extract-docs',
  description: 'Распознать документы и свести в таблицу',
  phases: [{ title: 'Извлечение' }, { title: 'Сведение' }],
}

// по субагенту на документ — но конкурентно бежит ~16, остальные в очереди
const rows = await parallel(files.map(f => () =>
  agent(`Извлеки из ${f} тип, номер, дату, сумму, контрагента, договор`,
    { schema: DOC_SCHEMA })          // вернёт объект, не текст
))

pipeline vs parallel — главная развилка

По умолчанию бери pipeline: он не ставит барьер между стадиями, поэтому wall-clock = самая долгая цепочка одного элемента, а не сумма самых долгих стадий. parallel нужен только когда следующая стадия обязана видеть все результаты предыдущей — дедуп, слияние, ранний выход по нулю.

живой кейс · 400 документов

Как сделать правильно: 200 актов × 200 счетов

Задача из видео: сопоставить акты и счёт-фактуры (PDF, Word, картинки, разное качество), найти расхождения, дубли и пропуски. Обычный скрипт не разберёт форматы; один агент не влезет 400 файлов в контекст. Workflow — да. Но с одной поправкой, которую часто упускают.

!
Через агентов гоняется только извлечение (по агенту на файл — там нужен LLM для OCR и смысла). А сопоставление по договору и сумме — это обычный JS поверх уже структурированных данных. Гонять matching через LLM = лишние токены и новые галлюцинации на самом чувствительном шаге (деньги, договоры).
извлечение — агенты · сведение — чистый JS
// 1. Извлечение: fan-out, каждый агент — свой файл, строгая schema
const docs = (await parallel(files.map(f => () =>
  agent(`Распознай ${f}: тип, номер, дата, сумма, контрагент, договор`,
    { schema: DOC_SCHEMA, phase: 'Извлечение' })
))).filter(Boolean)

// 2. Сведение: детерминированно, БЕЗ агентов
const acts = docs.filter(d => d.type === 'акт')
const invoices = docs.filter(d => d.type === 'счёт')
const table = acts.map(a => {
  const match = invoices.find(i => i.contract === a.contract && i.sum === a.sum)
  return { act: a.num, invoice: match?.num ?? '—', contract: a.contract,
           sum: a.sum, status: match ? 'ок' : 'нет пары' }
})
// дубли/пропуски — тоже обычными группировками по номеру
Деньги и договоры — зона человека. На messy-сканах точность извлечения не 100%. Выход workflow — это черновик для бухгалтера на проверку, а не финальный вердикт. Поставь human-in-the-loop на приёмку таблицы.

И это переиспользуется

Собрал один раз — workflow лёг в .claude/workflows/ отдельной сущностью. Прилетела новая партия — ничего не переписываешь, запускаешь по имени одной командой (можно параметризовать через args).

честно про лимиты — чтобы не поймали в комментах

Сколько агентов на самом деле

Главное заблуждение: «200 агентов сразу». Нет — одновременно крутится порядка 16, остальные ждут очереди и идут волнами.

ПараметрРеальностьЧастый миф
Конкурентность~16 одновременно (min(16, ядра−2))«сто-двести параллельно»
Всего за прогон1000 агентов суммарно (не одновременно)«1000 в параллель»
Один вызов4096 элементов на pipeline/parallelбезлимитный вход
200 документов13 волн по 16 — не мгновенно«всё сразу за секунды»
Токены/лимитагенты жгут тот же общий лимит«бесплатное ускорение»
i
Кэш промптов живёт 5 минут — длинные паузы между волнами читают контекст заново, дороже. Это норма для больших прогонов, просто закладывай время.
паттерны качества · компонуются свободно

Не просто fan-out — а fan-out с проверкой

Adversarial verify. На каждую находку — N независимых скептиков с задачей опровергнуть. Убиваем, если большинство опровергло.
Judge panel. Генеришь N решений под разными углами, судьи оценивают параллельно, синтез из победителя.
Loop-until-dry. Для находок неизвестного размера: гоняем искателей, пока K раундов подряд не дадут ничего нового.
Multi-modal sweep. Агенты ищут разными способами (по контейнеру, по контенту, по сущности, по времени) — каждый слеп к находкам других.
Completeness critic. Финальный агент спрашивает «что упущено?» — и это становится следующим раундом работы.
Loop-until-budget. Масштабируешь глубину под заданный бюджет токенов — цикл, пока есть остаток.
где реально заходит

Кейсы, где объём убивает обычный подход

Рефакторинг большого проекта за один заход — сайт трансформаций по файлам с изоляцией в worktree.
Код-ревью и security-аудит всей базы — по измерениям, с состязательной проверкой каждой находки.
Конвертация пачки файлов в другой формат — по агенту на файл.
Разбить огромный файл на смысловые блоки под LLM.
Транскрипция и саммари здоровенных проектов и библиотек.
Deep research / конкуренты — список на входе, таблица «сильные / слабые / пробелы» на выходе.
готовый промпт · исправленная версия

Скопируй и подставь свои данные

Версия из видео, но с двумя правками: сопоставление — детерминированным JS, а не агентами, и явная точка проверки человеком.

workflow promptcopy
Собери и запусти workflow. В папке ./docs лежат счёт-фактуры и акты в разных форматах (PDF, Word, картинки).

1) Извлечение (агенты): подними по одному субагенту на каждый документ, пусть распознает тип, номер, дату, сумму, контрагента и номер договора и вернёт СТРОГО по schema (валидированный объект, не текст).

2) Сопоставление (обычный JS, без агентов): сведи акты со счёт-фактурами по договору и сумме, найди несовпадения, дубли и пропуски детерминированной логикой поверх извлечённых данных — не гоняй matching через LLM.

3) Свод: одна таблица — акт, фактура, договор, сумма, статус (ок / расхождение / дубль / нет пары).

4) Приёмка: пометь строки с низкой уверенностью извлечения и выведи их отдельно на проверку человеком — это черновик для бухгалтера, не финальный вердикт.

Заверни в переиспользуемый именованный workflow в .claude/workflows/, чтобы я гонял его на следующих партиях одной командой (партию передавать через args).
памятка перед запуском

Чеклист

Явный запрос на оркестрацию — не полагайся на «само включится».
Разведка инлайн до скрипта — собери рабочий список, потом заворачивай в workflow.
pipeline по умолчанию, parallel — только когда нужны все результаты сразу.
schema на agent() — валидированные объекты вместо парсинга текста.
Не гоняй через LLM то, что решается кодом — matching, группировки, дедуп — обычный JS.
Не жди «200 сразу» — конкурентность ~16, потолок 1000 суммарно, идёт волнами.
Не доверяй слепо на деньгах/договорах/проде — human-in-the-loop на приёмку.