Idempotentne narzędzia i efekty uboczne
Agent może ponawiać próby — projektuj narzędzia tak, aby dwukrotne wywołanie nie powodowało podwójnej opłaty ani wysłania dwóch wiadomości e-mail.
Idempotentne narzędzia i efekty uboczne to bezpłatna lekcja AI Agents na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej AI Agents, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs AI Agents zawiera 4 lekcji w sumie.
Dlaczego idempotencja ma znaczenie
Pętla agenta może ponawiać próby. Jeśli narzędzie wysyła wiadomość e-mail lub obciąża kartę kredytową, ponowienie próby powoduje powielenie działania. Idempotencja sprawia, że polecenie „wykonaj X ponownie” nic nie robi, jeśli X już zostało wykonane.
Czym jest idempotencja
Operacja jest idempotentna, jeśli wywołanie jej N razy daje taki sam efekt jak wywołanie jej raz. Przykłady:
- „Ustaw status użytkownika na aktywny” — idempotentne (ponowne ustawienie statusu na aktywny niczego nie zmienia)
- „Zwiększ licznik o 1” — NIE jest idempotentne (każde wywołanie zwiększa licznik o kolejną 1)
Klucze idempotencji
W przypadku operacji nieidempotentnych (płatności, wiadomości e-mail) należy używać kluczy idempotencji:
import uuid
def create_payment(amount, idempotency_key):
# Stripe accepts this header — returns the existing payment if key was used
return stripe.Charge.create(
amount=amount,
currency='usd',
source=token,
idempotency_key=idempotency_key
)Generowanie kluczy na podstawie intencji
Należy użyć skrótu z (tool_name, arguments, run_id), aby identyczne ponowienia prób korzystały z tego samego klucza:
import hashlib, json
def intent_key(tool_name, args, run_id):
payload = json.dumps([tool_name, args, run_id], sort_keys=True)
return hashlib.sha256(payload.encode()).hexdigest()
print(intent_key('transfer_money', {'to': 'acc2', 'amount': 100}, 'run-1'))
Inwentaryzacja skutków ubocznych
Należy określić, które narzędzia powodują skutki uboczne:
- SEND — wiadomości e-mail / SMS
- CHARGE / refund — obciążenia / zwroty środków
- CREATE / DELETE — tworzenie / usuwanie wierszy w bazie danych
- POST do zewnętrznych interfejsów API, które zmieniają stan
Narzędzia tylko do odczytu są z natury idempotentne. Należy skupić się na operacjach zapisu.
Opakowywanie narzędzi powodujących skutki uboczne
Należy dodać warstwę idempotencji w implementacji narzędzia:
def send_email(to, subject, body, run_id):
key = intent_key('send_email', {'to': to, 'subject': subject, 'body': body}, run_id)
if redis.set(f'sent:{key}', 1, nx=True, ex=86400):
smtp.send(to, subject, body)
return {'sent': True}
return {'sent': False, 'reason': 'already-sent'}Potwierdzanie przed wykonaniem działania
W przypadku działań o poważnych konsekwencjach należy dodać etap potwierdzenia:
def transfer_money(from_acc, to_acc, amount, confirmed=False):
if not confirmed:
return {'pending': True, 'msg': 'Call again with confirmed=True to proceed.'}
return {'pending': False, 'msg': f'Transferred {amount} from {from_acc} to {to_acc}.'}
print(transfer_money('acc1', 'acc2', 100))
print(transfer_money('acc1', 'acc2', 100, confirmed=True))
Narzędzia dwuetapowe
Należy podzielić narzędzia na etapy „draft” i „commit”:
def draft_email(to, subject, body):
draft_id = save_draft(to, subject, body)
return {'draft_id': draft_id, 'preview': body[:200]}
def send_draft(draft_id):
return smtp.send(load_draft(draft_id))Działania kompensacyjne
Jeśli nie można uniknąć skutku ubocznego, należy zdefiniować narzędzie „undo”:
def refund_payment(payment_id):
return stripe.Refund.create(payment=payment_id)
# Now an erroneous create_payment can be undone.Dzienniki audytowe
Każde narzędzie powodujące skutki uboczne MUSI rejestrować: osobę, która je uruchomiła, argumenty, czas oraz wynik. Należy używać ustrukturyzowanych dzienników, które można później przeszukiwać.
Budżet skutków ubocznych na uruchomienie
Dla bezpieczeństwa należy ograniczyć liczbę skutków ubocznych podczas jednego uruchomienia:
if state.side_effect_count >= 5:
return {'error': 'Side-effect budget exhausted for this run.'}Tryb dry-run
Przydatne podczas programowania: narzędzia rejestrują, co ZROBIŁYBY, ale faktycznie tego nie wykonują:
import os
os.environ['DRY_RUN'] = '1'
DRY_RUN = os.getenv('DRY_RUN') == '1'
def send_email(to, subject, body):
if DRY_RUN:
print(f'would send email to {to}')
return {'sent': False, 'dry_run': True}
print(f'sending email to {to}')
return {'sent': True, 'dry_run': False}
result = send_email('user@example.com', 'Hi', 'Hello there')
print(result)
Definicja
Co oznacza „idempotentne” w odniesieniu do narzędzia?
Podsumowanie
Należy zidentyfikować skutki uboczne. Używać kluczy idempotencji. Budować narzędzia dwuetapowe i działania kompensacyjne. Wszystko poddawać audytowi. W środowisku deweloperskim używać trybu dry-run.
Często zadawane pytania
Czy lekcja „Idempotentne narzędzia i efekty uboczne” jest bezpłatna?
Tak — pełny tekst „Idempotentne narzędzia i efekty uboczne” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu AI Agents, przejdź na CoddyKit PRO. Kurs AI Agents zawiera 4 lekcji w sumie.
Co nauczysz się w „Idempotentne narzędzia i efekty uboczne”?
Agent może ponawiać próby — projektuj narzędzia tak, aby dwukrotne wywołanie nie powodowało podwójnej opłaty ani wysłania dwóch wiadomości e-mail. Ćwiczysz AI Agents z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć AI Agents?
Nie wymagamy żadnego doświadczenia. AI Agents w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Idempotentne narzędzia i efekty uboczne”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji AI Agents?
Tak. Każda lekcja AI Agents zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Idempotentne narzędzia i efekty uboczne
- Ponowienia z wykładniczym wycofaniem
- Limity czasu i circuit breaker
- Walidowanie danych wyjściowych narzędzi (Pydantic)