Главная / Статьи

Тест среды Sandbox для API-агентов: CSV Runner, проверка артефактов и обработка сбоев

Тестирование среды симуляции для API OpenAI Agents: Python-скрипт отправляет файл CSV, загружает полученные данные и проверяет само резюме в формате JSON. Учитываются случаи сбоев и связанные с ними затраты.

Издатель: REACTAPP.TOP9 мин чтения2177 слов

Источники: Testing the OpenAI Agents API with a Hosted Sandbox

Этот эксперимент основан на конкретном вопросе: может ли сессия 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 с отключенной сетью сандбокса. Другие варианты в основном влияют на то, кто владеет рабочей средой и как возвращаются файлы.

Значение 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 в формате base64. Среда выполнения — 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. Если создание сессии сорвётся до того, как будет возвращён идентификатор, очистка по этому идентификатору становится невозможной, и исполнитель фиксирует эту неопределённость.

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

    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
    

    Первая команда запускает один тест с семенем 42, а опциональная команда с пятью тестами запускает тесты с семенами от 42 до 46. Результаты сохраняются в новой папке runs/<timestamp>, причем для каждого теста создается отдельная папка. Установленная версия 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 года; пробные значения взяты из первоначального эксперимента без использования новых данных из реального сервиса, а приведённые ссылки описывают текущую бета-версию, которая может измениться.