Chapter 5. Generate and use evaluation cards
Generate standardized evaluation cards for evaluation runs in EvalHub to document what the evaluation tested, how it performed, and what infrastructure it used. EvalHub generates an evaluation card when the job request includes an MLflow experiment or OCI export configuration.
5.1. Evaluation cards overview Copy linkLink copied to clipboard!
An evaluation card is a structured JSON document that EvalHub generates when you specify an MLflow experiment or OCI export configuration in the evaluation job request.
Each evaluation card captures the full context of an evaluation: what model was tested, which benchmarks and datasets the evaluation used, and the results and pass or fail outcomes. EvalHub generates one evaluation card per job, regardless of whether the job evaluates a collection or a list of individual benchmarks.
Evaluation cards address three challenges in AI evaluation:
- Reproducibility
- Evaluation results are difficult to reproduce without a record of the exact configuration, infrastructure, and framework versions used. Evaluation cards capture this context so that teams can repeat evaluations with confidence.
- Accessibility
- Without a standardized format, evaluation documentation scatters across MLflow logs, code comments, and informal records. Evaluation cards consolidate this information into a single, discoverable artifact.
- Governance
- Regulatory frameworks such as the EU AI Act and FedRAMP require auditable records of AI system evaluations. Evaluation cards provide a versioned, schema-validated record suitable for compliance workflows.
5.1.1. When EvalHub generates evaluation cards Copy linkLink copied to clipboard!
EvalHub generates an evaluation card as a post-processing step when the evaluation job includes either of the following configurations:
- MLflow experiment configuration.
- OCI export configuration.
No evaluation card is generated if neither field is specified.
Each generated card includes metadata, evaluation context, and per-benchmark results with thresholds.
5.2. Configure evaluation card generation Copy linkLink copied to clipboard!
Enable evaluation card generation for an evaluation job so you can get a comprehensive record of the evaluation for compliance, auditing, and reproducibility. EvalHub generates the evaluation card as a post-processing step after it commits the evaluation results.
You can enable evaluation card generation one of the following ways: 1. By specifying an MLflow experiment 2. By setting an OCI export configuration in the job request
If neither an MLflow experiment nor an OCI export is configured, EvalHub does not generate an evaluation card.
Prerequisites
- You have a running EvalHub instance. For details, see Deploy EvalHub with the TrustyAI Operator.
- You have a running MLflow instance accessible from the EvalHub deployment, or access to an OCI-compatible container registry.
Procedure
To generate an evaluation card by configuring an MLflow experiment, include an
experimentblock in the job submission:To use the REST API, run:
"benchmarks": [ { "provider_id": "lm_evaluation_harness", "benchmark_id": "mmlu" } ], "experiment": { "name": "my-model-v2-eval" }For the full job submission request, see Submit an evaluation job.
To use the CLI, include the
experimentfield in your YAML config file:experiment: name: my-model-v2-eval$ evalhub eval run --config eval-with-mlflow.yamlTo use the Python SDK, pass an
ExperimentConfigto theJobSubmissionRequest:from evalhub.models import ExperimentConfig experiment = ExperimentConfig(name="my-model-v2-eval")
To generate an evaluation card by configuring an OCI export, include an
exportsblock in the job submission:"benchmarks": [ { "provider_id": "lm_evaluation_harness", "benchmark_id": "mmlu" } ], "exports": { "oci": { "coordinates": { "oci_host": "quay.io", "oci_repository": "my-org/eval-results" }, "k8s": { "connection": "oci-registry-credentials" } } }For details on OCI export configuration, see Export evaluation results to an OCI registry.
Verification
After the job completes, verify that EvalHub generated the evaluation card:
$ curl -s -H "Authorization: Bearer $TOKEN" -H "X-Tenant: <namespace>" \ $EVALHUB_URL/api/v1/evaluations/jobs/<job_id> | jq .results.evalcardThe response includes the evaluation card metadata and the artifact path.
NoteEvaluation card generation is a post-processing step that runs after EvalHub commits evaluation results to MLflow. If card generation fails, the evaluation results are still available. EvalHub logs card generation errors but does not fail the evaluation job.
5.3. Retrieve and interpret evaluation cards Copy linkLink copied to clipboard!
After an evaluation completes, retrieve the evaluation card to review results, share findings with stakeholders, or pass the card into audit tools, CI pipelines, or dashboards.
Depending on the job request configuration, EvalHub stores evaluation cards as MLflow run artifacts, OCI artifacts, or both. You can access them through the MLflow UI, an OCI registry, or programmatically.
Prerequisites
- You have a completed evaluation job with an evaluation card generated. For details, see Configure evaluation card generation.
- You have access to the MLflow instance configured for EvalHub.
Procedure
Identify the MLflow run ID for your evaluation job:
$ curl -s -H "Authorization: Bearer $TOKEN" -H "X-Tenant: <namespace>" \ $EVALHUB_URL/api/v1/evaluations/jobs/<job_id> | jq .results.mlflow_run_idRetrieve the evaluation card by using one of the following methods:
-
To use the MLflow UI, navigate to the experiment run and open the Artifacts tab. EvalHub stores the evaluation card as
evalcard.jsonin the run’s artifact root. To use the MLflow Python client, run:
import json import mlflow local_path = mlflow.artifacts.download_artifacts( run_id="<mlflow_run_id>", artifact_path="evalcard.json" ) with open(local_path) as f: evalcard = json.load(f) print(f"Model: {evalcard['evaluation_context']['model']['name']}") print(f"Schema version: {evalcard['schema_version']}")To use the CLI, run:
$ evalhub eval evalcard <job_id> --format jsonThe
--formatflag supportsjsonandtable.
-
To use the MLflow UI, navigate to the experiment run and open the Artifacts tab. EvalHub stores the evaluation card as
Verification
- Review the download evaluation card contents.
Confirm that the downloaded card validates against the evaluation card schema by checking the
schema_versionfield and verifying that all required sections are present:required_sections = ["metadata", "evaluation_context", "results"] for section in required_sections: assert section in evalcard, f"Missing section: {section}" print("Evaluation card structure is valid.")
5.4. Evaluation card schema reference Copy linkLink copied to clipboard!
An evaluation card conforms to a versioned JSON schema that EvalHub validates before storing.
5.4.1. Top-level fields Copy linkLink copied to clipboard!
Every evaluation card contains the following top-level fields.
| Field | Type | Required | Description |
|---|---|---|---|
|
| String | Yes |
The version of this card instance, for example |
|
| String | Yes |
The version of the evaluation card schema that this card conforms to, for example |
|
| Object | Yes | Card metadata including timestamps and generator identity. See Section 5.4.2, “Metadata fields”. |
|
| Object | Yes | The evaluation configuration including model, datasets, tasks, and framework. See Section 5.4.3, “Evaluation context fields”. |
|
| Object | Yes | Benchmark metrics, scores, and pass/fail outcomes. See Section 5.4.4, “Results fields”. |
5.4.2. Metadata fields Copy linkLink copied to clipboard!
The metadata section records when and how EvalHub generated the card.
| Field | Type | Required | Description |
|---|---|---|---|
|
| String (ISO 8601) | Yes | Timestamp when the card was generated. |
|
| String | Yes |
The identity and version of the generator, for example |
|
| Array of strings | No | Identifiers of the users or service accounts that submitted the evaluation job. |
|
| Array of strings | No | User-defined tags for card classification and filtering. |
5.4.3. Evaluation context fields Copy linkLink copied to clipboard!
The evaluation_context section describes what was evaluated and how the evaluation was configured.
| Field | Type | Required | Description |
|---|---|---|---|
|
| Object | Yes |
The model that was evaluated. Contains |
|
| Array of objects | No |
The datasets used in the evaluation. Each entry contains |
|
| Array of objects | No |
Descriptions of the evaluation tasks. Each entry contains |
|
| Object | Yes |
The evaluation framework metadata. Contains |
|
| Object | No |
The collection used, if the evaluation was a collection run. Contains |
5.4.4. Results fields Copy linkLink copied to clipboard!
The results section captures benchmark scores and overall pass or fail outcomes.
| Field | Type | Required | Description |
|---|---|---|---|
|
| Array of objects | Yes | Per-benchmark results. See Section 5.4.5, “Benchmark result fields”. |
|
| Boolean | No | Whether the evaluation passed overall, based on collection-level or job-level thresholds. |
|
| Number | No | The weighted average score across all benchmarks. |
|
| Object | No |
Aggregated statistics for collection evaluations, including |
5.4.5. Benchmark result fields Copy linkLink copied to clipboard!
The benchmarks array describes the results for each benchmark in the evaluation job.
| Field | Type | Required | Description |
|---|---|---|---|
|
| String | Yes |
The benchmark identifier, for example |
|
| String | Yes |
The provider that ran the benchmark, for example |
|
| Object | Yes |
Key-value pairs of metric names and their scores, for example |
|
| Number | Yes | The primary score used for pass/fail evaluation. |
|
| String | Yes |
The name of the primary metric, for example |
|
| Number | No | The pass/fail threshold applied to this benchmark. |
|
| Boolean | No |
Whether the benchmark passed based on the threshold and |
|
| Boolean | No |
If |
|
| Number | No | The weight of this benchmark in the overall score calculation. |
5.4.6. Evaluation card example Copy linkLink copied to clipboard!
The following example shows a complete evaluation card for a collection run with two benchmarks.
{
"card_version": "1.0.0",
"schema_version": "1.0.0",
"metadata": {
"generated_at": "2026-07-15T14:30:00Z",
"generator": "eval-hub/1.5.0",
"authors": [
"system:serviceaccount:my-namespace:eval-sa"
],
"tags": [
"production",
"quarterly-review"
]
},
"evaluation_context": {
"model": {
"name": "my-model",
"url": "http://my-model.my-namespace.svc.cluster.local:8080/v1"
},
"datasets": [
{ "name": "mmlu", "source": "built-in" },
{ "name": "hellaswag", "source": "built-in" }
],
"tasks": [
{ "name": "mmlu", "description": "Multitask language understanding", "provider_id": "lm_evaluation_harness" },
{ "name": "hellaswag", "description": "Commonsense reasoning", "provider_id": "lm_evaluation_harness" }
],
"framework": {
"name": "lm_evaluation_harness",
"version": "0.4.8",
"configuration": {
"num_fewshot": 5,
"batch_size": 16
}
},
"collection": {
"name": "leaderboard-v2",
"version": "1.0.0"
}
},
"results": {
"benchmarks": [
{
"benchmark_id": "mmlu",
"provider_id": "lm_evaluation_harness",
"metrics": { "acc": 0.65, "acc_norm": 0.68 },
"primary_score": 0.68,
"primary_metric": "acc_norm",
"threshold": 0.60,
"pass": true,
"lower_is_better": false,
"weight": 1
},
{
"benchmark_id": "hellaswag",
"provider_id": "lm_evaluation_harness",
"metrics": { "acc": 0.72, "acc_norm": 0.75 },
"primary_score": 0.75,
"primary_metric": "acc_norm",
"threshold": 0.70,
"pass": true,
"lower_is_better": false,
"weight": 1
}
],
"overall_pass": true,
"overall_score": 0.715,
"summary_statistics": {
"total_benchmarks": 2,
"passed": 2,
"failed": 0
}
}
}