Skip to main content
Use this pattern when you want EvalHub to orchestrate benchmark execution and Gaussia to compute the actual metrics. EvalHub handles:
  • job submission
  • provider registration
  • benchmark fan-out
  • runtime execution in Kubernetes
  • experiment tracking integration
Gaussia handles:
  • dataset construction
  • metric execution
  • benchmark-specific validation
  • benchmark results and artifacts
Gaussia ships an optional EvalHub provider adapter in gaussia[evalhub]. The adapter reads an EvalHub job spec, builds a gaussia.Dataset, dispatches the requested metric, and reports results back to EvalHub.
Install the integration in your provider image:

How the integration works

In a typical setup:
  1. Your system submits an EvalHub evaluation job.
  2. The job contains one or more benchmarks with provider_id: "gaussia".
  3. EvalHub launches one runtime job per benchmark.
  4. The Gaussia provider reads the benchmark payload from JobSpec.parameters.
  5. The provider builds a gaussia.Dataset.
  6. The provider runs the requested benchmark.
  7. The provider reports benchmark status back to EvalHub.
  8. The provider returns structured results and artifacts.
  9. If MLflow is enabled, benchmark evidence is stored there as well.

Logical flow

Deployment view

One event to many benchmarks

The contract between EvalHub and Gaussia

The preferred contract is to put a native gaussia.Dataset inside each benchmark and put operational identifiers in metadata:
This gives you:
  • benchmark-local business input
  • one EvalHub job with many Gaussia benchmarks
  • a simple provider contract
  • clean benchmark dispatch inside the provider
The adapter also accepts the legacy parameters.context_persistance payload key for existing integrations. The spelling is intentionally preserved for compatibility with stored job specs.

Build a gaussia.Dataset from your payload

The most important design step is not the EvalHub side. It is the mapping from your source payload into gaussia.Dataset. Gaussia expects a conversational structure with:
  • session_id
  • assistant_id
  • context
  • conversation: list[Batch]
In many integrations, the provider derives human/assistant pairs from a persisted message list.

Minimal mapping example

If your payload stores rich content blocks instead of plain strings, normalize them to plain text before building the Batch objects. The source can be:
  • a fixture
  • an HTTP request
  • an event bus message
  • a replay from storage
  • an audit pipeline
The mapping rule stays the same.

Choose benchmarks and runtime dependencies

Expose only the benchmarks your payload can actually support. A common policy is:
  • always include humanity, context, and conversational
  • include bias and toxicity only when the payload yields at least 5 human/assistant pairs
In practice:
  • humanity does not need an external judge model
  • context and conversational need a judge model
  • bias needs a guardian-style model
  • toxicity needs embeddings and clustering support
For metric-by-metric setup, see:

A maintainable provider pattern

Keep these concerns separate:
  • payload parsing and dataset construction
  • benchmark dispatch
  • benchmark execution
  • artifact serialization
  • MLflow logging, if you use it
A dispatch table is usually cleaner than a long if/elif chain.

Example dispatch pattern

This pattern makes it easier to:
  • add benchmarks
  • test each benchmark in isolation
  • keep benchmark-specific requirements local
  • avoid a monolithic adapter function

Run the built-in provider adapter

Use the packaged EvalHub adapter as the provider entrypoint:
The adapter supports:
  • humanity
  • context
  • conversational
  • bias
  • toxicity
It reads GAUSSIA_* runtime settings from the environment, logs benchmark-level MLflow evidence when MLFLOW_TRACKING_URI is configured, and writes OCI artifacts when EvalHub requests an OCI export.

Register the provider in EvalHub

A practical provider definition should stay focused on:
  • provider identity
  • runtime image and command
  • benchmark registration
Keep the runtime environment list separate. It is easier to read and easier to adapt to your own secret management model.

Runtime settings

Use your platform’s usual mechanism to inject these values into the provider runtime. In Kubernetes, that usually means env, Secret, ConfigMap, or your own rendered provider spec.
These settings are required for context and conversational.
These settings are required for bias.
These settings are strongly recommended for bias and toxicity.
The defaults are usually enough to get started. The most common overrides are:
If your provider logs one MLflow run per benchmark, the common runtime settings are:
Do not keep placeholder secrets in production. Inject real values through your runtime or secret management layer.
For full runtime dependency details, see Installation, LLM judge, and Toxicity.

Add an optional bridge

You only need a bridge if your upstream system does not already submit EvalHub jobs directly. A bridge usually does this:
  • accepts an incoming event or payload
  • normalizes the payload shape
  • derives interaction count
  • decides benchmark eligibility
  • builds a single JobSubmissionRequest
  • deduplicates with a business key such as stream_id + control_id
  • submits the job to EvalHub

Example job request

Existing bridges can keep sending context_persistance while they migrate to dataset and metadata.

Choose a result model

A robust setup looks like this:
  • one EvalHub evaluation job per source event
  • one provider benchmark execution per benchmark
  • one MLflow run per benchmark, if benchmark-level evidence matters to you
This gives you:
  • one top-level orchestration record
  • clear per-benchmark isolation
  • traceable benchmark metrics
  • strong auditability in MLflow

Understand how MLflow fits in

A common pattern is:
  • EvalHub owns experiment-level orchestration
  • the Gaussia provider logs benchmark-level evidence
That means each benchmark run can carry tags like:
  • benchmark_id
  • evaluation_job_id
  • assistant_id
  • session_id
  • stream_id
  • control_id
  • agentspace_id
This makes MLflow the strongest benchmark-level audit trail.

Production notes

Writable cache matters

If you run bias or toxicity in containers, give the pod writable cache directories for Hugging Face, Transformers, and Sentence Transformers. This matters much more in provider jobs than in a local notebook workflow.

toxicity needs more resources

toxicity is usually the heaviest benchmark because it may involve embeddings, dimensionality reduction, clustering, and group profiling. Do not size it like humanity.

Some MLflow deployments use Kubernetes identity

In some OpenShift AI and Open Data Hub deployments, MLflow is authenticated with Kubernetes or OpenShift identity instead of a standalone API token. That means your runtime may need:
  • a valid projected ServiceAccount token
  • workspace RBAC
  • a workspace header such as X-MLFLOW-WORKSPACE
If that token expires or loses permission, job creation may fail even when the provider code is correct.

Keep benchmark eligibility deterministic

If bias and toxicity require enough interactions, gate them before submission. Do not submit benchmarks that you already know cannot run. That keeps failures meaningful instead of noisy.

Next steps

Python SDK quickstart

Start with the Gaussia SDK basics before wiring EvalHub.

Gaussia architecture

Understand retrievers, datasets, and the core processing model.

Context metric

Learn how judge-based conversational evaluation works.

Toxicity metric

Review the heaviest runtime dependency in a typical EvalHub integration.