Artifact concepts¶
An artifact describes what a Workload runs: a container specification with image URI, port, entrypoint, environment variables, and health probes. Workloads are created from artifacts; one locked artifact can serve as the foundation for many Workloads.
Artifact types¶
Artifacts use a type discriminator. The API accepts service (default) and nim (NVIDIA NIM model artifacts). Both use the same multi-container containerGroups shape; NIM adds optional storage and GPU-oriented autoscaling metrics in the generated API reference.
| Type | When to use |
|---|---|
service |
Container-based Workloads where you supply images and the platform runs them (primary plus optional sidecar containers): inference servers, agent containers (LangGraph, CrewAI, AutoGen), APIs, and web services. |
nim |
NVIDIA NIM model serving when you need NIM-specific scheduling, storage options, and scaling signals (gpuCacheUtilization, gpuRequestQueueDepth). See the Workload API reference for NimArtifactSpec and Scaling metrics. |
NIM artifacts include an optional storage field (NimStorageConfig) with two choices: dedicatedPvc (default) gives the Workload its own PVC for model weights. Alternatively, nimCache uses a cluster-wide PVC keyed on the model image—pick nimCache when multiple Workloads share the same NIM image so that the cluster keeps a single cached copy of the weights.
NimStorageConfig fields:
| Field | Type | Default | Description |
|---|---|---|---|
mode |
"dedicatedPvc" | "nimCache" |
"dedicatedPvc" |
Storage strategy for model weights. |
pvcSize |
string (Kubernetes quantity) | none | PVC size (e.g., "150Gi"). Only valid when mode is "dedicatedPvc". |
NIM artifacts also accept an optional templateId field (string) to reference a NIM template for preconfigured model settings.
Container requirements¶
Every container the platform runs must satisfy the following baseline requirements:
| Requirement | Why |
|---|---|
Built for linux/amd64 |
The platform runs on x86-64 nodes. Images built for ARM (e.g., on Apple Silicon with a default docker build) will fail to start. Build with docker buildx build --platform linux/amd64 to produce the correct architecture. |
| Runs as non-root user | The platform runs containers unprivileged. |
| Listens on a port between 1024 and 65535 | Containers cannot bind to privileged ports (0-1023). The port is set on the artifact via containers[].port. |
| Exposes an HTTP server | The platform proxies invoke traffic as HTTP to the primary container. |
| Implements a readiness probe endpoint | The platform polls readinessProbe.path to determine readiness. |
| Implements graceful handling of SIGTERM signals | The platform may interrupt workloads (e.g., node maintenance). When this happens, SIGTERM is sent to the container to signal a grace period, during which it should drain running processes and connections before the platform escalates to SIGKILL. The grace period is configured at the cluster level during installation. |
Primary vs. non-primary containers
A container group has exactly one primary container (primary: true) plus any number of sidecars. The primary container must define a port; non-primary containers (sidecars) must omit port. Assigning these incorrectly returns a 422 validation error at artifact create or update.
Image build configuration¶
For draft service artifacts, set imageBuildConfig on a container instead of imageUri. This then builds from uploaded source code (POST /artifacts/{id}/builds). Provide either a pre-built imageUri or imageBuildConfig (not both). After a successful build, the platform populates imageUri.
ImageBuildConfig.dockerfile is a discriminated union—the source field is a tag whose value determines which of the following fields apply—and defaults to provided using ./Dockerfile from your source:
source |
Schema | Fields |
|---|---|---|
provided |
ProvidedDockerfile |
path (string, default ./Dockerfile)—relative path to the Dockerfile in synced source code. |
generated |
GeneratedDockerfile |
executionEnvironmentId, executionEnvironmentVersionId, entrypoint—platform generates a Dockerfile from the execution environment base image. |
Example using a provided Dockerfile:
"imageBuildConfig": {
"dockerfile": {
"source": "provided",
"path": "./Dockerfile"
}
}
Omit path to use the default ./Dockerfile. See Image builds REST.
Image URI validation¶
The platform validates every container's imageUri against the cluster's configured allowlist and denylist when you create, update, or clone an artifact. By default, well-known public registries are permitted (for example, Docker Hub, Quay.io, GHCR, public ECR (public.ecr.aws), GitLab Container Registry, JFrog, and NVIDIA NGC), while internal and cloud-provider-private registries (private ECR, ACR, GCR, GCP Artifact Registry) are not. Cluster administrators can customize this policy, so the exact set of permitted registries can vary by installation.
Only containers that specify an imageUri directly are checked—containers built through imageBuildConfig (the code-to-workload build flow) don't have an imageUri at this point and are skipped.
A disallowed imageUri fails artifact create, update, or clone with one of the following errors:
| Error | Cause |
|---|---|
Image URI '<uri>' is not permitted on this cluster. |
The URI matches a pattern the cluster denies. |
Image URI '<uri>' is not in the permitted image registry allowlist. |
The URI doesn't match any pattern the cluster allows. |
To resolve either error, push the image to a registry your cluster permits and reference it in imageUri.
Environment variable types¶
Container environment variables (environmentVars) are a discriminated union on the source field. The API accepts three types:
| Type | source |
Fields | Description |
|---|---|---|---|
StringEnvironmentVariable |
"string" (or omit source) |
name, value |
Plain-text key-value pair. Use for non-sensitive configuration. |
CredentialEnvironmentVariable |
"dr-credential" |
name, drCredentialId, key |
Looks up a value from the DataRobot Credentials service at runtime. Use for secrets, tokens, and passwords. |
ApiKeyEnvironmentVariable |
"api-key" |
name (optional) |
A per-Workload API key, scoped to the invoking user, resolved automatically at proton creation—no value or ID is supplied by the caller. name defaults to DATAROBOT_API_TOKEN when omitted. Use when the container needs to authenticate against DataRobot APIs. |
Example using all three types:
"environmentVars": [
{"name": "APP_MODE", "value": "production"},
{"source": "dr-credential", "name": "DB_PASSWORD", "drCredentialId": "64abc...", "key": "password"},
{"source": "api-key"}
]
The api-key entry has no name—the platform resolves it to DATAROBOT_API_TOKEN, the conventional name expected by the DataRobot SDK. To mount the token under a different name, set name explicitly: {"source": "api-key", "name": "MY_DR_TOKEN"}.
These per-Workload keys are visible in Console under Account settings > API keys and tools > Workload API keys, where they can be renamed or deleted; see Manage API keys.
Platform-managed environment variables¶
In addition to environmentVars declared in the artifact spec, the platform injects a set of environment variables into every container at runtime. These are not represented in the spec, not returned by GET /artifacts/{id} or GET /workloads/{id}, and cannot be removed. If you declare an env var with the same name via environmentVars, your value takes precedence.
| Variable | Description |
|---|---|
DATAROBOT_ENDPOINT |
DataRobot API base URL, computed from deployment configuration. Use this value to initialize the DataRobot SDK or construct API requests from inside the container. |
DATAROBOT_PUBLIC_API_ENDPOINT |
The public DataRobot API URL. Injected only when the Workload has an external URL configured. |
WORKLOAD_ID |
The ID of the Workload the container is running under. Use this to scope API calls back to the owning Workload. |
OTEL_EXPORTER_OTLP_ENDPOINT |
OTel collector endpoint. The SDK picks this up automatically—do not hardcode or override it unless routing telemetry to a custom collector. |
OTEL_EXPORTER_OTLP_HEADERS |
Authentication headers for the OTel collector. Platform-managed; do not override. |
OTEL_EXPORTER_OTLP_PROTOCOL |
OTLP transport protocol for the exporter, set to http/protobuf. Platform-managed; do not override. |
OTEL_EXPORTER_OTLP_TRACES_PROTOCOL |
OTLP transport protocol for traces specifically, set to http/protobuf. Some models only respect this signal-specific variable rather than the generic one above. |
OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE |
Metrics temporality preference for the OTel SDK, set to lowmemory. |
OTEL_RESOURCE_ATTRIBUTES |
OTel resource attributes identifying the Workload in traces and metrics. |
Artifact lifecycle¶
This section defines draft and locked as they relate to artifacts. For the Workload-creation decision—when each fits and what each implies for TTL (time-to-live), importance, and replace rules—see Choose draft vs. locked. Each status differs in lifecycle and editability.
| Status | Editable | Description |
|---|---|---|
draft |
Yes | Default status. Mutable. Update via PATCH/PUT during development. |
locked |
No | Immutable. Cannot be modified once set. Required for production Workloads. |
Locking is one-way: locked artifacts cannot return to draft. To iterate further on a locked artifact, create a new draft artifact. You can lock an artifact using either of the following methods:
| Method | Process |
|---|---|
| Direct lock | Call PATCH /artifacts/{id} with {"status": "locked"}. This automatically resets the associated Workload's statistics so production starts from a clean baseline. |
| Promote | Call POST /workloads/{id}/promote; see Promote to production. This also wipes stats and removes the draft Workload's 8-hour TTL in a single call. |
Deletion rules
Locked artifacts cannot be deleted. Artifacts with running protons (draft or locked) cannot be deleted either—stop or delete the backing Workloads first.
Artifact vs. Workload: what lives where¶
The artifact defines what runs; the Workload runtime defines how it runs. The runtime does not accept per-Workload environment variable overrides—values that need to vary across deployments belong in the artifact's environmentVars.
| Layer | What lives here | Mutability | Examples |
|---|---|---|---|
Artifact (spec.containerGroups[].containers[]) |
Container topology—image URI or build config, port, entrypoint, environment variables, and probes. | Immutable once locked. |
imageUri, imageBuildConfig, port, entrypoint, environmentVars, readinessProbe. |
Workload (runtime.containerGroups[]) |
Deployment-time settings—replicas, autoscaling, per-container resource allocation, resource bundles. | Always mutable. On a locked Workload, changes via PATCH /workloads/{id}/settings trigger a rolling replacement rather than taking effect immediately. (It is the artifact spec that becomes immutable at lock time, not the runtime.) |
replicaCount, autoscaling, per-container resourceAllocation, resourceBundles. |
Container and group name rules
Each container's name (and the matching name on a runtime override) follows DNS-label syntax—lowercase letters, digits, and hyphens; must start with a lowercase letter and end with a letter or digit; up to 63 characters. The runtime matches its containerGroups[].containers[] entries to the artifact by these names, so they must agree exactly.
Consider the following guidance when deciding where to define a field:
- If a field is part of the container's identity (which code runs, what ports it listens on, which env vars it needs), it belongs in the artifact spec.
- If a field is a deployment-time knob (replica count, CPU allocation, scaling policy), it belongs in the Workload runtime.
Artifact repositories¶
Artifact repositories group artifact versions and provide:
| Capability | What you get |
|---|---|
| Version history | A traceable lineage of artifact revisions in a single location. |
| Shared governance | A sharedRoles grant on the repository that controls who can read or modify the collection. |
| Discoverability | Easier discovery of artifacts that belong to the same product or team. |
The platform creates a repository automatically the first time you create an artifact with artifactRepositoryId set.