0Pricing
AI Agents · Lekcja

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

  1. Idempotentne narzędzia i efekty uboczne
  2. Ponowienia z wykładniczym wycofaniem
  3. Limity czasu i circuit breaker
  4. Walidowanie danych wyjściowych narzędzi (Pydantic)
← Powrót do AI Agents