Мультиагентная оркестрация
Запускайте много агентов. Порядок пусть выбирает controller.
У части работы порядок нельзя записать заранее. Поставьте type: controller, объявите, что должно быть истинным к концу запуска, и Dagu даст модели выбирать следующий шаг с агентом по мере поступления замечаний. Каждое действие остаётся обычным шагом workflow с логами, ретраями, approvals и историей аудита.
# code-review.yaml
type: controller
llm:
provider: anthropic
model: claude-opus-5
system: |
Get top_n.py past both reviews. When a review fails, pass its finding
to revise, then ask that same reviewer again. A revision made for one
reviewer can break the other.
steps:
- name: review_simplicity
description: Judge simplicity. Prints PASS, or FAIL with what to change.
action: harness.run
with:
provider: opencode
prompt: Read top_n.py. Print "PASS" or "FAIL: <what to change>".
- name: review_correctness
description: Judge correctness. Prints PASS, or FAIL with the bug.
action: harness.run
with:
provider: codex
prompt: Read top_n.py. Print "PASS" or "FAIL: <the bug>".
- name: revise
description: Edit top_n.py to resolve one review finding.
action: dag.run
with: { dag: revise }
tasks:
- name: simplicity_passed
description: The latest simplicity review returned PASS on the current file.
- name: correctness_passed
description: The latest correctness review returned PASS on the current file.Объявляются критерии завершения, а не порядок шагов
Каждое действие — настоящий агентский CLI: Claude, Codex, Gemini, OpenCode
Задача закрывается как completed, skipped или failed
Ожидание ответа человека не оставляет живого процесса
At a glance
Controller-воркфлоу и агентские фреймворки
Вы объявляете критерии завершения. Запуск заканчивается, когда не осталось открытых задач.
Либо модель сама решает, что закончила, либо все пути рисуются заранее и поддерживаются вручную.
Ожидающий запуск завершает процесс и возобновляется в новом.
Долгое ожидание обычно означает живой процесс и хранилище состояния, которое надо эксплуатировать.
Расписания, очереди, ретраи, артефакты и аудит приходят из DAG-run.
Собирается заново в каждом проекте либо отдаётся хостируемому control plane.
Множество шагов в файле workflow.
Всё, что разрешают определения инструментов.
In depth
Where each tool fits
Записать заранее нельзя именно порядок
Граф умеет ветвиться по коду возврата, но не по тому, что именно сказал ревьюер. Controller-воркфлоу оставляет набор действий фиксированным и передаёт наружу только упорядочивание.
- Шаги становятся каталогом действий, и поддерживать depends больше не нужно
- Список tasks объявляет, что должно быть истинным к концу запуска
- Controller переносит вывод одного агента в параметры следующего
Модель выбирает порядок, но никогда не возможности
Controller выбирает только из объявленных вами шагов. Он не может придумать шаг, написать собственную shell-команду или дотянуться до того, чего нет в файле, поэтому радиус поражения равен определению workflow.
- Запускайте агента на хосте или в контейнерной песочнице с явными монтированиями и правилами egress
- Дайте каждой роли свой provider и модель, чтобы модель не оценивала собственную работу
- То, чему вы стали доверять, переносится в под-workflow и перестаёт быть решением
Продакшн-контроль приходит от запуска, а не от фреймворка
Запуск controller — это обычный DAG-run. Расписания, очереди, ретраи, артефакты и аудит применяются без изменений, а лимиты расходов агента задаются настройками движка, а не строчкой в промпте.
- ask_user надёжно приостанавливает запуск: процесс завершается, слот воркера освобождается
- Человек отвечает через несколько часов, и запуск продолжается в новом процессе
- Лимиты на ходы, попытки действий и вопросы завершают запуск ошибкой вместо безлимитных трат
Любой запуск восстанавливается постфактум
У controller нет рёбер зависимостей, поэтому запуск показывается как последовательность принятых решений, а не как граф.
- Таймлайн решений: строка на каждый ход, с числом попыток, длительностью и ссылкой на дочерний запуск
- Вкладка задач показывает, как и почему controller закрыл каждую цель
- Полный транскрипт, включая каждый результат инструмента, который видела модель
FAQ
Practical questions before adopting Dagu
Чем controller-воркфлоу отличается от агентского цикла?
В голом цикле модель сама решает, что закончила. Controller сохраняет цикл, но забирает условие завершения себе: вы объявляете задачи и то, что считается выполненным, и запуск заканчивается, когда не осталось открытых задач.
Что происходит, если задача оказалась ненужной?
Controller помечает её как skipped и записывает причину, а запуск всё равно считается успешным. Skipped и failed разделены, потому что «делать было нечего» и «сделать не удалось» — разные исходы в журнале аудита.
Можно ли использовать разные модели на разных шагах?
Да. Каждый шаг Agent Harness указывает свой provider и модель, а модель самого controller настраивается отдельно, так что дешёвая модель может управлять дорогими специалистами, а два провайдера — проверять друг друга.
Как не дать запуску тратить бесконечно?
Лимиты применяет движок. Действие выполняется не более пяти раз за запуск, вопросов не больше пяти, лимит ходов по умолчанию равен пятидесяти и его можно снизить. Достигнутый лимит завершает запуск ошибкой и называет незакрытые задачи.
Когда всё же стоит взять обычный граф?
Если граф можно нарисовать, нарисуйте граф. type: graph остаётся значением по умолчанию: он быстрее, дешевле и воспроизводим. Controller нужен только там, где порядок действительно зависит от того, что дали предыдущие шаги.
Next step
Start with one workflow.
Install Dagu, move one fragile script or agent task into YAML, and decide from a real run history.