Суть патерна
Fallback-Recovery Agent - це патерн, у якому агент при помилці не просто завершується, а проходить через керований процес відновлення: класифікує збій, застосовує fallback і намагається відновити виконання.
Коли потрібен: коли важливо не падати на першій помилці, а відновлювати виконання за контрольованим сценарієм.
У реальних системах збої неминучі:
- таймаути зовнішніх API
- тимчасова недоступність інструмента
- помилки валідації відповіді
- часткові outage залежностей
Fallback-Recovery підхід перетворює "помилка = stop" на "помилка = контрольований сценарій відновлення".

Проблема
Уяви, що агент готує щоденний звіт для клієнта:
- зчитати метрики з API
- зібрати таблицю
- відправити результат
На другому кроці API повертає timeout.
Без recovery-логіки workflow просто зупиняється.
Одна локальна помилка не повинна валити весь процес, якщо решта кроків працездатні.
Що ти отримуєш:
- зірваний дедлайн
- втрачений проміжний прогрес
- ручний перезапуск з нуля
- непередбачувану поведінку в проді
У цьому й проблема: без стратегії відновлення навіть одиничний збій ламає весь сценарій.
Рішення
Fallback-Recovery вводить recovery-policy для контрольованого відновлення після збоїв.
Аналогія: це як автозбереження в редакторі. Якщо програма падає, ти не починаєш усе з нуля, а продовжуєш із останнього безпечного стану. Тут працює та сама логіка, але з чіткими межами.
Ключовий принцип: Не кожну помилку треба "ламати об stop": частину помилок треба класифікувати і безпечно відновлювати.
Агент може запропонувати retry, але шар виконання вирішує:
- чи дозволений
retry - чи потрібен
fallback - чи треба
escalation/stop
Керований процес:
- Виявити: зафіксувати збій
- Класифікувати: визначити тип помилки
- Прийняти рішення:
retry/fallback/escalation - Відновити: продовжити з checkpoint
- Безпечно завершити: зупинити з прозорим
stop_reason
Це дає:
- відновлення довгих процесів після тимчасових збоїв
- м'яку деградацію (
cached/partial result) - без дублювання вже успішних кроків
- прозору причину зупинки
Працює добре, якщо:
- є ліміти
max_retriesіmax_fallbacks - checkpoint зберігається після безпечного прогресу
- класифікація розділяє
retriable/non-retriable - high-risk кейси не відновлюються автоматично
Модель може "хотіти" робити retry нескінченно, але саме recovery-policy визначає межі безпечного відновлення.
Як працює
Критично: відновлення має мати межі.
max_retriesіmax_fallbacksstep_timeoutіtotal_timeoutstop_reasonдля кожного виходу- заборона “fallback -> retry -> fallback” без лічильника
Опис повного флоу: Detect → Classify → Recover → Resume/Stop
Виявити
Система фіксує збій: timeout, tool error, invalid output або policy violation.
Класифікувати
Помилка класифікується за типом: retriable, tool_unavailable, invalid_output, non_retriable, high_risk.
Відновити
Застосовується політика: retry із backoff, fallback на інший інструмент, degrade mode (partial result / cached data) або ескалація людині.
Продовжити/Зупинити
Якщо recovery успішний, процес продовжується з останнього checkpoint. Якщо ні - контрольована зупинка.
У коді це виглядає так
fallbacks_used = 0
for attempt in range(max_retries + 1):
try:
result = run_step(goal, context, timeout_sec=step_timeout)
checkpoint.save(task_id, context, result)
return result
except TimeoutError as err:
kind = "retriable"
except ToolUnavailableError as err:
kind = "tool_unavailable"
except ValidationError as err:
kind = "invalid_output"
except Exception as err:
kind = classify_error(err)
if kind == "retriable" and attempt < max_retries:
sleep(backoff(attempt))
continue
if kind == "tool_unavailable" and fallbacks_used < max_fallbacks:
fallbacks_used += 1
context.append(f"fallback_used={fallbacks_used}")
context.append("route=secondary_tool") # або alt_model / cached_path
continue
if kind == "high_risk":
return escalate_to_human(goal, err, stop_reason="high_risk")
return stop_with_reason(goal, stop_reason=kind, detail=str(err))
Checkpoint зберігають після успішного кроку або після безпечного часткового прогресу (idempotent state). Інакше retry може дублювати дію.
Як це виглядає під час виконання
Goal: сформувати звіт для клієнта
Step 1: зібрати метрики
- timeout у primary analytics API
- classify: retriable
- retry #1 -> fail
- retry #2 -> fail
Fallback:
- переключення на read-replica API
- успіх
Resume:
- звіт зібрано
- step завершено без повного зриву процесу
Повний приклад Fallback-Recovery агента
Коли підходить — і коли ні
Підходить
| Ситуація | Чому Recovery підходить | |
|---|---|---|
| ✅ | Нестабільні зовнішні інструменти і flaky API/tooling | Резервний сценарій і повтор дають змогу переживати тимчасові збої без повного падіння процесу. |
| ✅ | Довгі задачі, де не можна втрачати прогрес | Checkpoint і resume дозволяють відновитися з останнього стабільного кроку. |
| ✅ | Є SLA/SLO вимоги до стійкості процесу | Recovery-контур допомагає виконувати цілі доступності та надійності. |
| ✅ | Потрібні явні stop reasons замість silent fail | Патерн формалізує причини зупинки і покращує спостережуваність збоїв. |
Не підходить
| Ситуація | Чому Recovery не підходить | |
|---|---|---|
| ❌ | Одноразовий сценарій, де помилка не критична | Складний recovery-шар буде дорожчим за потенційну користь. |
| ❌ | Повтор/резервний сценарій заборонені бізнесом | Немає дозволених шляхів відновлення, тому патерн не застосовний. |
| ❌ | Немає checkpoint/state management | Технічно неможливо коректно відновити прогрес після збою. |
Бо патерн відновлення додає операційну складність: логіку помилок, стан і оверхед підтримки.
Чим відрізняється від Supervisor
| Supervisor | Fallback-Recovery | |
|---|---|---|
| Коли спрацьовує | Перед виконанням дії | Після збою або помилки |
| Головна роль | контроль політик і обмеження ризику | стійкість під час виконання і відновлення |
| Тип рішень | схвалити / доопрацювати / заблокувати / ескалювати | retry / fallback / resume / stop |
| Ключова цінність | Запобігти небезпечним діям | Не зірвати процес при помилках |
Supervisor - це профілактика. Fallback-Recovery - це відновлення після збою.
Коли використовувати Fallback-Recovery (vs інші патерни)
Використовуйте Fallback-Recovery, коли потрібно відновити виконання після збоїв, а не зірвати весь процес.
Короткий тест:
- якщо потрібно "retry/fallback/escalation після помилки" -> Fallback-Recovery
- якщо потрібно "зупинити ризикову дію ще до виконання" -> Guarded-Policy Agent
Порівняння з іншими патернами та приклади
Швидка шпаргалка:
| Якщо задача виглядає так... | Використовуйте |
|---|---|
| Потрібна коротка перевірка перед фінальною відповіддю | Reflection Agent |
| Потрібна глибока критика за критеріями і переписування відповіді | Self-Critique Agent |
| Потрібно відновлювати процес після timeout, exception або падіння інструмента | Fallback-Recovery Agent |
| Потрібні жорсткі policy-перевірки перед ризиковою дією | Guarded-Policy Agent |
Приклади:
Reflection: "Перед фінальною відповіддю швидко перевір логіку, повноту і явні помилки".
Self-Critique: "Оціни відповідь за чеклістом (точність, повнота, ризики), потім перепиши".
Fallback-Recovery: "Якщо API не відповідає, зроби retry -> fallback-джерело -> ескалація".
Guarded-Policy: "Перед відправкою даних назовні перевір policy: чи дозволено це робити".
Як комбінувати з іншими патернами
- Fallback-Recovery + ReAct: якщо збій стався в середині циклу, агент повторює лише проблемний крок і не стартує з нуля.
- Fallback-Recovery + Orchestrator: при паралельній роботі відновлюється тільки зламана гілка, а інші підзадачі продовжують виконання.
- Fallback-Recovery + Supervisor: перед відновленням перевіряються політики, щоб fallback не порушив правила безпеки.
Коротко
Fallback-Recovery Agent:
- Виявляє і класифікує збої
- Застосовує
retry/fallbackполітики - Повертається до виконання через checkpoint
- Зупиняє процес контрольовано, якщо відновлення неможливе
Переваги та Недоліки
Переваги
швидко відновлюється після збоїв
зменшує простої сервісу
тримає процес стабільним під час помилок
легше контролювати критичні сценарії
Недоліки
резервні сценарії треба продумати заздалегідь
додаткова логіка ускладнює систему
не всі збої можна відновити автоматично
FAQ
Q: Чи достатньо просто додати повтор?
A: Ні. Мінімальний безпечний набір: max_retries + backoff + step_timeout + stop_reason. Без цього повтори перетворюються на цикл, який спалює бюджет.
Q: Коли краще резервний сценарій, а не повтор?
A: Коли помилка системна: інструмент недоступний, quota вичерпана або кінцева точка деградувала.
Q: Навіщо checkpoint, якщо є fallback?
A: Резервний сценарій змінює шлях виконання, але контрольна точка зберігає прогрес, щоб не повторювати весь сценарій спочатку.
Що далі
Fallback-Recovery підхід додає стійкість до збоїв.
Але як зробити так, щоб небезпечні дії взагалі не запускались без policy-умов?