Комментарии 6
Очень очень абстрактно... можно какой-нибудь красивый пример, который бы показал, вот классический подход (алгоритм задается текстом) дает вот такой косяк, а вот 'мой подход' в такой задаче работает стабильно?!
Хм, похоже я перестарался с редактированием поста и удалил пару релевантных абзацев.
Упрошённый пример.
Допустим мы сделали правки в своём коде и хотим, чтобы агент поправил наши мелкие косяки: синхронизировал типы, починил тесты и так далее.
Для этого ему надо итерационно запускать тесты, линтеры, форматтеры и так далее (и править проблемы), пока все ошибки не будут исправлены.
Если таких операций много, то агент начнёт их пропускать, запускать в неправильном порядке, и так далее. В итоге он отрепортит нам, что всё готово, а на самом деле что-нибудь будет забыто (например, последняя правка типов сломает тесты или нарушит форматирование).
Можно сделать один скрипт, который прогоняет все утилиты и сказать агенту запускать его по кругу. Это в целом работает, на мой взгляд, довольно неопрятно и создаёт трудности. Например, для такого скрипта нуно будет рядом держать большую спеку о том как реагировать на разные типы ошибок.
А можно сделать стейт машину, которая управляет последовательностью запуска утилит (как в посте, но больше шагов) и знает как реагировать на каждую ошибку.
Например:
агент запускает workflow, вызывая что-то в духе
donna sessions run project:work:polishDonna начинает интерпретировать FSM
Первой оперцией идёт запуск, допустим, mypy и Donna это и делает (нет взаимодействия с агентом).
Если mypy отработал без ошибок, то FSM переходит к шагу с запуском следующей утилиты.
Если mypy отработал с ошибками, то FSM переходит к шагу, который отвечает за обработку ошибок mypy. На этом шаге Donna отображает сообщение агенту с описанием конкретной ошибки и правилами её исправления (специфичными для mypy).
Агент читает это сообщение и выполняет инструкцию, ему не надо подгружать отдельные спеки или помнить большую инструкцию как фиксить ошибки для любых линтеров.
Когда агент решает, что исправил ошибку, он говорит Donna продолжать, и та переключает FSM на следующий шаг (например, на форматирование кода).
Вот пример большого workflow для полировки кода: https://github.com/Tiendil/donna/blob/main/.donna/project/work/polish.md
И вот как выглядит шаблон сообщения для агента от конкретного шага FSM (исправление ошибок от flake8):
{{ donna.lib.task_variable("flake8_output") }}
1. Fix the flake8 issues based on the output above.
2. Ensure your changes are saved.
3. {{ donna.lib.goto("run_autoflake_script") }}
Instructions on fixing special cases:
- E800 Found commented out code — remove the commented out code.
- CCR001 Cognitive complexity is too high — ignore by adding # noqa: CCR001 at the end of the line.
- F821 undefined name when there are missing imports — add the necessary import statements at the top of the file.
- F821 undefined name in all other cases — ask the developer to fix it manually.
То есть вместо больших инструкций агент всегда имеет короткие и чёткие шагии (в данном случае 3 шага).
можно сделать стейт машину
кто создает этот алгоритм? разработчик хардкодит в агенте? или агент формирует детерменированный алгоритм (вместо human readable план) и запускает его на выполнение?
Стейт-машина описывается читаемым текстом в Markdown формате.
Поэтому создать её может и человек и агент. Можно и совместно — попросить агента сгенерировать workflow, а потом его отревьювить.
Например, базу для workflow по ссылке выше я сделал руками, потом в несколько итераций доработал агентом — так быстрее.
В целом, предполагаемую стратегию использования Donna я вижу так:
Постоянные workflow делаются человеком с помощью агента.
Workflow для выполнения разовой задачи генерируются агентом (при выполнении workflow из предыдущего пункта, например) и выполняются без участия человека. Полная автоматизация может потребовать некоторой работы (создать спеки по проекту, создать правильные meta-workflow, etc.).
Изменения в саму утилиту, например, мой агент сейчас вносит в основном самостоятельно: создаёт workflow и исполняет его.
К openclaw легко прикручивается?

Детерминированное поведение и стейт-машины для ваших агентов