Start from an existing dataset
SDK0.2.1 adds one shared start path for live evaluation runners. Pass a
dataset artifact ID or its exact name. The SDK resolves one dataset, pins its
current Registry version, creates a running experiment, and returns the
experiment ID before the runner starts.
Pin the context that changes behavior
A context manifest is the fingerprint of the agent setup used for a run. It answers a specific question: which version of every behavior-shaping input was active when this result was produced? The manifest contains references and hashes, not the underlying content. The SDK sorts its entries, writes the canonical manifest to the experiment config, and computes one manifest digest. Python and TypeScript produce the same digest for the same entries, regardless of input order. Each context item has the following shape:
TypeScript accepts
artifactId and versionOrdinal, then serializes the same
snake-case manifest as Python.
Use one item for each input that can change independently:
Keep run data on its native Eval surface:
kind is extensible, but the item structure is fixed in SDK 0.2.1.
Use a new lowercase kind for a new artifact category. Do not put arbitrary
metadata or raw protected content into the manifest.version and digest whenever its effective content changes.
Keep the manifest unchanged when only the dataset case, run timestamp, or model
configuration changes. That separation supports three useful comparisons:
run.experiment is the generated experiment-create response. Python exposes
its ID as run.id and run.experiment_id; TypeScript exposes run.id and
run.experimentId. A name match is exact and workspace-scoped. Multiple exact
matches fail instead of selecting one.
The experiment config keeps both context_manifest and
context_manifest_digest. The trace scope carries the digest alongside the
experiment ID. This gives every result a path back to the exact prompt, skill,
tool contract, and knowledge versions that shaped it.
The helper starts the Registry lifecycle. Your harness still executes the
dataset, uploads results, summarizes score spans, and marks the experiment
completed or failed through client.experiments.Record the whole evaluation
Start by creating a dataset and the cases it contains. Every Eval create body needsworkspace_id, even when the client has a default workspace header.
Python
camelCase body keys
and awaited calls: await client.datasets.records.create(datasetId, body) and
await client.experiments.results.create(experimentId, body).
An experiment’s trace views scope OTel data by the
atlan.eval.experiment_id span attribute. run.trace() in Python and
propagateAttributes(run.traceOptions, fn) in TypeScript stamp that association
and the context-manifest digest on every span created inside the runner scope.
Keep evidence that remains useful
The value of an evaluation is being able to diagnose a regression months later, not only its average score. Preserve these fields as part of each run:
Scorers are versioned artifacts. Results are create-only, and a completed or
failed experiment is frozen. That combination preserves the run as evidence
instead of allowing later dataset edits or result updates to rewrite history.
Read and compare
Use the resource tree to review an experiment’s durable results and the live trace detail behind them:Python
Datasets
Curate dataset records and preserve their provenance.
Experiments
Record runs, results, traces, and score rollups.
Scorers
Version the score definition alongside the evaluation.
Tracing and scores
Capture the execution evidence that makes an evaluation explainable.