AI-агенты и автоматизация Собрать руками

Workflow, очереди и ретраи для AI-агента

AI-агент — не волшебная коробка: он требует чёткого workflow, устойчивой очереди задач и умения корректно обрабатывать сбои. В этом гайде — как собрать агента, который не падает, а ждёт и пробует снова.

Что такое workflow агента?

Workflow — это последовательность этапов, через которые проходит задача от поступления до завершения. Для AI-агента это: получение запроса → анализ цели → выбор инструмента → выполнение → обработка результата → логирование → ответ. Если на любом этапе происходит ошибка — workflow должен либо завершиться с fallback, либо перейти в очередь на повтор.

Стандартный workflow агента

flowchart TD
    A[Запрос поступил] --> B{Проверка контекста}
    B -->|OK| C[Разбор цели]
    B -->|Ошибка| Z[Fallback / human review]
    C --> D[Выбор инструмента]
    D --> E[Вызов инструмента]
    E --> F{Успех?}
    F -->|Да| G[Формирование ответа]
    F -->|Нет| H[Лог + ретраи]
    H --> I{Попытки исчерпаны?}
    I -->|Да| Z
    I -->|Нет| E
    G --> J[Отправка ответа]

Зачем нужны очереди?

Очередь — это буфер между входящими запросами и агентом. Она решает три проблемы: нагрузка (агент не перегружается), приоритеты (важные задачи — вперёд), отказоустойчивость (запросы не теряются при падении агента). В CodeVibers мы используем Redis Streams или RabbitMQ для асинхронной обработки задач.

Пример: постановка задачи в очередь

// Псевдокод: отправка задачи в очередь
const task = {
  id: uuid(),
  user_id: "u_123",
  goal: "Проверить баланс по счету 4711",
  context: { account_id: "4711", timestamp: Date.now() },
  priority: "normal",
  max_retries: 3,
  retry_delay_ms: 2000
};

await redis.xAdd("agent:tasks:queue", "*", "payload", JSON.stringify(task));
// Redis Stream: ключ "agent:tasks:queue" — очередь задач

Обработка с ретраями: простой цикл

async function processTask(task) {
  let attempt = 0;
  while (attempt < task.max_retries) {
    try {
      const result = await agent.run(task);
      return { status: "success", result };
    } catch (err) {
      attempt++;
      if (attempt === task.max_retries) {
        log.error(`Task ${task.id} failed after ${attempt} attempts`, err);
        return { status: "failed", error: err.message, needs_human_review: true };
      }
      await sleep(task.retry_delay_ms * attempt); // экспоненциальная задержка
    }
  }
}

Типичные ошибки

  • Бесконечные ретраи — без лимита и экспоненциальной задержки агент может «зависнуть» и блокировать ресурсы.
  • Очередь без TTL — устаревшие задачи накапливаются и мешают обработке актуальных.
  • Нет разделения по типам ошибок — сеть? LLM? Данные? — нужно логировать и обрабатывать по-разному.
  • Ретраи без проверки идемпотентности — повторный вызов инструмента может создать дубли (например, заказ).

Чеклист надёжного агентного workflow

Что проверитьЗачем
Очередь с TTL и лимитом длиныИзбежать накопления «мертвых» задач и перегрузки
Ретраи с экспоненциальной задержкой и лимитомНе спамить внешние API и не блокировать агента
Разделение ошибок: сеть / LLM / данные / инструментРазные стратегии fallback и логирования
Идемпотентные ключи для повторных вызововИзбежать дублирования действий (заказы, платежи)
Метрики: время в очереди, % ретраев, % fallbackВовремя заметить деградацию системы
Ручная проверка через human_review_queueНе терять критичные случаи и учить агента

Следующий шаг

Теперь, когда агент умеет работать в потоке и не падать — пора научить его тестировать сам себя и оценивать качество результата. Это критично для автоматического fallback и обучения.