Головна / Статті

Тест сандбоксу для API агентів: CSV Runner, перевірка артефактів та обробка невдач

Тестування сандбоксу API OpenAI Agents: Python-запускач надсилає CSV-файл, отримує результати та перевіряє сам огляд у форматі JSON. Враховуються помилки та витрати.

Видавець: REACTAPP.TOP9 хв читання2177 слів

Джерела: Testing the OpenAI Agents API with a Hosted Sandbox

Цей експеримент починається з конкретного запитання: чи може сесія Agents API приймати файл, обробляти його у «пісочниці» та повертати результат, який можна перевірити? На це запитання відповідає невеликий Python-запускач. Вхідними даними є CSV-файл з транзакціями, який містить чотири продажі, одну повернення грошей та один недійсний рядок. Агент створює JSON-підсумок, а додаток самостійно обчислює очікувану відповідь, щоб їх можна було порівняти. Усі думки тут є особистими та ґрунтуються на тестуванні з особистим обліком OpenAI у плані Pro, а також на документації, яка була доступна на той момент.

10 вересня 2026 року API Agents від OpenAI вийшов у публічну бета-версію, представивши керований інструментарій Codex, який забезпечує роботу циклу моделі та інструментів. Додаток, що викликає цей інструментарій, визначає завдання та місце виконання команд. Далі описано, як будується виконувач. П’ять записаних тестів були отримані з попередньої версії. Оновлений виконувач забезпечує відтворюваність результатів та зберігання доказів, причому наразі його перевіряли лише офлайн.

01 Як взаємодіють компоненти API Agents

Чотири елементи мають залишатися окремими. Агент несе модель, інструкції та інструменти. Середовище забезпечує необов’язкові обчислювальні ресурси. Сесія об’єднує всю роботу протягом певного часу. Події та елементи інформують про те, що відбувається зараз та що було збережено. Одна ітерація — це один прохід по цьому циклу.

Схема роботи в цьому експерименті виглядає так: запускач на Python відкриває сесію та отримує результати, тоді як OpenAI керує інструментарієм та сандбоксом для виконання.

Перше питання дизайну стосується того, де має знаходитися цикл агента. За допомогою API Agents OpenAI хостить інструментарій та забезпечує стабільність сесій. SDK Agents виконує цей цикл у вашому власному додатку, тож ви самі вибираєте спосіб зберігання даних та інтеграції. API Responses забезпечує прямий доступ до моделі та залишає решту робочого процесу на ваш розсуд.

Responses також можуть виконувати команди шелу, тому для обчислень у форматі CSV не потрібен API Agents. Запускач використовує цей API для виконання всього процесу від сесії до результату. Кожна спроба створює нову сесію та виконує одне завдання; при цьому не перевіряється можливість збереження інформації між кількома кроками чи використання підагентів.

02 Чому потрібен хостований сандбокс

Для цієї роботи потрібно лише місце для зберігання CSV-файлу та файлу Python, який генерує агент. Вона не вимагає приватної мережі чи спеціального образу, тому виконувач обирає openai_hosted із вимкненою мережею sandbox. Альтернативи переважно змінюють того, хто володіє робочим простором, та спосіб отримання файлів назад.

Значення none означає відсутність файлової системи середовища та вбудованої можливості виконання Bash, хоча функції додатку та віддалені сервери MCP все ще можуть виконувати код в іншому місці. За параметром self_hosted OpenAI продовжує керувати інфраструктурою, але ви самі керуєте середовищем виконання.

Обробка результатів також залежить від цього вибору. Файли в самостійно організованому середовищі не публікуються через API Artifacts від OpenAI, навіть якщо агент зберігає їх у директорії /workspace/outputs. Ваш додаток мусить самостійно їх отримувати та зберігати.

Налаштування хостингу, які мають значення тут

Гід з хостингу також охоплює змінні середовища, навички, плагіни та каталоги можливостей. Тут достатньо файлів-насінь та вимкненого доступу до мережі сандбоксу. Віддалені з’єднання MCP починаються з сервісу OpenAI, тому налаштування виходу з сандбоксу не слід розглядати як політику для кожного з’єднання з інструментом.

03 Всередині виконувача CSV

Код знаходиться у файлі openai-agents-api/sandbox_check.py, а повний приклад — у каталозі openai-agents-api репозиторію techforum-repo ai-agents-experimentation на GitHub. Виконувач генерує суми у вигляді цілих сантимів та зберігає своє насіння. Кожен CSV навмисно містить складні випадки: символи валют, роздільники тисяч, зайві пробіли, від’ємну суму повернення та запис N/A.

Вхідні дані seed-42

amount,note
 $981.96 ,sale
" $1,838.10 ",sale
 $42.78 ,sale
-$100.12,refund
N/A,voided
 $155.92 ,sale

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

{
  "total_cents": 291864,
  "valid_rows": 5,
  "invalid_rows": 1
}

