Ти написав п'ятдесят рядків Python. Системний промпт, список інструментів, виклик моделі. Твій агент бронює зустрічі, ходить у бази даних, надсилає листи. У терміналі працює красиво. Шипити?

Спочатку відкрий свій тестовий файл. Давай. Спробуй написати тест для чогось, що дає різну відповідь щоразу, коли запитуєш.

Проблема недетермінованості, про яку ніхто не хоче говорити

Ось як виглядає звичайний тест на Python:

def test_add():
    assert add(2, 2) == 4  # детерміновано. завжди 4.

А ось як виглядає тест для агента:

def test_booking_agent():
    result = agent.run("Book a room for tomorrow 2pm")
    assert result == ???  # а що сюди писати?
    # Агент може сказати "Done! Booked room A at 2pm"
    # або "I've reserved conference room A for tomorrow at 14:00"
    # або "Booked! Room A, April 27, 2:00 PM"
    # Усі правильні. Усі різні рядки.

LLM — мозок, що стоїть за ChatGPT, Claude, Gemini — недетермінований. Той самий вхід, різний вихід. Щоразу. Твій assertEqual — марний. Це не баг. Це фундаментальна властивість, завдяки якій агенти корисні. І вона робить їх майже неможливими для тестування інструментами, на які інженери покладалися десятиліттями.

Три SDK вийшли за місяць. Жодної тест-команди.

Три великі SDK для агентів — набори інструментів для побудови ШІ-агентів — з'явилися у квітні. Anthropic запустив Managed Agents API 8 квітня. OpenAI оновив свій Agents SDK 15 квітня. Google відвантажив ADK 1.0 разом із Agent Simulation на Cloud Next 22 квітня. Усі три дають тобі примітиви для побудови та запуску. Жоден не включає команду для тестування.

Це не порівняння трьох вендорів. Це патерн. Уся індустрія — кожна велика ШІ-лабораторія — вирішила, що тестування — це твоя проблема.

Що пропонують натомість

Google підійшов найближче. На Cloud Next вони анонсували Agent Evaluation — хмарний сервіс, що оцінює твого агента за виконанням завдань, використанням інструментів та безпекою. Реально корисна штука для системних метрик. Але працює на Vertex AI, коштує приблизно $0.50–2.00 за оцінку залежно від складності, і виконується хвилинами. Запускай це на кожен pull request у активному репо — і матимеш $300+ на місяць лише за eval, без урахування фактичного використання API. Це не юніт-тест. Це подія у біллінгу.

Managed Agents API від Anthropic дає трейсинг — лог кожного кроку агента — але нуль тестових утиліт. Жодного мок-моделі, жодного запису відповідей, жодних assertion-хелперів.

OpenAI пропонує параметр seed для часткової відтворюваності, але "часткова" означає "іноді той самий результат, іноді ні". Спробуй побудувати CI/CD — автоматизовані пайплайни деплою — на "іноді".

Патерн поведінкових асершенів

Спільнота знайшла обхідний шлях. Замість перевірки точного тексту — перевіряй патерни поведінки: які інструменти агент викликав, у якому порядку, і чи зупинився, коли мав:

def test_booking_agent_behavior(recorded_responses):
    trace = agent.run("Book a room for tomorrow 2pm")
    
    # Перевіряємо виклики інструментів, а не текстовий вивід
    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  # не зациклився назавжди

Open-source проєкти на кшталт DeepEval та Promptfoo прокладають цей шлях. Жоден нативно не інтегрується з жодним із трьох SDK. Склеюєш сам.

Кожен обхідний шлях має ціну

Мокаєш модель? Втрачаєш LLM-міркування, яке робить агентів цінними — тестуєш маріонетку, а не агента. Снепшот-тести — записуєш точну відповідь і порівнюєш з нею пізніше? Ламаються при кожному оновленні моделі чи зміні промпта. Хмарні оцінки? Хвилини та долари за кожен pull request. Поведінкові асершени? Складно писати, ще складніше підтримувати, і по суті ти з нуля будуєш тестовий фреймворк окремо для кожного проєкту.

Глибинна суперечність: інженери створили інструменти тестування для детермінованого софту. Агенти не є ні детермінованими, ні, строго кажучи, софтом у традиційному розумінні. Це стохастичні системи, вдягнені в костюм програмного забезпечення.

Що реально робити прямо зараз

Жоден вендор тебе не врятує. Ось що працює — з повним визнанням абсурдності ситуації: ти винаходиш тестову інфраструктуру у 2026 році, бо три трильйонні компанії не спромоглися:

  1. Записуй реальні відповіді LLM як golden fixtures — збережені еталонні відповіді, які відтворюєш у тестах замість виклику моделі щоразу. Так, ти вручну будуєш тестову обв'язку, яку SDK мав би мати з коробки. Ні, іронія не губиться.

  2. Перевіряй послідовності tool-call, а не фінальний текст. Агент викликав check_availability перед create_booking? Достатньо. Твій мозок, натренований на assertEqual, кричатиме. Нехай.

  3. Запускай smoke-тести на реальних моделях за крон-розкладом, а не на кожен pull request. Ловиш дрифт моделі, не спалюючи бюджет CI.

  4. Стався до тестів агентів як до інтеграційних — повільніших, менш численних, більш цінних — а не як до юніт-тестів. П'ять добрих поведінкових тестів краще за п'ятдесят крихких снепшотів. Хто радить "просто пиши більше тестів" — ще не пробував тестувати щось, що щоразу генерує інше хайку про бронювання кімнат.

# Практично: патерн record & replay
import json

def record_golden_fixture(agent, prompt, path):
    """Запускаємо раз на реальній моделі, зберігаємо трейс."""
    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):
    """Відтворюємо збережений трейс, перевіряємо структуру."""
    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"
    ]

Хто першим відправить agent test — той переможе

Django захопив веб-розробників через manage.py test. Rails зробив це через rails test. Перший SDK для агентів, який зробить тестування вбудованим примітивом — не хмарним апселом по $0.50 за запуск, не стороннім аддоном, а локальною командою, що працює офлайн — захопить рівень розробників над якістю моделі та кількістю інструментів.

Нетестований агент — це новий нетестований мікросервіс. Усі шиплять. Усі шкодують через півроку. Прямо зараз команда agent test не існує в жодному з трьох великих SDK.

Твій тестовий файл досі порожній.