Agent wywołał narzędzie, narzędzie zadziałało, ale odpowiedź nie wróciła. Pętla uznaje wywołanie za nieudane i ponawia. Czy klient dostał jedną wycenę, czy dwie?
Czym jest idempotencja
Operacja jest idempotentna, jeśli jej wielokrotne wykonanie z tymi samymi argumentami daje ten sam skutek co jednokrotne. Odczyt stanu zamówienia jest idempotentny z natury. Wysłanie maila, obciążenie karty czy utworzenie zamówienia — nie są.
Dlaczego przy agentach to szczególnie ważne
Powtórzenie jest tu regułą, nie wyjątkiem. Ponowienia po błędach sieci, zapętlenie modelu, uruchomienie tego samego zadania przez użytkownika, równoległe wywołania z jednej odpowiedzi, wznowienie przerwanego przebiegu — każde z nich może doprowadzić do drugiego wykonania tej samej operacji. W klasycznej aplikacji ścieżki wykonania są przewidywalne; w pętli agenta nie są.
Jak to się robi
Klucz idempotencji: wywołanie niesie identyfikator, po którym system docelowy rozpoznaje powtórzenie i zwraca wynik pierwszego wykonania zamiast wykonywać operację ponownie. To rozwiązanie standardowe w API płatniczych i warte zastosowania wszędzie tam, gdzie operacja ma skutki uboczne.
Sprawdzenie stanu przed działaniem: zanim agent wyśle wycenę, pętla sprawdza, czy wycena dla tego zapytania już nie została wysłana.
Rozdzielenie przygotowania od zatwierdzenia: agent tworzy operację w stanie oczekującym, a zatwierdza ją osobny krok, najlepiej z udziałem człowieka przy działaniach nieodwracalnych.
Reguła praktyczna
Każde narzędzie o skutkach ubocznych powinno być albo idempotentne, albo objęte potwierdzeniem przed wykonaniem. Trzeciej możliwości nie ma — a domyślne ponawianie w większości frameworków sprawia, że problem pojawi się prędzej czy później.