Надіслані інструкції

Агенту передають CSV-файл разом із письмовим завданням, причому очікувана відповідь ніколи не виходить за межі додатку. Суть завдання: створити файл /workspace/outputs/calculate.py та запустити його за допомогою Python; завантажити файл /workspace/data.csv; видалити з кожної суми пробіли, знаки долара та роздільники тисяч; проігнорувати значення, які не є числовими, але зберегти від’ємні суми повернення; виконувати обчислення за допомогою Decimal або цілих сантів, але ніколи не за допомогою двійкових чисел з плаваючою комою; створити файл /workspace/outputs/summary.json із рівно трьома цілими полями під назвами total_cents, valid_rows та invalid_rows; підрахувати кожен рядок даних лише один раз, виключивши заголовковий рядок; а також зберегти файл calculate.py як результат виконання завдання.

Функція run_trial() відкриває сесію за допомогою client.beta.agents.sessions.create(), передаючи gpt-6-astra та відповідні інструкції як агента, а також завантажує файл /workspace/data.csv у вигляді баз64-коду. Середовище — openai_hosted, а параметр network.access встановлений як disabled. Це той самий шлях API, який використовувався у початковому експерименті.

Що перевіряється та зберігається

  1. Відстежування правильного кроку. Після отримання сесії програма перевіряє кореневий крок. Невдала сесія, необхідна дія, невдалий крок, скасування чи вичерпання ліміту опитувань призводять до окремих результатів.
  2. Завантаження обох запитаних файлів. Файли summary.json та calculate.py порівнюються за шляхом та ідентифікатором кроку, тому відсутній чи застарілий файл ніколи не може бути прийнятий.
  • Перевірте підсумок. Рівно три цілочисельні поля мають збігатися з локальним посиланням: загальна сума в центах, кількість дійсних рядків та кількість недійсних рядків. Парсер відхиляє додаткові, відсутні, дубльовані, булеві, дійсні та нескінченні значення.
  • Зберігайте докази. Для кожної спроби програма зберігає вхідні дані, очікувану відповідь, запит, найновішу сесію, записи ходів, збережені елементи, метадані артефактів, завантажені файли та файл з результатом, який можуть обробити машини.
  • Довідник з артефактами пояснює, як файли пов’язані з ходами, а довідник з можливістю спостереження охоплює перевірку діяльності команд. Автоматизована перевірка підтверджує наявність файлів та точність структурованого виводу. Збережений скрипт та елементи все одно потребують перевірки, перш ніж хтось стверджуватиме, як було виконано обчислення. Завантажений код ніколи не виконується на машині додатку.

    04 Що показують п’ять записаних спроб

    Оригінальний запуск зафіксував свої результати 15 вересня 2026 року, причому у кожному тесті використовувався новостворений випадковим чином CSV-файл. Ці дані були взяті з того запуску. Це спостереження з боку клієнта, зроблені після відповіді про створення, а часи включають як створення сеансу, так і завантаження результатів.

    Усі п’ять сум, повідомлених агентом, збігалися з базовими даними. Для перевірки використовувалась арифметика з плаваючою комою з толерантністю менше одного відсотка. Часи фіксують момент, коли під час опитування вперше відбулося зміна стану та сеанс став стабільним, тому вони не відображають ні точний час виконання на сервері, ні загальну затримку від початку до кінця. П’ять успішних тестів описують те, що відбулося під час одного невеликого запуску, і нічого не говорять про загальний рівень надійності.

    Що змінює оновлений запуск

    Переглянутий варіант програми повторює той самий невеликий експеримент, але з більш суворою визначеністю поняття успіху. Цілі значення центів та кількість рядків порівнюються точно, кожен вхідний даний зберігається, а створений скрипт та історія сеансу також зберігаються. Відлік часу починається ще до створення сеансу, причому завантаження та перевірка фіксуються окремо. Вісім тестів в офлайн-режимі перевіряють ці критерії, а наведені вище показники все ще належать до попереднього робочого запуску.

    05 Обробка помилок

    Цикл опитування використовує чітко визначені таймаути HTTP, вимикає автоматичні спроби повтору та перевіряє залишок бюджету спроб між запитами. Цей бюджет не є жорстким таймером для зупинки процесу. Програма фіксує результат перед спробою очищення, і навіть у разі правильної відповіді разом із невдалою спробою очищення код завершення залишається ненульовим.

    Сесія може мати чотири статуси: idle, in_progress, requires_action та failed. Конфігурація завдання у форматі CSV не визначає жодних інструментів функцій додатку, тому якщо коли-небудь знадобиться дія, виконувач зберігає цей статус та повідомляє про нього для перевірки, замість того щоб чекати нескінченно.

    Прямі трансляції не відтворюють події, які були пропущені. Щоб відновити вигляд додатку, необхідно знову під’єднатися та накопичити надходжені події під час отримання збережених елементів сесії, а потім узгодити їх за ідентифікатором елемента. Це відновлює відображення збереженої роботи, проте не гарантує, що перервана команда була виконана успішно.

    Один відповідний інцидент заслуговує на увагу. У попередніх звітах про розслідування описувалися сеанси, які залишалися нерухомими без видимих ходів, а у звіті OpenAI про інцидент від 14 вересня 2026 року йдеться про затримку або блокування початку ходів о 13:30 за тихоокеанським часом того дня, які згодом були визнані вирішеними. Симптоми збігаються, але без доказів на рівні запитів вони не доводять причину кожної локальної несправності. Порівняйте статус послуги з збереженими даними сеансу та помилками ходів. Запускач записує невдалі сеанси, невдалі ходи, відсутні артефакти, недійсні підсумки та неправильні результати як окремі події, і більше не вважає непомічений хід доказом повернення старого інциденту.

    Як тільки результати стають доступними та зберігаються, виконавець просить скасувати процес, якщо робота не завершена, та намагається видалити сеанс, роблячи до трьох спроб у разі конфлікту під час видалення. Будь-які помилки при очищенні залишаються записаними у result.json. Якщо створення сеансу зазнає невдачі до того, як буде повернений ID, очищення за ID неможливе, і виконавець фіксує цю невизначеність.

    Хостоване робоче середовище може закінчити свою дію через годину без діяльності чи сигналів про життєздатність, тоді як підключені пісочниці отримують такі сигнали між етапами роботи. Опубліковані результати залишаються актуальними після закінчення терміну дії середовища, але необхідні результати слід зберегти перед видаленням сеансу.

    06 Коли варто використовувати власні обчислювальні ресурси

    Пунктирна лінія на більш детальній схемі архітектури стосується лише самостійно розгорнутих обчислювальних ресурсів, тоді як експеримент з CSV залишається на обчислювальних ресурсах OpenAI. Самостійне розгортання стає вигідним, якщо завдання вимагає певного зображення, доступу до приватної мережі чи машин, які вже є у вашому парку. У цьому середовищі ви запускаєте codex exec-server, передаючи йому віддалений URL та ідентифікатор середовища, які надходять разом із обмеженим ключем, прив’язаним до цього середовища, тоді як загальний ключ додатку має залишатися поза ним.

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

    Самостійне хостингування також не робить усю послугу локальною. Чинний API Agents зберігає стан сеансу, підтримує розміщення даних у США та не підтримує принцип нульового зберігання даних.

    Витрати мають враховуватися під час прийняття рішення. Токени моделей та обчислювальні ресурси, що надаються, оплачуються окремо; ціни на контейнери залежать від обсягу пам’яті та інтервалів оплати, тому необхідно фіксувати реальне споживання та не оцінювати суму рахунку за пробний період лише на основі кількості минулих секунд.

    07 Запуск експерименту

    Його запуск коштує реальних грошей, оскільки потрібне окреме оплата використання API у вигляді кредитів або діюча угода з оплатою API, причому підписка Pro не покриває витрати на ці виклики. Захід для запуску використовує GPT-6 Astra (gpt-6-astra), тому багато пробних запусків або тривалі роботи агента можуть швидко спожити кредити, а час роботи у хостованому сендбоксі додає додаткові витрати на обчислення. Спочатку спробуйте один пробний запуск, перегляньте панель керування використанням та прочитайте сторінку з цінами Astra перед тим, як запускати ще.

    Усередині репозиторію створіть віртуальне середовище та встановіть потрібний SDK. Потрібен API-ключ додатку з дозволом на читання та запис сеансів та на виконання інференції моделі. Кожен пробний запуск споживає токени живого API та ресурси хостованих обчислень.

    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
    

    Перша команда запускає один тест із налаштуванням seed 42, а необов’язкова команда з п’ятьма тестами запускає налаштування seed від 42 до 46. Результати зберігаються у новому каталозі runs/, де кожен тест має власну папку. Версія SDK — openai==3.13.0, а у документації README описано файли вихідних даних та опції команд.

    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
    

    Провалені запуски зберігають усі файли, які були отримані до виникнення проблеми. Код вихіду 0 вимагає точної перевірки результатів та підтвердженого видалення сесії після кожної спроби. Щоб протестувати засіб виконання локально без будь-яких викликів API:

    python -m unittest discover -s . -p test_sandbox_check.py -v
    

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

    Довгострокова цінність проекту полягає у можливості повторювано перевіряти, як API Agents переміщує дані від файлу до артефакта. Завершений етап є лише одним сигналом, тоді як завантажений та незалежно перевірений результат є справжнім тестом прийняття. Документація була перевірена 15 вересня 2026 року; пробні значення походять з початкового експерименту без нових показників з реального сервісу, а посилані посібники описують поточну версію бета-тесту, яка може змінитися.