Evaluation Configuration Reference#
Evaluation is a separate run over a benchmark that was already published. This page lists
the keys of the resolved scoring config, as validated by load_eval_config in
src/nemotron/steps/byob/runtime/benchmark_families/bfcl/eval/config.py and typed by the
models in the sibling eval/schemas.py. For more information about the metrics, refer to
Evaluation. To run an evaluation, refer to Evaluate a Candidate Model.
The Three Files#
All three ship under src/nemotron/steps/byob/bfcl/config/.
File |
Role |
|---|---|
|
The scoring template. Copy it, fill in every |
|
The direct envelope. It carries |
|
The Launcher envelope. Same envelope keys with |
The split is deliberate: operational CLI choices belong in an envelope so that selecting
a backend, changing output rendering, or doing a dry run never changes
eval_config_hash, which is the identity of the measurement itself.
Important
Nothing in the scoring config falls back to a provider or pipeline default. Every section is closed against unknown keys, and every key in a section must be present: an absent limit or gate is an error, not a default, because a run must not be able to claim a setting the config never stated. Quoted booleans and numbers are refused for the same reason. Resolution reports every independent violation in one pass, with the first in file order setting the exit status.
Identity and Path Resolution#
Field |
Type |
Default |
Controls |
|---|---|---|---|
|
|
none, required |
The contract the file is held to. |
|
|
none, required |
Only |
Relative paths resolve against the eval config’s own directory. When an eval config is
inlined into a generation config as a legacy eval block, they resolve against the BYOB
root instead, matching how generation resolves its own paths. Credentials are refused
before anything is hashed or logged: any key that names a credential, and any string value
that looks like one, is rejected, so only variable names survive.
Source Binding#
Field |
Type |
Default |
Controls |
|---|---|---|---|
|
path string |
none, required |
The |
|
mapping or |
none, required |
|
|
path string or |
none, required |
Set only when scoring a localized benchmark derived from the same source run. |
Almost nothing about the source is restated by the operator. Which table to read, the run
id, the schema version, the lineage policy, and whether the run was gold-eligible all
come out of the manifest, so the config and the publication cannot disagree. The table’s
content hash comes from artifacts.benchmark_parquet.content_hash: resolution pins what
the run claims, and source verification later proves the bytes.
source_oracle accepts exactly kind, pack_manifest, and resource, and requires all
three. kind is python or endpoint and must equal oracle.kind in the source
manifest. pack_manifest must be the manifest.yaml whose pack_id and version match
the pack the source run recorded. resource must be a .py file for kind python, and a
.yaml, .yml, or .json file for kind endpoint. A translation_manifest must declare
the same source_run_id or source_run_manifest_content_hash as the run being evaluated.
eval#
Field |
Type |
Default |
Controls |
|---|---|---|---|
|
list |
none, required |
A non-empty list with no repeats, drawn from |
trace scores the calls the candidate proposed against the published gold trace.
executable additionally replays them against the oracle pack and evaluates the pack’s
assertions, so it requires a resolvable source_oracle. held_out_eval is the private
executable path; it requires a held_out_eval section, contamination.comparison_set: common_intersection, no translation manifest, and write_task_results,
cache_candidate_responses, and cache_tool_results all false, so private tasks never
leave the boundary. That section accepts policy_hash, fixture_refs, template_ids,
seed, pack_version, max_tasks_per_template, and an optional contract_version.
scoring#
Field |
Type |
Default |
Controls |
|---|---|---|---|
|
path string |
none, required |
The document defining how a call is compared. It is content-hashed, so editing it changes |
|
|
none, required |
Whether candidate arguments must satisfy their declared schema before canonical comparison. |
|
bool |
none, required |
Whether declared parameter defaults are inserted before comparison. |
|
bool |
none, required |
Whether call ordering and parallel call grouping are scored gates. |
|
bool |
none, required |
Whether malformed candidate output may be repaired by a model. |
|
|
none, required |
How per-task success is derived. |
|
|
|
What an intermediate text-only turn must reproduce. This is the one optional key here: a config written before the policy existed means the value publication requires. |
limits#
Limits are part of the measurement: a model cut off at two turns did not answer the same question as one given ten, so they enter the hash like the scoring flags do.
Field |
Type |
Default |
Controls |
|---|---|---|---|
|
integer > 0 |
none, required |
Assistant turns per episode. |
|
number > 0 |
none, required |
Per tool call, and per candidate request covering all attempts. |
|
number > 0 |
none, required |
Per episode. Must be at least the larger of the two per-call timeouts. |
|
integer > 0 |
none, required |
Concurrent task-local sessions per candidate. |
|
integer ≥ 0 |
none, required |
Total HTTP attempts are |
candidates#
A non-empty list. Each entry declares exactly alias, model, provider,
provider_api_version, api, model_identity, and inference, all required. provider
and model are the serving route; model_identity is the weights that answered. Keeping
them apart is what makes a score comparable after an endpoint is renamed.
Field |
Type |
Controls |
|---|---|---|
|
lowercase token, up to 64 characters |
A unique, filesystem-safe name for the candidate’s artifacts. |
|
string, lowercase token, string |
The serving route: the model id the request names, the provider, and its API version. |
|
|
The endpoint, which may not embed credentials, a query string, or a fragment, and the variable the runner reads the key from. The key value never appears in the config. |
|
lowercase token, string |
Where the weights come from, for example |
|
string or |
An immutable revision, meaning 40 to 64 hexadecimal characters. Branch and tag names such as |
|
string or |
|
|
number ≥ 0, number in (0, 1] or |
Decoding temperature and nucleus sampling. |
|
integer > 0, integer or |
Response bound and optional decoding seed. |
|
|
Tool-choice policy. |
|
mapping |
Optional; keys are versioned namespaces such as |
A candidate that sets neither revision nor weights_digest is recorded as
provider_managed, the honest case for a hosted route that publishes neither. Its identity
must then restate its own provider and model, because the route is the only evidence of
which weights answered, and two such candidates on one route collide. Schema 1.1 has
neither an unpinned candidate nor a scheme-qualified digest; declare 1.2 to use either.
Aliases must be unique, and two candidates may not resolve to the same canonical identity.
Run uv run python -m nemotron.steps.byob.scripts.resolve_bfcl_model_identity to populate
the block instead of assembling it by hand.
contamination#
Field |
Type |
Default |
Controls |
|---|---|---|---|
|
bool |
none, required |
Whether the contamination gate runs. |
|
|
none, required |
|
|
|
none, required |
Whether every candidate answers one shared task set. |
Overlap is a validity precondition, not a scoring dimension. A comparison that cannot settle whether a candidate is the model that profiled, paraphrased, judged, or translated the rows is recorded as unresolved and never guessed either way, and unresolved evidence blocks publication.
publication#
Field |
Type |
Default |
Controls |
|---|---|---|---|
|
bool |
none, required |
Whether the operator is asking for a publishable result. |
|
|
none, required |
Must be |
publication.requested: true requires every locked gate: argument_matching: schema_then_canonical, respect_call_order and respect_call_group true,
allow_llm_repair false, task_success: all_applicable_gates,
intermediate_text_matching: structural, contamination enforced with fail_run over a
common_intersection, all four outputs artifact flags true, and weights pinned on every
candidate. An executable claim also requires a gold-eligible source run. Requesting
publication with any of these weakened is refused; requested: false runs anyway and
reports each weakened field in non_publication_reasons.
outputs#
Field |
Type |
Default |
Controls |
|---|---|---|---|
|
path string |
none, required |
Where eval artifacts go. It must be a directory if it exists, must not overlap the source publication tree in either direction, and must not already hold |
|
bool |
none, required |
Write |
|
bool |
none, required |
Write |
output_dir is deliberately absent from eval_config_hash: two operators running the same
evaluation into different directories ran the same evaluation. Which artifacts get written
is in the hash, because a run that skipped its per-task results cannot be audited.
For more information about result artifacts, refer to Output Files. For generation fields, refer to Generation Configuration Reference. For error codes, refer to Troubleshooting.