API Reference

View as Markdown

Core Types

SeedResult

Returned by EvalEnvironment.seed().

FieldTypeDescription
promptstrThe prompt to send to the model
expected_answerstrGround-truth answer for verification
metadatadict[str, Any]Arbitrary metadata (category, difficulty, aliases)

VerifyResult

Returned by EvalEnvironment.verify().

FieldTypeDescription
rewardfloatScore (0.0 = wrong, 1.0 = correct)
extracted_answerstr | NoneWhat was extracted from the model response
scoring_detailsdict[str, Any]Method used, intermediate values
metadatadict[str, Any]Additional verification metadata

EvalEnvironment

Abstract base class for all benchmarks.

1from nemo_evaluator.environments import EvalEnvironment, SeedResult, VerifyResult, register
2
3@register("my_benchmark")
4class MyBenchmark(EvalEnvironment):
5 def __init__(self):
6 super().__init__()
7 self._dataset = [...]
8
9 def __len__(self) -> int:
10 return len(self._dataset)
11
12 async def seed(self, idx: int) -> SeedResult:
13 ...
14
15 async def verify(self, response: str, expected: str, **metadata) -> VerifyResult:
16 ...

Runner

ModelClient

Async client for OpenAI-compatible endpoints.

ParameterTypeDefaultDescription
base_urlstrhttps://inference-api.nvidia.com/v1API base URL
modelstrazure/openai/gpt-5.2Model identifier
api_keystr | NoneNone (uses NEMO_API_KEY)API key
temperaturefloat | NoneNoneSampling temperature (0.0-2.0)
max_tokensint | NoneNoneMax completion tokens
top_pfloat | NoneNoneNucleus sampling threshold (0.0-1.0)
seedint | NoneNoneRNG seed for reproducibility
stoplist[str] | NoneNoneStop sequences
frequency_penaltyfloat | NoneNoneFrequency penalty (-2.0 to 2.0)
presence_penaltyfloat | NoneNonePresence penalty (-2.0 to 2.0)
timeoutfloat120.0Request timeout in seconds
max_concurrentint8Max parallel requests
1from nemo_evaluator.engine import ModelClient
2
3client = ModelClient(
4 base_url="https://inference-api.nvidia.com/v1",
5 model="azure/openai/gpt-5.2",
6 api_key="sk-...",
7 max_concurrent=16,
8)
9response = await client.chat("What is 2+2?", system="Answer briefly.")

run_evaluation()

Core evaluation loop.

1async def run_evaluation(
2 env: EvalEnvironment,
3 solver: Solver,
4 n_repeats: int = 1,
5 max_problems: int | None = None,
6 config: dict[str, Any] | None = None,
7 progress: ProgressTracker | None = None,
8 problem_range: tuple[int, int] | None = None,
9 max_concurrent: int = 32,
10 judge_client: Any = None,
11 shard_info: tuple[int, int] | None = None,
12) -> dict[str, Any]:
ParameterDescription
envEvalEnvironment instance
solverSolver instance (e.g. ChatSolver, HarborSolver, GymSolver)
n_repeatsNumber of times to evaluate each problem
max_problemsLimit to first N problems
configMetadata included in the output bundle
progressProgress tracker (default: no-op)
problem_range(start, end) for sharded execution
max_concurrentMax parallel solve tasks (default: 32)
judge_clientOptional ModelClient for LLM-as-judge post-processing
shard_info(shard_idx, total_shards) — auto-computes problem_range if not set

Returns a bundle dict containing metrics, results, config, and artifacts.

write_all()

Write all artifacts to disk.

1from nemo_evaluator.engine import write_all
2
3write_all(bundle, "./eval_results")

Writes: eval-*.json (bundle), results.jsonl, trajectories.jsonl, runtime_stats.json, failure_analysis.json.

compare_runs()

Compare two evaluation bundles for regression.

1from nemo_evaluator.engine import compare_runs
2
3report = compare_runs("baseline/eval-*.json", "candidate/eval-*.json")

Environment Integrations

GymEnvironment

HTTP client for consuming nel serve endpoints or Gym resource servers.

1from nemo_evaluator.environments.gym import GymEnvironment
2from nemo_evaluator.solvers import ChatSolver
3
4env = GymEnvironment("http://localhost:9090")
5solver = ChatSolver(client)
6bundle = await run_evaluation(env, solver, n_repeats=4)

SkillsEnvironment

Wraps any NeMo Skills benchmark as an EvalEnvironment.

