Repository navigation
Conversation
Contributor
ritaneves
force-pushed
the
docs/evaluation-page
branch
from
June 24, 2026 07:53
92d7bec to
1a84541
Compare
ritaneves
marked this pull request as ready for review
June 24, 2026 10:49
sephmard
requested changes
Jun 24, 2026
sephmard
left a comment
Contributor
There was a problem hiding this comment.
Thanks for working on this @ritaneves. Added some comments for review.
Contributor
Author
|
Hi @sephmard , thank you for the great comments :) If you're happy to approve, I'll close |
ritaneves
force-pushed
the
docs/evaluation-page
branch
from
June 25, 2026 14:13
20e0e51 to
bac5e30
Compare
sephmard
requested changes
Jun 25, 2026
sephmard
left a comment
Contributor
There was a problem hiding this comment.
Looks great Rita. Two comments:
- Suggest moving the
Add a benchmarkinto theEvaluationtab. We can do this as a follow-up, but since this PR is touching a lot. Thought it good to include. - I suggest some light revisions on the BLADE tutorial to clarify more on the analysis tool.
## Summary - Add a NeMo-Gym `ns_tools` config that exposes `WikipediaSearchTool` through the existing NeMo-Skills ToolManager bridge. - Add a focused config test to keep the resource-server wiring valid. - This is the Gym-side companion to NVIDIA-NeMo/Skills#1419. Replaces fork-origin PR #1217 so CI can run with full repository secrets. ## Test plan - `PYTHONPATH=. python -m pytest resources_servers/ns_tools/tests/test_wikipedia_mcp_config.py -q --tb=short` --------- Signed-off-by: tamohannes <hovhannes.tamoyan@gmail.com> Co-authored-by: Christian Munley <cmunley@nvidia.com> Signed-off-by: Rita Fernandes Neves <rfernandesne@nvidia.com>
## Summary - Add a NeMo-Gym `ns_tools` config that exposes `PeriodictableTool` through the existing NeMo-Skills ToolManager bridge. - Add a focused config test to keep the resource-server wiring valid. - This is the Gym-side companion to NVIDIA-NeMo/Skills#1421. Replaces fork-origin PR #1219 so CI can run with full repository secrets. ## Test plan - `PYTHONPATH=. python -m pytest resources_servers/ns_tools/tests/test_periodictable_mcp_config.py -q --tb=short` --------- Signed-off-by: tamohannes <hovhannes.tamoyan@gmail.com> Co-authored-by: Christian Munley <cmunley@nvidia.com> Signed-off-by: Rita Fernandes Neves <rfernandesne@nvidia.com>
## Summary - Adds automated Claude Code review on PR `opened`/`reopened`/`ready_for_review`, plus manual re-trigger via `/claude review` comment - On-call engineer persona with BLOCKER/RISK/NOTE grading and SHIP/SHIP WITH CARE/HOLD verdict — modeled on [NeMo-CI-TF-States #110](NVIDIA-NeMo/NeMo-CI-TF-States#110) - No preflight job needed — gates directly on `author_association ∈ {OWNER, MEMBER, COLLABORATOR}` using only `ANTHROPIC_API_KEY` ## Test plan - [ ] Confirm `ANTHROPIC_API_KEY` secret has visibility for this repo in the NVIDIA-NeMo org - [ ] Open a test PR and verify `auto-review` job triggers - [ ] Comment `/claude review` and verify `manual-review` job triggers 🤖 Generated with [Claude Code](https://claude.com/claude-code) Signed-off-by: Kajal Jain <kajalj@nvidia.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Signed-off-by: Rita Fernandes Neves <rfernandesne@nvidia.com>
## Changes Documents the `use_absolute_ip` global config option on the Fern **Configuration** reference page (`fern/versions/latest/pages/reference/configuration.mdx`): - Adds it to the `env.yaml` example block. - Adds a short **Multi-Node Configuration** subsection explaining default (`127.0.0.1`), when to use it (multi-node / Ray clusters), and its effect (`gethostbyname(gethostname())`). ## Why a fresh PR This supersedes #595, which documented the same option but targeted `docs/reference/configuration.md` — a path that no longer exists after the docs migration to Fern. The option itself is still live (`nemo_gym/global_config.py`) and was undocumented in the current docs. Content ported and adapted to the Fern page. Closes #595 🤖 Generated with [Claude Code](https://claude.com/claude-code) Signed-off-by: Lawrence Lane <llane@nvidia.com> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> Signed-off-by: Rita Fernandes Neves <rfernandesne@nvidia.com>
## Summary - Add a NeMo-Gym `ns_tools` config that exposes `CoolPropTool` through the existing NeMo-Skills ToolManager bridge. - Add a focused config test to keep the resource-server wiring valid. - This is the Gym-side companion to NVIDIA-NeMo/Skills#1420. Replaces fork-origin PR #1218 so CI can run with full repository secrets. ## Test plan - `PYTHONPATH=. python -m pytest resources_servers/ns_tools/tests/test_coolprop_mcp_config.py -q --tb=short` --------- Signed-off-by: tamohannes <hovhannes.tamoyan@gmail.com> Co-authored-by: Christian Munley <cmunley@nvidia.com> Signed-off-by: Rita Fernandes Neves <rfernandesne@nvidia.com>
## Summary - Add a NeMo-Gym `ns_tools` config that exposes `ParticleTool` through the existing NeMo-Skills ToolManager bridge. - Add a focused config test to keep the resource-server wiring valid. - This is the Gym-side companion to NVIDIA-NeMo/Skills#1422. Replaces fork-origin PR #1220 so CI can run with full repository secrets. ## Test plan - `PYTHONPATH=. python -m pytest resources_servers/ns_tools/tests/test_particle_mcp_config.py -q --tb=short` --------- Signed-off-by: tamohannes <hovhannes.tamoyan@gmail.com> Co-authored-by: Christian Munley <cmunley@nvidia.com> Signed-off-by: Rita Fernandes Neves <rfernandesne@nvidia.com>
## Summary - Add a NeMo-Gym `ns_tools` config that exposes `RadioactivedecayTool` through the existing NeMo-Skills ToolManager bridge. - Add a focused config test to keep the resource-server wiring valid. - This is the Gym-side companion to NVIDIA-NeMo/Skills#1423. Replaces fork-origin PR #1221 so CI can run with full repository secrets. ## Test plan - `PYTHONPATH=. python -m pytest resources_servers/ns_tools/tests/test_radioactivedecay_mcp_config.py -q --tb=short` --------- Signed-off-by: tamohannes <hovhannes.tamoyan@gmail.com> Co-authored-by: Christian Munley <cmunley@nvidia.com> Signed-off-by: Rita Fernandes Neves <rfernandesne@nvidia.com>
…1612) vLLM computes `logprobs = top_logprobs if logprobs else None`, so a request carrying an explicit `top_logprobs` field makes vLLM return no logprobs. That empties the captured token ids and silently zeroes the training loss mask, which freezes RL training with no error. - Pin `top_logprobs=0` when `return_token_id_information` is set, so capture is independent of any value inherited from the request or dataset - Drop a null `top_logprobs` on the non-capture path before forwarding - Raise a clear error when capture is requested but vLLM returns no logprobs, instead of an opaque TypeError or silently empty training data supersedes #1013 Signed-off-by: Ananth Subramaniam <ansubramania@nvidia.com> Signed-off-by: Rita Fernandes Neves <rfernandesne@nvidia.com>
Migrates the SciCode benchmark from nemo-skills into nemo-gym.
**How it works in gym:**
- Architecture - Multi-step: the agent makes one model call per
sub-step, accumulating its own prior-step code as context, then submits
the accumulated solutions to `/verify`. N model calls per problem (N
varies).
- Execution - Resources server runs each sub-step's accumulated code in
a Ray subprocess against ground-truth targets in `test_data.h5`.
- Test data - `test_data.h5` must be staged manually from the official
SciCode Google Drive.
- Reward - Binary per problem (`1.0` iff every sub-step passes), same as
skills' problem-level accuracy.
- Headline metric - `subtask_accuracy` (total sub-steps passed / total)
via `compute_metrics`/`get_key_metrics` override on the agent.
Numerically equal to nemo-skills' `pass@1[avg-of-3]/subtask_accuracy`.
**Test results:**
With ultra mopd/step36 checkpoint:
```
Key metrics for scicode_benchmark_agent:
{
"mean/reward": 0.19583333333333333,
"mean/num_steps_passed": 1.8875,
"mean/num_steps_total": 4.225,
"mean/problem_accuracy": 0.19583333333333333,
"mean/input_tokens": 3554.2,
"mean/output_tokens": 5608.7125,
"mean/total_tokens": 9162.9125,
"subtask_accuracy": 0.4467455621301775
}
```
wandb: https://wandb.ai/nvidia/fsiino-gym-dev/runs/3jom33yh
---------
Signed-off-by: Frankie Siino <fsiino@nvidia.com>
Signed-off-by: Rita Fernandes Neves <rfernandesne@nvidia.com>
Fixes DCO issue in #1537 -- Migrates the CritPt benchmark from nemo-skills into nemo-gym. This keeps the workflow gym-shaped (per-rollout `reward` flowing through the standard `/verify` contract). **How it works in gym:** - Architecture - Single phase: agent runs per-rollout `/run` -> `/verify`. - Batching - Resources server buffers concurrent `verify()` calls until 70 unique `problem_id`s accumulate, then fires once and resolves all 70 awaiting futures with the same aggregate accuracy - `num_repeats > 1` - Each repeat of a `problem_id` opens a new pending batch. N repeats -> N independent AA API calls. - Reward - Same as skills in that the aggregate is distributed to all batch members as their `reward`. - Headline metric - `pass@k/accuracy` via `compute_metrics` override. Numerically equal to nemo-skills' `accuracy` at `num_repeats=1`. **Test results**: With ultra mopd/step36 checkpoint: ``` Key metrics for critpt_benchmark_agent: { "mean/reward": 0.05714285714285713, "mean/accuracy": 0.05714285714285713, "mean/timeout_rate": 0.0, "mean/input_tokens": 6107.028571428571, "mean/output_tokens": 2514.1857142857143, "mean/total_tokens": 8621.214285714286 } ``` wandb: https://wandb.ai/nvidia/fsiino-gym-dev/runs/lle631hq --------- Signed-off-by: Frankie Siino <fsiino@nvidia.com> Signed-off-by: Rita Fernandes Neves <rfernandesne@nvidia.com>
…nt README (#1642) ## Summary Fixes two CI breakages on `main` introduced by the CritPt benchmark (#1588). Both fail unit/server CI for any PR once it is merged with current `main`: 1. **`resources_servers/critpt/configs/critpt.yaml`** referenced `${artificial_analysis_api_key}` with no definition or default. `list_benchmarks()` (chained via `benchmarks/critpt/config.yaml`) cannot resolve it, failing `tests/unit_tests/test_benchmarks.py::TestListBenchmarks::test_lists_found_benchmarks` and dropping unit-test coverage below the 96% gate (the errored test stops covering `benchmarks.py`). Changed to `${oc.select:artificial_analysis_api_key,null}` so it resolves to `null` when unset — matching the default-bearing pattern used by sibling configs (e.g. `labbench2_vlm`'s `${oc.select:judge_api_key,unset}`, `frontierscience_judge`'s `${oc.env:NVIDIA_API_KEY,null}`). The override key name is unchanged, so any existing `artificial_analysis_api_key` config/env override still applies. 2. **`responses_api_agents/critpt_agent`** shipped without a `README.md`. `ng_test_all` counts it as a candidate module but not a testable one, failing the total-vs-tested assertion (`Mismatch on the number of total modules found (120) ... (119)`) on **every** server-suite shard. Added a `README.md` describing the two-turn agent. ## Testing - `pytest tests/unit_tests/` → 290 passed; coverage **96.20%** (was 95.87%) - Module discovery: **120 candidates == 120 testable** - `critpt` server test is unaffected (it constructs its config directly with a dummy key and never resolves the YAML interpolation) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Signed-off-by: Lin Jia <linj@nvidia.com> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Signed-off-by: Rita Fernandes Neves <rfernandesne@nvidia.com>
This PR solves issue #1106 --------- Signed-off-by: Marta Stepniewska-Dziubinska <martas@nvidia.com> Signed-off-by: Lawrence Lane <llane@nvidia.com> Co-authored-by: Lawrence Lane <llane@nvidia.com> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> Signed-off-by: Rita Fernandes Neves <rfernandesne@nvidia.com>
…(FEP-1025) (#1637) ## What Replaces the two parallel identifier fields on `DatasetConfig` — `gitlab_identifier` and `huggingface_identifier` — with a single, self-describing discriminated `source:` block: ```yaml # GitLab source: type: gitlab dataset_name: my_dataset version: 0.0.1 artifact_fpath: train.jsonl # HuggingFace source: type: huggingface repo_id: org/dataset artifact_fpath: train.jsonl # optional ``` The `type` discriminator makes it unambiguous which fields apply, instead of two optional sibling blocks where only one may be set. ## Backward compatibility Fully non-breaking — no consumer changes required: - A **legacy `*_identifier`** is accepted, mirrored into `source`, and emits a `DeprecationWarning`. - A **`source:`** is back-filled into the matching legacy field, so existing code that reads `gitlab_identifier` / `huggingface_identifier` keeps working unchanged. - Specifying **both** `source` and a legacy identifier is rejected with a clear error. - Specifying **neither** (local `jsonl_fpath` only) remains valid. ## Tests - `tests/unit_tests/test_dataset_source.py` — 7 cases covering both backends, the legacy↔source mirroring (incl. deprecation warning), the both-set rejection, the no-source path, and discriminator validation. - Updated `test_train_data_utils.py` serialization fixture for the new `source` field. Part of the configuration-friction epic (#1205). --------- Signed-off-by: Wojciech Prazuch <wprazuch@nvidia.com> Co-authored-by: Ananth Subramaniam <ansubramania@nvidia.com> Signed-off-by: Rita Fernandes Neves <rfernandesne@nvidia.com>
…hs (#1205 #8/#12; #1488/#1489/#1490) (#1609) ## What One coherent fix for the three `config_paths` failure modes, all failing fast with a **clean message and no traceback**: | Issue | Bad input | Before | After | |-------|-----------|--------|-------| | [#1488](#1488) | typo'd / missing path | 7-frame `FileNotFoundError` | `Error: config_paths entry '...' was not found. Looked in: ...` | | [#1490](#1490) | scalar instead of list | raw Pydantic `ValidationError` (+pydantic.dev URL) | `Error: 'config_paths' must be a list of paths ...` | | [#1489](#1489) | empty / omitted (zero servers) | Ray starts, hangs until SIGTERM | `Error: No server instances are configured ...` before Ray | ## How - New `ConfigError` base in `config_types.py`; `ConfigPathNotFoundError`, `MalformedConfigPathsError`, `NoServerInstancesError` (and the existing `ServerRefNotFoundError`) inherit it. They stay ordinary exceptions, so `ng_validate` (#1599, `except Exception`) can still catch and format them. - `load_extra_config_paths` wraps `OmegaConf.load` (#1488); `parse()` wraps `ta.validate_python` (#1490). - `raise_on_no_server_instances` (validated server-instance check, not a raw key count) runs in **`RunHelper.start()`** before `initialize_ray()` — covers both run and `e2e_rollout_collection` (#1489). - A CLI decorator `exit_cleanly_on_config_error` converts any `ConfigError` to a rich-escaped message + `exit 1`, **no traceback**. Unexpected errors still propagate unchanged. ## Supersedes #1510 Consolidates [#1510](#1510): typed exceptions `ng_validate` can catch/format (a bare `SystemExit` would escape it), a validated zero-server check, the guard in `start()` so `e2e` is covered, and deterministic tests. ## Tests `test_global_config.py`: path-not-found (both-locations / dedup / absolute), malformed config_paths, zero-server (raise + pass). `test_cli.py`: the decorator (ConfigError → clean exit; non-ConfigError propagates unchanged; success passes through). 67/67 `test_global_config`+`test_cli` pass; ruff + pre-commit clean. --------- Signed-off-by: Wojciech Prazuch <wprazuch@nvidia.com> Signed-off-by: Rita Fernandes Neves <rfernandesne@nvidia.com>
… / M2) (#1635) ## What The **M2 keystone** — discover environments by name from the CLI: **1. `nemo_gym/registry.py` (new) — discovery only** - `discover_environments()` → name → `EnvironmentEntry` for every [`environments/<name>/config.yaml`](https://github.com/NVIDIA-NeMo/Gym/tree/main/environments) (name = dir), with `description`/`domain` read **without resolving interpolations/secrets** (a config referencing an unset key is still discoverable — no crash). **2. `gym list environments` (CLI wiring)** - `list_environments()` in `cli/env.py` renders discovered environments (name / domain / description) as a table, or `--json` for programmatic use — matching `gym list benchmarks` / `gym list agents` (#1671). Registered in the `gym` router; the `list` group is no longer "benchmarks only". ``` $ gym list environments ┏━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ Environment ┃ Domain ┃ Description ┃ ┡━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ workplace_assistant │ agent │ Workplace assistant multi-step tool-using env │ └─────────────────────┴────────┴───────────────────────────────────────────────┘ $ gym list environments --json [{"name": "workplace_assistant", "domain": "agent", "description": "..."}, ...] ``` ## Why Epic [#1205](#1205) friction 8. Directly answers the reviewer asks for "`gym list` by environment name". The `environments/` layout was live but unconsumed in code; this surfaces it in the CLI. ## Alignment with the unified CLI (#1434) Run-by-**name** for environments is already provided by the unified CLI's generic **`--environment`** asset selector (on `gym env start` / `gym eval run`, with `--search-dir` and `name/flavor` support). So this registry is intentionally **discovery-only** — an earlier `resolve_environment_config_paths` was removed as a duplicate of that selector. `gym list environments` is the piece the asset selectors don't provide. ## Tests `test_registry.py` (discovery: name/metadata, missing dir, malformed YAML tolerance, unset-secret tolerance, real-repo discovery) + `test_cli.py` / `test_cli_main.py` (`list_environments` table / empty / `--json` output + router dispatch incl. `--json`). Smoke-tested `gym list environments [--json]` end-to-end. ruff + pre-commit clean. --------- Signed-off-by: Wojciech Prazuch <wprazuch@nvidia.com> Signed-off-by: Rita Fernandes Neves <rfernandesne@nvidia.com>
… core) (#1671) ## What Adds `nemo_gym.agent_registry` + the **`gym list agents`** command — the foundation for RFC **M3 / friction 6** ("every agent×environment combination requires a separate config"). Maps an agent's short `<name>` (directory under `responses_api_agents/`) to its config variant(s) and classifies how each harness composes. ## `gym list agents` (CLI) Lists every discovered agent and its composition pattern — the one thing the unified CLI's generic `--<asset>` selectors can't surface. Table + `--json`, mirroring `gym list benchmarks` / `gym list environments` (#1635). ``` $ gym list agents agent composition variants description simple_agent composable (A) simple_agent swe_agents self-contained (B) swebench_openhands, ... Software engineering tasks ... ... ``` Across the repo: **23 agents — 15 Pattern A (composable), 8 Pattern B (self-contained).** ## API - `discover_agents() -> Dict[str, AgentEntry]` — one entry per agent dir; `AgentEntry(name, path, config_paths, self_contained, description)` with a `.variants` map (variant stem → config). - `resolve_agent_config_path(name, variant=None, *, require_composable=False) -> str` — explicit variant wins; a single config is used directly; a variant named after the agent is the default when several exist; otherwise raises. The run-by-name primitive consumed by the composer (#1673). - Errors: `AgentNotFoundError` (did-you-mean), `AgentVariantError` (zero-config / ambiguous), `AgentNotComposableError` (for the composer's `require_composable` guard). ## Composition classification (`self_contained`) - **Pattern A (`self_contained=False`):** references a *separate* `resources_server` → wireable into a compatible environment (e.g. `simple_agent`, `langgraph_agent`). Which harness↔resources-server pairings are actually compatible is the **composer's** concern, not the registry's. - **Pattern B (`self_contained=True`):** bundles its own environment/framework or external LLM loop (`agent_framework`; e.g. `swe_agents`, `harbor_agent`, `verifiers_agent`, `claude_code_agent`) and runs with its own config. `require_composable=True` rejects these with a clear error. - Non-agent YAML in a `configs/` dir is filtered out; zero-config agents (e.g. `aviary_agent`) are still discovered (their wiring lives in a paired benchmark/resources config). Resolution-safe (`resolve=False, throw_on_missing=False`; never starts servers), so it works with unset secrets. > Reflects @cmunley1's review: classification reframed around Pattern A vs self-contained B, field renamed `composable`→`self_contained`, and cross-pattern compatibility documented as the composer's job (separate commit, history preserved). ## Tests `test_agent_registry.py` (21 cases — A/B classification, external-harness carve-out, zero-config, variant selection, did-you-mean, `require_composable`) + `test_cli_agents.py` / `test_cli_main.py` (`gym list agents` table / empty / `--json` / router dispatch). Part of epic #1205 (M3 / friction 6). --------- Signed-off-by: Wojciech Prazuch <wprazuch@nvidia.com> Signed-off-by: Rita Fernandes Neves <rfernandesne@nvidia.com>
Signed-off-by: Rita Fernandes Neves <rfernandesne@nvidia.com>
Signed-off-by: Rita Fernandes Neves <rfernandesne@nvidia.com>
Signed-off-by: Rita Fernandes Neves <rfernandesne@nvidia.com>
Signed-off-by: Rita Fernandes Neves <rfernandesne@nvidia.com>
Signed-off-by: Rita Fernandes Neves <rfernandesne@nvidia.com>
Signed-off-by: Rita Fernandes Neves <rfernandesne@nvidia.com>
Signed-off-by: Rita Fernandes Neves <rfernandesne@nvidia.com>
Signed-off-by: Rita Fernandes Neves <rfernandesne@nvidia.com>
Signed-off-by: Rita Fernandes Neves <rfernandesne@nvidia.com>
Signed-off-by: Rita Fernandes Neves <rfernandesne@nvidia.com>
Signed-off-by: Rita Fernandes Neves <rfernandesne@nvidia.com>
Signed-off-by: Rita Fernandes Neves <rfernandesne@nvidia.com>
Signed-off-by: Rita Fernandes Neves <rfernandesne@nvidia.com>
Signed-off-by: Rita Fernandes Neves <rfernandesne@nvidia.com>
Signed-off-by: Rita Fernandes Neves <rfernandesne@nvidia.com>
Signed-off-by: Rita Fernandes Neves <rfernandesne@nvidia.com>
Signed-off-by: Rita Fernandes Neves <rfernandesne@nvidia.com>
Signed-off-by: Rita Fernandes Neves <rfernandesne@nvidia.com>
ritaneves
force-pushed
the
docs/evaluation-page
branch
from
June 25, 2026 17:30
fd3343c to
bbafeb0
Compare
Contributor
Author
|
This rebasing cost me too much, I will open this somewhere else |
This was referenced Jun 25, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Add documentation on Evaluation for https://docs.nvidia.com/nemo/gym/about