Суть
Раз узлы могут вызываться повторно (retry, восстановление из чекпоинта, возобновление после HITL), исполнение должно быть устойчиво к повторам и сбоям. Три опоры: идемпотентность, ограничение циклов, политика повторов.
Как работает
Идемпотентность. Повторный вызов узла с теми же входными данными даёт тот же результат. Обязательна, если узел может вызваться снова. Приёмы: детерминировать LLM (temperature=0, seed), проверять operation_id перед необратимой операцией, передавать idempotency_key в API, кэшировать результат в state. Особый случай: interrupt() возобновляет узел с начала, поэтому необратимый код (списание) нельзя ставить до прерывания — выносим его за узел с interrupt() (см. LangGraph HITL).
Циклы и лимиты. Цикличный граф (узел, возвращающий управление себе) рискует зациклиться, если маршрутизатор не сработает (например, агент бесконечно дописывает сообщения). Решение — жёсткий лимит итераций + условное ребро на выход/fallback при превышении порога.
RetryPolicy. Повтор узла при временных ошибках (таймаут API, невалидный JSON) с экспоненциальной задержкой:
from langgraph.types import RetryPolicy
retry = RetryPolicy(max_attempts=3, initial_interval=1.0,
backoff_factor=2.0, max_interval=10.0, jitter=True) # 1с→2с→4с, ±50%
workflow.add_node("api_call", api_call_node, retry=retry)
Runbook типовых отказов:
| Отказ | Решение |
|---|---|
| Потеря состояния | PostgreSQL checkpointer (LangGraph Checkpointers) |
| Бесконечные циклы | Лимит итераций + fallback |
Неидемпотентный код до interrupt() |
Вынести код за узел с interrupt() |
| Опасные действия агента | interrupt на каждый опасный tool |
| Дорогие LLM при replay | Кэшировать результаты в state |
Связано с
- Agent CostControl —
RetryPolicy, лимиты итераций, дорогой replay = контроль стоимости - LangGraph HITL — идемпотентность вокруг
interrupt() - LangGraph Checkpointers — персистентность как ответ на потерю состояния
- LangGraph — «метрики качества» контролируемого workflow
Открытые вопросы
- разумный дефолт лимита итераций (баланс «доделать» vs «не зациклиться») → см. ReAct (ждёт курс: лекция #18 State machine, 2026-07-02)