English translation is not available yet. Showing Russian content.
Реализовать rollback delegation
ТЕХНИЧЕСКОЕ ЗАДАНИЕ: Реализовать rollback delegation
1. Цель задачи
Разработать механизм безопасного делегирования задач между агентами в multi-agent системе, который гарантирует консистентность состояния при ошибках исполнителя. Когда агент A допускает ошибку, его частичные действия должны быть откачены (rollback), а задача передана агенту B для повторного выполнения. Необходимо реализовать протокол, обеспечивающий атомарность и idempotency операций, чтобы система оставалась в консистентном состоянии независимо от точки сбоя.
Ключевой результат Функциональный прототип (или детальный дизайн + код), в котором при имитации ошибки агента A все его изменения отменяются, и агент B успешно завершает задачу без остаточных артефактов.
2. Исходные данные
Для выполнения задачи потребуется:
| Что нужно | Откуда взять |
|---|---|
| Multi-agent фреймворк или симуляция | LangChain / CrewAI / собственный на Python |
| Сервис для хранения состояния (база данных / in-memory) | PostgreSQL / Redis / SQLite |
| Логирование и мониторинг | Python logging, Prometheus (опционально) |
| Инструмент для тестирования сбоев | tenacity, chaosmonkey или ручной выброс исключений |
| Пример задачи с сайд-эффектами | Генерация отчёта, запись в БД, вызов внешнего API |
Если нет реального multi-agent фреймворка — симулируем:
- Создаём двух простых агентов (классы Python), которые могут выполнять последовательность действий (например, обновить записи в SQLite, отправить HTTP-запрос).
- Один агент (A) намеренно выбрасывает исключение на последнем шаге.
- Пишем координатор (DelegationManager), который перехватывает ошибку, вызывает rollback-функции для агента A и передаёт задачу агенту B.
3. Технологический стек
| Компонент | Инструменты | Назначение |
|---|---|---|
| Язык программирования | Python 3.11+ | Разработка агентов, координатора, тестов |
| Управление зависимостями | Poetry / pip + requirements.txt | Изоляция окружения |
| Хранение состояния | SQLite (in-memory или файл) | Имитация БД, на которой видны изменения |
| Логирование | structlog / logging | Трассировка действий агентов и rollback |
| Тестирование | pytest, pytest-asyncio (если async) | Unit-тесты и integration-тесты |
| Имитация сбоев | unittest.mock, ручные exception | Внезапные ошибки в середине задачи |
| Паттерн Saga (опционально) | Собственная реализация | Координация компенсирующих транзакций |
4. Этапы выполнения
Этап 1: Проектирование протокола rollback delegation (30 минут)
Действия
- Определить жизненный цикл задачи:
- Статусы:
PENDING,IN_PROGRESS,COMMITTED,FAILED,ROLLED_BACK,DELEGATED,COMPLETED.
- Статусы:
- Спроектировать интерфейсы агента:
class AgentInterface(ABC): @abstractmethod def execute_task(self, task: dict) -> bool: ... @abstractmethod def rollback_task(self, task_id: str) -> None: ... - Описать протокол координатора:
- Гарантировать идемпотентность: каждый шаг должен быть повторяем (использовать идемпотентные операции, например UPDATE ... SET status = 'COMPLETED' WHERE status = 'IN_PROGRESS').
Ожидаемый результат этапа Документ (Markdown) или диаграмма последовательности, описывающая протокол.
Этап 2: Реализация координатора и базовых агентов (1.5 часа)
Действия
- Создать базовые классы
AgentAиAgentB, наследующие AgentInterface. - Каждый агент имитирует работу с БД:
- Реализовать DelegationManager:
class DelegationManager: def __init__(self, agent_a: AgentInterface, agent_b: AgentInterface): ... def run(self, task: dict) -> str: try: self.agent_a.execute_task(task) return "SUCCESS" except Exception as e: logger.error(f"Agent A failed: {e}") self.agent_a.rollback_task(task["id"]) logger.info("Rollback completed, delegating to Agent B") self.agent_b.execute_task(task) return "DELEGATED_SUCCESS" - Добавить детальное логирование каждого шага (время, статус, стек ошибок).
Ожидаемый результат этапа Работающий скрипт, который при запуске показывает:
- Если Agent A успешен — только его действия.
- Если Agent A бросает исключение — сначала откат A, затем успешное выполнение B.
Этап 3: Обработка граничных случаев и сбоев при откате (1 час)
Действия
- Рассмотреть сценарии:
- Реализовать стратегию повторных попыток для rollback (retry с exponential backoff).
- Добавить проверку консистентности после каждого rollback:
- Проверить, что все записи агента A удалены или аннулированы.
- Использовать отдельный статус
ROLLING_BACKво избежание двойного отката.
- Написать unit-тесты на каждый граничный случай (pytest).
Ожидаемый результат этапа Расширенный координатор, обрабатывающий сбои при откате и делегировании. Тесты покрывают не менее 5 сценариев.
Этап 4: Интеграционное тестирование и валидация консистентности (1 час)
Действия
- Создать сквозной тест, который:
- Написать скрипт, измеряющий консистентность:
def test_consistency_after_failure(): state_before = snapshot_db() manager.run(some_task) state_after = snapshot_db() # Agent A records should be absent, Agent B records present assert "agent_a" not in state_after assert state_after["agent_b"]["task_id"] == some_task["id"] - Добавить метрику успеха: время выполнения, количество вызовов rollback, частота отказов Agent B.
Ожидаемый результат этапа Набор интеграционных тестов (pytest), подтверждающих консистентность состояния при любом сценарии сбоя.
Этап 5: Документирование и демонстрация (30 минут)
Действия
- Написать краткое README с описанием архитектуры, инструкцией по запуску и примером вывода.
- Создать файл
rollback_delegation_demo.py, который можно запустить и увидеть пошаговый лог. - Зафиксировать в отчёте:
- Количество протестированных сценариев.
- Время выполнения в нормальном и падёжном режиме.
- Любые ограничения (например, нет поддержки distributed transactions).
Ожидаемый результат этапа README.md и демо-скрипт, готовые к презентации.
5. Критерии приемки (Definition of Done)
- Реализован протокол rollback delegation, при котором ошибка агента A приводит к откату всех его действий.
- Агент B получает задачу в том же состоянии, что и до начала работы агента A (чистая доска).
- Состояние системы после успешного делегирования полностью консистентно (нет остаточных данных от A, все шаги B завершены).
- Координатор корректно обрабатывает сбой во время rollback (повторяет попытку, логирует, не зацикливается).
- Все операции идемпотентны: повторный вызов
executeили rollback не портит состояние. - Написаны минимум 5 unit-тестов и 2 integration-теста, покрывающих основные сценарии (успех, ошибка A, ошибка при rollback, ошибка B).
- Код проходит pylint / black без ошибок, уровни логирования настроены (DEBUG для отладки, INFO для основных событий).
- Есть README с инструкцией по запуску и примерами вывода.
6. Ожидаемый результат
Основной артефакт Папка проекта с файлами:
agent.py— классы AgentA, AgentB.manager.py— DelegationManager.exceptions.py— кастомные исключения (RollbackError, DelegateError).test_rollback.py— тесты.demo.py— демо-скрипт.README.md— документация.
Содержание README
- Архитектура (диаграмма или текстовое описание).
- Шаги запуска:
pip install -r requirements.txt && python demo.py. - Пример вывода:
2025-12-31 10:00:00 | INFO | Delegating task 'T-001' to Agent A
2025-12-31 10:00:01 | INFO | Agent A: step 1 complete
2025-12-31 10:00:02 | ERROR | Agent A failed: Simulated exception on step 2
2025-12-31 10:00:02 | INFO | Rolling back Agent A actions...
2025-12-31 10:00:02 | INFO | Rollback successful
2025-12-31 10:00:02 | INFO | Delegating task 'T-001' to Agent B
2025-12-31 10:00:03 | INFO | Agent B: task completed
Final state: consistency check passed.
Дополнительные результаты
- Метрики успеха (таблица с временами отката).
- Отчёт о покрытии тестов (coverage report).
7. Возможные сложности и их решение
| Сложность | Решение |
|---|---|
| Rollback не выполняется (например, БД упала) | Внедрить retry с exponential backoff (max 3 попытки). Если всё равно упал — перевести задачу в статус MANUAL_INTERVENTION, записать в лог. |
| Агент B тоже падает | В координаторе предусмотреть цепочку делегирования (список агентов). Если все падают — задача помечается как FAILED. |
| Параллельные задачи влияют друг на друга | Каждая задача должна иметь уникальный task_id, все операции фильтруются по этому ID. Использовать блокировки (row-level) в БД. |
| Идемпотентность нарушена | Все сайд-эффекты проверять перед выполнением: INSERT ... WHERE NOT EXISTS. При повторном execute ничего не делать. |
| Логи слишком объёмные | Настроить уровни: INFO — только ключевые события (делегирование, откат, успех), DEBUG — детали шагов. |
8. Бюджет времени (оценка)
| Этап | Время |
|---|---|
| Этап 1: Проектирование протокола | 30 мин |
| Этап 2: Реализация координатора и агентов | 1.5 ч |
| Этап 3: Обработка граничных случаев | 1 ч |
| Этап 4: Интеграционное тестирование | 1 ч |
| Этап 5: Документирование | 30 мин |
| Итого | 4–5 часов |
Примечание Если вы впервые знакомитесь с паттерном Saga или компенсирующими транзакциями, заложите дополнительно 1 час на изучение.
9. Связанные вопросы из базы знаний
| Вопрос | Тема |
|---|---|
| 12 | Что такое Saga-паттерн и чем отличается от двухфазного коммита? |
| 45 | Как реализовать компенсирующую транзакцию в микросервисах? |
| 78 | Какие стратегии повторных попыток (retry) существуют для идемпотентных операций? |
| 132 | Как обеспечить консистентность в распределённых мульти-агентных системах? |
| 215 | Методы логирования и трассировки в цепочках делегирования |
| 341 | Какие виды сбоев возможны при асинхронном делегировании? |
| 489 | Проектирование idempotency key для повторяемых запросов |
| 567 | Как тестировать отказоустойчивость multi-agent оркестратора? |
| 623 | Что такое “circuit breaker” и как он помогает при делегировании? |
| 789 | Best practices по управлению состоянием в агентных фреймворках |
10. Чек-лист самопроверки
- Я проверил, что при ошибке агента A его изменения действительно откатываются (а не просто игнорируются).
- Я убедился, что после отката агент B получает задачу в том же контексте, что и A (те же параметры, не испорченные).
- Я протестировал сценарий, где rollback сам выбрасывает исключение — система не зависла и записала предупреждение.
- Я проверил, что повторный запуск того же
task_id(идемпотентность) не создаёт дублирующих записей. - Я прочитал README и убедился, что другой разработчик сможет запустить демо без дополнительных пояснений.
- Я подключил хотя бы базовое логирование с разными уровнями, чтобы видеть хронологию.