{"id":53754,"plugin_id":"plugins_6ac012b82680819195f8a26cbe32c246","kind":"skill","collection_source":"skill_api","comparison_source":null,"observed_at":"2026-10-24T13:54:57.963Z","digest":"301337c5848c4153491d4cc331b2f08d2cb3f13a79082e4df63e1e7970c59d6e","against":null,"payload":{"description":"Create, run, and manage Domino Jobs - batch executions for scripts, training, and data processing. Covers job configuration, hardware tiers, scheduled jobs (cron), monitoring status, viewing logs, and API-driven execution. Use when running batch workloads, scheduling recurring tasks, or automating training pipelines.","included_files":[],"name":"domino-jobs","skill_md_contents":"---\nname: domino-jobs\ndescription: Create, run, and manage Domino Jobs - batch executions for scripts, training, and data processing. Covers job configuration, hardware tiers, scheduled jobs (cron), monitoring status, viewing logs, and API-driven execution. Use when running batch workloads, scheduling recurring tasks, or automating training pipelines.\n---\n\n# Domino Jobs Skill\n\n## Description\nThis skill helps users create, run, and manage Domino Jobs - batch executions for running scripts, training models, and processing data.\n\n## Activation\nActivate this skill when users want to:\n- Run a script or notebook as a batch job\n- Schedule recurring jobs\n- Configure job settings (hardware, environment)\n- Monitor job status and results\n- Run jobs via API or CLI\n\n## What is a Domino Job?\n\nA Job is a batch execution that runs a script or command in Domino. Unlike workspaces, jobs:\n- Run to completion without user interaction\n- Are fully reproducible with tracked inputs/outputs\n- Can be scheduled to run automatically\n- Scale to any hardware tier\n\n## Creating and Running Jobs\n\n### Via Domino UI\n1. Navigate to your project\n2. Click **Jobs** in the navigation\n3. Click **Run**\n4. Configure:\n   - **File to Run**: Script path (e.g., `train.py`)\n   - **Arguments**: Command-line arguments (optional)\n   - **Hardware Tier**: Select resources\n   - **Compute Environment**: Select environment\n5. Click **Start**\n\n### Via Python (requests)\n```python\nimport requests, os\n\nTOKEN = requests.get(\"http://localhost:8899/access-token\").text.strip()\nBASE = os.environ[\"DOMINO_API_HOST\"]\nPROJECT_ID = os.environ[\"DOMINO_PROJECT_ID\"]\nheaders = {\"Authorization\": f\"Bearer {TOKEN}\", \"Content-Type\": \"application/json\"}\n\n# Start a job\nresponse = requests.post(\n    f\"{BASE}/api/jobs/v1/jobs\",\n    headers=headers,\n    json={\n        \"projectId\": PROJECT_ID,\n        \"runCommand\": \"python train.py --epochs 100\",\n        \"title\": \"Training run\",\n    }\n)\njob = response.json()\nprint(f\"Job ID: {job['id']}\")\n```\n\n### Via Domino CLI\n```bash\n# Start a job with script\ndomino run train.py\n\n# Run with arguments\ndomino run train.py arg1 arg2 arg3\n\n# Wait for job to complete\ndomino run --wait train.py arg1 arg2\n\n# Run direct command (not a script)\ndomino run --direct \"pip freeze | grep pandas\"\n```\n\n### Via REST API\n```bash\nTOKEN=$(curl -s http://localhost:8899/access-token)\ncurl -X POST \"$DOMINO_API_HOST/api/jobs/v1/jobs\" \\\n  -H \"Authorization: Bearer $TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d \"{\n    \\\"projectId\\\": \\\"$DOMINO_PROJECT_ID\\\",\n    \\\"runCommand\\\": \\\"python train.py\\\",\n    \\\"hardwareTierId\\\": \\\"tier-id\\\",\n    \\\"environmentId\\\": \\\"env-id\\\"\n  }\"\n```\n\n## Job Commands\n\n### Run Python Script\n```bash\npython train.py\n```\n\n### Run with Arguments\n```bash\npython train.py --data /mnt/data/train.csv --output /mnt/artifacts/model.pkl\n```\n\n### Run Jupyter Notebook\n```bash\njupyter nbconvert --to notebook --execute notebook.ipynb\n```\n\n### Run R Script\n```bash\nRscript analysis.R\n```\n\n### Run Shell Script\n```bash\nbash pipeline.sh\n```\n\n## Scheduled Jobs\n\n### Creating a Scheduled Job\n\n1. Go to **Scheduled Jobs** in your project\n2. Click **New Scheduled Job**\n3. Configure:\n   - **Name**: Descriptive name\n   - **Command**: Script to execute\n   - **Schedule**: Cron expression or preset\n   - **Hardware Tier**: Resources to use\n   - **Environment**: Compute environment\n\n### Schedule Examples\n\n| Schedule | Cron Expression |\n|----------|-----------------|\n| Every hour | `0 0 * * * ?` |\n| Daily at midnight | `0 0 0 * * ?` |\n| Every Monday 9 AM | `0 0 9 ? * MON` |\n| First of month | `0 0 0 1 * ?` |\n\n### Cron Expression Format\n\nDomino scheduled jobs use **Quartz** cron (six required fields, optional seventh year field; seconds first). This is not Unix five-field crontab. Use `?` in day-of-month or day-of-week when the other field is set. Field rules and special characters (`*`, `-`, `/`, `L`, `W`, `#`): [Quartz CronTrigger tutorial](https://www.quartz-scheduler.org/documentation/quartz-2.5.x/tutorials/crontrigger.html).\n\n```\n┌───────────── second (0-59)\n│ ┌───────────── minute (0-59)\n│ │ ┌───────────── hour (0-23)\n│ │ │ ┌───────────── day of month (1-31)\n│ │ │ │ ┌───────────── month (1-12)\n│ │ │ │ │ ┌───────────── day of week (0-7, SUN-SAT)\n│ │ │ │ │ │\n* * * * * *\n```\n\n### Run Modes\n\n**Sequential**: Wait for previous job to complete before starting next\n```python\n# Good for jobs that depend on previous output\n# Example: Daily model retrain that uses previous day's data\n```\n\n**Concurrent**: Allow multiple jobs to run simultaneously\n```python\n# Good for independent jobs\n# Example: Hourly data refresh that doesn't depend on previous runs\n```\n\n## Job Notifications\n\n### Email Notifications\nConfigure in job settings:\n- Success notifications\n- Failure notifications\n- Specific email addresses\n\n### Model API Updates\nTrigger Model API republish after job completes:\n1. In scheduled job settings\n2. Select **Update Model API** option\n3. Choose the Model API to update\n\n## Accessing Job Results\n\n### Output Files\nFiles written to `/mnt/` directories are available after job completion:\n- `/mnt/results/` - Custom outputs\n- `/mnt/artifacts/` - Model artifacts\n\n### Job Logs\nView logs in Domino UI or via API:\n```python\n# Get job logs\nlogs = domino.runs_get_logs(run_id)\nprint(logs)\n```\n\n### Stdout/Stderr\nAll print statements and errors are captured in job logs.\n\n## Environment Variables in Jobs\n\n```python\nimport os\n\n# Domino-provided\nrun_id = os.environ.get('DOMINO_RUN_ID')\nproject_name = os.environ.get('DOMINO_PROJECT_NAME')\nusername = os.environ.get('DOMINO_USER_NAME')\n\n# Custom (set in project or job settings)\napi_key = os.environ.get('MY_API_KEY')\n```\n\n## Job Best Practices\n\n### 1. Parameterize Scripts\n```python\nimport argparse\n\nparser = argparse.ArgumentParser()\nparser.add_argument('--data-path', required=True)\nparser.add_argument('--model-output', required=True)\nparser.add_argument('--epochs', type=int, default=100)\nargs = parser.parse_args()\n```\n\n### 2. Log Progress\n```python\nimport logging\n\nlogging.basicConfig(level=logging.INFO)\nlogger = logging.getLogger(__name__)\n\nlogger.info(\"Starting training...\")\nlogger.info(f\"Epoch {epoch}/{total_epochs}\")\nlogger.info(\"Training complete!\")\n```\n\n### 3. Handle Failures Gracefully\n```python\ntry:\n    train_model(data)\nexcept Exception as e:\n    logger.error(f\"Training failed: {e}\")\n    # Save checkpoint\n    save_checkpoint(model, \"checkpoint.pt\")\n    raise\n```\n\n### 4. Save Artifacts\n```python\nimport joblib\n\n# Save model\njoblib.dump(model, \"/mnt/artifacts/model.joblib\")\n\n# Save metrics\nwith open(\"/mnt/artifacts/metrics.json\", \"w\") as f:\n    json.dump(metrics, f)\n```\n\n## Monitoring Jobs\n\n### Job Status\n- **Pending**: Waiting for resources\n- **Running**: Currently executing\n- **Succeeded**: Completed successfully\n- **Failed**: Exited with error\n- **Stopped**: Manually cancelled\n\n### Check Status via API\n```python\nstatus = domino.runs_status(run_id)\nprint(f\"Status: {status['status']}\")\nprint(f\"Started: {status['startedAt']}\")\n```\n\n### Stop a Running Job\n```python\ndomino.runs_stop(run_id)\n```\n\n## Troubleshooting\n\n### Job Fails Immediately\n- Check script syntax\n- Verify file paths exist\n- Check environment has required packages\n\n### Job Times Out\n- Increase hardware tier resources\n- Optimize code performance\n- Check for infinite loops\n\n### Out of Memory\n- Use larger hardware tier\n- Optimize data loading (chunking, generators)\n- Clear variables when no longer needed\n\n## API Reference\n\nBefore writing or verifying any API call, confirm endpoint paths and field names in [API-SPECS.md](../domino-api-intro/API-SPECS.md) (use the **Public routes** section for `/api/jobs/…`; use **Internal routes** for legacy `/v4/jobs/…` and `/v4/runs/…`). Use public docs for workflow context and field explanations.\n\n**Get the cluster base URL:** `$DOMINO_API_HOST` (injected by Domino into every workspace, job, and app).\n\n**Public docs (workflow context and field explanations):**\n- [API Guide](https://docs.dominodatalab.com/en/latest/api_guide/f35c19/api-guide/)\n- [Create and run Jobs](https://docs.dominodatalab.com/en/latest/user_guide/af97b7/create-and-run-jobs/)\n- [Scheduled Jobs](https://docs.dominodatalab.com/en/latest/user_guide/673577/scheduled-jobs/)\n- [Work with Jobs](https://docs.dominodatalab.com/en/latest/user_guide/942549/work-with-jobs/)\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}