Мультиагентная оркестрация

Запускайте много агентов. Порядок пусть выбирает controller.

У части работы порядок нельзя записать заранее. Поставьте type: controller, объявите, что должно быть истинным к концу запуска, и Dagu даст модели выбирать следующий шаг с агентом по мере поступления замечаний. Каждое действие остаётся обычным шагом workflow с логами, ретраями, approvals и историей аудита.

Два ревьюера, один правщик, ни одного depends
# 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-воркфлоу и агентские фреймворки

Завершение
Dagu

Вы объявляете критерии завершения. Запуск заканчивается, когда не осталось открытых задач.

Агентский фреймворк

Либо модель сама решает, что закончила, либо все пути рисуются заранее и поддерживаются вручную.

Устойчивость
Dagu

Ожидающий запуск завершает процесс и возобновляется в новом.

Агентский фреймворк

Долгое ожидание обычно означает живой процесс и хранилище состояния, которое надо эксплуатировать.

Эксплуатация
Dagu

Расписания, очереди, ретраи, артефакты и аудит приходят из DAG-run.

Агентский фреймворк

Собирается заново в каждом проекте либо отдаётся хостируемому control plane.

Радиус поражения
Dagu

Множество шагов в файле workflow.

Агентский фреймворк

Всё, что разрешают определения инструментов.

In depth

Where each tool fits

01

Записать заранее нельзя именно порядок

Граф умеет ветвиться по коду возврата, но не по тому, что именно сказал ревьюер. Controller-воркфлоу оставляет набор действий фиксированным и передаёт наружу только упорядочивание.

  • Шаги становятся каталогом действий, и поддерживать depends больше не нужно
  • Список tasks объявляет, что должно быть истинным к концу запуска
  • Controller переносит вывод одного агента в параметры следующего
02

Модель выбирает порядок, но никогда не возможности

Controller выбирает только из объявленных вами шагов. Он не может придумать шаг, написать собственную shell-команду или дотянуться до того, чего нет в файле, поэтому радиус поражения равен определению workflow.

  • Запускайте агента на хосте или в контейнерной песочнице с явными монтированиями и правилами egress
  • Дайте каждой роли свой provider и модель, чтобы модель не оценивала собственную работу
  • То, чему вы стали доверять, переносится в под-workflow и перестаёт быть решением
03

Продакшн-контроль приходит от запуска, а не от фреймворка

Запуск controller — это обычный DAG-run. Расписания, очереди, ретраи, артефакты и аудит применяются без изменений, а лимиты расходов агента задаются настройками движка, а не строчкой в промпте.

  • ask_user надёжно приостанавливает запуск: процесс завершается, слот воркера освобождается
  • Человек отвечает через несколько часов, и запуск продолжается в новом процессе
  • Лимиты на ходы, попытки действий и вопросы завершают запуск ошибкой вместо безлимитных трат
04

Любой запуск восстанавливается постфактум

У 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.