Test pustyni hostowanej przez API agentów: CSV Runner, sprawdzanie artefaktów i obsługa błędów
Testowanie sandboxu z hostowaną API OpenAI Agents: narzędzie w Pythonie wysyła plik CSV, pobiera wyniki i sprawdza sam podsumowanie w formacie JSON. Uwzględniono przypadki niepowodzeń oraz koszty.
To doświadczenie wychodzi od konkretnej kwestii: czy sesja API agenta może przyjąć plik, przetworzyć go w środowisku izolowanym i zwrócić wynik, który można zweryfikować? Odpowiada na to mały program w Pythonie. Wejściem jest plik CSV z transakcjami – cztery sprzedaże, jedna zwrot pieniędzy oraz jedna nieważna wiersz. Agent tworzy podsumowanie w formacie JSON, a aplikacja sama oblicza oczekiwany wynik, aby można je było porównać. Wszystkie opinie tutaj są osobiste i pochodzą z testów przeprowadzonych przy użyciu osobistego konta OpenAI w planie Pro, wraz z dokumentacją dostępną w tym czasie.
10 września 2026 roku API Agents zostało wpuszczone do publicznego beta przez OpenAI, oferując zarządzany mechanizm Codex, który napędza pętlę modelu i narzędzi. Aplikacja wywołująca dostarcza zadanie i decyduje, gdzie mają być wykonywane polecenia. Dalej opisano, w jaki sposób budowany jest ten mechanizm. Pięć zarejestrowanych prób pochodziło z wcześniejszej wersji. Zrewidowany mechanizm zapewnia powtarzalność i przechowuje dowody, a dotychczas był sprawdzany wyłącznie offline.
01 Jak składa się API Agents
Cztery komponenty muszą pozostać odrębne. Agent przenosi model, instrukcje i narzędzia. Środowisko dostarcza opcjonalne zasoby obliczeniowe. Sesja łączy wszystkie te elementy w czasie. Zdarzenia i elementy informują o tym, co dzieje się aktualnie oraz co zostało zapisane. Jedna tura to jeden obieg tej pętli.
Układ hostowany w tym eksperymencie wygląda następująco: narzędzie Python otwiera sesję i pobiera wyniki, podczas gdy OpenAI zarządza narzędziem sterującym oraz środowiskiem wykonywania.
Pierwsze pytanie projektowe dotyczy tego, gdzie powinien znajdować się pętla agenta. Dzięki API Agents OpenAI hostuje narzędzie sterujące i zapewnia trwałość sesji. SDK Agents uruchamia tę pętlę w Twojej własnej aplikacji, więc to Ty decydujesz o sposobie przechowywania danych i integracjach. API Responses umożliwia bezpośredni dostęp do modeli, pozostawiając cały proces pracy do Twojej dyspozycji.
Responses mogą również wykonywać polecenia w środowisku shell, więc sam obliczenie w formacie CSV nie wymaga API Agents. Narzędzie wykorzystuje to API do przeprowadzenia całego procesu od sesji po wynik. Każda próba tworzy nową sesję i wykonywa jedno zadanie. Nie testuje ono ani trwałości wieloetapowej, ani podagentów.
02 Dlaczego środowisko hostowane?
W tym przypadku wystarczy miejsce na plik CSV oraz plik w języku Python, który generuje agent. Nie wymaga to sieci prywatnej ani specjalnego obrazu, dlatego narzędzie wybiera opcję openai_hosted z wyłączoną siecią sandbox. Alternatywy głównie wpływają na to, kto posiada przestrzeń roboczą i w jaki sposób pliki są zwracane.
Wartość none oznacza brak systemu plików środowiskowego oraz brak wbudowanej możliwości wykonywania poleceń Bash, chociaż funkcje aplikacji i zdalne serwery MCP mogą nadal wykonywać kod w innych miejscach. Przy opcji self_hosted OpenAI nadal uruchamia narzędzie, ale to ty zarządzasz środowiskiem wykonywania.
Zarządzanie wynikami należy do tej opcji. Pliki w środowisku typu self-hosted nie są publikowane za pośrednictwem API Artifacts firmy OpenAI, nawet jeśli agent zapisuje je w katalogu /workspace/outputs. Twoja aplikacja musi sama je pobrać i zachować.
Ustawienia hostowane, które są tu istotne
Przewodnik hostowany omawia również zmienne środowiskowe, umiejętności, wtyczki oraz katalogi funkcjonalności. W tym przypadku wystarczają pliki seed oraz wyłączony dostęp sieciowy sandbox. Połączenia MCP zdalne rozpoczynają się od usługi OpenAI, dlatego ustawienia wyjścia sandbox nie powinny być opisywane jako zasada dla każdego połączenia narzędziowego.
03 Wewnątrz uruchamiacza CSV
Kod znajduje się w pliku openai-agents-api/sandbox_check.py, a pełny przykład jest dostępny w katalogu openai-agents-api w repozytorium techforum-repo ai-agents-experimentation na GitHubie. Uruchamiacz generuje kwoty w postaci całkowitych centów i zapisuje swój seed. Każdy plik CSV zawiera celowo trudne przypadki: symbole walut, separatory tysięczne, zbędne spacje, ujemną kwotę zwrotu oraz wpis N/A.
Wprowadzenie seed-42
amount,note
$981.96 ,sale
" $1,838.10 ",sale
$42.78 ,sale
-$100.12,refund
N/A,voided
$155.92 ,sale
Localny generator wyprowadza podany poniżej odniesienie bezpośrednio z tych wartości całkowitych. Jest to oczekiwany wynik dla tego zestawu testowego, a nie odpowiedź od aktualnego agenta.
{
"total_cents": 291864,
"valid_rows": 5,
"invalid_rows": 1
}
Wysłane instrukcje
Pracownik otrzymuje plik CSV wraz z pisemnym zadaniem, a oczekiwana odpowiedź nigdy nie opuszcza aplikacji. Istota zadania: utworzyć plik /workspace/outputs/calculate.py i uruchomić go za pomocą Pythona; załadować plik /workspace/data.csv; usunąć spacje, znaki dolara oraz separatory tysięczne z każdej kwoty; zignorować wartości, które nie są liczbowe, ale zachować ujemne zwroty; wykonać obliczenia przy użyciu typu Decimal lub całkowitych setek, nigdy zmiennych liczbowych w formacie binarnym; stworzyć plik /workspace/outputs/summary.json zawierający dokładnie trzy pola całkowite o nazwach total_cents, valid_rows i invalid_rows; policzyć każdy wiersz danych tylko raz, pomijając nagłówek; oraz zachować plik calculate.py jako wynik działania.
Funkcja run_trial() otwiera sesję za pomocą client.beta.agents.sessions.create(), przekazując gpt-6-astra wraz z tymi instrukcjami jako agenta, a plik /workspace/data.csv jest wczytywany w formie base64. Środowisko to openai_hosted, przy czym network.access jest ustawione na disabled. Jest to ta sama ścieżka API, której użyto w oryginalnym eksperymencie.
Co jest sprawdzane i zapisywane
- Śledzenie właściwego kroku. Po pobraniu sesji program sprawdza główny krok. Nieudana sesja, konieczna akcja, nieudany krok, anulowanie oraz wyczerpanie budżetu na sprawdzanie skutkują każdy odrębnym wynikiem.
- Pobieranie obu żądanych plików. Zarówno
summary.json, jak icalculate.pysą porównywane pod względem ścieżki i identyfikatora kroku, co oznacza, że brakujący lub przestarzały plik nigdy nie może zostać zaakceptowany.
Przewodnik po artefaktach wyjaśnia, w jaki sposób pliki są powiązane z rundami, natomiast przewodnik dotyczący obserwowalności omawia sprawdzanie aktywności poleceń. Automatyczna weryfikacja potwierdza, że pliki istnieją, a strukturyzowany wynik jest dokładny. Zapisany skrypt i elementy nadal wymagają sprawdzenia, zanim ktoś będzie twierdził, w jaki sposób przeprowadzono obliczenia. Pobrany kod nigdy nie jest wykonywany na maszynie aplikacji.
04 Co pokazują pięć zapisanych testów
Pierwotna sesja zarejestrowała swoje wyniki 15 września 2026 roku, przy czym w każdym teście używano nowo losowanego pliku CSV. Użyto danych z tej sesji. Są to obserwacje po stronie klienta, dokonane po otrzymaniu odpowiedzi o utworzeniu sesji, a czasy obejmują zarówno utworzenie sesji, jak i pobranie pliku.
Każda z pięciu sum podanych przez agenta zgadzała się z wartościami referencyjnymi. W tym sprawdzeniu zastosowano arytmetykę zmiennoprzecinkową z tolerancją poniżej jednego centa. Czas rejestruje moment, w którym pierwsze zapytanie doprowadziło do uruchomienia sesji i jej ustabilizowania, więc nie mierzy ani dokładnego czasu wykonywania operacji na serwerze, ani całkowitego opóźnienia. Pięć udanych prób opisuje to, co wydarzyło się podczas jednej małej sesji, i nic nie mówi o ogólnej stopie niezawodności.
Co zmienia zaktualizowany narzędzie
Zmodyfikowany program powtarza ten sam mały eksperyment, ale z ostrzejszą definicją sukcesu. Dokładnie porównuje się całkowite kwoty w centach oraz liczbę wierszy, przechowuje się każdy wprowadzony przykład, a także zachowuje generowany skrypt oraz historię sesji. Pomiar czasu rozpoczyna się przed utworzeniem sesji, przy czym pobieranie i weryfikacja są liczone oddzielnie. Osiem testów offline obejmuje te sprawdzenia, a podane powyżej wartości nadal odnoszą się do wcześniejszego wykonywania w trybie online.
05 Obsługa błędów
Pętla polling używa wyraźnych czasów wygaśnięcia HTTP, wyłącza automatyczne próby ponowne oraz sprawdza pozostały budżet prób pomiędzy żądaniami. Ten budżet nie stanowi sztywnego terminu zakończenia procesu. Proba rejestruje swój wynik przed podjęciem prób czyszczenia, a poprawna odpowiedź w połączeniu z nieudanym czyszczeniem nadal daje niezerowy kod wyjścia.
Seans może mieć cztery stany: idle, in_progress, requires_action oraz failed. Konfiguracja zadania w formacie CSV nie definiuje żadnych narzędzi funkcji aplikacyjnych, więc jeśli kiedykolwiek jest potrzebna jakakolwiek akcja, silnik zapisuje ten stan i zgłasza go do sprawdzenia, zamiast czekać w nieskończoność.
Strumienie na żywo nie odtwarzają wydarzeń, które zostały przegapione. Aby odbudować widok aplikacji, należy ponownie nawiązać połączenie i zbuforować przychodzące wydarzenia podczas pobierania zapisanych elementów sesji, a następnie dopasować je według identyfikatora elementu. Dzięki temu przywraca się wyświetlanie zapisanej pracy, choć nie gwarantuje to, że przerwany polecenie zostało pomyślnie wykonane.
Jeden pasujący incydent zasługuje na odnotowanie. W wcześniejszych notatkach z dochodzeń opisywano sesje pozostające w stanie bezczynności bez widocznych ruchów, a raport incydentowy OpenAI z 14 września 2026 roku opisuje opóźnione lub zablokowane rozpoczęcia ruchów od godziny 13:30 czasu pacyfickiego tego dnia, które później zostały oznaczone jako rozwiązane. Objawy są zgodne, ale bez dowodów na poziomie żądania nie potwierdzają przyczyny każdego lokalnego awarii. Porównaj stan usługi z zapisanymi sesjami oraz błędami ruchów. Narzędzie rejestruje nieudane sesje, nieudane ruchy, brakujące pliki, nieważne podsumowania oraz błędne wyniki jako odrębne zdarzenia, i nie traktuje już niezauważonego ruchu jako dowodu na powrót starego incydentu.
Gdy wyniki stają się dostępne i zostaną zapisane, jeśli praca nie jest ukończona, uruchamiający prosi o anulowanie i próbuje usunąć sesję, robiąc to maksymalnie trzy razy w przypadku konfliktów przy usuwaniu. Każdy błąd przy czyszczeniu jest nadal rejestrowany w pliku result.json. Jeśli utworzenie sesji zawiedzie zanim zostanie zwrócony ID, usunięcie według ID nie jest możliwe, a uruchamiający rejestruje tę niepewność.
Pracownia hostowana może wygasnąć po godzinie bez żadnej aktywności lub sygnałów utrzymania połączenia, natomiast połączone środowiska testowe otrzymują takie sygnały pomiędzy kolejnymi rundami. Publikowane artefakty przetrwają wygaśnięcie środowiska, ale wymagane wyniki powinny zostać zapisane przed usunięciem sesji.
06 Kiedy użyć własnych zasobów obliczeniowych
Lina przerywana na szerszym diagramie architektury odnosi się wyłącznie do obliczeń self-hosted, natomiast eksperyment CSV pozostaje na obliczeniach hostowanych przez OpenAI. Self-hosting zaczyna się opłacać, gdy zadanie wymaga określonego obrazu, dostępu do sieci prywatnej lub maszyn już istniejących w Twojej flotylli. W tym środowisku uruchamiasz codex exec-server, przekazując mu zdalną adresację URL oraz identyfikator środowiska, które przychodzą wraz z ograniczonym kluczem skierowanym na to środowisko, natomiast główny klucz aplikacji powinien pozostać poza nim.
Następnie aplikacja jest odpowiedzialna za przygotowanie zasobów, przechowywanie danych, ponowne połączenie oraz rozwiązanie zasobów. Usunięcie sesji OpenAI nie zatrzymuje obliczeń dostawcy, a ponowne użycie identyfikatora środowiska nie przywraca plików na zastępczą maszynę.
Samohostowanie również nie sprawia, że cała usługa jest lokalna. Obecna API Agents przechowuje stan sesji, obsługuje przechowywanie danych w Stanach Zjednoczonych i nie wspiera polityki zerowego przechowywania danych.
Koszty należy wziąć pod uwagę przy podejmowaniu decyzji. Tokeny modeli oraz obliczenia w chmurze są fakturowane oddzielnie, a ceny kontenerów zależą od ilości pamięci oraz interwałów fakturowania, dlatego należy rejestrować rzeczywiste zużycie i nie szacować rachunku za próbny okres wyłącznie na podstawie upływu sekund.
07 Uruchamianie eksperymentu
Uruchamianie go kosztuje prawdziwe pieniądze, ponieważ wymaga oddzielnie fakturowanego korzystania z API w postaci kredytów lub aktywnego układu fakturowania API, a subskrypcja Pro nie pokrywa kosztów tych połączeń. Narzędzie to łączy się z GPT-6 Astra (gpt-6-astra), więc liczne próby lub długotrwałe uruchomienia agenta mogą szybko wyczerpać kredyty, a czas pracy w hostowanym środowisku sandbox dodatkowo generuje opłaty za obliczenia. Najpierw spróbuj raz, sprawdź panel sterowania zużyciem oraz przeczytaj stronę z cenami Astry, zanim uruchomisz więcej prób.
Wewnątrz repozytorium utwórz środowisko wirtualne i zainstaluj zdefiniowane SDK. Potrzebny jest klucz API aplikacji, który daje uprawnienia do czytania i zapisywania sesji oraz do wykonywania inferencji modelu. Każda próba zużywa żywe tokeny API oraz zasoby obliczeniowe w chmurze.
cd openai-agents-api
python -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txt
export OPENAI_API_KEY="your-key"
python sandbox_check.py --seed 42 # Start with one trial
# python sandbox_check.py 5 --seed 42 # Optional: five trials
Pierwszy polecenie uruchamia jedno doświadczenie z seedem 42, natomiast opcjonalne polecenie dla pięciu doświadczeń uruchamia seedy od 42 do 46. Wyniki trafiają do nowego katalogu runs/, przy czym każde doświadczenie ma własną folder. Wersja SDK to openai==3.13.0, a plik README opisuje pliki wyjściowe oraz opcje poleceń.
trial-001/
data.csv # Exact input
expected.json # Local reference
request.json # Submitted configuration
session.json # Latest retrieved session
turns.json # Turn status, timestamps, usage
items.json # Saved messages and tool calls
artifacts.json # Published file metadata
summary.json # Downloaded result
calculate.py # Downloaded agent script
result.json # Checks, timing, errors, cleanup
Nieudane próby zachowują wszystkie pliki uzyskane przed awarią. Kod wyjścia równy zero wymaga dokładnej weryfikacji wyników oraz potwierdzonego usunięcia sesji po każdej próbie. Aby przetestować narzędzie lokalnie bez żadnych wywołań API:
python -m unittest discover -s . -p test_sandbox_check.py -v
Bez łączenia się z siecią, zestaw testów sprawdza obliczenia referencyjne, błędne wyniki modelu, przestarzałe lub brakujące artefakty, nieudane sesje i rundy, wymagane działania, błędy żądań, obsługę terminów oraz problemy z usuwaniem danych. Zrewidowany narzędzie do wykonywania testów nie zostało jeszcze zweryfikowane w kontekście rzeczywistego serwisu.
Trwałą wartością projektu jest możliwość powtarzalnej weryfikacji tego, w jaki sposób API Agentów przenosi dane z plików do artefaktów. Zakończona runda stanowi jeden sygnał, natomiast pobraany i niezależnie sprawdzony wynik to prawdziwy test akceptacji. Dokumentacja została sprawdzona 15 września 2026 roku, wartości próbne pochodzą z oryginalnego eksperymentu bez nowych pomiarów w warunkach rzeczywistych, a podlinkowane przewodniki opisują obecną wersję beta, która może ulec zmianie.
Literatura pokrewna
- Tworzenie pierwszego agenta LangChain za pomocą LangGraph w 2026 roku — Buduj agenta LangChain krok po kroku z wykorzystaniem LangGraph, narzędzi, pamięci i śledzenia, unikaj czterech powszechnych błędów i dowiedz się, jak biuro obsługi uczestników bootcampu go wykorzystało.
- Praktyczne notatki: Qwen 3.8 wreszcie jest dostępny, kodowanie agentowe poziomu Opus z lokalnym uruchomieniem — Szczegółowy przewodnik po praktycznych notatkach: Qwen 3.8 wreszcie jest dostępny, kodowanie agentowe poziomu Opus z lokalnym uruchomieniem: kontrakty, sprawdzania oraz miejsca na kod do wstawienia dla zespołów wdrażających ten model.