Reference
Data model
The shapes the SDK and API exchange. These mirror the package's generated models and the OpenAPI schemas. When those change, this page is updated to match.
Run
A single eval execution.
type Run = {
run_id: string;
project_id: string;
execution_mode: "external" | "managed";
status: "created" | "ingesting" | "succeeded" | "failed" | "ingested_with_warnings";
name?: string;
tags: Record<string, string>;
source?: InspectSource;
warnings: RunWarning[];
artifact?: Artifact;
created_at: string;
completed_at?: string;
};Run status lifecycle
created ──completeRun──▶ ingesting ──▶ succeeded
├──▶ ingested_with_warnings
└──▶ failedcreated: run exists, no artifact yet. Deletable. This is the only statedeleteRunaccepts.ingesting:completeRunaccepted the manifest; the backend is parsing the artifact and materializing records.succeeded: ingestion finished cleanly.ingested_with_warnings: ingestion finished but the backend emittedRunWarnings (e.g. an unsupported inspect version). The artifact is still stored; samples may be partially materialized.failed: ingestion threw, or the manifest declaredstatus: "failed".
Artifact
The immutable raw output attached to a run.
type Artifact = {
type: "inspect_eval_log"; // only type today
uri: string; // storage URI (R2 in prod, filesystem in tests)
content_type: string; // application/json | application/octet-stream
size_bytes: number;
checksum_sha256: string; // hex SHA-256 of the bytes
created_at: string;
producer: string; // e.g. "evaris-inspect-publish"
};ArtifactUpload
The pre-signed upload target returned by createArtifactUpload.
type ArtifactUpload = {
artifact_id: string;
run_id: string;
uri: string;
upload_url: string; // PUT your bytes here
method: "PUT";
headers: Record<string, string>; // include these on the PUT
expires_at: string;
};ArtifactManifest
type ArtifactManifest = {
schema_version: "2026-06-11";
run_id: string;
artifact: Artifact;
};RunManifest
The signed summary sent on completeRun. See
Publish eval logs for the full prose.
type RunManifest = {
schema_version: "2026-06-11";
run_id: string;
project_id: string;
execution_mode: "external" | "managed";
producer: { name: string; version: string };
source: InspectSource;
status: "succeeded" | "failed";
started_at: string;
completed_at: string;
artifact_manifest: ArtifactManifest;
summary: { artifact_count: number; artifact_bytes: number };
checksums: { artifact_manifest_sha256: string };
};The checksums.artifact_manifest_sha256 is the SHA-256 of the serialized
artifact_manifest JSON; the backend verifies it on completeRun.
InspectSource
Records what produced the artifact.
type InspectSource = {
name: "inspect_ai"; // only source today
version: string; // detected inspect-ai version (or "unknown")
log_format?: string;
python_version?: string;
};RunWarning
type RunWarning = {
code: "unsupported_inspect_version" | "invalid_inspect_version";
message: string;
};Emitted by the backend during ingestion. Surfaced on the run's warnings
array and in the UI.
Project API token
type ProjectApiToken = {
id: string;
project_id: string;
name?: string;
token: string; // full token: returned ONCE at creation
token_prefix: string; // what's stored after creation
created_at: string;
};Bootstrap response
type BootstrapSetupResponse = {
tenant: SetupTenant;
project: SetupProject; // the default project
projects: SetupProject[]; // all projects the user can access
};
type SetupTenant = {
id: string;
slug: string;
name: string;
role: "owner" | "admin" | "member";
};
type SetupProject = {
id: string;
tenant_id: string;
public_id: string; // this is the --project value for the CLI
name: string;
};Schema versioning
ArtifactManifest and RunManifest both carry a schema_version. Current:
2026-06-11. The publisher and backend must agree on the version; a mismatch
shows up as a 400 from completeRun. When the contract evolves, a new
version is added (not mutated in place) and the publisher is updated to emit
it.