Эссе о разработке игр, мышлении и книгах

Donna готова к использованию ru en

Как работает Donna.

Как работает Donna.

В феврале я выпустил Donna(оригинальный пост) — CLI-утилиту для запуска агентных сценариев как стейт-машин и их описания в Markdown-файлах.

Поскольку я разрабатывал её одновременно разбираясь как работать с агентами, у меня получился переусложнённый, универсальный монстр. Donna имела много полезных функций, но совместно они слишком сильно ограничивали окружение разработчика и требовали слишком много времени на изучение.

Поэтому, набравшись опыта, я решил следовать философии Unix и отрефакторить монолит в набор меньших инструментов, каждый с отдельной чёткой зоной ответственности. Новая Donna — это первый из них (второй — это depmesh — я расскажу о нём в отдельном посте).

Новая Donna решает проблемы управления потоком исполнения агентов при длительной работе. Логика следующая:

  • Большая часть разработки на мета-уровне повторяема: «запусти этот инструмент, что-то сделай с его выводом, запусти другой инструмент» или «реализуй функцию A, реализуй тесты для функции A, реализуй функцию B, …».
  • Одни части этой работы требуют сложных рассуждений, другие — нет.
  • Агенты почти хороши в рассуждениях, но плохо держат в голове весь процесс: что уже сделали, что нужно сделать, в каком порядке, etc.
  • Поэтому логично отделить рассуждение от контроля потока исполнения — пусть агенты сосредоточатся на том, в чём они хороши, а поток можно отдать традиционным инструментам автоматизации.

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

Как Donna работает

Вы описываете сценарий в одном читаемом Markdown-файле. Агент просит Donna провести его через сценарий; Donna хранит состояние выполнения, выбирает следующую операцию и говорит агенту, что делать или что сообщать дальше.

Сценарии могут запускать дочерние сценарии, генерироваться на лету или изменяться во время выполнения. Например, у вас может быть сценарий, который проводит агента через процесс планирования, и на последнем шаге агент может сгенерировать новый сценарий с подробным планом работы, после чего сразу же его запустить.

Как бонус, Donna экономит токены, потому что агенту не нужно рассуждать о контроле потока исполнения или о том, как запускать конкретные команды CLI и другие инструменты автоматизации.

Пример

Вот игрушечный пример сценария, который получает текущее время, спрашивает агента, не пора ли пить чай, и разветвляется в зависимости от ответа агента.

Абстрактная схема сценария выглядит так:

[Get Current Time]
          |
          v
   [Ask About Tea]
          |
     +----+----+
     |         |
    yes        no
     |         |
     v         |
  [Turn On     |
   Kettle]     |
     |         |
     +----+----+
          |
          v
       [Finish]

И вот исходник этого сценария:

# Is it time to drink tea?

This workflow checks the current time, asks the agent whether it is tea time,
and branches on the answer.

## Get Current Time

```toml donna
id = "get_current_time"
kind = "donna.lib.run_script"
save_stdout_to = "current_time"
goto_on_success = "ask_about_tea"
goto_on_failure = "finish"

```bash donna script #!/usr/bin/env bash date +%H:%M

## Ask About Tea

```toml donna
id = "ask_about_tea"
kind = "donna.lib.request_action"

The current time is:

{{ donna.lib.task_variable("current_time") }}

Is it time to drink tea?

  1. If yes, {{ donna.lib.goto("turn_on_kettle") }}.
  2. If no, {{ donna.lib.goto("finish") }}.

Turn On Kettle

```toml donna id = "turn_on_kettle" kind = "donna.lib.request_action"

Turn on the kettle, then `{{ donna.lib.goto("finish") }}`.

## Finish

```toml donna
id = "finish"
kind = "donna.lib.finish"

The workflow is complete. You are a good butler. ```

Сценарий взят из README.md проекта, подробное объяснение его работы можно найти там.

Реальное использование

Мой основной вариант использования Donna — это создание сценариев полировки кода, например, вроде этого: polish.donna.md.

Такой сценарий форматирует код, запускает тесты, линтеры, проверяет орфографию и так далее, а если он находит какие-то проблемы, то просит агента их исправить. Сценарий работает пока все проблемы не будут исправлены, выполняя проверки в фиксированном порядке после каждого изменения.

Мой агент инструктирован запускать полировку кода как последний шаг выполнения задачи и после каждого значительного этапа работы, когда проект должен быть в согласованном состоянии.

Подобный подход избавляет меня от большого количества ручной работы и сокращает время на код ревью, особенно после того как я добавил tach в свои проекты для контроля зависимостей кода.

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

Моя жена недавно начала использовать Donna для перевода китайских романов для личного пользования. Я помог ей создать около 5 сценариев; она итеративно настроила их для получения ожидаемого поведения и качества, и теперь они переводят что-то в фоновом режиме. Написание кода не требовалось.

Ищу первых пользователей

Я использую Donna каждый день и думаю, что она может принести много пользы другим. Поэтому, если вам интересно, попробуйте её и дайте мне знать, что вы думаете. Я всегда готов помочь, а ваш отзыв для меня очень важен.

Не беспокойтесь о долгосрочной поддержке — я использую Donna во всех своих проектах каждый день, так что я буду поддерживать её в любом случае. И я быстро внедряю новые функции и исправляю ошибки по запросу.