1from nemo_evaluator.environments.skills import SkillsEnvironment
2
3env = SkillsEnvironment("gpqa")
4solver = ChatSolver(client)
5bundle = await run_evaluation(env, solver, n_repeats=4)
ParameterTypeDefaultDescription
benchmarkstrrequiredSkills benchmark name (e.g., gpqa, aime24)
splitstr | NoneNoneDataset split (default from benchmark config)
data_dirstr | NoneNoneOverride data directory
prompt_templatestr | NoneNoneCustom prompt template with {problem} placeholder
eval_typestr | NoneNoneOverride scoring type (default from benchmark config)

VLMEvalKitEnvironment

Wraps VLMEvalKit datasets as an EvalEnvironment. Supports MCQ, VQA, and Y/N dataset types.

1from nemo_evaluator.environments.vlmevalkit import VLMEvalKitEnvironment
2
3env = VLMEvalKitEnvironment("MMBench_DEV_EN")
4solver = VLMSolver(client)
5bundle = await run_evaluation(env, solver, n_repeats=1)

generate_app()

Serve an EvalEnvironment as a Gym-compatible HTTP endpoint.

1from nemo_evaluator.serving.app import generate_app
2
3app = generate_app(env, gym_compat=True)
4# Use with uvicorn: uvicorn.run(app, port=9090)

Observability

ModelResponse

FieldTypeDescription
contentstrModel output text
modelstrModel identifier
finish_reasonstrstop, length, etc.
prompt_tokensintInput tokens
completion_tokensintOutput tokens
total_tokensintTotal tokens
reasoning_tokensintReasoning tokens (if available)
latency_msfloatRequest latency
raw_responsedictFull API response

StepRecord

Complete record for one seed → model → verify cycle.

FieldTypeDescription
problem_idxintProblem index
repeatintRepeat index
promptstrThe prompt sent
expected_answerstrGround truth
model_responseModelResponse | NoneFull model response
rewardfloatVerification score
extracted_answerstr | NoneExtracted from response
scoring_methodstrMethod used for scoring
scoring_detailsdictScoring intermediaries
seed_msfloatTime to seed
model_msfloatTime for model call
verify_msfloatTime to verify
total_msfloatTotal step time
model_errorstr | NoneError if model call failed

CLI Commands

CommandDescription
nel eval runRun evaluation (benchmark name or YAML config)
nel eval reportGenerate evaluation report
nel eval mergeMerge sharded evaluation results
nel serveStart HTTP server for an environment
nel validateQuick validation of a benchmark
nel listShow available benchmarks and environments
nel exportExport bundles to a registered exporter
nel cache-sqshBuild a SLURM .sqsh cache image
nel reportGenerate a multi-benchmark report
nel compareCompare two evaluation bundles
nel gateApply a multi-benchmark gate policy
nel configPersistent user config
nel packageContainerize BYOB benchmark

nel eval run

nel eval run [CONFIG_FILE]
--bench, -b TEXT Benchmark name
--repeats, -n INT Repeats per problem [1]
--max-problems INT Limit problem count
--model-url TEXT Model API base URL
--model-id TEXT Model identifier
--api-key TEXT Model API key
--system-prompt TEXT System prompt
--temperature FLOAT Sampling temperature
--max-tokens INT Maximum generated tokens
--output-dir, -o TEXT Output directory [./eval_results]
--dry-run Generate scripts without running
--submit Submit to cluster via SSH
--background Run locally in background
--resume Resume partially completed suite
-O, --override TEXT Dot-path config overrides (e.g. services.model.model=foo)
--verbose, -v Enable verbose logging

nel serve

nel serve
--bench, -b TEXT Benchmark to serve
--port INT Port [9090]
--host TEXT Host [0.0.0.0]
--gym-compat Enable Gym-compatible endpoints
--export-data TEXT Export JSONL to path and exit

nel validate

nel validate
--benchmark, -b TEXT Benchmark to validate
--samples, -s INT Number of samples [5]
--model-url TEXT Model endpoint URL
--model-id TEXT Model identifier
--api-key TEXT Model API key
--verbose, -v Enable verbose logging

nel list

nel list
--source TEXT Filter by source (e.g., lm-eval)

nel eval report

nel eval report RESULTS_DIR
--format, -f TEXT Output format (markdown, html, csv, json, latex)
--output, -o TEXT Output report path
--all-formats Generate all formats

nel eval merge

nel eval merge OUTPUT_DIR
--repeats, -n INT Override n_repeats (auto-detected if omitted)

nel compare

nel compare BASELINE CANDIDATE
--max-drop FLOAT Max acceptable drop [0.05]
--strict Exit non-zero on regression
--output TEXT Write JSON report

nel gate

nel gate BASELINE_DIR CANDIDATE_DIR
--policy TEXT Gate policy YAML file [required]
--output TEXT Write JSON gate report
--format [text|json] Output format [text]
--strict Exit non-zero on NO-GO or INCONCLUSIVE
--verbose Show per-benchmark reasons