dr pipeline - Pipelines API management
Manage AI/ML pipelines orchestrated by Covalent through the DataRobot
pipelines service. The dr pipeline group is a thin CLI wrapper over
the pipelines REST API: every subcommand maps directly to a single
endpoint.
Synopsis
Description
A pipeline is a versioned bundle of Python source defining a DataRobot pipeline (one or more tasks). Each
top-level dr pipeline subcommand operates on one of four resources:
- the pipeline itself (create, list, get, update, delete, lock),
- pipeline versions (list, get, graph),
- pipeline inputs — JSON payloads supplied to a run,
- pipeline runs — concrete executions on Covalent,
- pipeline schedules — recurring runs on a cron expression,
- pipeline images — named, immutable-versioned execution environments (pip packages, conda packages, base image, NVIDIA GPU support) that pipelines can be built against,
- pipeline tasks — source code, function signature, and input payload
for individual
@task-decorated functions.
Versions are created automatically:
- The first
createcall registers the source as v1 indraftmode. updatere-uploads the same file (or an edited copy) and appends v2, v3, etc., as long as the pipeline name still matches and the pipeline is still indraftmode.lockpromotes a draft to locked mode. Locked pipelines are immutable; their inputs and schedules become valid.
Inputs, runs, and the graph endpoint exist in two scopes —
draft (mutable, no version pinned) and locked (immutable, tied
to a frozen version) — selected via the shared --scope and
--version flags. Schedules are locked-only.
[!NOTE] The
pipelinecommand is currently behind a feature gate. Enable it by exportingDATAROBOT_CLI_FEATURE_PIPELINE=truebefore running anydr pipelinesubcommand. See Feature gates for details.[!NOTE] First time? If you're new to the CLI, start with the Quick start for step-by-step setup instructions.
Quick start
# List pipelines registered with the pipelines service
dr pipeline list
# Register a new draft pipeline by uploading a DataRobot pipeline source file
dr pipeline create ./my_pipeline.py --description "First draft"
# Append a new version after editing the file
dr pipeline update <pipeline-id> ./my_pipeline.py
# Promote the draft to locked when you are happy with it
dr pipeline lock <pipeline-id>
Command groups
| Group | Endpoint(s) | Purpose |
|---|---|---|
dr pipeline create |
POST /api/v2/pipelines |
Upload a Python file to register a new pipeline. |
dr pipeline list |
GET /api/v2/pipelines |
Paginated list with mode filtering. |
dr pipeline get |
GET /api/v2/pipelines/{id} |
Pipeline detail including all versions. |
dr pipeline update |
PATCH /api/v2/pipelines/{id} |
Re-upload a file to append a new version. |
dr pipeline delete |
DELETE /api/v2/pipelines/{id} |
Remove a pipeline and all of its versions. |
dr pipeline lock |
PATCH /api/v2/pipelines/{id}/mode |
Promote a draft to locked mode. |
dr pipeline version … |
…/versions[/{ver}] |
Inspect pipeline versions. |
dr pipeline graph |
…/graph (draft or locked) |
Render the pipeline/task DAG. |
dr pipeline source |
…/source (draft or locked) |
Retrieve the pipeline's Python source code. |
dr pipeline run … |
…/dispatches and …/{id} |
Trigger, inspect, and cancel runs. |
dr pipeline input … |
…/inputs and …/inputs/{input_id} |
Manage JSON payloads for runs. |
dr pipeline schedule … |
…/versions/{ver}/schedules |
Manage recurring (cron) runs on locked versions. |
dr pipeline image … |
/pipelines/images[/{id}] |
Manage named, versioned pip-package images. |
dr pipeline task … |
…/tasks/{task_id} (draft or locked) |
Inspect individual task source, signature, and inputs. |
Subcommands
create
Upload a Python file defining a DataRobot pipeline (one or more tasks) and
register a new pipeline. The display name defaults to the title-cased @pipeline
function name (e.g. my_workflow → My Workflow); supply --name to use a
custom label instead.
Arguments:
<file>— path to a.pyfile containing a single DataRobot pipeline. Mutually exclusive with--from-file.
Flags:
--from-file <path>— alternative to the positional file argument.--name <text>— optional human-readable display name. Defaults to the title-cased@pipelinefunction name when omitted.--description <text>— optional human-readable description stored on the pipeline.--mode <draft|locked>— pipeline lifecycle mode. Defaults todraft.--image <image-id>— optional execution image to associate with the pipeline. The pipeline's runs will use this image's environment. Image IDs are obtained fromdr pipeline image createordr pipeline image list.--output-format <json>— emit machine-parseable JSON instead of the human-readable summary.
Example:
$ dr pipeline create ./confluence_to_vdb.py --description "test"
Pipeline ID: 683c2a1b4f8e1a2b3c4d5e6f
Name: Confluence To Vdb
Version: 1
Status: READY
Mode: draft
Tasks: create_vector_database, ingest_confluence_files, setup_credential_and_datastore
Created: 2026-04-28T11:42:28Z
$ dr pipeline create ./confluence_to_vdb.py --name "My Confluence VDB Pipeline"
Pipeline ID: 683c2a1b4f8e1a2b3c4d5e70
Name: My Confluence VDB Pipeline
Version: 1
Status: READY
Mode: draft
Tasks: create_vector_database, ingest_confluence_files, setup_credential_and_datastore
Created: 2026-04-28T11:43:00Z
When --image is supplied, an Image ID: row is shown in the response.
$ dr pipeline create ./confluence_to_vdb.py --image 683c000000000000000000ab
Pipeline ID: 683c2a1b4f8e1a2b3c4d5e6f
Name: confluence_to_vdb
Version: 1
Status: READY
Mode: draft
Tasks: create_vector_database, ingest_confluence_files, setup_credential_and_datastore
Image ID: 683c000000000000000000ab
Created: 2026-04-28T11:42:28Z
list
List pipelines registered with the pipelines service, with optional mode filtering and pagination.
Flags:
--mode <draft|locked>— filter by pipeline mode.--offset <N>— pagination offset. Default0.--limit <N>— pagination limit (1-200). Default50.--output-format <json>— emit machine-parseable JSON instead of a table.
Example:
$ dr pipeline list
Showing 1 of 1 (offset=0 limit=50)
ID NAME MODE ACTIVE VERSION UPDATED
683c2a1b4f8e1a2b3c4d5e6f confluence_to_vdb draft true v3 2026-04-28T12:25:11Z
get
Display full details of a single pipeline including all versions.
Arguments:
<pipeline-id>— the ObjectId returned bycreate/ shown inpipeline list.
Flags:
--output-format <json>— emit machine-parseable JSON.
Example:
$ dr pipeline get 683c2a1b4f8e1a2b3c4d5e6f
ID: 683c2a1b4f8e1a2b3c4d5e6f
Name: confluence_to_vdb
Mode: draft
Active: true
Created: 2026-04-28T11:42:28Z
Updated: 2026-04-28T12:25:11Z
Versions (3):
VERSION STATUS PYTHON CREATED TASKS
v1 READY 3.12 2026-04-28T11:42:28Z create_vector_database
v2 READY 3.12 2026-04-28T12:24:54Z create_vector_database
v3 READY 3.12 2026-04-28T12:25:11Z create_vector_database
When a pipeline has a linked execution image, an Image: row is shown
(format: <imageId> (v<n>, <status>)). When an inputSetTemplate is set,
an Input template: section is printed below the header block.
If the pipeline doesn't exist, get prints
No pipeline found with id: <id> and exits 0.
update
Re-upload a Python file to update a draft pipeline. A new version is appended.
dr pipeline update <pipeline-id> <file> [flags]
dr pipeline update <pipeline-id> --from-file=<file> [flags]
Constraints:
- The pipeline name encoded in the uploaded file must match the pipeline's existing name.
- Locked pipelines cannot be updated (API responds
409 Conflict).
Flags:
--from-file <path>— alternative to the positional file argument.--name <text>— new display name for the pipeline.--description <text>— new description for the pipeline.--image <image-id>— execution image to associate with the pipeline. Image IDs are obtained fromdr pipeline image createordr pipeline image list.--output-format <json>— emit machine-parseable JSON.
delete
Delete a pipeline and all of its versions.
If the pipeline doesn't exist, delete prints
No pipeline found with id: <id> and exits 0.
lock
Promote a draft pipeline to locked mode. Once locked, the pipeline can no longer be updated.
Flags:
--output-format <json>— emit machine-parseable JSON.
version
Read-only access to pipeline versions.
dr pipeline version list --pipeline <id> [--offset N] [--limit N] [--output-format json]
dr pipeline version get --pipeline <id> <version-id> [--output-format json]
graph
Display the pipeline/task DAG as either a JSON payload or a human-readable summary.
The human table includes a TASK ID column showing the stable identifier for each
task node (populated once CMPT-6040 is deployed; — for legacy pipelines).
dr pipeline graph --pipeline <id> # draft graph
dr pipeline graph --pipeline <id> --version=N # locked-version graph
dr pipeline graph --pipeline <id> --output-format json # includes taskId on each node
source
Retrieve the Python source file of a pipeline as uploaded.
dr pipeline source --pipeline <id> # draft source
dr pipeline source --pipeline <id> --version=N # locked-version source
dr pipeline source --pipeline <id> --output-format json # returns {"source": "..."}
Flags:
--pipeline <id>— pipeline ObjectId (required).--scope <draft|locked>— scope selector. Defaultdraft.--version <n>— locked version number; implies--scope=locked.--output-format <json>— emit the source wrapped in a JSON object.
Shared flags
--from-file / positional file
pipeline create and pipeline update accept the input file in two equivalent ways:
--output-format
Every verb that produces a payload accepts --output-format json to emit the response struct as indented JSON.
Global options
All global flags are available, notably
--debug for protocol-level tracing and --skip-auth for advanced scenarios.
Local development
While iterating against a locally running pipelines-api (default port 8100), point the CLI at
http://localhost:8100 and bypass token verification:
export DATAROBOT_CLI_FEATURE_PIPELINE=true
export DATAROBOT_CLI_ENDPOINT=http://localhost:8100/api/v2
export DATAROBOT_CLI_TOKEN=local
export DATAROBOT_CLI_SKIP_AUTH=true
./dist/dr pipeline list
Examples
Pipeline lifecycle
# Register a draft, append a version, lock it, then delete it
dr pipeline create ./my_pipeline.py --description "Initial draft"
dr pipeline update <pipeline-id> ./my_pipeline.py
dr pipeline lock <pipeline-id>
dr pipeline delete <pipeline-id>
Inspect versions, graph, and source
dr pipeline version list --pipeline <pipeline-id>
dr pipeline version get --pipeline <pipeline-id> 2
dr pipeline graph --pipeline <pipeline-id> --version=2 --output-format json
dr pipeline source --pipeline <pipeline-id> # draft source
dr pipeline source --pipeline <pipeline-id> --version=2 # locked version source
Inspect a task
# 1. Find task IDs via the graph (TASK ID column)
dr pipeline graph --pipeline <pipeline-id>
# 2. View source + signature for a draft task
dr pipeline task get --pipeline <pipeline-id> <task-id>
# 3. View the same task on a locked version (includes input payload)
dr pipeline task get --pipeline <pipeline-id> --version=2 <task-id>
input
Manage JSON payloads that drive a run.
dr pipeline input create --pipeline <id> <payload-file> # draft scope
dr pipeline input create --pipeline <id> --version=N <payload-file> # locked scope
dr pipeline input list --pipeline <id> [--scope|--version] [--offset N] [--limit N]
dr pipeline input get --pipeline <id> <input-id> [--scope|--version]
dr pipeline input update --pipeline <id> <input-id> <payload-file> # draft only
dr pipeline input delete --pipeline <id> <input-id> [--scope|--version]
The payload file must contain a JSON object. The CLI wraps it in {"payload": …} before sending.
schedule
Manage recurring (cron) runs on locked versions only. Both --pipeline and --version are
required for every verb.
dr pipeline schedule create --pipeline <id> --version=N \
--cron "0 * * * *" --input <input-id> [--timezone UTC]
dr pipeline schedule list --pipeline <id> --version=N [--offset N] [--limit N]
dr pipeline schedule get --pipeline <id> --version=N <schedule-id>
dr pipeline schedule update --pipeline <id> --version=N <schedule-id> --cron "*/15 * * * *"
dr pipeline schedule delete --pipeline <id> --version=N <schedule-id>
schedule update requires at least one of --cron or --timezone.
run
Trigger, inspect, and cancel pipeline executions.
dr pipeline run create --pipeline <id> --input <input-id> --image <img-id> # draft
dr pipeline run create --pipeline <id> --version=N --input <input-id> --image <img-id> # locked
dr pipeline run list --pipeline <id> [--scope|--version]
dr pipeline run get --pipeline <id> <run-id> [--scope|--version]
dr pipeline run status --pipeline <id> <run-id> [--scope|--version]
dr pipeline run cancel --pipeline <id> <run-id> [--scope|--version]
run create requires --image <image-id> — the execution image to use for
this run. Image IDs are obtained from dr pipeline image create or
dr pipeline image list.
run status is a lighter-weight call intended for polling — returns just
the run ID, status, and Covalent dispatch ID.
run cancel returns 409 Conflict if the run is already terminal.
run task
Inspect the per-@task executions of a single run (dispatch): their lifecycle
status, logs, and results. Distinct from dr pipeline task …, which inspects the
static task definitions in a pipeline; run task reports what actually happened
in one execution.
dr pipeline run task list --pipeline <id> --run <run-id>
dr pipeline run task get --pipeline <id> --run <run-id> <task-id> [--node-id N]
dr pipeline run task logs --pipeline <id> --run <run-id> <task-id> [--node-id N] [--stream stdout|stderr] [--tail N] [--verbosity user|all]
dr pipeline run task result --pipeline <id> --run <run-id> <task-id> [--node-id N]
<task-id> is the sequential task number (1, 2, 3, …) shown in the TASK ID
column of run task list.
Fan-out and --node-id. When the same @task runs at more than one graph
node (fan-out — e.g. the same function called on several inputs), every one of
its invocations shares one <task-id> but has a distinct NODE ID (the
run task list NODE ID column). Pass --node-id <N> to address a specific
invocation. Without it, a task that ran more than once returns 409 Conflict
whose message lists the candidate node ids — so get/logs/result never
silently return the wrong invocation's data. Tasks that ran exactly once need no
--node-id.
run task list— one row per invocation, with both TASK ID and NODE ID. Returns an empty list while the run is stillPENDING/PREPARING.run task get— lifecycle record (status, timestamps, error) for one invocation.run task logs— without--stream, live Kubernetes pod logs (available only while the pod exists, ~60s after the task finishes); with--stream stdoutor--stream stderr, the durable S3-archived log for post-mortem debugging.--tail Nlimits live logs to the last N lines;--verbosity allincludes the task runner's own bookkeeping lines (defaultuserhides them).run task result— presigned S3 URL for a completed task's cloudpickle result, plus an inline value preview. Returns409 Conflictuntil the task reachesCOMPLETED.
# Discover invocations, then address a specific fan-out node:
dr pipeline run task list --pipeline <id> --run <run-id>
dr pipeline run task result --pipeline <id> --run <run-id> 3 --node-id 7
dr pipeline run task logs --pipeline <id> --run <run-id> 3 --node-id 7 --stream stderr
image
Manage pipeline execution images — named, immutable-versioned environments (pip
packages, conda packages, base Docker image, NVIDIA GPU support) that pipelines
can be built against. Each update appends a new version; individual older versions
can be removed with image version delete.
# pip-only image
dr pipeline image create --name <name> --package <pkg> [--package <pkg> …] [--description <text>] [--output-format json]
# conda image (channels optional; --conda-channel requires at least one --conda)
dr pipeline image create --name <name> --conda <pkg> [--conda <pkg> …] [--conda-channel <ch>]
# combined pip + conda + base image + nvidia
dr pipeline image create --name gpu-base --package torch --conda scipy \
--base-image nvcr.io/nvidia/pytorch:24.01-py3 --nvidia
dr pipeline image list [--offset N] [--limit N] [--output-format json]
dr pipeline image update <image-id> --package <pkg> [--package <pkg> …] [--output-format json]
dr pipeline image update <image-id> --conda <pkg> [--conda-channel <ch>] [--base-image <uri>] [--nvidia]
dr pipeline image delete <image-id>
dr pipeline image version delete --image <image-id> <version>
image create registers a new image with an initial version (v1). At least one of
--package (pip) or --conda must be supplied; --conda-channel requires at
least one --conda package. image update appends a new immutable version with
the supplied definition — all fields must be re-specified since the server does not
carry over the previous version's packages. image delete soft-deletes the latest
active version (cascading to the parent if no active versions remain).
image version delete targets a specific version by its integer number.
image create / image update flags:
--package <spec>— pip package spec (repeatable, also accepts comma-separated values).--conda <spec>— conda package spec (repeatable).--conda-channel <channel>— conda channel (repeatable); requires at least one--conda.--base-image <uri>— Docker base image URI (e.g.python:3.12).--nvidia— enable NVIDIA GPU support.
task
Inspect individual @task-decorated functions within a pipeline. Task IDs are stable
24-char identifiers minted when a pipeline is uploaded; they appear in the TASK ID
column of dr pipeline graph and are preserved across re-uploads and across the
draft-to-locked transition.
dr pipeline task get --pipeline <id> <task-id> # draft — source + params, inputs=null
dr pipeline task get --pipeline <id> --version=N <task-id> # locked — source + params + latest VALID input payload
dr pipeline task get --pipeline <id> <task-id> --output-format json
task get returns the task's Python source string, its @task function signature
parameters (name + optional type annotation), and — for locked versions — the full
payload from the latest VALID PipelineInput record for that version.
If the task ID is not found, the command prints Task not found: <task-id> and exits 0.
Error handling
| Status | Cause |
|---|---|
400 |
Invalid Python file or mismatched pipeline name. |
404 |
The provided <pipeline-id>, version, or run does not exist. |
409 |
Tried to update a locked pipeline, or cancel an already-terminal run. |
See also
- Authentication — how
dr auth loginand--skip-authinteract. - Configuration — config file and environment-variable precedence.
- Feature gates — flipping
DATAROBOT_CLI_FEATURE_PIPELINEon and off.