В AI-системах retry почти всегда выглядит безобидно, пока у вас нет side effect. Повторить classification, summary или extraction - обычно нормально. Повторить refund, create_ticket, send_email, write_to_crm или run_tool - уже риск двойного действия, inconsistent state и трудноуловимых инцидентов.
Поэтому в 2026 retries и idempotency полезно мыслить не как общую backend-гигиену, а как обязательный слой вокруг agent/tool workflows. Как только система:
вам нужна ясная граница между можно безопасно повторить и повтор может удвоить side effect.
Retry полезен почти везде, где есть transient failure:
Но этим же retry-path-ом нельзя одинаково пользоваться для всех шагов. Production-команда должна явно разделять:
| Тип шага | Retry policy |
|---|---|
| Generation / classification | обычно safe retry |
| Retrieval / search | safe retry с bounded attempts |
| Tool read | safe-ish retry, если executor read-only |
| Tool write | только с idempotency / commit awareness |
| Webhook consumer | dedupe + idempotent handler |
Самый важный вопрос не "что ответил API", а произошёл ли внешний commit.
Например:
Если система этого не понимает, любой retry становится лотереей.
Команды часто связывают idempotency только с payment APIs. Для agent systems это слишком узко.
Idempotency key полезен в:
Ключевая идея:
Даже safe retry-path может быть вредным, если он:
Поэтому production retry обычно включает:
Это особенно важно для LLM-heavy workflows, где каждый лишний retry - это ещё и деньги, latency и downstream pressure.
AI-продукты всё чаще живут не только в request/response, но и в webhook-driven flows:
Webhook delivery по своей природе может дублироваться. Поэтому обработчик должен быть idempotent even if upstream behaves correctly most of the time.
Минимальная защита:
Модель не уверена, выполнился ли tool, и предлагает повторить действие.
После approval workflow случайно переигрывает уже committed step.
Worker падает после commit, но до acknowledge.
Команда думает, что это "просто LLM step", хотя за ним стоит tool executor с write semantics.
Чтобы retries были безопаснее, workflow обычно хранит:
intent_receivedexecution_startedcommit_unknowncommittedfailed_retryablefailed_terminalОсобенно важен commit_unknown. Это неприятное, но честное состояние. Оно лучше, чем симулировать определённость там, где её нет.
Минимальный reliability dashboard:
commit_unknown count;