Napisałeś pięćdziesiąt linijek Pythona. System prompt, lista narzędzi, wywołanie modelu. Twój agent rezerwuje spotkania, odpytuje bazy danych, wysyła maile. Działa pięknie w terminalu. Wrzucasz na proda?

Najpierw otwórz plik z testami. Śmiało. Spróbuj napisać test dla czegoś, co za każdym razem daje inną odpowiedź.

Problem niedeterminizmu, o którym nikt nie chce gadać

Tak wygląda normalny test w Pythonie:

def test_add():
    assert add(2, 2) == 4  # deterministyczne. zawsze 4.

A tak wygląda test agenta:

def test_booking_agent():
    result = agent.run("Book a room for tomorrow 2pm")
    assert result == ???  # co tu wstawić?
    # Agent może odpowiedzieć "Done! Booked room A at 2pm"
    # albo "I've reserved conference room A for tomorrow at 14:00"
    # albo "Booked! Room A, April 27, 2:00 PM"
    # Wszystkie poprawne. Wszystkie różne stringi.

LLM — mózg stojący za ChatGPT, Claude, Gemini — jest niedeterministyczny. Ten sam input, inny output. Za każdym razem. Twój assertEqual jest bezużyteczny. To nie jest bug. To fundamentalna właściwość, dzięki której agenty są w ogóle przydatne. I która sprawia, że testowanie ich narzędziami, na których inżynierowie polegali od dekad, jest praktycznie niemożliwe.

Trzy SDK wyszły w tym miesiącu. Zero komend do testowania.

W kwietniu pojawiły się trzy duże SDK do agentów. Anthropic uruchomił Managed Agents API 8 kwietnia. OpenAI zaktualizowało swoje Agents SDK 15 kwietnia. Google wypuścił ADK 1.0 razem z Agent Simulation na Cloud Next 22 kwietnia. Wszystkie trzy dają ci prymitywy do budowania i uruchamiania. Żadne nie zawiera komendy do testowania.

To nie jest porównanie trzech vendorów. To wzorzec. Cała branża — każde duże labolatorium AI — zdecydowało, że testowanie to twój problem.

Co oferują w zamian

Google podszedł najbliżej. Na Cloud Next ogłosili Agent Evaluation — usługę chmurową, która ocenia twojego agenta pod kątem realizacji zadań, użycia narzędzi i bezpieczeństwa. Naprawdę przydatne do metryk systemowych. Ale działa na Vertex AI, kosztuje mniej więcej $0.50–2.00 za ewaluację w zależności od złożoności, i trwa minuty. Odpal to per pull request w aktywnym repo, a patrzysz na $300+ miesięcznie samych opłat za ewaluację — bez kosztów API. To nie jest unit test. To zdarzenie billingowe.

Managed Agents API od Anthropic daje tracing — log każdego kroku agenta — ale zero narzędzi testowych. Żadnego mock modelu, nagrywania odpowiedzi, helperów do asercji.

OpenAI oferuje parametr seed dla częściowej powtarzalności, ale "częściowa" znaczy "czasem ten sam output, czasem nie". Spróbuj zbudować CI/CD — zautomatyzowane pipeline'y deploymentu — na "czasem".

Wzorzec asercji behawioralnych

Community wypracowało obejście. Zamiast asertować na dokładnym tekście, asertuj na wzorcach zachowania — jakie narzędzia agent wywołał, w jakiej kolejności i czy się zatrzymał, kiedy powinien:

def test_booking_agent_behavior(recorded_responses):
    trace = agent.run("Book a room for tomorrow 2pm")
    
    # Asertuj na wywołaniach narzędzi, nie na tekście
    assert trace.tool_calls[0].name == "check_availability"
    assert trace.tool_calls[1].name == "create_booking"
    assert "room" in trace.tool_calls[1].args
    assert trace.completed  # nie zapętlił się w nieskończoność

Projekty open-source jak DeepEval i Promptfoo pionierują to podejście. Żaden nie integruje się natywnie z żadnym z trzech SDK. Kleisz to sam.

Każde obejście ma swoją cenę

Mockujesz model? Tracisz rozumowanie LLM, które sprawia, że agenty są wartościowe — testujesz marionetkę, nie agenta. Testy snapshotowe — nagrywasz dokładną odpowiedź i porównujesz z nią później? Sypią się przy każdej aktualizacji modelu albo zmianie prompta. Ewaluacje w chmurze? Minuty i dolary za pull request. Asercje behawioralne? Trudne do napisania, jeszcze trudniejsze do utrzymania, i w zasadzie ręcznie budujesz framework testowy od zera dla każdego projektu.

Tensja u podstaw: inżynierowie zbudowali narzędzia testowe dla deterministycznego softu. Agenty nie są ani deterministyczne, ani — ściśle rzecz biorąc — softwarem w tradycyjnym sensie. To systemy stochastyczne przebrane za oprogramowanie.

Co faktycznie robić tu i teraz

Żaden vendor cię nie uratuje. Oto co działa, z pełną świadomością absurdu — wymyślasz infrastrukturę testową w 2026 roku, bo trzy firmy warte biliony dolarów nie mogły się zmusić:

  1. Nagrywaj prawdziwe odpowiedzi LLM jako golden fixtures — zapisane znane-dobre odpowiedzi, które odtwarzasz w testach zamiast wywoływać model za każdym razem. Tak, ręcznie budujesz instalację hydrauliczną testów, którą SDK powinno dostarczyć. Nie, ironia nie umyka.

  2. Asertuj na sekwencjach wywołań narzędzi, nie na końcowym tekście. Czy agent wywołał check_availability przed create_booking? Wystarczy. Twój mózg wytrenowany na assertEqual będzie krzyczeć. Niech krzyczy.

  3. Odpalaj smoke testy na prawdziwych modelach w daily cronie, nie per pull request. Łapiesz model drift bez palenia budżetu CI.

  4. Traktuj testy agentów jak testy integracyjne — wolniejsze, mniej liczne, ale bardziej wartościowe — a nie jak unit testy. Pięć dobrych testów behawioralnych bije pięćdziesiąt kruchych snapshotów. Każdy, kto mówi ci "po prostu pisz więcej testów", nie próbował testować czegoś, co przy każdym uruchomieniu generuje inne haiku o rezerwacji sal.

# Praktycznie: wzorzec record & replay
import json

def record_golden_fixture(agent, prompt, path):
    """Odpal raz na prawdziwym modelu, zapisz trace."""
    trace = agent.run(prompt)
    with open(path, "w") as f:
        json.dump(trace.to_dict(), f)
    return trace

def test_from_fixture(mock_agent, fixture_path):
    """Odtwórz zapisany trace, asertuj na strukturze."""
    with open(fixture_path) as f:
        golden = json.load(f)
    mock_agent.load_trace(golden)
    result = mock_agent.replay()
    assert [c["name"] for c in result.tool_calls] == [
        "check_availability", "create_booking"
    ]

Vendor, który pierwszy doda agent test, wygrywa

Django zdobyło webdevów dzięki manage.py test. Rails zrobił to z rails test. Pierwsze SDK do agentów, które uczyni testowanie domyślnym prymitywem — nie chmurowym upsell'em za $0.50 za uruchomienie, nie third-party addonem, ale lokalną komendą działającą offline — zgarnie warstwę developerską ponad jakością modelu i liczbą narzędzi.

Nietestowalny agent to nowy nietestowany mikroserwis. Każdy go wrzuca na proda. Każdy tego żałuje pół roku później. W tej chwili komenda agent test nie istnieje w żadnym z trzech głównych SDK.

Twój plik z testami jest wciąż pusty.