Skip to content

Commit bf33c8b

Browse files
SandyChapmanclaude
andauthored
docs(evaluator): fix submit() packager, FilesetRef import, and leaked titles (#406)
* docs(evaluator): fix SDK submit() examples, FilesetRef import, ModelRef, and leaked titles The Evaluator docs drifted from the current plugin SDK contract. This brings the runnable snippets back in line and fixes two broken tutorial titles. - submit(): add the now-required `metric_bundle_packager=CloudpickleMetricBundlePackager()` (and its import) to every runnable `evaluator.submit(...)` example across index, sdk-resources, and the metrics/* and tutorials/* pages. `run()` examples are unchanged (they do not take the packager). - LLM Judge tutorial: import `FilesetRef` from `nemo_evaluator.sdk` instead of the non-existent `nemo_evaluator_sdk.values.FilesetRef`. - model-configuration: document that local `run()` requires an inline `Model` while remote `submit()` also accepts a `ModelRef`. - test_doc_examples.py: replace the stale `/v2/...` REST script with offline contract checks for the import paths and the submit() packager requirement. - Fix two tutorial pages that rendered `@nemo-nb: hide` as the page title (leaked cell marker in frontmatter `title`); set real titles and drop the duplicate body H1, matching every other evaluator page. Verified: `make docs-check` and `make docs-broken-links` pass; ruff/ty clean; the new contract test passes (7/7); both tutorial titles confirmed via the Fern dev-server render. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Signed-off-by: Sandy Chapman <schapman@nvidia.com> * docs(evaluator): fix ModelRef submit example config + shorten test name Address review feedback on #406: - ModelRef submit example now passes config=RunConfigOnlineModel(). A ModelRef target generates outputs online, and _submit_params raises TypeError("ModelRef target requires RunConfigOnlineModel") otherwise — so the example was not runnable. (CodeRabbit flagged this; its suggested fix used params=/the plugin import path — the public submit() keyword is config= and the value type is imported from nemo_evaluator_sdk like the other docs.) - Rename test_submit_exposes_metric_bundle_packager_but_run_does_not to test_packager_param_is_submit_only (reviewer: name too long). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Signed-off-by: Sandy Chapman <schapman@nvidia.com> --------- Signed-off-by: Sandy Chapman <schapman@nvidia.com> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
1 parent abc6f40 commit bf33c8b

15 files changed

Lines changed: 275 additions & 177 deletions

docs/evaluator/index.mdx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ Submit your evaluation to the Evaluator service using the NeMo Platform SDK:
5959

6060
```python
6161
from nemo_evaluator.sdk import Evaluator
62+
from nemo_evaluator.shared.metric_bundles.cloudpickle import CloudpickleMetricBundlePackager
6263
from nemo_platform import NeMoPlatform
6364

6465

@@ -69,7 +70,12 @@ evaluator: Evaluator = sdk.evaluator
6970
local_result = evaluator.run(metric=metric, dataset=dataset, config=config)
7071

7172
# Production evaluation as a durable platform job
72-
job = evaluator.submit(metric=metric, dataset=dataset, config=config)
73+
job = evaluator.submit(
74+
metric=metric,
75+
dataset=dataset,
76+
config=config,
77+
metric_bundle_packager=CloudpickleMetricBundlePackager(),
78+
)
7379
job.wait_until_done()
7480
result = job.get_result()
7581
```

docs/evaluator/metrics/agent-configuration.mdx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ from nemo_evaluator_sdk import Agent, RunConfigOnline
164164

165165

166166
from nemo_evaluator_sdk import ExactMatchMetric
167+
from nemo_evaluator.shared.metric_bundles.cloudpickle import CloudpickleMetricBundlePackager
167168
metric = ExactMatchMetric(reference="{{item.expected_answer}}")
168169
agent = Agent(
169170
url="https://my-nat-agent.example.com",
@@ -184,6 +185,7 @@ job = evaluator.submit(
184185
{"role": "user", "content": "{{item.question}}"},
185186
],
186187
},
188+
metric_bundle_packager=CloudpickleMetricBundlePackager(),
187189
)
188190
job.wait_until_done()
189191
result = job.get_result()

docs/evaluator/metrics/agentic.mdx

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,7 @@ print(result.aggregate_scores)
228228
```python
229229
from nemo_evaluator_sdk import RunConfig
230230
from nemo_evaluator_sdk.metrics.ragas import ToolCallAccuracyMetric
231+
from nemo_evaluator.shared.metric_bundles.cloudpickle import CloudpickleMetricBundlePackager
231232
metric = ToolCallAccuracyMetric()
232233

233234
job = evaluator.submit(
@@ -250,6 +251,7 @@ job = evaluator.submit(
250251
}
251252
],
252253
config=RunConfig(parallelism=4),
254+
metric_bundle_packager=CloudpickleMetricBundlePackager(),
253255
)
254256
job.wait_until_done()
255257
result = job.get_result()
@@ -428,6 +430,7 @@ print(result.aggregate_scores)
428430

429431
```python
430432
from nemo_evaluator_sdk import RunConfig, ToolCallingMetric
433+
from nemo_evaluator.shared.metric_bundles.cloudpickle import CloudpickleMetricBundlePackager
431434

432435
metric = ToolCallingMetric(reference="{{item.tool_calls}}")
433436

@@ -462,6 +465,7 @@ job = evaluator.submit(
462465
}
463466
],
464467
config=RunConfig(parallelism=4),
468+
metric_bundle_packager=CloudpickleMetricBundlePackager(),
465469
)
466470
job.wait_until_done()
467471
result = job.get_result()
@@ -568,6 +572,7 @@ print(result.aggregate_scores)
568572
```python
569573
from nemo_evaluator_sdk import RunConfig, Model
570574
from nemo_evaluator_sdk.metrics.ragas import TopicAdherenceMetric
575+
from nemo_evaluator.shared.metric_bundles.cloudpickle import CloudpickleMetricBundlePackager
571576

572577
judge_model = Model(
573578
url="https://integrate.api.nvidia.com/v1/chat/completions",
@@ -591,6 +596,7 @@ job = evaluator.submit(
591596
}
592597
],
593598
config=RunConfig(parallelism=4),
599+
metric_bundle_packager=CloudpickleMetricBundlePackager(),
594600
)
595601
job.wait_until_done()
596602
result = job.get_result()
@@ -762,6 +768,7 @@ print(result.aggregate_scores)
762768
```python
763769
from nemo_evaluator_sdk import RunConfig, Model
764770
from nemo_evaluator_sdk.metrics.ragas import AgentGoalAccuracyMetric
771+
from nemo_evaluator.shared.metric_bundles.cloudpickle import CloudpickleMetricBundlePackager
765772

766773
judge_model = Model(
767774
url="https://integrate.api.nvidia.com/v1/chat/completions",
@@ -791,6 +798,7 @@ job = evaluator.submit(
791798
}
792799
],
793800
config=RunConfig(parallelism=4),
801+
metric_bundle_packager=CloudpickleMetricBundlePackager(),
794802
)
795803
job.wait_until_done()
796804
result = job.get_result()
@@ -917,6 +925,7 @@ print(result.aggregate_scores)
917925
```python
918926
from nemo_evaluator_sdk import RunConfig, Model
919927
from nemo_evaluator_sdk.metrics.ragas import AgentGoalAccuracyMetric
928+
from nemo_evaluator.shared.metric_bundles.cloudpickle import CloudpickleMetricBundlePackager
920929

921930
judge_model = Model(
922931
url="https://integrate.api.nvidia.com/v1/chat/completions",
@@ -954,6 +963,7 @@ job = evaluator.submit(
954963
}
955964
],
956965
config=RunConfig(parallelism=4),
966+
metric_bundle_packager=CloudpickleMetricBundlePackager(),
957967
)
958968
job.wait_until_done()
959969
result = job.get_result()
@@ -1013,6 +1023,7 @@ print(result.aggregate_scores)
10131023
```python
10141024
from nemo_evaluator_sdk import RunConfig, Model
10151025
from nemo_evaluator_sdk.metrics.ragas import AnswerAccuracyMetric
1026+
from nemo_evaluator.shared.metric_bundles.cloudpickle import CloudpickleMetricBundlePackager
10161027

10171028
judge_model = Model(
10181029
url="https://integrate.api.nvidia.com/v1/chat/completions",
@@ -1031,6 +1042,7 @@ job = evaluator.submit(
10311042
}
10321043
],
10331044
config=RunConfig(parallelism=4),
1045+
metric_bundle_packager=CloudpickleMetricBundlePackager(),
10341046
)
10351047
job.wait_until_done()
10361048
result = job.get_result()
@@ -1043,6 +1055,7 @@ print(result.aggregate_scores)
10431055
```python
10441056
from nemo_evaluator_sdk import RunConfigOnlineModel, InferenceParams, Model
10451057
from nemo_evaluator_sdk.metrics.ragas import AnswerAccuracyMetric
1058+
from nemo_evaluator.shared.metric_bundles.cloudpickle import CloudpickleMetricBundlePackager
10461059

10471060
judge_model = Model(
10481061
url="https://integrate.api.nvidia.com/v1/chat/completions",
@@ -1077,6 +1090,7 @@ job = evaluator.submit(
10771090
}
10781091
]
10791092
},
1093+
metric_bundle_packager=CloudpickleMetricBundlePackager(),
10801094
)
10811095

10821096
job.wait_until_done()

docs/evaluator/metrics/job-management.mdx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ from nemo_evaluator.sdk import Evaluator
2121
from nemo_platform import NeMoPlatform
2222
from nemo_evaluator_sdk import RunConfig
2323
from nemo_evaluator_sdk import ExactMatchMetric
24+
from nemo_evaluator.shared.metric_bundles.cloudpickle import CloudpickleMetricBundlePackager
2425

2526
sdk = NeMoPlatform(
2627
base_url=os.environ.get("NMP_BASE_URL", "http://localhost:8080"),
@@ -37,6 +38,7 @@ job = evaluator.submit(
3738
{"expected": "Berlin", "output": "Munich"},
3839
],
3940
config=RunConfig(parallelism=4),
41+
metric_bundle_packager=CloudpickleMetricBundlePackager(),
4042
)
4143
print("Submitted job:", job.name)
4244

docs/evaluator/metrics/llm-as-a-judge.mdx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,7 @@ For production workloads, submit the same metric and dataset as a durable platfo
298298

299299
```python
300300
from nemo_evaluator_sdk import RunConfig, JSONScoreParser, Model, RubricScore, LLMJudgeMetric
301+
from nemo_evaluator.shared.metric_bundles.cloudpickle import CloudpickleMetricBundlePackager
301302

302303
metric = LLMJudgeMetric(
303304
model=Model(
@@ -346,6 +347,7 @@ job = evaluator.submit(
346347
{"input": "What is 2 + 2?", "output": "4"},
347348
],
348349
config=RunConfig(parallelism=8, limit_samples=100),
350+
metric_bundle_packager=CloudpickleMetricBundlePackager(),
349351
)
350352
print("Submitted job:", job.name)
351353

docs/evaluator/metrics/manage-metrics.mdx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ For online evaluations, provide a model or agent target and use the online param
9898

9999
```python
100100
from nemo_evaluator_sdk import RunConfig, ExactMatchMetric
101+
from nemo_evaluator.shared.metric_bundles.cloudpickle import CloudpickleMetricBundlePackager
101102

102103
metric = ExactMatchMetric(reference="{{item.expected}}", candidate="{{item.output}}")
103104

@@ -108,6 +109,7 @@ job = evaluator.submit(
108109
{"expected": "Berlin", "output": "Munich"},
109110
],
110111
config=RunConfig(parallelism=4),
112+
metric_bundle_packager=CloudpickleMetricBundlePackager(),
111113
)
112114

113115
job.wait_until_done()

docs/evaluator/metrics/model-configuration.mdx

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,43 @@ Use plain `RunConfig` for offline evaluations where the dataset already contains
183183

184184
## Model References
185185

186-
The plugin SDK examples on this page use inline `Model` objects. If your deployment resolves platform model entities into model endpoint details, perform that lookup before constructing the `Model`, then pass the resulting inline model to the metric or request.
186+
You can supply the evaluation target two ways. Which one is valid depends on whether you run the evaluation locally or submit it as a durable platform job.
187+
188+
### Inline `Model` (required for `evaluator.run(...)`)
189+
190+
`evaluator.run(...)` executes in your local Python process, so it needs the resolved endpoint details inline. Always pass an inline `Model` as the `target` (or as a judge/embeddings field on the metric). If your deployment stores platform model entities, resolve the entity into endpoint details before constructing the `Model`:
191+
192+
```python
193+
from nemo_evaluator_sdk import Model
194+
195+
model_entity = client.models.retrieve("my-model", workspace="default")
196+
model = Model(
197+
url=client.models.get_model_entity_route_openai_url(model_entity),
198+
name="my-model",
199+
api_key_secret="NVIDIA_API_KEY",
200+
)
201+
202+
result = evaluator.run(metric=metric, dataset=dataset, target=model)
203+
```
204+
205+
### `ModelRef` (supported by `evaluator.submit(...)`)
206+
207+
Durable remote `evaluator.submit(...)` jobs additionally accept a `ModelRef` target. A `ModelRef` names a platform model entity (`workspace/model-name`) and is resolved by the evaluator backend when the job runs, so you do not have to resolve the endpoint yourself. Use this for platform-managed model routing. A `ModelRef` target generates outputs online, so it requires an online run config (`RunConfigOnlineModel`):
208+
209+
```python
210+
from nemo_evaluator_sdk import ModelRef, RunConfigOnlineModel
211+
from nemo_evaluator.shared.metric_bundles.cloudpickle import CloudpickleMetricBundlePackager
212+
213+
job = evaluator.submit(
214+
metric=metric,
215+
dataset=dataset,
216+
config=RunConfigOnlineModel(),
217+
target=ModelRef(root="default/my-model"),
218+
metric_bundle_packager=CloudpickleMetricBundlePackager(),
219+
)
220+
```
221+
222+
`ModelRef` is **not** valid for `evaluator.run(...)`; the local runtime cannot resolve a platform entity. Pass an inline `Model` for local runs and either a `Model` or a `ModelRef` for remote submits. See the [Define and Run Custom Python Metrics](/documentation/evaluate-models/tutorials/define-and-run-custom-python-metrics) tutorial for an end-to-end `ModelRef` + `FilesetRef` submit example.
187223

188224
<Note>
189225

0 commit comments

Comments
 (0)