Repository navigation
feat(enterpriseops_gym): run EnterpriseOps-Gym on OpenSandbox with Stirrup - #5000
Conversation
8f9520f to
6ead18e
Compare
|
🌿 Preview your docs: https://nvidia-preview-pr-5000-6ead18ef36f4.docs.buildwithfern.com/nemo/gym |
…irrup Add ServiceNow's EnterpriseOps-Gym as a benchmark, run the way Artificial Analysis runs EnterpriseOps-Gym-AA: the Stirrup harness with only each task's oracle tools, a 100-turn cap, 3 repeats and strict pass@1. - resources_servers/enterpriseops_gym: for each task, start its gym servers from the upstream images in sandboxes (OpenSandbox), seed the task databases from the pinned upstream dumps, forward the agent's tool calls to the gym that owns each tool, and score the final database state with the task's SQL verifiers. Verifier semantics are checked against goldens produced by the upstream harness. - benchmarks/enterpriseops_gym: prepare the 649 public oracle tasks from the pinned Hugging Face dataset and pair the server with the Stirrup agent through an environment-server taskset. - responses_api_agents/stirrup_agent: add `code_exec` (default true) to leave out the shell tool when the task's tools are the only tools. Signed-off-by: Khushi Bhardwaj <kbhardwaj@nvidia.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
6ead18e to
eebb0f8
Compare
cmunley1
left a comment
There was a problem hiding this comment.
tested a rollout, worked smoothly!
|
🔄 Merge queue validation started! You can track the progress here: https://github.com/NVIDIA-NeMo/Gym/actions/runs/40048740820 |
|
🔄 Merge queue validation started! You can track the progress here: https://github.com/NVIDIA-NeMo/Gym/actions/runs/40050482626 |
|
🔄 Merge queue validation started! You can track the progress here: https://github.com/NVIDIA-NeMo/Gym/actions/runs/40054852036 |
|
🔄 Merge queue validation started! You can track the progress here: https://github.com/NVIDIA-NeMo/Gym/actions/runs/40114833043 |
#4679 made check_resources_session_contract require typed refusals and masked verifies for lost sessions, which failed this server's contract test in the merge queue. - Serialize seed and close with ResourcesSessionFence, which also bounds how long a closed session is remembered. - Refuse an unrunnable task with ResourcesSeedRejectedError (422) and a conflicting seed or close with ResourcesSessionConflictError (409); a close for another episode was a 500 that re-dispatched the episode. - Set the session cookie only after a seed succeeds. - Answer a tool call for a session the server no longer holds with ResourcesSessionLostError (404), and its verify with a masked session_lost sample instead of a 409. Signed-off-by: Khushi Bhardwaj <kbhardwaj@nvidia.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
/ok to test d146e81 |
|
🔄 Merge queue validation started! You can track the progress here: https://github.com/NVIDIA-NeMo/Gym/actions/runs/40210724713 |
What does this PR do?
Adds ServiceNow's EnterpriseOps-Gym as a benchmark. It runs the way Artificial Analysis runs EnterpriseOps-Gym-AA:
The gym servers run in per-task sandboxes from Gym's sandbox provider (OpenSandbox), the same way SWE-bench and GDPVal run.
Part of #909.
Related open work:
simple_agentand a turn-logging agent, and keeps upstream's name-collapsed scoring.#2142 and #4944 both also add
resources_servers/enterpriseops_gym, so maintainers will need to choose the layout.resources_servers/enterpriseops_gym(new)/seed_session:/health, then seeds a fresh database from the task's dump in upstream'sgym_dbs.zip, which is pinned by sha256.POST /{tool_name}:/verify:verifier_pass_rateand per-verifier expected and actual values.evaluation_completed: falseandfailure_kind: verifier_error, so the row is not read as a hard task.num_workers: 1is enforced and sessions are locked per session.task_data.pydefines the row schema.VERIFIER_FIXTUREscores final database states built in SQLite.pass@1[avg-of-k]of success and of verifier pass rate, overall and per domain.benchmarks/enterpriseops_gym(new)prepare.pywrites the 649 public oracle tasks fromServiceNow-AI/EnterpriseOps-Gym@c8e538e. Tool schemas come from the images'tools/list, snapshotted innvidia/NeMo-Gym-EnterpriseOps-Assets@8918dc6.stirrup_agentthrough asingle_agent_turn_legacyenvironment server (tasksetenterpriseops_gym).responses_api_agents/stirrup_agentcode_execoption, defaulttrue, which keeps current behavior. The benchmark sets it tofalse, so the model gets only the task's tools and Stirrup'sfinish.Deliberate differences from the upstream harness (documented in the server README):
equals,greater_thanandless_than. 20 public tasks expect"1"from aCOUNT(*); the same tasks in the dataset'splus_*_toolsconfigs expect1.Validation
Run against the final diff unless noted:
pre-commit run --all-files: pass.gym env test +entrypoint=resources_servers/enterpriseops_gym +should_validate_data=true: 71 passed; example data validated.gym env test +entrypoint=responses_api_agents/stirrup_agent +should_validate_data=true: 169 passed.test_an_agent_that_runs_out_of_wall_time_answers_with_its_partial_run_as_incompletehas a 4 s wall-time budget. It failed in 3 of 5 local suite runs on a heavily loaded shared login node (load average around 80); it passes in CI (5.3 s) and when rerun alone.code_exec: truepath, which this PR does not change.gym env validate enterpriseops_gym --kind benchmark --sync: pass, with nothing to sync. Datasets: 649 benchmark rows and 5 example rows.gym dataset collate "+config_paths=[benchmarks/enterpriseops_gym/config.yaml]" +mode=example_validation: produceddata/example_metrics.json.data/example_rollouts.jsonlholds the 5 example tasks run through Stirrup with GLM-5.3-Flash; 3 pass.Exit checks (add-benchmark Step 7), on the results run below:
quality_summary.json: 1,947 healthy, 0 unhealthy, 0 unobserved; 0 failed rollouts; 0 sandboxes left behindscripts/inspect_harness_conformance.py --bundle rollouts.jsonl --capture-dir model-calls(gym-p0/v1): TE-1 to TE-9 fulfilled for 1,947/1,947 rollouts, exit 0gym eval rundoes not writeresolved-config.yaml(only thegym eval submitexecutors do). The exact command is below.Parity with the upstream harness, in the spirit of #2142's PARITY.md. The public set has no reference solutions, so 100% oracle runs are not possible; the checks compare against upstream's own code instead.
tests/verifier_golden.jsoncomes from running upstream'sVerifierEngine: 12 kinds of/api/sql-runneranswer and 660 combinations of actual value, expected value and comparison. The server matches all of them except the 21 that compare a number with a numeric string, which is the intended difference.create_database_from_file,MCPClient,VerifierEngine), with the recorded tool calls remapped to newly generated IDs.datetime('now')and the replay ran six hours later.Rollouts
Results run
nvidia/zai-org/glm-5.3-flash), temperature 1.0 (the lab's recommendation, set on the agent),top_p0.95.gym eval run --benchmark enterpriseops_gym --model-type openai_model --model nvidia/zai-org/glm-5.3-flash --model-url https://inference-api.nvidia.com/v1 --model-api-key <key> --split benchmark --concurrency 64 --output <run>/rollouts.jsonl ++enterpriseops_gym_stirrup_agent.responses_api_agents.stirrup_agent.temperature=1.0 ++observability_enabled=true ++model_call_capture_dir=<run>/model-calls.licensefield and the committed example artifacts.Run details
gym eval compareagainst the last of them gives Δ −0.5 pt, with a 95% CI of [−3.1, +2.1] pt on mean reward.finish. Rollouts averaged 7.6 model calls, 12.2 tool calls and 2.3k output tokens (1.1k reasoning).evaluation_completed: false: the 3 tasks whose verifier SQL is broken, times 3 repeats.Comparison with AA
Compatibility and benchmark impact
stirrup_agent: the newcode_execoption defaults totrue, so existing configs such as GDPVal are unchanged.verified: false. The only published reference for this model is AA's 1,117-task score, and this run used GLM-5.3-Flash rather than a frontier model, so baselining is left to maintainers.images.rewrites.create_send_as_aliasinternal error.Checklist
pre-commit run --all-files) (so CI lint/format checks pass).git commit -s) (so the DCO check passes).🤖 Generated with Claude Code