| name | domino-python-sdk |
| description | Programmatically interact with Domino using python-domino SDK and REST APIs. Covers authentication, running jobs, managing projects, file operations, model deployment, and automation. Use when automating Domino workflows, integrating with CI/CD, or building custom tooling around Domino. |
Domino Python SDK Skill
Description
This skill helps users work with the Domino Python SDK (python-domino) and REST APIs to programmatically interact with Domino.
Activation
Activate this skill when users want to:
- Use the Domino Python SDK
- Make API calls to Domino
- Automate Domino workflows
- Integrate Domino with external systems
- Query Domino programmatically
Overview
Domino provides two main programmatic interfaces:
- python-domino: Python SDK for common operations
- REST API: Full HTTP API for all Domino features
Installation
python-domino
pip install dominodatalab
pip install "dominodatalab[data]"
In Domino Environment
Add to requirements.txt:
dominodatalab>=1.4.0
Or Dockerfile:
RUN pip install dominodatalab
Authentication
Preferred: Access Token (inside Domino)
When running inside Domino (workspace, job, app, model), fetch a short-lived bearer token from the local sidecar:
import requests, os
TOKEN = requests.get("http://localhost:8899/access-token").text.strip()
BASE = os.environ["DOMINO_API_HOST"]
headers = {"Authorization": f"Bearer {TOKEN}", "Content-Type": "application/json"}
Use headers on all requests calls. Prefer this over the SDK for new code — see REST API section below.
SDK Authentication (deprecated pattern)
Note: DOMINO_USER_API_KEY and the api_key= parameter are deprecated and will be removed in a future Domino release. Use the access-token endpoint above for new code. The SDK options below are documented for reference only.
from domino import Domino
domino = Domino(
host="https://your-domino.com",
api_key="your-api-key",
project="owner/project-name"
)
import os
os.environ["DOMINO_API_HOST"] = "https://your-domino.com"
os.environ["DOMINO_USER_API_KEY"] = "your-api-key"
domino = Domino("owner/project-name")
domino = Domino("owner/project-name")
Common Operations
Projects
from domino import Domino
domino = Domino()
project = domino.project_create(
project_name="my-new-project",
owner_name="username"
)
info = domino.project_info()
print(f"Project: {info['name']}")
print(f"ID: {info['id']}")
Jobs (Runs)
run = domino.runs_start(
command="python train.py --epochs 100",
hardware_tier_name="medium",
environment_id="env-id"
)
print(f"Run ID: {run['runId']}")
run = domino.runs_start(
command="python train.py",
commit_id="abc123"
)
status = domino.runs_status(run['runId'])
print(f"Status: {status['status']}")
domino.runs_wait(run['runId'])
logs = domino.runs_get_logs(run['runId'])
print(logs)
domino.runs_stop(run['runId'])
Workspaces
workspace = domino.workspace_start(
hardware_tier_name="medium",
environment_id="env-id",
workspace_type="JupyterLab"
)
print(f"Workspace ID: {workspace['workspaceId']}")
domino.workspace_stop(workspace['workspaceId'])
Files
domino.files_upload(
path="local/file.csv",
dest_path="/mnt/code/data/"
)
domino.files_download(
path="/mnt/code/results/output.csv",
dest_path="local/output.csv"
)
files = domino.files_list("/mnt/code/")
for f in files:
print(f['path'])
Datasets
dataset = domino.datasets_create(
name="training-data",
description="Training dataset"
)
datasets = domino.datasets_list()
snapshot = domino.datasets_snapshot(
dataset_name="training-data",
tag="v1.0"
)
Environments
environments = domino.environments_list()
for env in environments:
print(f"{env['name']}: {env['id']}")
env = domino.environment_get("env-id")
Model APIs
model = domino.model_publish(
file="model.py",
function="predict",
environment_id="env-id",
name="my-classifier",
description="Classification model"
)
print(f"Model ID: {model['id']}")
models = domino.models_list()
model_info = domino.model_get("model-id")
REST API
Direct API Calls
import requests, os
TOKEN = requests.get("http://localhost:8899/access-token").text.strip()
BASE = os.environ["DOMINO_API_HOST"]
headers = {"Authorization": f"Bearer {TOKEN}", "Content-Type": "application/json"}
response = requests.get(f"{BASE}/v4/projects", headers=headers)
projects = response.json()
response = requests.post(
f"{BASE}/v4/projects/{project_id}/runs",
headers=headers,
json={
"command": "python train.py",
"hardwareTierId": "tier-id"
}
)
run = response.json()
Common Endpoints
| Endpoint | Method | Description |
|---|
/v4/projects | GET | List projects |
/v4/projects/{id}/runs | POST | Start a run |
/v4/projects/{id}/runs/{runId} | GET | Get run status |
/v4/projects/{id}/files | GET | List files |
/v4/gateway/runs/{runId}/logs | GET | Get run logs |
/v4/models | GET | List models |
/v4/models/{id}/latest/model | POST | Call model |
Domino Data API
Separate SDK for data access:
from domino_data.data_sources import DataSourceClient
client = DataSourceClient()
sources = client.list_data_sources()
df = client.get_datasource("my-datasource").query(
"SELECT * FROM customers WHERE region = 'US'"
)
Automation Examples
CI/CD Integration
from domino import Domino
import sys
domino = Domino("team/ml-project")
run = domino.runs_start(
command="python train.py",
hardware_tier_name="gpu-large"
)
result = domino.runs_wait(run['runId'])
if result['status'] != 'Succeeded':
print(f"Training failed: {result['status']}")
sys.exit(1)
print("Training completed successfully!")
Batch Job Scheduler
from domino import Domino
import itertools
domino = Domino("team/experiments")
params = {
"learning_rate": [0.01, 0.001, 0.0001],
"batch_size": [32, 64, 128]
}
combinations = list(itertools.product(*params.values()))
param_names = list(params.keys())
runs = []
for combo in combinations:
param_str = " ".join(
f"--{name}={value}"
for name, value in zip(param_names, combo)
)
run = domino.runs_start(
command=f"python experiment.py {param_str}",
hardware_tier_name="gpu-small"
)
runs.append(run['runId'])
print(f"Started run {run['runId']} with {param_str}")
for run_id in runs:
result = domino.runs_wait(run_id)
print(f"Run {run_id}: {result['status']}")
Model Deployment Pipeline
from domino import Domino
domino = Domino("team/model-deployment")
train_run = domino.runs_start(command="python train.py")
domino.runs_wait(train_run['runId'])
eval_run = domino.runs_start(command="python evaluate.py")
domino.runs_wait(eval_run['runId'])
model = domino.model_publish(
file="serve.py",
function="predict",
name="production-model"
)
print(f"Model deployed: {model['id']}")
Error Handling
from domino import Domino
from domino.exceptions import DominoException
try:
domino = Domino("team/project")
run = domino.runs_start(command="python train.py")
except DominoException as e:
print(f"Domino error: {e}")
except Exception as e:
print(f"Unexpected error: {e}")
Best Practices
1. Use the Access Token Endpoint
import requests, os
TOKEN = requests.get("http://localhost:8899/access-token").text.strip()
BASE = os.environ["DOMINO_API_HOST"]
2. Handle Rate Limits
import time
from domino.exceptions import DominoException
def api_call_with_retry(func, max_retries=3):
for attempt in range(max_retries):
try:
return func()
except DominoException as e:
if "rate limit" in str(e).lower():
time.sleep(2 ** attempt)
else:
raise
raise Exception("Max retries exceeded")
3. Log API Calls
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def start_run(command):
logger.info(f"Starting run: {command}")
run = domino.runs_start(command=command)
logger.info(f"Run ID: {run['runId']}")
return run
Detailed API Reference
For comprehensive REST API documentation, see these specialized guides:
| Guide | Description |
|---|
| API-PROJECTS.md | Projects, collaborators, Git repos, goals |
| API-JOBS.md | Jobs, scheduled jobs, logs, tags |
| API-DATASETS.md | Datasets, snapshots, tags, grants |
| API-MODELS.md | Model APIs, deployments, registry |
| API-ENVIRONMENTS.md | Environments, revisions, Dockerfile |
| API-APPS.md | Apps, versions, instances, logs |
| API-ADMIN.md | Users, orgs, hardware tiers, data sources |
| API-REFERENCE.md | Complete endpoint reference |
Documentation Reference
Before writing or verifying any API call, use the cluster swagger to confirm current endpoint paths and field names. Use public docs for workflow context and field explanations.
Get the cluster base URL: $DOMINO_API_HOST (injected by Domino into every workspace, job, and app).
Fetch the swagger spec:
curl "$DOMINO_API_HOST/assets/public-api.json"
Public docs (workflow context and field explanations):