[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-nvidia-tao-run-platform":3,"mdc-yob4v5-key":34,"related-repo-nvidia-tao-run-platform":2685,"related-org-nvidia-tao-run-platform":2789},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":29,"sourceUrl":32,"mdContent":33},"tao-run-platform","submit and monitor TAO training jobs","TAO Execution SDK for submitting and monitoring GPU training jobs on supported platforms (Brev, SLURM, local Docker, Kubernetes). Use when the user wants to run TAO jobs through the SDK, get job tracking, S3 I\u002FO wrapping, multi-node distributed training, or platform-specific features that docker-run can't provide. Trigger phrases include \"use the TAO SDK\", \"call tao_sdk\", \"AutoMLRunner\", \"ActionWorkflow\", \"Job handles\", \"S3 I\u002FO wrapping\", \"TAO platform run\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},"nvidia","NVIDIA","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fnvidia.png",[12,16,17,20],{"name":13,"slug":14,"type":15},"Machine Learning","machine-learning","tag",{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},"Docker","docker",{"name":21,"slug":22,"type":15},"Kubernetes","kubernetes",2473,"https:\u002F\u002Fgithub.com\u002FNVIDIA\u002Fskills","2026-07-14T05:26:55.177568","Apache-2.0",281,[],{"repoUrl":24,"stars":23,"forks":27,"topics":30,"description":31},[],"AI agent skills published by NVIDIA","https:\u002F\u002Fgithub.com\u002FNVIDIA\u002Fskills\u002Ftree\u002FHEAD\u002Fskills\u002Ftao-run-platform","---\nname: tao-run-platform\ndescription: TAO Execution SDK for submitting and monitoring GPU training jobs on supported platforms (Brev, SLURM,\n  local Docker, Kubernetes). Use when the user wants to run TAO jobs through the SDK, get job tracking, S3 I\u002FO wrapping,\n  multi-node distributed training, or platform-specific features that docker-run can't provide. Trigger phrases include\n  \"use the TAO SDK\", \"call tao_sdk\", \"AutoMLRunner\", \"ActionWorkflow\", \"Job handles\", \"S3 I\u002FO wrapping\", \"TAO platform run\".\nlicense: Apache-2.0\ncompatibility: Requires Python 3.10+ and the nvidia-tao-sdk package (pip install nvidia-tao-sdk[all]).\nmetadata:\n  author: NVIDIA Corporation\n  version: \"0.1.0\"\nallowed-tools: Read Bash\ntags:\n- platform\n- tao\n- sdk\n---\n\n# TAO Execution SDK\n\nThe SDK is the **optional** Python layer for users who need job handles, S3 I\u002FO wrapping, or platform-specific features (SLURM\u002FLustre queues, Kubernetes Jobs, local Docker debugging, Brev instance reuse). Most TAO skills run with just `docker run` and don't need it. Reach for the SDK when:\n\n- You want a `Job` handle to poll status and stream logs over time.\n- You need S3-aware input download \u002F output upload baked into the entrypoint.\n- You're chaining multiple jobs and want persisted state.\n\n## Preflight\n\nInstall `nvidia-tao-sdk[all]` before using this platform — the `[all]` extra pulls in every platform-specific dependency (Brev, S3 utilities, etc.). If it is missing, install it by default in the active Python environment and rerun the import check:\n\n```bash\npython -c \"import tao_sdk\" 2>\u002Fdev\u002Fnull || {\n  echo \"Installing missing Python requirement: nvidia-tao-sdk[all]\"\n  python -m pip install \"nvidia-tao-sdk[all]\"\n}\npython -c \"import tao_sdk\"\n```\n\nThe package index is environment-specific — the runner\u002Fcontainer is expected to have a working `pip` configuration (e.g. `~\u002F.pip\u002Fpip.conf`, `PIP_INDEX_URL`, `PIP_EXTRA_INDEX_URL`, or proxy). If the install fails for index\u002Fnetwork reasons, that's a runner setup issue; this skill stays agnostic to the registry.\n\nMissing pip requirements are installed automatically by default and reported in the run log. Non-pip\u002Fsystem prerequisites still require a normal preflight failure and user-visible remediation.\n\n## Setup\n\nCredentials come from **environment variables** — read from the session environment (export them in your shell before launching).\n\n```python\nfrom tao_sdk.platforms.brev   import BrevSDK     # Brev GPU instances\n\nsdk = BrevSDK()      # reads BREV_API_TOKEN (optional — falls back to brev login)\n```\n\nThe SDK validates credentials lazily on first use and raises `CredentialError` with a clear message if a required env var is missing. Required env vars:\n\n| Platform | Required | Optional |\n|---|---|---|\n| Brev | — (manual `brev login` works) | `BREV_API_TOKEN` |\n| S3 I\u002FO (any platform) | `S3_BUCKET_NAME`, `ACCESS_KEY`, `SECRET_KEY` | `S3_ENDPOINT_URL`, `CLOUD_REGION` |\n| Container env | `NGC_KEY` | `HF_TOKEN` |\n\nThe agent never reads credential values — it only checks presence with `[ -n \"$VAR_NAME\" ]`.\n\n## Workflow Launch Intake\n\nFor any TAO workflow or action launch, first confirm the user goal. Then ask\nfor platform and monitoring preferences before credentials or launch details.\nGenerate the supported platform choices from the packaged helper, not by\nscanning platform docs or folders:\n\n```bash\n${TAO_SKILL_BANK_PATH:-~\u002Ftao-skills-external}\u002Fscripts\u002Flist_tao_platforms.py \\\n  --skill-bank ${TAO_SKILL_BANK_PATH:-~\u002Ftao-skills-external} --format text\n```\n\nAsk:\n\n1. Which supported platform should run this workflow?\n2. Should long-running monitoring stay enabled? Default: enabled. This means\n   the agent remains attached and posts status until terminal state, including\n   long `PENDING` queue waits.\n3. How many minutes between status updates? Default: 5 minutes.\n\nAfter the model\u002Faction are known, resolve the default container image from the\npackaged metadata and ask the user to confirm it or provide `image=\u003Coverride>`\nbefore creating runner files:\n\n```bash\n${TAO_SKILL_BANK_PATH:-~\u002Ftao-skills-external}\u002Fscripts\u002Fresolve_tao_image.py \\\n  --skill-bank ${TAO_SKILL_BANK_PATH:-~\u002Ftao-skills-external} \\\n  --model \u003Cnetwork_arch> --action \u003Caction> --format text\n```\n\nFor train-capable model workflows, inspect model-level AutoML metadata before\ncreating a plain training job:\n\n```bash\n${TAO_SKILL_BANK_PATH:-~\u002Ftao-skills-external}\u002Fscripts\u002Flist_tao_models.py \\\n  --skill-bank ${TAO_SKILL_BANK_PATH:-~\u002Ftao-skills-external} \\\n  --scope automl --format json\n```\n\nIf the selected model has `automl_enabled: true` and a valid train schema,\nroute training through `skills\u002Fapplications\u002Ftao-run-automl` by default with\n`automl_policy: on`. A workflow should only bypass AutoML when its run settings\ninclude `automl_policy: off`, the user explicitly asks for a plain run, or the\nmodel metadata says AutoML is enabled but the train schema is not packaged yet.\n\nAfter the platform is selected, get the credential filter:\n\n```bash\n${TAO_SKILL_BANK_PATH:-~\u002Ftao-skills-external}\u002Fscripts\u002Flist_tao_platforms.py \\\n  --skill-bank ${TAO_SKILL_BANK_PATH:-~\u002Ftao-skills-external} \\\n  --platform \u003Cplatform> --format text\n```\n\nAsk only for credentials returned for the selected platform. For example, SLURM\nneeds `SLURM_USER` and `SLURM_HOSTNAME`; it does not need Brev credentials.\nKubernetes and local Docker do not need Brev or SLURM credentials. Ask storage\ncredentials such as S3 keys only when the selected platform and the data\u002Fresult\nURIs require them.\n\n## Core API\n\nAll platform SDKs implement the same core shape:\n\n```python\nsdk.create_job(image, command, gpu_count=1, env_vars=None, inputs=None, outputs=None, **kwargs) -> Job\nsdk.get_job_status(job_id) -> JobStatus\nsdk.get_job_logs(job_id, tail=None) -> str\nsdk.cancel_job(job_id) -> bool\nsdk.get_failure_analysis(job_id) -> dict | None\nsdk.get_job_results_dir(job_id) -> str\nsdk.check_path(remote_path) -> bool\nsdk.list_path(remote_path) -> list[str]\n```\n\nBrev-only:\n- `sdk.delete_instance(instance_id)` — clean up an ephemeral instance.\n- `sdk.list_instances()` — list active instances.\n\n## Submitting a Job\n\nThe agent always **constructs the container command via `build_entrypoint`** before calling `create_job`. The agent reads the action's schema from `skill_info.yaml` (`command`, `mode`, `config_format`, `inputs`, `outputs`, `upload_excludes`) and passes those fields as kwargs. `build_entrypoint` then bakes:\n\n1. The in-container `script_runner` runtime (inlined as a base64 heredoc — no need for `tao_sdk` to be installed in the container).\n2. The CLI invocation that, at runtime in the container, will: download declared inputs (S3 \u002F HF-Hub \u002F NGC), write the spec file at `{config_path}` with remote URIs rewritten to local paths, run the user command, and upload outputs.\n\nOutput destinations are resolved at runtime from env vars the SDK injects (see \"Where outputs go\" below). The platform SDK's `create_job` runs the resulting command **as-is** — no inputs\u002Foutputs kwargs, no implicit wrapping. The data flow is visible in the agent's code.\n\n### Where outputs go (resolved at runtime — agents don't manage it)\n\nThe SDK injects `TAO_JOB_ID` (matches `Job.id`) and, when a persistent mount is attached, `TAO_RESULTS_ROOT` into the container env. Inside the container, `script_runner` resolves output destinations:\n\n| Container env | Result |\n|---|---|\n| `TAO_RESULTS_ROOT` set (Lustre \u002F PVC \u002F bind \u002F NFS) | Outputs at `{TAO_RESULTS_ROOT}\u002F\u003Cjob_id>\u002F\u003Ckey>\u002F`; no upload |\n| `S3_BUCKET_NAME` set (cloud, no mount) | Outputs at `s3:\u002F\u002F{bucket}\u002Fresults\u002F\u003Cjob_id>\u002F\u003Ckey>\u002F`; uploaded at end of run |\n| Neither | Outputs at `\u002Fresults\u002F\u003Cjob_id>\u002F\u003Ckey>\u002F` (container-ephemeral) with a loud end-of-run warning |\n\nPer-platform policy:\n\n| SDK | What gets injected |\n|---|---|\n| `SlurmSDK` | `TAO_RESULTS_ROOT={SLURM_BASE_RESULTS_DIR}\u002Fresults` (always — Lustre, never S3, avoids GPU-idle scheduler kill) |\n| `KubernetesSDK` \u002F `DockerSDK` \u002F `BrevSDK` | `TAO_RESULTS_ROOT=\u002Fresults` if a mount targets `\u002Fresults`; otherwise S3 fallback |\n\nAgents who want a custom destination can put an `s3:\u002F\u002F...` URI or absolute path directly at the output spec key — explicit values override the auto-fill. Otherwise, model-natural defaults like cosmos-rl's `output_dir: \"output\"` or DINO's empty `results_dir` are auto-rewritten by `script_runner`.\n\n### The spec is nested dicts, NOT flat dotted keys\n\nThis is the most common mistake when constructing a spec. The dotted notation that appears in `skill_info.yaml`'s `inputs:` \u002F `outputs:` blocks (e.g. `section.subsection.key`) is a **path into** a nested spec — `script_runner` looks values up at that path. It's not the spec's own shape. The spec mirrors whatever shape the model's container expects (typically a nested TOML\u002FYAML).\n\n```python\n# ✓ CORRECT — nested dicts\nspecs = {\n    \"section\": {\n        \"subsection\": {\"key\": \"value\"},\n    },\n}\n\n# ✗ WRONG — flat top-level key with dots. TOML\u002FYAML emits this as a\n# quoted bare-string key, the model sees an empty `section` table, and\n# any input declared at \"section.subsection.key\" silently fails to\n# download because _get_nested(specs, \"section.subsection.key\") → None.\nspecs = {\n    \"section.subsection.key\": \"value\",\n}\n```\n\nThe two shapes look superficially similar but mean different things. When in doubt, open the model's `references\u002F` directory (e.g. a default-spec TOML or YAML) — that's the literal nested structure the spec dict needs to mirror. The `inputs:` \u002F `outputs:` declarations in `skill_info.yaml` are *paths into* the nested spec, not key names.\n\n### Constructing the spec \u002F args\n\nThe skill's action declares its config mechanism in `skill_info.yaml`'s `actions.\u003Caction>.mode` field. Treat missing `mode` as invalid metadata and fix the skill instead of inferring a default. Read `actions.\u003Caction>.mode` first, then pass the matching argument shape to `build_entrypoint`:\n\n| Declared mode | What the agent passes |\n|---|---|\n| `config` | `specs=...` with spec-keyed `inputs` \u002F `outputs`; the helper writes the spec file, rewrites URIs, and runs the command |\n| `args` | `args=...` with optional spec-keyed `inputs` \u002F `outputs`; the helper substitutes CLI args into the command template |\n| `passthrough` | path-keyed `inputs=...` and\u002For `outputs=...`; the helper downloads to listed paths, runs the command, and uploads listed outputs |\n\nDo not infer mode from missing metadata. Missing `mode` means the skill contract is stale.\n\nSee [`references\u002Fspec-construction.md`](references\u002Fspec-construction.md) for the per-mode construction strategy, the recommended decision order, and worked `build_entrypoint` examples for spec-driven jobs (config file) and path-keyed jobs (no config file).\n\n## Resolving container images\n\nSkills declare images either by key (`tao_toolkit.pyt`) or as an absolute URI (`nvcr.io\u002F...`). Use `resolve_container_image()` to handle both:\n\n```python\nfrom tao_sdk.versions import resolve_container_image\nimage = resolve_container_image(skill_info[\"container_image\"])\n```\n\nBehind the scenes it walks `versions.yaml` for keys; absolute URIs are returned as-is.\n\n## Monitoring\n\n```python\nstatus = sdk.get_job_status(job.id)\nprint(status.status)   # Pending, Running, Complete, Error, Canceled\nprint(status.message)  # platform-specific detail\n\nlogs = sdk.get_job_logs(job.id, tail=200)\nprint(logs)\n```\n\nOn failure, `get_failure_analysis()` classifies the root cause:\n\n```python\nanalysis = sdk.get_failure_analysis(job.id)\nif analysis:\n    print(analysis[\"err_class\"])   # ERR_PROGRAM, ERR_INFRA, etc.\n    print(analysis[\"suggestion\"])  # human-readable fix\n    for event in analysis.get(\"job_failure_by_node_event\", []):\n        print(event[\"node_event_name\"], event[\"message\"])  # OOM, GPU error, etc.\n```\n\n## Polling pattern\n\nFor interactive runs where the user wants to watch:\n\n```python\nimport time\nstatus_interval_minutes = status_interval_minutes or 5\nwhile True:\n    status = sdk.get_job_status(job.id)\n    if status.status in (\"Complete\", \"Error\", \"Canceled\"):\n        break\n    print(f\"  {status.status}\")\n    time.sleep(status_interval_minutes * 60)\n\nif status.status == \"Error\":\n    print(sdk.get_job_logs(job.id, tail=100))\n    print(sdk.get_failure_analysis(job.id))\n```\n\nWith long-running monitoring enabled, do not stop after 30 minutes or after a\nfew unchanged polls. Keep emitting updates every `status_interval_minutes`\nuntil the job finishes, fails, is canceled, or the user asks to detach\u002Fstop.\nIf the chat\u002Fruntime cannot remain open that long, say so explicitly and provide\nthe durable workflow\u002Flog path for manual status refresh.\n\nDo not use a final response for non-terminal monitored jobs. Finalizing the\nturn detaches the chat watcher. Keep non-terminal status messages in progress\nupdates and continue polling; only finalize at terminal state, explicit user\ndetach\u002Fstop, or a real runtime limit that prevents further polling.\n\nFor background runs, persist `job.id` and the `state_file` path, then re-attach later by constructing the same SDK and calling `get_job_status(job_id)` — job state is read from the on-disk store.\n\n## Orchestration patterns\n\nMulti-step workflows, parallel sweeps, and run-folder durability via\n`ActionWorkflow` live in\n[`references\u002Forchestration-patterns.md`](references\u002Forchestration-patterns.md).\nRead it before chaining `create_job` calls, sweeping a parameter, or\npersisting run state across context breaks.\n\n## Dataset utilities\n\nWhen the skill's documented filenames don't match the user's layout, list the dataset to confirm:\n\n```python\nassert sdk.check_path(\"s3:\u002F\u002Fmy-bucket\u002Fcoco\u002F\")\nfiles = sdk.list_path(\"s3:\u002F\u002Fmy-bucket\u002Fcoco\u002Ftrain\u002F\")\n# Use the actual paths to set spec fields.\n```\n\nFor S3 paths, strip trailing slashes when concatenating to avoid `\u002F\u002F`:\n\n```python\nbase = dataset_uri.rstrip(\"\u002F\")\nspecs[\"dataset\"][\"train_csv\"] = f\"{base}\u002Ftrain.csv\"   # nested — see \"spec is nested dicts\"\n```\n\n## Platform-specific notes\n\nSee [`references\u002Fplatform-notes.md`](references\u002Fplatform-notes.md) for per-platform behavior, kwargs, and credential scoping: Brev (`instance_id`\u002F`gpu_type`\u002F`cloud_cred_id`\u002F`workspace_group_id`, ready-wait timeouts), SLURM (sbatch over SSH, Lustre paths, queue defaults), Kubernetes (kubeconfig, GPU Operator), and local Docker (single-host, multi-GPU).\n\n## Error patterns\n\nSDK error → root cause → fix mappings are in\n[`references\u002Ferror-patterns.md`](references\u002Ferror-patterns.md). Read when\nyou hit a `CredentialError`, image-pull failure, stuck-Pending job, or\nsimilar — the entries map exception text to the underlying cause.\n\n## What the SDK does NOT do\n\nThe SDK does not read\u002Finterpret skills, run AutoML on its own, decide spec contents, select platforms, or orchestrate multi-step workflows — those stay the agent's responsibility. See [`references\u002Fscope.md`](references\u002Fscope.md) for the full scope guardrails, including the model-level AutoML policy (`automl_enabled: true` → `skills\u002Fapplications\u002Ftao-run-automl` unless `automl_policy: off` or the user asks for a plain single run).\n",{"data":35,"body":45},{"name":4,"description":6,"license":26,"compatibility":36,"metadata":37,"allowed-tools":40,"tags":41},"Requires Python 3.10+ and the nvidia-tao-sdk package (pip install nvidia-tao-sdk[all]).",{"author":38,"version":39},"NVIDIA Corporation","0.1.0","Read Bash",[42,43,44],"platform","tao","sdk",{"type":46,"children":47},"root",[48,57,80,108,115,136,294,330,335,341,353,386,399,535,548,554,559,657,662,689,702,844,849,953,990,995,1110,1131,1137,1142,1216,1221,1246,1252,1336,1373,1392,1399,1435,1527,1532,1623,1658,1664,1713,1834,1875,1881,1921,2048,2060,2084,2090,2119,2142,2155,2161,2215,2228,2283,2289,2294,2396,2409,2414,2443,2449,2480,2486,2491,2522,2534,2557,2563,2607,2613,2636,2642,2679],{"type":49,"tag":50,"props":51,"children":53},"element","h1",{"id":52},"tao-execution-sdk",[54],{"type":55,"value":56},"text","TAO Execution SDK",{"type":49,"tag":58,"props":59,"children":60},"p",{},[61,63,69,71,78],{"type":55,"value":62},"The SDK is the ",{"type":49,"tag":64,"props":65,"children":66},"strong",{},[67],{"type":55,"value":68},"optional",{"type":55,"value":70}," Python layer for users who need job handles, S3 I\u002FO wrapping, or platform-specific features (SLURM\u002FLustre queues, Kubernetes Jobs, local Docker debugging, Brev instance reuse). Most TAO skills run with just ",{"type":49,"tag":72,"props":73,"children":75},"code",{"className":74},[],[76],{"type":55,"value":77},"docker run",{"type":55,"value":79}," and don't need it. Reach for the SDK when:",{"type":49,"tag":81,"props":82,"children":83},"ul",{},[84,98,103],{"type":49,"tag":85,"props":86,"children":87},"li",{},[88,90,96],{"type":55,"value":89},"You want a ",{"type":49,"tag":72,"props":91,"children":93},{"className":92},[],[94],{"type":55,"value":95},"Job",{"type":55,"value":97}," handle to poll status and stream logs over time.",{"type":49,"tag":85,"props":99,"children":100},{},[101],{"type":55,"value":102},"You need S3-aware input download \u002F output upload baked into the entrypoint.",{"type":49,"tag":85,"props":104,"children":105},{},[106],{"type":55,"value":107},"You're chaining multiple jobs and want persisted state.",{"type":49,"tag":109,"props":110,"children":112},"h2",{"id":111},"preflight",[113],{"type":55,"value":114},"Preflight",{"type":49,"tag":58,"props":116,"children":117},{},[118,120,126,128,134],{"type":55,"value":119},"Install ",{"type":49,"tag":72,"props":121,"children":123},{"className":122},[],[124],{"type":55,"value":125},"nvidia-tao-sdk[all]",{"type":55,"value":127}," before using this platform — the ",{"type":49,"tag":72,"props":129,"children":131},{"className":130},[],[132],{"type":55,"value":133},"[all]",{"type":55,"value":135}," extra pulls in every platform-specific dependency (Brev, S3 utilities, etc.). If it is missing, install it by default in the active Python environment and rerun the import check:",{"type":49,"tag":137,"props":138,"children":143},"pre",{"className":139,"code":140,"language":141,"meta":142,"style":142},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","python -c \"import tao_sdk\" 2>\u002Fdev\u002Fnull || {\n  echo \"Installing missing Python requirement: nvidia-tao-sdk[all]\"\n  python -m pip install \"nvidia-tao-sdk[all]\"\n}\npython -c \"import tao_sdk\"\n","bash","",[144],{"type":49,"tag":72,"props":145,"children":146},{"__ignoreMap":142},[147,201,225,261,270],{"type":49,"tag":148,"props":149,"children":152},"span",{"class":150,"line":151},"line",1,[153,159,165,171,176,181,186,191,196],{"type":49,"tag":148,"props":154,"children":156},{"style":155},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[157],{"type":55,"value":158},"python",{"type":49,"tag":148,"props":160,"children":162},{"style":161},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[163],{"type":55,"value":164}," -c",{"type":49,"tag":148,"props":166,"children":168},{"style":167},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[169],{"type":55,"value":170}," \"",{"type":49,"tag":148,"props":172,"children":173},{"style":161},[174],{"type":55,"value":175},"import tao_sdk",{"type":49,"tag":148,"props":177,"children":178},{"style":167},[179],{"type":55,"value":180},"\"",{"type":49,"tag":148,"props":182,"children":183},{"style":167},[184],{"type":55,"value":185}," 2>",{"type":49,"tag":148,"props":187,"children":188},{"style":161},[189],{"type":55,"value":190},"\u002Fdev\u002Fnull",{"type":49,"tag":148,"props":192,"children":193},{"style":167},[194],{"type":55,"value":195}," ||",{"type":49,"tag":148,"props":197,"children":198},{"style":167},[199],{"type":55,"value":200}," {\n",{"type":49,"tag":148,"props":202,"children":204},{"class":150,"line":203},2,[205,211,215,220],{"type":49,"tag":148,"props":206,"children":208},{"style":207},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[209],{"type":55,"value":210},"  echo",{"type":49,"tag":148,"props":212,"children":213},{"style":167},[214],{"type":55,"value":170},{"type":49,"tag":148,"props":216,"children":217},{"style":161},[218],{"type":55,"value":219},"Installing missing Python requirement: nvidia-tao-sdk[all]",{"type":49,"tag":148,"props":221,"children":222},{"style":167},[223],{"type":55,"value":224},"\"\n",{"type":49,"tag":148,"props":226,"children":228},{"class":150,"line":227},3,[229,234,239,244,249,253,257],{"type":49,"tag":148,"props":230,"children":231},{"style":155},[232],{"type":55,"value":233},"  python",{"type":49,"tag":148,"props":235,"children":236},{"style":161},[237],{"type":55,"value":238}," -m",{"type":49,"tag":148,"props":240,"children":241},{"style":161},[242],{"type":55,"value":243}," pip",{"type":49,"tag":148,"props":245,"children":246},{"style":161},[247],{"type":55,"value":248}," install",{"type":49,"tag":148,"props":250,"children":251},{"style":167},[252],{"type":55,"value":170},{"type":49,"tag":148,"props":254,"children":255},{"style":161},[256],{"type":55,"value":125},{"type":49,"tag":148,"props":258,"children":259},{"style":167},[260],{"type":55,"value":224},{"type":49,"tag":148,"props":262,"children":264},{"class":150,"line":263},4,[265],{"type":49,"tag":148,"props":266,"children":267},{"style":167},[268],{"type":55,"value":269},"}\n",{"type":49,"tag":148,"props":271,"children":273},{"class":150,"line":272},5,[274,278,282,286,290],{"type":49,"tag":148,"props":275,"children":276},{"style":155},[277],{"type":55,"value":158},{"type":49,"tag":148,"props":279,"children":280},{"style":161},[281],{"type":55,"value":164},{"type":49,"tag":148,"props":283,"children":284},{"style":167},[285],{"type":55,"value":170},{"type":49,"tag":148,"props":287,"children":288},{"style":161},[289],{"type":55,"value":175},{"type":49,"tag":148,"props":291,"children":292},{"style":167},[293],{"type":55,"value":224},{"type":49,"tag":58,"props":295,"children":296},{},[297,299,305,307,313,315,321,322,328],{"type":55,"value":298},"The package index is environment-specific — the runner\u002Fcontainer is expected to have a working ",{"type":49,"tag":72,"props":300,"children":302},{"className":301},[],[303],{"type":55,"value":304},"pip",{"type":55,"value":306}," configuration (e.g. ",{"type":49,"tag":72,"props":308,"children":310},{"className":309},[],[311],{"type":55,"value":312},"~\u002F.pip\u002Fpip.conf",{"type":55,"value":314},", ",{"type":49,"tag":72,"props":316,"children":318},{"className":317},[],[319],{"type":55,"value":320},"PIP_INDEX_URL",{"type":55,"value":314},{"type":49,"tag":72,"props":323,"children":325},{"className":324},[],[326],{"type":55,"value":327},"PIP_EXTRA_INDEX_URL",{"type":55,"value":329},", or proxy). If the install fails for index\u002Fnetwork reasons, that's a runner setup issue; this skill stays agnostic to the registry.",{"type":49,"tag":58,"props":331,"children":332},{},[333],{"type":55,"value":334},"Missing pip requirements are installed automatically by default and reported in the run log. Non-pip\u002Fsystem prerequisites still require a normal preflight failure and user-visible remediation.",{"type":49,"tag":109,"props":336,"children":338},{"id":337},"setup",[339],{"type":55,"value":340},"Setup",{"type":49,"tag":58,"props":342,"children":343},{},[344,346,351],{"type":55,"value":345},"Credentials come from ",{"type":49,"tag":64,"props":347,"children":348},{},[349],{"type":55,"value":350},"environment variables",{"type":55,"value":352}," — read from the session environment (export them in your shell before launching).",{"type":49,"tag":137,"props":354,"children":357},{"className":355,"code":356,"language":158,"meta":142,"style":142},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","from tao_sdk.platforms.brev   import BrevSDK     # Brev GPU instances\n\nsdk = BrevSDK()      # reads BREV_API_TOKEN (optional — falls back to brev login)\n",[358],{"type":49,"tag":72,"props":359,"children":360},{"__ignoreMap":142},[361,369,378],{"type":49,"tag":148,"props":362,"children":363},{"class":150,"line":151},[364],{"type":49,"tag":148,"props":365,"children":366},{},[367],{"type":55,"value":368},"from tao_sdk.platforms.brev   import BrevSDK     # Brev GPU instances\n",{"type":49,"tag":148,"props":370,"children":371},{"class":150,"line":203},[372],{"type":49,"tag":148,"props":373,"children":375},{"emptyLinePlaceholder":374},true,[376],{"type":55,"value":377},"\n",{"type":49,"tag":148,"props":379,"children":380},{"class":150,"line":227},[381],{"type":49,"tag":148,"props":382,"children":383},{},[384],{"type":55,"value":385},"sdk = BrevSDK()      # reads BREV_API_TOKEN (optional — falls back to brev login)\n",{"type":49,"tag":58,"props":387,"children":388},{},[389,391,397],{"type":55,"value":390},"The SDK validates credentials lazily on first use and raises ",{"type":49,"tag":72,"props":392,"children":394},{"className":393},[],[395],{"type":55,"value":396},"CredentialError",{"type":55,"value":398}," with a clear message if a required env var is missing. Required env vars:",{"type":49,"tag":400,"props":401,"children":402},"table",{},[403,427],{"type":49,"tag":404,"props":405,"children":406},"thead",{},[407],{"type":49,"tag":408,"props":409,"children":410},"tr",{},[411,417,422],{"type":49,"tag":412,"props":413,"children":414},"th",{},[415],{"type":55,"value":416},"Platform",{"type":49,"tag":412,"props":418,"children":419},{},[420],{"type":55,"value":421},"Required",{"type":49,"tag":412,"props":423,"children":424},{},[425],{"type":55,"value":426},"Optional",{"type":49,"tag":428,"props":429,"children":430},"tbody",{},[431,462,509],{"type":49,"tag":408,"props":432,"children":433},{},[434,440,453],{"type":49,"tag":435,"props":436,"children":437},"td",{},[438],{"type":55,"value":439},"Brev",{"type":49,"tag":435,"props":441,"children":442},{},[443,445,451],{"type":55,"value":444},"— (manual ",{"type":49,"tag":72,"props":446,"children":448},{"className":447},[],[449],{"type":55,"value":450},"brev login",{"type":55,"value":452}," works)",{"type":49,"tag":435,"props":454,"children":455},{},[456],{"type":49,"tag":72,"props":457,"children":459},{"className":458},[],[460],{"type":55,"value":461},"BREV_API_TOKEN",{"type":49,"tag":408,"props":463,"children":464},{},[465,470,493],{"type":49,"tag":435,"props":466,"children":467},{},[468],{"type":55,"value":469},"S3 I\u002FO (any platform)",{"type":49,"tag":435,"props":471,"children":472},{},[473,479,480,486,487],{"type":49,"tag":72,"props":474,"children":476},{"className":475},[],[477],{"type":55,"value":478},"S3_BUCKET_NAME",{"type":55,"value":314},{"type":49,"tag":72,"props":481,"children":483},{"className":482},[],[484],{"type":55,"value":485},"ACCESS_KEY",{"type":55,"value":314},{"type":49,"tag":72,"props":488,"children":490},{"className":489},[],[491],{"type":55,"value":492},"SECRET_KEY",{"type":49,"tag":435,"props":494,"children":495},{},[496,502,503],{"type":49,"tag":72,"props":497,"children":499},{"className":498},[],[500],{"type":55,"value":501},"S3_ENDPOINT_URL",{"type":55,"value":314},{"type":49,"tag":72,"props":504,"children":506},{"className":505},[],[507],{"type":55,"value":508},"CLOUD_REGION",{"type":49,"tag":408,"props":510,"children":511},{},[512,517,526],{"type":49,"tag":435,"props":513,"children":514},{},[515],{"type":55,"value":516},"Container env",{"type":49,"tag":435,"props":518,"children":519},{},[520],{"type":49,"tag":72,"props":521,"children":523},{"className":522},[],[524],{"type":55,"value":525},"NGC_KEY",{"type":49,"tag":435,"props":527,"children":528},{},[529],{"type":49,"tag":72,"props":530,"children":532},{"className":531},[],[533],{"type":55,"value":534},"HF_TOKEN",{"type":49,"tag":58,"props":536,"children":537},{},[538,540,546],{"type":55,"value":539},"The agent never reads credential values — it only checks presence with ",{"type":49,"tag":72,"props":541,"children":543},{"className":542},[],[544],{"type":55,"value":545},"[ -n \"$VAR_NAME\" ]",{"type":55,"value":547},".",{"type":49,"tag":109,"props":549,"children":551},{"id":550},"workflow-launch-intake",[552],{"type":55,"value":553},"Workflow Launch Intake",{"type":49,"tag":58,"props":555,"children":556},{},[557],{"type":55,"value":558},"For any TAO workflow or action launch, first confirm the user goal. Then ask\nfor platform and monitoring preferences before credentials or launch details.\nGenerate the supported platform choices from the packaged helper, not by\nscanning platform docs or folders:",{"type":49,"tag":137,"props":560,"children":562},{"className":139,"code":561,"language":141,"meta":142,"style":142},"${TAO_SKILL_BANK_PATH:-~\u002Ftao-skills-external}\u002Fscripts\u002Flist_tao_platforms.py \\\n  --skill-bank ${TAO_SKILL_BANK_PATH:-~\u002Ftao-skills-external} --format text\n",[563],{"type":49,"tag":72,"props":564,"children":565},{"__ignoreMap":142},[566,610],{"type":49,"tag":148,"props":567,"children":568},{"class":150,"line":151},[569,574,580,585,590,595,600,605],{"type":49,"tag":148,"props":570,"children":571},{"style":167},[572],{"type":55,"value":573},"${",{"type":49,"tag":148,"props":575,"children":577},{"style":576},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[578],{"type":55,"value":579},"TAO_SKILL_BANK_PATH",{"type":49,"tag":148,"props":581,"children":582},{"style":167},[583],{"type":55,"value":584},":-",{"type":49,"tag":148,"props":586,"children":587},{"style":576},[588],{"type":55,"value":589},"~",{"type":49,"tag":148,"props":591,"children":592},{"style":167},[593],{"type":55,"value":594},"\u002F",{"type":49,"tag":148,"props":596,"children":597},{"style":576},[598],{"type":55,"value":599},"tao-skills-external",{"type":49,"tag":148,"props":601,"children":602},{"style":167},[603],{"type":55,"value":604},"}",{"type":49,"tag":148,"props":606,"children":607},{"style":576},[608],{"type":55,"value":609},"\u002Fscripts\u002Flist_tao_platforms.py \\\n",{"type":49,"tag":148,"props":611,"children":612},{"class":150,"line":203},[613,618,623,627,631,635,639,643,647,652],{"type":49,"tag":148,"props":614,"children":615},{"style":155},[616],{"type":55,"value":617},"  --skill-bank",{"type":49,"tag":148,"props":619,"children":620},{"style":167},[621],{"type":55,"value":622}," ${",{"type":49,"tag":148,"props":624,"children":625},{"style":576},[626],{"type":55,"value":579},{"type":49,"tag":148,"props":628,"children":629},{"style":167},[630],{"type":55,"value":584},{"type":49,"tag":148,"props":632,"children":633},{"style":576},[634],{"type":55,"value":589},{"type":49,"tag":148,"props":636,"children":637},{"style":167},[638],{"type":55,"value":594},{"type":49,"tag":148,"props":640,"children":641},{"style":576},[642],{"type":55,"value":599},{"type":49,"tag":148,"props":644,"children":645},{"style":167},[646],{"type":55,"value":604},{"type":49,"tag":148,"props":648,"children":649},{"style":161},[650],{"type":55,"value":651}," --format",{"type":49,"tag":148,"props":653,"children":654},{"style":161},[655],{"type":55,"value":656}," text\n",{"type":49,"tag":58,"props":658,"children":659},{},[660],{"type":55,"value":661},"Ask:",{"type":49,"tag":663,"props":664,"children":665},"ol",{},[666,671,684],{"type":49,"tag":85,"props":667,"children":668},{},[669],{"type":55,"value":670},"Which supported platform should run this workflow?",{"type":49,"tag":85,"props":672,"children":673},{},[674,676,682],{"type":55,"value":675},"Should long-running monitoring stay enabled? Default: enabled. This means\nthe agent remains attached and posts status until terminal state, including\nlong ",{"type":49,"tag":72,"props":677,"children":679},{"className":678},[],[680],{"type":55,"value":681},"PENDING",{"type":55,"value":683}," queue waits.",{"type":49,"tag":85,"props":685,"children":686},{},[687],{"type":55,"value":688},"How many minutes between status updates? Default: 5 minutes.",{"type":49,"tag":58,"props":690,"children":691},{},[692,694,700],{"type":55,"value":693},"After the model\u002Faction are known, resolve the default container image from the\npackaged metadata and ask the user to confirm it or provide ",{"type":49,"tag":72,"props":695,"children":697},{"className":696},[],[698],{"type":55,"value":699},"image=\u003Coverride>",{"type":55,"value":701},"\nbefore creating runner files:",{"type":49,"tag":137,"props":703,"children":705},{"className":139,"code":704,"language":141,"meta":142,"style":142},"${TAO_SKILL_BANK_PATH:-~\u002Ftao-skills-external}\u002Fscripts\u002Fresolve_tao_image.py \\\n  --skill-bank ${TAO_SKILL_BANK_PATH:-~\u002Ftao-skills-external} \\\n  --model \u003Cnetwork_arch> --action \u003Caction> --format text\n",[706],{"type":49,"tag":72,"props":707,"children":708},{"__ignoreMap":142},[709,745,785],{"type":49,"tag":148,"props":710,"children":711},{"class":150,"line":151},[712,716,720,724,728,732,736,740],{"type":49,"tag":148,"props":713,"children":714},{"style":167},[715],{"type":55,"value":573},{"type":49,"tag":148,"props":717,"children":718},{"style":576},[719],{"type":55,"value":579},{"type":49,"tag":148,"props":721,"children":722},{"style":167},[723],{"type":55,"value":584},{"type":49,"tag":148,"props":725,"children":726},{"style":576},[727],{"type":55,"value":589},{"type":49,"tag":148,"props":729,"children":730},{"style":167},[731],{"type":55,"value":594},{"type":49,"tag":148,"props":733,"children":734},{"style":576},[735],{"type":55,"value":599},{"type":49,"tag":148,"props":737,"children":738},{"style":167},[739],{"type":55,"value":604},{"type":49,"tag":148,"props":741,"children":742},{"style":576},[743],{"type":55,"value":744},"\u002Fscripts\u002Fresolve_tao_image.py \\\n",{"type":49,"tag":148,"props":746,"children":747},{"class":150,"line":203},[748,752,756,760,764,768,772,776,780],{"type":49,"tag":148,"props":749,"children":750},{"style":155},[751],{"type":55,"value":617},{"type":49,"tag":148,"props":753,"children":754},{"style":167},[755],{"type":55,"value":622},{"type":49,"tag":148,"props":757,"children":758},{"style":576},[759],{"type":55,"value":579},{"type":49,"tag":148,"props":761,"children":762},{"style":167},[763],{"type":55,"value":584},{"type":49,"tag":148,"props":765,"children":766},{"style":576},[767],{"type":55,"value":589},{"type":49,"tag":148,"props":769,"children":770},{"style":167},[771],{"type":55,"value":594},{"type":49,"tag":148,"props":773,"children":774},{"style":576},[775],{"type":55,"value":599},{"type":49,"tag":148,"props":777,"children":778},{"style":167},[779],{"type":55,"value":604},{"type":49,"tag":148,"props":781,"children":782},{"style":576},[783],{"type":55,"value":784}," \\\n",{"type":49,"tag":148,"props":786,"children":787},{"class":150,"line":227},[788,793,798,803,808,813,818,822,827,832,836,840],{"type":49,"tag":148,"props":789,"children":790},{"style":161},[791],{"type":55,"value":792},"  --model",{"type":49,"tag":148,"props":794,"children":795},{"style":167},[796],{"type":55,"value":797}," \u003C",{"type":49,"tag":148,"props":799,"children":800},{"style":161},[801],{"type":55,"value":802},"network_arc",{"type":49,"tag":148,"props":804,"children":805},{"style":576},[806],{"type":55,"value":807},"h",{"type":49,"tag":148,"props":809,"children":810},{"style":167},[811],{"type":55,"value":812},">",{"type":49,"tag":148,"props":814,"children":815},{"style":161},[816],{"type":55,"value":817}," --action",{"type":49,"tag":148,"props":819,"children":820},{"style":167},[821],{"type":55,"value":797},{"type":49,"tag":148,"props":823,"children":824},{"style":161},[825],{"type":55,"value":826},"actio",{"type":49,"tag":148,"props":828,"children":829},{"style":576},[830],{"type":55,"value":831},"n",{"type":49,"tag":148,"props":833,"children":834},{"style":167},[835],{"type":55,"value":812},{"type":49,"tag":148,"props":837,"children":838},{"style":161},[839],{"type":55,"value":651},{"type":49,"tag":148,"props":841,"children":842},{"style":161},[843],{"type":55,"value":656},{"type":49,"tag":58,"props":845,"children":846},{},[847],{"type":55,"value":848},"For train-capable model workflows, inspect model-level AutoML metadata before\ncreating a plain training job:",{"type":49,"tag":137,"props":850,"children":852},{"className":139,"code":851,"language":141,"meta":142,"style":142},"${TAO_SKILL_BANK_PATH:-~\u002Ftao-skills-external}\u002Fscripts\u002Flist_tao_models.py \\\n  --skill-bank ${TAO_SKILL_BANK_PATH:-~\u002Ftao-skills-external} \\\n  --scope automl --format json\n",[853],{"type":49,"tag":72,"props":854,"children":855},{"__ignoreMap":142},[856,892,931],{"type":49,"tag":148,"props":857,"children":858},{"class":150,"line":151},[859,863,867,871,875,879,883,887],{"type":49,"tag":148,"props":860,"children":861},{"style":167},[862],{"type":55,"value":573},{"type":49,"tag":148,"props":864,"children":865},{"style":576},[866],{"type":55,"value":579},{"type":49,"tag":148,"props":868,"children":869},{"style":167},[870],{"type":55,"value":584},{"type":49,"tag":148,"props":872,"children":873},{"style":576},[874],{"type":55,"value":589},{"type":49,"tag":148,"props":876,"children":877},{"style":167},[878],{"type":55,"value":594},{"type":49,"tag":148,"props":880,"children":881},{"style":576},[882],{"type":55,"value":599},{"type":49,"tag":148,"props":884,"children":885},{"style":167},[886],{"type":55,"value":604},{"type":49,"tag":148,"props":888,"children":889},{"style":576},[890],{"type":55,"value":891},"\u002Fscripts\u002Flist_tao_models.py \\\n",{"type":49,"tag":148,"props":893,"children":894},{"class":150,"line":203},[895,899,903,907,911,915,919,923,927],{"type":49,"tag":148,"props":896,"children":897},{"style":155},[898],{"type":55,"value":617},{"type":49,"tag":148,"props":900,"children":901},{"style":167},[902],{"type":55,"value":622},{"type":49,"tag":148,"props":904,"children":905},{"style":576},[906],{"type":55,"value":579},{"type":49,"tag":148,"props":908,"children":909},{"style":167},[910],{"type":55,"value":584},{"type":49,"tag":148,"props":912,"children":913},{"style":576},[914],{"type":55,"value":589},{"type":49,"tag":148,"props":916,"children":917},{"style":167},[918],{"type":55,"value":594},{"type":49,"tag":148,"props":920,"children":921},{"style":576},[922],{"type":55,"value":599},{"type":49,"tag":148,"props":924,"children":925},{"style":167},[926],{"type":55,"value":604},{"type":49,"tag":148,"props":928,"children":929},{"style":576},[930],{"type":55,"value":784},{"type":49,"tag":148,"props":932,"children":933},{"class":150,"line":227},[934,939,944,948],{"type":49,"tag":148,"props":935,"children":936},{"style":161},[937],{"type":55,"value":938},"  --scope",{"type":49,"tag":148,"props":940,"children":941},{"style":161},[942],{"type":55,"value":943}," automl",{"type":49,"tag":148,"props":945,"children":946},{"style":161},[947],{"type":55,"value":651},{"type":49,"tag":148,"props":949,"children":950},{"style":161},[951],{"type":55,"value":952}," json\n",{"type":49,"tag":58,"props":954,"children":955},{},[956,958,964,966,972,974,980,982,988],{"type":55,"value":957},"If the selected model has ",{"type":49,"tag":72,"props":959,"children":961},{"className":960},[],[962],{"type":55,"value":963},"automl_enabled: true",{"type":55,"value":965}," and a valid train schema,\nroute training through ",{"type":49,"tag":72,"props":967,"children":969},{"className":968},[],[970],{"type":55,"value":971},"skills\u002Fapplications\u002Ftao-run-automl",{"type":55,"value":973}," by default with\n",{"type":49,"tag":72,"props":975,"children":977},{"className":976},[],[978],{"type":55,"value":979},"automl_policy: on",{"type":55,"value":981},". A workflow should only bypass AutoML when its run settings\ninclude ",{"type":49,"tag":72,"props":983,"children":985},{"className":984},[],[986],{"type":55,"value":987},"automl_policy: off",{"type":55,"value":989},", the user explicitly asks for a plain run, or the\nmodel metadata says AutoML is enabled but the train schema is not packaged yet.",{"type":49,"tag":58,"props":991,"children":992},{},[993],{"type":55,"value":994},"After the platform is selected, get the credential filter:",{"type":49,"tag":137,"props":996,"children":998},{"className":139,"code":997,"language":141,"meta":142,"style":142},"${TAO_SKILL_BANK_PATH:-~\u002Ftao-skills-external}\u002Fscripts\u002Flist_tao_platforms.py \\\n  --skill-bank ${TAO_SKILL_BANK_PATH:-~\u002Ftao-skills-external} \\\n  --platform \u003Cplatform> --format text\n",[999],{"type":49,"tag":72,"props":1000,"children":1001},{"__ignoreMap":142},[1002,1037,1076],{"type":49,"tag":148,"props":1003,"children":1004},{"class":150,"line":151},[1005,1009,1013,1017,1021,1025,1029,1033],{"type":49,"tag":148,"props":1006,"children":1007},{"style":167},[1008],{"type":55,"value":573},{"type":49,"tag":148,"props":1010,"children":1011},{"style":576},[1012],{"type":55,"value":579},{"type":49,"tag":148,"props":1014,"children":1015},{"style":167},[1016],{"type":55,"value":584},{"type":49,"tag":148,"props":1018,"children":1019},{"style":576},[1020],{"type":55,"value":589},{"type":49,"tag":148,"props":1022,"children":1023},{"style":167},[1024],{"type":55,"value":594},{"type":49,"tag":148,"props":1026,"children":1027},{"style":576},[1028],{"type":55,"value":599},{"type":49,"tag":148,"props":1030,"children":1031},{"style":167},[1032],{"type":55,"value":604},{"type":49,"tag":148,"props":1034,"children":1035},{"style":576},[1036],{"type":55,"value":609},{"type":49,"tag":148,"props":1038,"children":1039},{"class":150,"line":203},[1040,1044,1048,1052,1056,1060,1064,1068,1072],{"type":49,"tag":148,"props":1041,"children":1042},{"style":155},[1043],{"type":55,"value":617},{"type":49,"tag":148,"props":1045,"children":1046},{"style":167},[1047],{"type":55,"value":622},{"type":49,"tag":148,"props":1049,"children":1050},{"style":576},[1051],{"type":55,"value":579},{"type":49,"tag":148,"props":1053,"children":1054},{"style":167},[1055],{"type":55,"value":584},{"type":49,"tag":148,"props":1057,"children":1058},{"style":576},[1059],{"type":55,"value":589},{"type":49,"tag":148,"props":1061,"children":1062},{"style":167},[1063],{"type":55,"value":594},{"type":49,"tag":148,"props":1065,"children":1066},{"style":576},[1067],{"type":55,"value":599},{"type":49,"tag":148,"props":1069,"children":1070},{"style":167},[1071],{"type":55,"value":604},{"type":49,"tag":148,"props":1073,"children":1074},{"style":576},[1075],{"type":55,"value":784},{"type":49,"tag":148,"props":1077,"children":1078},{"class":150,"line":227},[1079,1084,1088,1093,1098,1102,1106],{"type":49,"tag":148,"props":1080,"children":1081},{"style":161},[1082],{"type":55,"value":1083},"  --platform",{"type":49,"tag":148,"props":1085,"children":1086},{"style":167},[1087],{"type":55,"value":797},{"type":49,"tag":148,"props":1089,"children":1090},{"style":161},[1091],{"type":55,"value":1092},"platfor",{"type":49,"tag":148,"props":1094,"children":1095},{"style":576},[1096],{"type":55,"value":1097},"m",{"type":49,"tag":148,"props":1099,"children":1100},{"style":167},[1101],{"type":55,"value":812},{"type":49,"tag":148,"props":1103,"children":1104},{"style":161},[1105],{"type":55,"value":651},{"type":49,"tag":148,"props":1107,"children":1108},{"style":161},[1109],{"type":55,"value":656},{"type":49,"tag":58,"props":1111,"children":1112},{},[1113,1115,1121,1123,1129],{"type":55,"value":1114},"Ask only for credentials returned for the selected platform. For example, SLURM\nneeds ",{"type":49,"tag":72,"props":1116,"children":1118},{"className":1117},[],[1119],{"type":55,"value":1120},"SLURM_USER",{"type":55,"value":1122}," and ",{"type":49,"tag":72,"props":1124,"children":1126},{"className":1125},[],[1127],{"type":55,"value":1128},"SLURM_HOSTNAME",{"type":55,"value":1130},"; it does not need Brev credentials.\nKubernetes and local Docker do not need Brev or SLURM credentials. Ask storage\ncredentials such as S3 keys only when the selected platform and the data\u002Fresult\nURIs require them.",{"type":49,"tag":109,"props":1132,"children":1134},{"id":1133},"core-api",[1135],{"type":55,"value":1136},"Core API",{"type":49,"tag":58,"props":1138,"children":1139},{},[1140],{"type":55,"value":1141},"All platform SDKs implement the same core shape:",{"type":49,"tag":137,"props":1143,"children":1145},{"className":355,"code":1144,"language":158,"meta":142,"style":142},"sdk.create_job(image, command, gpu_count=1, env_vars=None, inputs=None, outputs=None, **kwargs) -> Job\nsdk.get_job_status(job_id) -> JobStatus\nsdk.get_job_logs(job_id, tail=None) -> str\nsdk.cancel_job(job_id) -> bool\nsdk.get_failure_analysis(job_id) -> dict | None\nsdk.get_job_results_dir(job_id) -> str\nsdk.check_path(remote_path) -> bool\nsdk.list_path(remote_path) -> list[str]\n",[1146],{"type":49,"tag":72,"props":1147,"children":1148},{"__ignoreMap":142},[1149,1157,1165,1173,1181,1189,1198,1207],{"type":49,"tag":148,"props":1150,"children":1151},{"class":150,"line":151},[1152],{"type":49,"tag":148,"props":1153,"children":1154},{},[1155],{"type":55,"value":1156},"sdk.create_job(image, command, gpu_count=1, env_vars=None, inputs=None, outputs=None, **kwargs) -> Job\n",{"type":49,"tag":148,"props":1158,"children":1159},{"class":150,"line":203},[1160],{"type":49,"tag":148,"props":1161,"children":1162},{},[1163],{"type":55,"value":1164},"sdk.get_job_status(job_id) -> JobStatus\n",{"type":49,"tag":148,"props":1166,"children":1167},{"class":150,"line":227},[1168],{"type":49,"tag":148,"props":1169,"children":1170},{},[1171],{"type":55,"value":1172},"sdk.get_job_logs(job_id, tail=None) -> str\n",{"type":49,"tag":148,"props":1174,"children":1175},{"class":150,"line":263},[1176],{"type":49,"tag":148,"props":1177,"children":1178},{},[1179],{"type":55,"value":1180},"sdk.cancel_job(job_id) -> bool\n",{"type":49,"tag":148,"props":1182,"children":1183},{"class":150,"line":272},[1184],{"type":49,"tag":148,"props":1185,"children":1186},{},[1187],{"type":55,"value":1188},"sdk.get_failure_analysis(job_id) -> dict | None\n",{"type":49,"tag":148,"props":1190,"children":1192},{"class":150,"line":1191},6,[1193],{"type":49,"tag":148,"props":1194,"children":1195},{},[1196],{"type":55,"value":1197},"sdk.get_job_results_dir(job_id) -> str\n",{"type":49,"tag":148,"props":1199,"children":1201},{"class":150,"line":1200},7,[1202],{"type":49,"tag":148,"props":1203,"children":1204},{},[1205],{"type":55,"value":1206},"sdk.check_path(remote_path) -> bool\n",{"type":49,"tag":148,"props":1208,"children":1210},{"class":150,"line":1209},8,[1211],{"type":49,"tag":148,"props":1212,"children":1213},{},[1214],{"type":55,"value":1215},"sdk.list_path(remote_path) -> list[str]\n",{"type":49,"tag":58,"props":1217,"children":1218},{},[1219],{"type":55,"value":1220},"Brev-only:",{"type":49,"tag":81,"props":1222,"children":1223},{},[1224,1235],{"type":49,"tag":85,"props":1225,"children":1226},{},[1227,1233],{"type":49,"tag":72,"props":1228,"children":1230},{"className":1229},[],[1231],{"type":55,"value":1232},"sdk.delete_instance(instance_id)",{"type":55,"value":1234}," — clean up an ephemeral instance.",{"type":49,"tag":85,"props":1236,"children":1237},{},[1238,1244],{"type":49,"tag":72,"props":1239,"children":1241},{"className":1240},[],[1242],{"type":55,"value":1243},"sdk.list_instances()",{"type":55,"value":1245}," — list active instances.",{"type":49,"tag":109,"props":1247,"children":1249},{"id":1248},"submitting-a-job",[1250],{"type":55,"value":1251},"Submitting a Job",{"type":49,"tag":58,"props":1253,"children":1254},{},[1255,1257,1268,1270,1276,1278,1284,1286,1292,1293,1299,1300,1306,1307,1313,1314,1320,1321,1327,1329,1334],{"type":55,"value":1256},"The agent always ",{"type":49,"tag":64,"props":1258,"children":1259},{},[1260,1262],{"type":55,"value":1261},"constructs the container command via ",{"type":49,"tag":72,"props":1263,"children":1265},{"className":1264},[],[1266],{"type":55,"value":1267},"build_entrypoint",{"type":55,"value":1269}," before calling ",{"type":49,"tag":72,"props":1271,"children":1273},{"className":1272},[],[1274],{"type":55,"value":1275},"create_job",{"type":55,"value":1277},". The agent reads the action's schema from ",{"type":49,"tag":72,"props":1279,"children":1281},{"className":1280},[],[1282],{"type":55,"value":1283},"skill_info.yaml",{"type":55,"value":1285}," (",{"type":49,"tag":72,"props":1287,"children":1289},{"className":1288},[],[1290],{"type":55,"value":1291},"command",{"type":55,"value":314},{"type":49,"tag":72,"props":1294,"children":1296},{"className":1295},[],[1297],{"type":55,"value":1298},"mode",{"type":55,"value":314},{"type":49,"tag":72,"props":1301,"children":1303},{"className":1302},[],[1304],{"type":55,"value":1305},"config_format",{"type":55,"value":314},{"type":49,"tag":72,"props":1308,"children":1310},{"className":1309},[],[1311],{"type":55,"value":1312},"inputs",{"type":55,"value":314},{"type":49,"tag":72,"props":1315,"children":1317},{"className":1316},[],[1318],{"type":55,"value":1319},"outputs",{"type":55,"value":314},{"type":49,"tag":72,"props":1322,"children":1324},{"className":1323},[],[1325],{"type":55,"value":1326},"upload_excludes",{"type":55,"value":1328},") and passes those fields as kwargs. ",{"type":49,"tag":72,"props":1330,"children":1332},{"className":1331},[],[1333],{"type":55,"value":1267},{"type":55,"value":1335}," then bakes:",{"type":49,"tag":663,"props":1337,"children":1338},{},[1339,1360],{"type":49,"tag":85,"props":1340,"children":1341},{},[1342,1344,1350,1352,1358],{"type":55,"value":1343},"The in-container ",{"type":49,"tag":72,"props":1345,"children":1347},{"className":1346},[],[1348],{"type":55,"value":1349},"script_runner",{"type":55,"value":1351}," runtime (inlined as a base64 heredoc — no need for ",{"type":49,"tag":72,"props":1353,"children":1355},{"className":1354},[],[1356],{"type":55,"value":1357},"tao_sdk",{"type":55,"value":1359}," to be installed in the container).",{"type":49,"tag":85,"props":1361,"children":1362},{},[1363,1365,1371],{"type":55,"value":1364},"The CLI invocation that, at runtime in the container, will: download declared inputs (S3 \u002F HF-Hub \u002F NGC), write the spec file at ",{"type":49,"tag":72,"props":1366,"children":1368},{"className":1367},[],[1369],{"type":55,"value":1370},"{config_path}",{"type":55,"value":1372}," with remote URIs rewritten to local paths, run the user command, and upload outputs.",{"type":49,"tag":58,"props":1374,"children":1375},{},[1376,1378,1383,1385,1390],{"type":55,"value":1377},"Output destinations are resolved at runtime from env vars the SDK injects (see \"Where outputs go\" below). The platform SDK's ",{"type":49,"tag":72,"props":1379,"children":1381},{"className":1380},[],[1382],{"type":55,"value":1275},{"type":55,"value":1384}," runs the resulting command ",{"type":49,"tag":64,"props":1386,"children":1387},{},[1388],{"type":55,"value":1389},"as-is",{"type":55,"value":1391}," — no inputs\u002Foutputs kwargs, no implicit wrapping. The data flow is visible in the agent's code.",{"type":49,"tag":1393,"props":1394,"children":1396},"h3",{"id":1395},"where-outputs-go-resolved-at-runtime-agents-dont-manage-it",[1397],{"type":55,"value":1398},"Where outputs go (resolved at runtime — agents don't manage it)",{"type":49,"tag":58,"props":1400,"children":1401},{},[1402,1404,1410,1412,1418,1420,1426,1428,1433],{"type":55,"value":1403},"The SDK injects ",{"type":49,"tag":72,"props":1405,"children":1407},{"className":1406},[],[1408],{"type":55,"value":1409},"TAO_JOB_ID",{"type":55,"value":1411}," (matches ",{"type":49,"tag":72,"props":1413,"children":1415},{"className":1414},[],[1416],{"type":55,"value":1417},"Job.id",{"type":55,"value":1419},") and, when a persistent mount is attached, ",{"type":49,"tag":72,"props":1421,"children":1423},{"className":1422},[],[1424],{"type":55,"value":1425},"TAO_RESULTS_ROOT",{"type":55,"value":1427}," into the container env. Inside the container, ",{"type":49,"tag":72,"props":1429,"children":1431},{"className":1430},[],[1432],{"type":55,"value":1349},{"type":55,"value":1434}," resolves output destinations:",{"type":49,"tag":400,"props":1436,"children":1437},{},[1438,1453],{"type":49,"tag":404,"props":1439,"children":1440},{},[1441],{"type":49,"tag":408,"props":1442,"children":1443},{},[1444,1448],{"type":49,"tag":412,"props":1445,"children":1446},{},[1447],{"type":55,"value":516},{"type":49,"tag":412,"props":1449,"children":1450},{},[1451],{"type":55,"value":1452},"Result",{"type":49,"tag":428,"props":1454,"children":1455},{},[1456,1482,1507],{"type":49,"tag":408,"props":1457,"children":1458},{},[1459,1469],{"type":49,"tag":435,"props":1460,"children":1461},{},[1462,1467],{"type":49,"tag":72,"props":1463,"children":1465},{"className":1464},[],[1466],{"type":55,"value":1425},{"type":55,"value":1468}," set (Lustre \u002F PVC \u002F bind \u002F NFS)",{"type":49,"tag":435,"props":1470,"children":1471},{},[1472,1474,1480],{"type":55,"value":1473},"Outputs at ",{"type":49,"tag":72,"props":1475,"children":1477},{"className":1476},[],[1478],{"type":55,"value":1479},"{TAO_RESULTS_ROOT}\u002F\u003Cjob_id>\u002F\u003Ckey>\u002F",{"type":55,"value":1481},"; no upload",{"type":49,"tag":408,"props":1483,"children":1484},{},[1485,1495],{"type":49,"tag":435,"props":1486,"children":1487},{},[1488,1493],{"type":49,"tag":72,"props":1489,"children":1491},{"className":1490},[],[1492],{"type":55,"value":478},{"type":55,"value":1494}," set (cloud, no mount)",{"type":49,"tag":435,"props":1496,"children":1497},{},[1498,1499,1505],{"type":55,"value":1473},{"type":49,"tag":72,"props":1500,"children":1502},{"className":1501},[],[1503],{"type":55,"value":1504},"s3:\u002F\u002F{bucket}\u002Fresults\u002F\u003Cjob_id>\u002F\u003Ckey>\u002F",{"type":55,"value":1506},"; uploaded at end of run",{"type":49,"tag":408,"props":1508,"children":1509},{},[1510,1515],{"type":49,"tag":435,"props":1511,"children":1512},{},[1513],{"type":55,"value":1514},"Neither",{"type":49,"tag":435,"props":1516,"children":1517},{},[1518,1519,1525],{"type":55,"value":1473},{"type":49,"tag":72,"props":1520,"children":1522},{"className":1521},[],[1523],{"type":55,"value":1524},"\u002Fresults\u002F\u003Cjob_id>\u002F\u003Ckey>\u002F",{"type":55,"value":1526}," (container-ephemeral) with a loud end-of-run warning",{"type":49,"tag":58,"props":1528,"children":1529},{},[1530],{"type":55,"value":1531},"Per-platform policy:",{"type":49,"tag":400,"props":1533,"children":1534},{},[1535,1551],{"type":49,"tag":404,"props":1536,"children":1537},{},[1538],{"type":49,"tag":408,"props":1539,"children":1540},{},[1541,1546],{"type":49,"tag":412,"props":1542,"children":1543},{},[1544],{"type":55,"value":1545},"SDK",{"type":49,"tag":412,"props":1547,"children":1548},{},[1549],{"type":55,"value":1550},"What gets injected",{"type":49,"tag":428,"props":1552,"children":1553},{},[1554,1577],{"type":49,"tag":408,"props":1555,"children":1556},{},[1557,1566],{"type":49,"tag":435,"props":1558,"children":1559},{},[1560],{"type":49,"tag":72,"props":1561,"children":1563},{"className":1562},[],[1564],{"type":55,"value":1565},"SlurmSDK",{"type":49,"tag":435,"props":1567,"children":1568},{},[1569,1575],{"type":49,"tag":72,"props":1570,"children":1572},{"className":1571},[],[1573],{"type":55,"value":1574},"TAO_RESULTS_ROOT={SLURM_BASE_RESULTS_DIR}\u002Fresults",{"type":55,"value":1576}," (always — Lustre, never S3, avoids GPU-idle scheduler kill)",{"type":49,"tag":408,"props":1578,"children":1579},{},[1580,1604],{"type":49,"tag":435,"props":1581,"children":1582},{},[1583,1589,1591,1597,1598],{"type":49,"tag":72,"props":1584,"children":1586},{"className":1585},[],[1587],{"type":55,"value":1588},"KubernetesSDK",{"type":55,"value":1590}," \u002F ",{"type":49,"tag":72,"props":1592,"children":1594},{"className":1593},[],[1595],{"type":55,"value":1596},"DockerSDK",{"type":55,"value":1590},{"type":49,"tag":72,"props":1599,"children":1601},{"className":1600},[],[1602],{"type":55,"value":1603},"BrevSDK",{"type":49,"tag":435,"props":1605,"children":1606},{},[1607,1613,1615,1621],{"type":49,"tag":72,"props":1608,"children":1610},{"className":1609},[],[1611],{"type":55,"value":1612},"TAO_RESULTS_ROOT=\u002Fresults",{"type":55,"value":1614}," if a mount targets ",{"type":49,"tag":72,"props":1616,"children":1618},{"className":1617},[],[1619],{"type":55,"value":1620},"\u002Fresults",{"type":55,"value":1622},"; otherwise S3 fallback",{"type":49,"tag":58,"props":1624,"children":1625},{},[1626,1628,1634,1636,1642,1644,1650,1652,1657],{"type":55,"value":1627},"Agents who want a custom destination can put an ",{"type":49,"tag":72,"props":1629,"children":1631},{"className":1630},[],[1632],{"type":55,"value":1633},"s3:\u002F\u002F...",{"type":55,"value":1635}," URI or absolute path directly at the output spec key — explicit values override the auto-fill. Otherwise, model-natural defaults like cosmos-rl's ",{"type":49,"tag":72,"props":1637,"children":1639},{"className":1638},[],[1640],{"type":55,"value":1641},"output_dir: \"output\"",{"type":55,"value":1643}," or DINO's empty ",{"type":49,"tag":72,"props":1645,"children":1647},{"className":1646},[],[1648],{"type":55,"value":1649},"results_dir",{"type":55,"value":1651}," are auto-rewritten by ",{"type":49,"tag":72,"props":1653,"children":1655},{"className":1654},[],[1656],{"type":55,"value":1349},{"type":55,"value":547},{"type":49,"tag":1393,"props":1659,"children":1661},{"id":1660},"the-spec-is-nested-dicts-not-flat-dotted-keys",[1662],{"type":55,"value":1663},"The spec is nested dicts, NOT flat dotted keys",{"type":49,"tag":58,"props":1665,"children":1666},{},[1667,1669,1674,1676,1682,1683,1689,1691,1697,1699,1704,1706,1711],{"type":55,"value":1668},"This is the most common mistake when constructing a spec. The dotted notation that appears in ",{"type":49,"tag":72,"props":1670,"children":1672},{"className":1671},[],[1673],{"type":55,"value":1283},{"type":55,"value":1675},"'s ",{"type":49,"tag":72,"props":1677,"children":1679},{"className":1678},[],[1680],{"type":55,"value":1681},"inputs:",{"type":55,"value":1590},{"type":49,"tag":72,"props":1684,"children":1686},{"className":1685},[],[1687],{"type":55,"value":1688},"outputs:",{"type":55,"value":1690}," blocks (e.g. ",{"type":49,"tag":72,"props":1692,"children":1694},{"className":1693},[],[1695],{"type":55,"value":1696},"section.subsection.key",{"type":55,"value":1698},") is a ",{"type":49,"tag":64,"props":1700,"children":1701},{},[1702],{"type":55,"value":1703},"path into",{"type":55,"value":1705}," a nested spec — ",{"type":49,"tag":72,"props":1707,"children":1709},{"className":1708},[],[1710],{"type":55,"value":1349},{"type":55,"value":1712}," looks values up at that path. It's not the spec's own shape. The spec mirrors whatever shape the model's container expects (typically a nested TOML\u002FYAML).",{"type":49,"tag":137,"props":1714,"children":1716},{"className":355,"code":1715,"language":158,"meta":142,"style":142},"# ✓ CORRECT — nested dicts\nspecs = {\n    \"section\": {\n        \"subsection\": {\"key\": \"value\"},\n    },\n}\n\n# ✗ WRONG — flat top-level key with dots. TOML\u002FYAML emits this as a\n# quoted bare-string key, the model sees an empty `section` table, and\n# any input declared at \"section.subsection.key\" silently fails to\n# download because _get_nested(specs, \"section.subsection.key\") → None.\nspecs = {\n    \"section.subsection.key\": \"value\",\n}\n",[1717],{"type":49,"tag":72,"props":1718,"children":1719},{"__ignoreMap":142},[1720,1728,1736,1744,1752,1760,1767,1774,1782,1791,1800,1809,1817,1826],{"type":49,"tag":148,"props":1721,"children":1722},{"class":150,"line":151},[1723],{"type":49,"tag":148,"props":1724,"children":1725},{},[1726],{"type":55,"value":1727},"# ✓ CORRECT — nested dicts\n",{"type":49,"tag":148,"props":1729,"children":1730},{"class":150,"line":203},[1731],{"type":49,"tag":148,"props":1732,"children":1733},{},[1734],{"type":55,"value":1735},"specs = {\n",{"type":49,"tag":148,"props":1737,"children":1738},{"class":150,"line":227},[1739],{"type":49,"tag":148,"props":1740,"children":1741},{},[1742],{"type":55,"value":1743},"    \"section\": {\n",{"type":49,"tag":148,"props":1745,"children":1746},{"class":150,"line":263},[1747],{"type":49,"tag":148,"props":1748,"children":1749},{},[1750],{"type":55,"value":1751},"        \"subsection\": {\"key\": \"value\"},\n",{"type":49,"tag":148,"props":1753,"children":1754},{"class":150,"line":272},[1755],{"type":49,"tag":148,"props":1756,"children":1757},{},[1758],{"type":55,"value":1759},"    },\n",{"type":49,"tag":148,"props":1761,"children":1762},{"class":150,"line":1191},[1763],{"type":49,"tag":148,"props":1764,"children":1765},{},[1766],{"type":55,"value":269},{"type":49,"tag":148,"props":1768,"children":1769},{"class":150,"line":1200},[1770],{"type":49,"tag":148,"props":1771,"children":1772},{"emptyLinePlaceholder":374},[1773],{"type":55,"value":377},{"type":49,"tag":148,"props":1775,"children":1776},{"class":150,"line":1209},[1777],{"type":49,"tag":148,"props":1778,"children":1779},{},[1780],{"type":55,"value":1781},"# ✗ WRONG — flat top-level key with dots. TOML\u002FYAML emits this as a\n",{"type":49,"tag":148,"props":1783,"children":1785},{"class":150,"line":1784},9,[1786],{"type":49,"tag":148,"props":1787,"children":1788},{},[1789],{"type":55,"value":1790},"# quoted bare-string key, the model sees an empty `section` table, and\n",{"type":49,"tag":148,"props":1792,"children":1794},{"class":150,"line":1793},10,[1795],{"type":49,"tag":148,"props":1796,"children":1797},{},[1798],{"type":55,"value":1799},"# any input declared at \"section.subsection.key\" silently fails to\n",{"type":49,"tag":148,"props":1801,"children":1803},{"class":150,"line":1802},11,[1804],{"type":49,"tag":148,"props":1805,"children":1806},{},[1807],{"type":55,"value":1808},"# download because _get_nested(specs, \"section.subsection.key\") → None.\n",{"type":49,"tag":148,"props":1810,"children":1812},{"class":150,"line":1811},12,[1813],{"type":49,"tag":148,"props":1814,"children":1815},{},[1816],{"type":55,"value":1735},{"type":49,"tag":148,"props":1818,"children":1820},{"class":150,"line":1819},13,[1821],{"type":49,"tag":148,"props":1822,"children":1823},{},[1824],{"type":55,"value":1825},"    \"section.subsection.key\": \"value\",\n",{"type":49,"tag":148,"props":1827,"children":1829},{"class":150,"line":1828},14,[1830],{"type":49,"tag":148,"props":1831,"children":1832},{},[1833],{"type":55,"value":269},{"type":49,"tag":58,"props":1835,"children":1836},{},[1837,1839,1845,1847,1852,1853,1858,1860,1865,1867,1873],{"type":55,"value":1838},"The two shapes look superficially similar but mean different things. When in doubt, open the model's ",{"type":49,"tag":72,"props":1840,"children":1842},{"className":1841},[],[1843],{"type":55,"value":1844},"references\u002F",{"type":55,"value":1846}," directory (e.g. a default-spec TOML or YAML) — that's the literal nested structure the spec dict needs to mirror. The ",{"type":49,"tag":72,"props":1848,"children":1850},{"className":1849},[],[1851],{"type":55,"value":1681},{"type":55,"value":1590},{"type":49,"tag":72,"props":1854,"children":1856},{"className":1855},[],[1857],{"type":55,"value":1688},{"type":55,"value":1859}," declarations in ",{"type":49,"tag":72,"props":1861,"children":1863},{"className":1862},[],[1864],{"type":55,"value":1283},{"type":55,"value":1866}," are ",{"type":49,"tag":1868,"props":1869,"children":1870},"em",{},[1871],{"type":55,"value":1872},"paths into",{"type":55,"value":1874}," the nested spec, not key names.",{"type":49,"tag":1393,"props":1876,"children":1878},{"id":1877},"constructing-the-spec-args",[1879],{"type":55,"value":1880},"Constructing the spec \u002F args",{"type":49,"tag":58,"props":1882,"children":1883},{},[1884,1886,1891,1892,1898,1900,1905,1907,1912,1914,1919],{"type":55,"value":1885},"The skill's action declares its config mechanism in ",{"type":49,"tag":72,"props":1887,"children":1889},{"className":1888},[],[1890],{"type":55,"value":1283},{"type":55,"value":1675},{"type":49,"tag":72,"props":1893,"children":1895},{"className":1894},[],[1896],{"type":55,"value":1897},"actions.\u003Caction>.mode",{"type":55,"value":1899}," field. Treat missing ",{"type":49,"tag":72,"props":1901,"children":1903},{"className":1902},[],[1904],{"type":55,"value":1298},{"type":55,"value":1906}," as invalid metadata and fix the skill instead of inferring a default. Read ",{"type":49,"tag":72,"props":1908,"children":1910},{"className":1909},[],[1911],{"type":55,"value":1897},{"type":55,"value":1913}," first, then pass the matching argument shape to ",{"type":49,"tag":72,"props":1915,"children":1917},{"className":1916},[],[1918],{"type":55,"value":1267},{"type":55,"value":1920},":",{"type":49,"tag":400,"props":1922,"children":1923},{},[1924,1940],{"type":49,"tag":404,"props":1925,"children":1926},{},[1927],{"type":49,"tag":408,"props":1928,"children":1929},{},[1930,1935],{"type":49,"tag":412,"props":1931,"children":1932},{},[1933],{"type":55,"value":1934},"Declared mode",{"type":49,"tag":412,"props":1936,"children":1937},{},[1938],{"type":55,"value":1939},"What the agent passes",{"type":49,"tag":428,"props":1941,"children":1942},{},[1943,1979,2015],{"type":49,"tag":408,"props":1944,"children":1945},{},[1946,1955],{"type":49,"tag":435,"props":1947,"children":1948},{},[1949],{"type":49,"tag":72,"props":1950,"children":1952},{"className":1951},[],[1953],{"type":55,"value":1954},"config",{"type":49,"tag":435,"props":1956,"children":1957},{},[1958,1964,1966,1971,1972,1977],{"type":49,"tag":72,"props":1959,"children":1961},{"className":1960},[],[1962],{"type":55,"value":1963},"specs=...",{"type":55,"value":1965}," with spec-keyed ",{"type":49,"tag":72,"props":1967,"children":1969},{"className":1968},[],[1970],{"type":55,"value":1312},{"type":55,"value":1590},{"type":49,"tag":72,"props":1973,"children":1975},{"className":1974},[],[1976],{"type":55,"value":1319},{"type":55,"value":1978},"; the helper writes the spec file, rewrites URIs, and runs the command",{"type":49,"tag":408,"props":1980,"children":1981},{},[1982,1991],{"type":49,"tag":435,"props":1983,"children":1984},{},[1985],{"type":49,"tag":72,"props":1986,"children":1988},{"className":1987},[],[1989],{"type":55,"value":1990},"args",{"type":49,"tag":435,"props":1992,"children":1993},{},[1994,2000,2002,2007,2008,2013],{"type":49,"tag":72,"props":1995,"children":1997},{"className":1996},[],[1998],{"type":55,"value":1999},"args=...",{"type":55,"value":2001}," with optional spec-keyed ",{"type":49,"tag":72,"props":2003,"children":2005},{"className":2004},[],[2006],{"type":55,"value":1312},{"type":55,"value":1590},{"type":49,"tag":72,"props":2009,"children":2011},{"className":2010},[],[2012],{"type":55,"value":1319},{"type":55,"value":2014},"; the helper substitutes CLI args into the command template",{"type":49,"tag":408,"props":2016,"children":2017},{},[2018,2027],{"type":49,"tag":435,"props":2019,"children":2020},{},[2021],{"type":49,"tag":72,"props":2022,"children":2024},{"className":2023},[],[2025],{"type":55,"value":2026},"passthrough",{"type":49,"tag":435,"props":2028,"children":2029},{},[2030,2032,2038,2040,2046],{"type":55,"value":2031},"path-keyed ",{"type":49,"tag":72,"props":2033,"children":2035},{"className":2034},[],[2036],{"type":55,"value":2037},"inputs=...",{"type":55,"value":2039}," and\u002For ",{"type":49,"tag":72,"props":2041,"children":2043},{"className":2042},[],[2044],{"type":55,"value":2045},"outputs=...",{"type":55,"value":2047},"; the helper downloads to listed paths, runs the command, and uploads listed outputs",{"type":49,"tag":58,"props":2049,"children":2050},{},[2051,2053,2058],{"type":55,"value":2052},"Do not infer mode from missing metadata. Missing ",{"type":49,"tag":72,"props":2054,"children":2056},{"className":2055},[],[2057],{"type":55,"value":1298},{"type":55,"value":2059}," means the skill contract is stale.",{"type":49,"tag":58,"props":2061,"children":2062},{},[2063,2065,2075,2077,2082],{"type":55,"value":2064},"See ",{"type":49,"tag":2066,"props":2067,"children":2069},"a",{"href":2068},"references\u002Fspec-construction.md",[2070],{"type":49,"tag":72,"props":2071,"children":2073},{"className":2072},[],[2074],{"type":55,"value":2068},{"type":55,"value":2076}," for the per-mode construction strategy, the recommended decision order, and worked ",{"type":49,"tag":72,"props":2078,"children":2080},{"className":2079},[],[2081],{"type":55,"value":1267},{"type":55,"value":2083}," examples for spec-driven jobs (config file) and path-keyed jobs (no config file).",{"type":49,"tag":109,"props":2085,"children":2087},{"id":2086},"resolving-container-images",[2088],{"type":55,"value":2089},"Resolving container images",{"type":49,"tag":58,"props":2091,"children":2092},{},[2093,2095,2101,2103,2109,2111,2117],{"type":55,"value":2094},"Skills declare images either by key (",{"type":49,"tag":72,"props":2096,"children":2098},{"className":2097},[],[2099],{"type":55,"value":2100},"tao_toolkit.pyt",{"type":55,"value":2102},") or as an absolute URI (",{"type":49,"tag":72,"props":2104,"children":2106},{"className":2105},[],[2107],{"type":55,"value":2108},"nvcr.io\u002F...",{"type":55,"value":2110},"). Use ",{"type":49,"tag":72,"props":2112,"children":2114},{"className":2113},[],[2115],{"type":55,"value":2116},"resolve_container_image()",{"type":55,"value":2118}," to handle both:",{"type":49,"tag":137,"props":2120,"children":2122},{"className":355,"code":2121,"language":158,"meta":142,"style":142},"from tao_sdk.versions import resolve_container_image\nimage = resolve_container_image(skill_info[\"container_image\"])\n",[2123],{"type":49,"tag":72,"props":2124,"children":2125},{"__ignoreMap":142},[2126,2134],{"type":49,"tag":148,"props":2127,"children":2128},{"class":150,"line":151},[2129],{"type":49,"tag":148,"props":2130,"children":2131},{},[2132],{"type":55,"value":2133},"from tao_sdk.versions import resolve_container_image\n",{"type":49,"tag":148,"props":2135,"children":2136},{"class":150,"line":203},[2137],{"type":49,"tag":148,"props":2138,"children":2139},{},[2140],{"type":55,"value":2141},"image = resolve_container_image(skill_info[\"container_image\"])\n",{"type":49,"tag":58,"props":2143,"children":2144},{},[2145,2147,2153],{"type":55,"value":2146},"Behind the scenes it walks ",{"type":49,"tag":72,"props":2148,"children":2150},{"className":2149},[],[2151],{"type":55,"value":2152},"versions.yaml",{"type":55,"value":2154}," for keys; absolute URIs are returned as-is.",{"type":49,"tag":109,"props":2156,"children":2158},{"id":2157},"monitoring",[2159],{"type":55,"value":2160},"Monitoring",{"type":49,"tag":137,"props":2162,"children":2164},{"className":355,"code":2163,"language":158,"meta":142,"style":142},"status = sdk.get_job_status(job.id)\nprint(status.status)   # Pending, Running, Complete, Error, Canceled\nprint(status.message)  # platform-specific detail\n\nlogs = sdk.get_job_logs(job.id, tail=200)\nprint(logs)\n",[2165],{"type":49,"tag":72,"props":2166,"children":2167},{"__ignoreMap":142},[2168,2176,2184,2192,2199,2207],{"type":49,"tag":148,"props":2169,"children":2170},{"class":150,"line":151},[2171],{"type":49,"tag":148,"props":2172,"children":2173},{},[2174],{"type":55,"value":2175},"status = sdk.get_job_status(job.id)\n",{"type":49,"tag":148,"props":2177,"children":2178},{"class":150,"line":203},[2179],{"type":49,"tag":148,"props":2180,"children":2181},{},[2182],{"type":55,"value":2183},"print(status.status)   # Pending, Running, Complete, Error, Canceled\n",{"type":49,"tag":148,"props":2185,"children":2186},{"class":150,"line":227},[2187],{"type":49,"tag":148,"props":2188,"children":2189},{},[2190],{"type":55,"value":2191},"print(status.message)  # platform-specific detail\n",{"type":49,"tag":148,"props":2193,"children":2194},{"class":150,"line":263},[2195],{"type":49,"tag":148,"props":2196,"children":2197},{"emptyLinePlaceholder":374},[2198],{"type":55,"value":377},{"type":49,"tag":148,"props":2200,"children":2201},{"class":150,"line":272},[2202],{"type":49,"tag":148,"props":2203,"children":2204},{},[2205],{"type":55,"value":2206},"logs = sdk.get_job_logs(job.id, tail=200)\n",{"type":49,"tag":148,"props":2208,"children":2209},{"class":150,"line":1191},[2210],{"type":49,"tag":148,"props":2211,"children":2212},{},[2213],{"type":55,"value":2214},"print(logs)\n",{"type":49,"tag":58,"props":2216,"children":2217},{},[2218,2220,2226],{"type":55,"value":2219},"On failure, ",{"type":49,"tag":72,"props":2221,"children":2223},{"className":2222},[],[2224],{"type":55,"value":2225},"get_failure_analysis()",{"type":55,"value":2227}," classifies the root cause:",{"type":49,"tag":137,"props":2229,"children":2231},{"className":355,"code":2230,"language":158,"meta":142,"style":142},"analysis = sdk.get_failure_analysis(job.id)\nif analysis:\n    print(analysis[\"err_class\"])   # ERR_PROGRAM, ERR_INFRA, etc.\n    print(analysis[\"suggestion\"])  # human-readable fix\n    for event in analysis.get(\"job_failure_by_node_event\", []):\n        print(event[\"node_event_name\"], event[\"message\"])  # OOM, GPU error, etc.\n",[2232],{"type":49,"tag":72,"props":2233,"children":2234},{"__ignoreMap":142},[2235,2243,2251,2259,2267,2275],{"type":49,"tag":148,"props":2236,"children":2237},{"class":150,"line":151},[2238],{"type":49,"tag":148,"props":2239,"children":2240},{},[2241],{"type":55,"value":2242},"analysis = sdk.get_failure_analysis(job.id)\n",{"type":49,"tag":148,"props":2244,"children":2245},{"class":150,"line":203},[2246],{"type":49,"tag":148,"props":2247,"children":2248},{},[2249],{"type":55,"value":2250},"if analysis:\n",{"type":49,"tag":148,"props":2252,"children":2253},{"class":150,"line":227},[2254],{"type":49,"tag":148,"props":2255,"children":2256},{},[2257],{"type":55,"value":2258},"    print(analysis[\"err_class\"])   # ERR_PROGRAM, ERR_INFRA, etc.\n",{"type":49,"tag":148,"props":2260,"children":2261},{"class":150,"line":263},[2262],{"type":49,"tag":148,"props":2263,"children":2264},{},[2265],{"type":55,"value":2266},"    print(analysis[\"suggestion\"])  # human-readable fix\n",{"type":49,"tag":148,"props":2268,"children":2269},{"class":150,"line":272},[2270],{"type":49,"tag":148,"props":2271,"children":2272},{},[2273],{"type":55,"value":2274},"    for event in analysis.get(\"job_failure_by_node_event\", []):\n",{"type":49,"tag":148,"props":2276,"children":2277},{"class":150,"line":1191},[2278],{"type":49,"tag":148,"props":2279,"children":2280},{},[2281],{"type":55,"value":2282},"        print(event[\"node_event_name\"], event[\"message\"])  # OOM, GPU error, etc.\n",{"type":49,"tag":109,"props":2284,"children":2286},{"id":2285},"polling-pattern",[2287],{"type":55,"value":2288},"Polling pattern",{"type":49,"tag":58,"props":2290,"children":2291},{},[2292],{"type":55,"value":2293},"For interactive runs where the user wants to watch:",{"type":49,"tag":137,"props":2295,"children":2297},{"className":355,"code":2296,"language":158,"meta":142,"style":142},"import time\nstatus_interval_minutes = status_interval_minutes or 5\nwhile True:\n    status = sdk.get_job_status(job.id)\n    if status.status in (\"Complete\", \"Error\", \"Canceled\"):\n        break\n    print(f\"  {status.status}\")\n    time.sleep(status_interval_minutes * 60)\n\nif status.status == \"Error\":\n    print(sdk.get_job_logs(job.id, tail=100))\n    print(sdk.get_failure_analysis(job.id))\n",[2298],{"type":49,"tag":72,"props":2299,"children":2300},{"__ignoreMap":142},[2301,2309,2317,2325,2333,2341,2349,2357,2365,2372,2380,2388],{"type":49,"tag":148,"props":2302,"children":2303},{"class":150,"line":151},[2304],{"type":49,"tag":148,"props":2305,"children":2306},{},[2307],{"type":55,"value":2308},"import time\n",{"type":49,"tag":148,"props":2310,"children":2311},{"class":150,"line":203},[2312],{"type":49,"tag":148,"props":2313,"children":2314},{},[2315],{"type":55,"value":2316},"status_interval_minutes = status_interval_minutes or 5\n",{"type":49,"tag":148,"props":2318,"children":2319},{"class":150,"line":227},[2320],{"type":49,"tag":148,"props":2321,"children":2322},{},[2323],{"type":55,"value":2324},"while True:\n",{"type":49,"tag":148,"props":2326,"children":2327},{"class":150,"line":263},[2328],{"type":49,"tag":148,"props":2329,"children":2330},{},[2331],{"type":55,"value":2332},"    status = sdk.get_job_status(job.id)\n",{"type":49,"tag":148,"props":2334,"children":2335},{"class":150,"line":272},[2336],{"type":49,"tag":148,"props":2337,"children":2338},{},[2339],{"type":55,"value":2340},"    if status.status in (\"Complete\", \"Error\", \"Canceled\"):\n",{"type":49,"tag":148,"props":2342,"children":2343},{"class":150,"line":1191},[2344],{"type":49,"tag":148,"props":2345,"children":2346},{},[2347],{"type":55,"value":2348},"        break\n",{"type":49,"tag":148,"props":2350,"children":2351},{"class":150,"line":1200},[2352],{"type":49,"tag":148,"props":2353,"children":2354},{},[2355],{"type":55,"value":2356},"    print(f\"  {status.status}\")\n",{"type":49,"tag":148,"props":2358,"children":2359},{"class":150,"line":1209},[2360],{"type":49,"tag":148,"props":2361,"children":2362},{},[2363],{"type":55,"value":2364},"    time.sleep(status_interval_minutes * 60)\n",{"type":49,"tag":148,"props":2366,"children":2367},{"class":150,"line":1784},[2368],{"type":49,"tag":148,"props":2369,"children":2370},{"emptyLinePlaceholder":374},[2371],{"type":55,"value":377},{"type":49,"tag":148,"props":2373,"children":2374},{"class":150,"line":1793},[2375],{"type":49,"tag":148,"props":2376,"children":2377},{},[2378],{"type":55,"value":2379},"if status.status == \"Error\":\n",{"type":49,"tag":148,"props":2381,"children":2382},{"class":150,"line":1802},[2383],{"type":49,"tag":148,"props":2384,"children":2385},{},[2386],{"type":55,"value":2387},"    print(sdk.get_job_logs(job.id, tail=100))\n",{"type":49,"tag":148,"props":2389,"children":2390},{"class":150,"line":1811},[2391],{"type":49,"tag":148,"props":2392,"children":2393},{},[2394],{"type":55,"value":2395},"    print(sdk.get_failure_analysis(job.id))\n",{"type":49,"tag":58,"props":2397,"children":2398},{},[2399,2401,2407],{"type":55,"value":2400},"With long-running monitoring enabled, do not stop after 30 minutes or after a\nfew unchanged polls. Keep emitting updates every ",{"type":49,"tag":72,"props":2402,"children":2404},{"className":2403},[],[2405],{"type":55,"value":2406},"status_interval_minutes",{"type":55,"value":2408},"\nuntil the job finishes, fails, is canceled, or the user asks to detach\u002Fstop.\nIf the chat\u002Fruntime cannot remain open that long, say so explicitly and provide\nthe durable workflow\u002Flog path for manual status refresh.",{"type":49,"tag":58,"props":2410,"children":2411},{},[2412],{"type":55,"value":2413},"Do not use a final response for non-terminal monitored jobs. Finalizing the\nturn detaches the chat watcher. Keep non-terminal status messages in progress\nupdates and continue polling; only finalize at terminal state, explicit user\ndetach\u002Fstop, or a real runtime limit that prevents further polling.",{"type":49,"tag":58,"props":2415,"children":2416},{},[2417,2419,2425,2427,2433,2435,2441],{"type":55,"value":2418},"For background runs, persist ",{"type":49,"tag":72,"props":2420,"children":2422},{"className":2421},[],[2423],{"type":55,"value":2424},"job.id",{"type":55,"value":2426}," and the ",{"type":49,"tag":72,"props":2428,"children":2430},{"className":2429},[],[2431],{"type":55,"value":2432},"state_file",{"type":55,"value":2434}," path, then re-attach later by constructing the same SDK and calling ",{"type":49,"tag":72,"props":2436,"children":2438},{"className":2437},[],[2439],{"type":55,"value":2440},"get_job_status(job_id)",{"type":55,"value":2442}," — job state is read from the on-disk store.",{"type":49,"tag":109,"props":2444,"children":2446},{"id":2445},"orchestration-patterns",[2447],{"type":55,"value":2448},"Orchestration patterns",{"type":49,"tag":58,"props":2450,"children":2451},{},[2452,2454,2460,2462,2471,2473,2478],{"type":55,"value":2453},"Multi-step workflows, parallel sweeps, and run-folder durability via\n",{"type":49,"tag":72,"props":2455,"children":2457},{"className":2456},[],[2458],{"type":55,"value":2459},"ActionWorkflow",{"type":55,"value":2461}," live in\n",{"type":49,"tag":2066,"props":2463,"children":2465},{"href":2464},"references\u002Forchestration-patterns.md",[2466],{"type":49,"tag":72,"props":2467,"children":2469},{"className":2468},[],[2470],{"type":55,"value":2464},{"type":55,"value":2472},".\nRead it before chaining ",{"type":49,"tag":72,"props":2474,"children":2476},{"className":2475},[],[2477],{"type":55,"value":1275},{"type":55,"value":2479}," calls, sweeping a parameter, or\npersisting run state across context breaks.",{"type":49,"tag":109,"props":2481,"children":2483},{"id":2482},"dataset-utilities",[2484],{"type":55,"value":2485},"Dataset utilities",{"type":49,"tag":58,"props":2487,"children":2488},{},[2489],{"type":55,"value":2490},"When the skill's documented filenames don't match the user's layout, list the dataset to confirm:",{"type":49,"tag":137,"props":2492,"children":2494},{"className":355,"code":2493,"language":158,"meta":142,"style":142},"assert sdk.check_path(\"s3:\u002F\u002Fmy-bucket\u002Fcoco\u002F\")\nfiles = sdk.list_path(\"s3:\u002F\u002Fmy-bucket\u002Fcoco\u002Ftrain\u002F\")\n# Use the actual paths to set spec fields.\n",[2495],{"type":49,"tag":72,"props":2496,"children":2497},{"__ignoreMap":142},[2498,2506,2514],{"type":49,"tag":148,"props":2499,"children":2500},{"class":150,"line":151},[2501],{"type":49,"tag":148,"props":2502,"children":2503},{},[2504],{"type":55,"value":2505},"assert sdk.check_path(\"s3:\u002F\u002Fmy-bucket\u002Fcoco\u002F\")\n",{"type":49,"tag":148,"props":2507,"children":2508},{"class":150,"line":203},[2509],{"type":49,"tag":148,"props":2510,"children":2511},{},[2512],{"type":55,"value":2513},"files = sdk.list_path(\"s3:\u002F\u002Fmy-bucket\u002Fcoco\u002Ftrain\u002F\")\n",{"type":49,"tag":148,"props":2515,"children":2516},{"class":150,"line":227},[2517],{"type":49,"tag":148,"props":2518,"children":2519},{},[2520],{"type":55,"value":2521},"# Use the actual paths to set spec fields.\n",{"type":49,"tag":58,"props":2523,"children":2524},{},[2525,2527,2533],{"type":55,"value":2526},"For S3 paths, strip trailing slashes when concatenating to avoid ",{"type":49,"tag":72,"props":2528,"children":2530},{"className":2529},[],[2531],{"type":55,"value":2532},"\u002F\u002F",{"type":55,"value":1920},{"type":49,"tag":137,"props":2535,"children":2537},{"className":355,"code":2536,"language":158,"meta":142,"style":142},"base = dataset_uri.rstrip(\"\u002F\")\nspecs[\"dataset\"][\"train_csv\"] = f\"{base}\u002Ftrain.csv\"   # nested — see \"spec is nested dicts\"\n",[2538],{"type":49,"tag":72,"props":2539,"children":2540},{"__ignoreMap":142},[2541,2549],{"type":49,"tag":148,"props":2542,"children":2543},{"class":150,"line":151},[2544],{"type":49,"tag":148,"props":2545,"children":2546},{},[2547],{"type":55,"value":2548},"base = dataset_uri.rstrip(\"\u002F\")\n",{"type":49,"tag":148,"props":2550,"children":2551},{"class":150,"line":203},[2552],{"type":49,"tag":148,"props":2553,"children":2554},{},[2555],{"type":55,"value":2556},"specs[\"dataset\"][\"train_csv\"] = f\"{base}\u002Ftrain.csv\"   # nested — see \"spec is nested dicts\"\n",{"type":49,"tag":109,"props":2558,"children":2560},{"id":2559},"platform-specific-notes",[2561],{"type":55,"value":2562},"Platform-specific notes",{"type":49,"tag":58,"props":2564,"children":2565},{},[2566,2567,2576,2578,2584,2585,2591,2592,2598,2599,2605],{"type":55,"value":2064},{"type":49,"tag":2066,"props":2568,"children":2570},{"href":2569},"references\u002Fplatform-notes.md",[2571],{"type":49,"tag":72,"props":2572,"children":2574},{"className":2573},[],[2575],{"type":55,"value":2569},{"type":55,"value":2577}," for per-platform behavior, kwargs, and credential scoping: Brev (",{"type":49,"tag":72,"props":2579,"children":2581},{"className":2580},[],[2582],{"type":55,"value":2583},"instance_id",{"type":55,"value":594},{"type":49,"tag":72,"props":2586,"children":2588},{"className":2587},[],[2589],{"type":55,"value":2590},"gpu_type",{"type":55,"value":594},{"type":49,"tag":72,"props":2593,"children":2595},{"className":2594},[],[2596],{"type":55,"value":2597},"cloud_cred_id",{"type":55,"value":594},{"type":49,"tag":72,"props":2600,"children":2602},{"className":2601},[],[2603],{"type":55,"value":2604},"workspace_group_id",{"type":55,"value":2606},", ready-wait timeouts), SLURM (sbatch over SSH, Lustre paths, queue defaults), Kubernetes (kubeconfig, GPU Operator), and local Docker (single-host, multi-GPU).",{"type":49,"tag":109,"props":2608,"children":2610},{"id":2609},"error-patterns",[2611],{"type":55,"value":2612},"Error patterns",{"type":49,"tag":58,"props":2614,"children":2615},{},[2616,2618,2627,2629,2634],{"type":55,"value":2617},"SDK error → root cause → fix mappings are in\n",{"type":49,"tag":2066,"props":2619,"children":2621},{"href":2620},"references\u002Ferror-patterns.md",[2622],{"type":49,"tag":72,"props":2623,"children":2625},{"className":2624},[],[2626],{"type":55,"value":2620},{"type":55,"value":2628},". Read when\nyou hit a ",{"type":49,"tag":72,"props":2630,"children":2632},{"className":2631},[],[2633],{"type":55,"value":396},{"type":55,"value":2635},", image-pull failure, stuck-Pending job, or\nsimilar — the entries map exception text to the underlying cause.",{"type":49,"tag":109,"props":2637,"children":2639},{"id":2638},"what-the-sdk-does-not-do",[2640],{"type":55,"value":2641},"What the SDK does NOT do",{"type":49,"tag":58,"props":2643,"children":2644},{},[2645,2647,2656,2658,2663,2665,2670,2672,2677],{"type":55,"value":2646},"The SDK does not read\u002Finterpret skills, run AutoML on its own, decide spec contents, select platforms, or orchestrate multi-step workflows — those stay the agent's responsibility. See ",{"type":49,"tag":2066,"props":2648,"children":2650},{"href":2649},"references\u002Fscope.md",[2651],{"type":49,"tag":72,"props":2652,"children":2654},{"className":2653},[],[2655],{"type":55,"value":2649},{"type":55,"value":2657}," for the full scope guardrails, including the model-level AutoML policy (",{"type":49,"tag":72,"props":2659,"children":2661},{"className":2660},[],[2662],{"type":55,"value":963},{"type":55,"value":2664}," → ",{"type":49,"tag":72,"props":2666,"children":2668},{"className":2667},[],[2669],{"type":55,"value":971},{"type":55,"value":2671}," unless ",{"type":49,"tag":72,"props":2673,"children":2675},{"className":2674},[],[2676],{"type":55,"value":987},{"type":55,"value":2678}," or the user asks for a plain single run).",{"type":49,"tag":2680,"props":2681,"children":2682},"style",{},[2683],{"type":55,"value":2684},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":2686,"total":2788},[2687,2704,2718,2732,2744,2761,2774],{"slug":2688,"name":2688,"fn":2689,"description":2690,"org":2691,"tags":2692,"stars":23,"repoUrl":24,"updatedAt":2703},"accelerated-computing-cudf","accelerate data processing with cuDF","Official NVIDIA-authored guidance for NVIDIA cuDF GPU DataFrames, pandas acceleration, dask-cuDF, ETL, joins, groupby, CSV\u002FParquet I\u002FO, nullable semantics, and multi-GPU DataFrame workloads.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2693,2696,2699,2700],{"name":2694,"slug":2695,"type":15},"Data Analysis","data-analysis",{"name":2697,"slug":2698,"type":15},"Data Engineering","data-engineering",{"name":9,"slug":8,"type":15},{"name":2701,"slug":2702,"type":15},"Performance","performance","2026-07-14T05:28:43.176466",{"slug":2705,"name":2705,"fn":2706,"description":2707,"org":2708,"tags":2709,"stars":23,"repoUrl":24,"updatedAt":2717},"aiq-deploy","deploy and manage NVIDIA AI-Q infrastructure","Use when asked to install, deploy, run, validate, troubleshoot, or stop NVIDIA AI-Q Blueprint infrastructure.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2710,2713,2716],{"name":2711,"slug":2712,"type":15},"Deployment","deployment",{"name":2714,"slug":2715,"type":15},"Infrastructure","infrastructure",{"name":9,"slug":8,"type":15},"2026-07-14T05:29:06.667109",{"slug":2719,"name":2719,"fn":2720,"description":2721,"org":2722,"tags":2723,"stars":23,"repoUrl":24,"updatedAt":2731},"aiq-research","conduct deep research with AI-Q","Use when asked to run deep research or AI-Q research through a reachable NVIDIA AI-Q Blueprint backend.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2724,2727,2728],{"name":2725,"slug":2726,"type":15},"Agents","agents",{"name":9,"slug":8,"type":15},{"name":2729,"slug":2730,"type":15},"Research","research","2026-07-14T05:28:06.816956",{"slug":2733,"name":2733,"fn":2734,"description":2735,"org":2736,"tags":2737,"stars":23,"repoUrl":24,"updatedAt":2743},"amc-run-sample-calibration","run AMC sample dataset calibration","Run end-to-end calibration on the shipped sample dataset (sdg_08_2_sample_data_010926.zip) against a running AMC microservice. Use when user says 'test sample dataset', 'run sample calibration', 'verify AMC install', or 'launch and test'.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2738,2739,2740],{"name":2694,"slug":2695,"type":15},{"name":9,"slug":8,"type":15},{"name":2741,"slug":2742,"type":15},"Testing","testing","2026-07-17T05:29:03.913266",{"slug":2745,"name":2745,"fn":2746,"description":2747,"org":2748,"tags":2749,"stars":23,"repoUrl":24,"updatedAt":2760},"amc-run-video-calibration","calibrate video datasets with AutoMagicCalib","Calibrate a new dataset from pre-recorded video files via the AutoMagicCalib REST API. Use when user has local MP4s and says 'calibrate my videos', 'run AMC on these videos', or similar. For RTSP\u002Flive streams, use amc-run-rtsp-calibration instead.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2750,2753,2756,2757],{"name":2751,"slug":2752,"type":15},"Automation","automation",{"name":2754,"slug":2755,"type":15},"Imaging","imaging",{"name":9,"slug":8,"type":15},{"name":2758,"slug":2759,"type":15},"Video","video","2026-07-17T05:28:53.905004",{"slug":2762,"name":2762,"fn":2763,"description":2764,"org":2765,"tags":2766,"stars":23,"repoUrl":24,"updatedAt":2773},"amc-setup-calibration-stack","deploy AutoMagicCalib microservice with Docker","Launch AutoMagicCalib microservice and web UI from NGC release images via Docker Compose. Use when user says 'deploy auto calibration', 'launch auto calibration', 'launch AMC', 'start MS+UI', or 'set up auto-magic-calib'. Requires NGC API key.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2767,2768,2769,2770],{"name":2711,"slug":2712,"type":15},{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"name":2771,"slug":2772,"type":15},"Operations","operations","2026-07-17T05:28:56.913999",{"slug":2775,"name":2775,"fn":2776,"description":2777,"org":2778,"tags":2779,"stars":23,"repoUrl":24,"updatedAt":2787},"cudaq-guide","develop quantum applications with CUDA-Q","CUDA-Q onboarding guide for installation, test programs, GPU simulation, QPU hardware, and quantum applications.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2780,2781,2784],{"name":9,"slug":8,"type":15},{"name":2782,"slug":2783,"type":15},"Quantum Computing","quantum-computing",{"name":2785,"slug":2786,"type":15},"Simulation","simulation","2026-07-14T05:26:58.898253",305,{"items":2790,"total":2938},[2791,2809,2824,2835,2847,2861,2874,2886,2897,2906,2920,2929],{"slug":2792,"name":2792,"fn":2793,"description":2794,"org":2795,"tags":2796,"stars":2806,"repoUrl":2807,"updatedAt":2808},"nemoclaw-user-guide","retrieve NemoClaw documentation and configuration","Guides human users' AI agents to the NemoClaw docs MCP server and canonical Fern documentation in Markdown form. Use when users ask how to install, configure, operate, troubleshoot, secure, or learn NemoClaw with an AI coding assistant. Trigger keywords - nemoclaw docs, use nemoclaw with ai agent, nemoclaw mcp docs, nemoclaw install help, nemoclaw quickstart, nemoclaw markdown docs, llms.txt, agent skills.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2797,2800,2803],{"name":2798,"slug":2799,"type":15},"Documentation","documentation",{"name":2801,"slug":2802,"type":15},"MCP","mcp",{"name":2804,"slug":2805,"type":15},"Search","search",21777,"https:\u002F\u002Fgithub.com\u002FNVIDIA\u002FNemoClaw","2026-07-20T06:00:01.461044",{"slug":2810,"name":2810,"fn":2811,"description":2812,"org":2813,"tags":2814,"stars":2821,"repoUrl":2822,"updatedAt":2823},"mcore-build-and-dependency","manage Megatron-LM development environments","Container-based dev environment setup and dependency management for Megatron-LM. Covers acquiring and launching the CI container, uv package management, and updating uv.lock.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2815,2818,2819],{"name":2816,"slug":2817,"type":15},"Containers","containers",{"name":2711,"slug":2712,"type":15},{"name":2820,"slug":158,"type":15},"Python",17049,"https:\u002F\u002Fgithub.com\u002FNVIDIA\u002FMegatron-LM","2026-07-27T06:06:11.249662",{"slug":2825,"name":2825,"fn":2826,"description":2827,"org":2828,"tags":2829,"stars":2821,"repoUrl":2822,"updatedAt":2834},"mcore-bump-base-image","update NVIDIA PyTorch base images","Bump the NVIDIA PyTorch base image (`nvcr.io\u002Fnvidia\u002Fpytorch:YY.MM-py3`) used by Megatron-LM CI. Covers the two pin sites (GitHub CI in `docker\u002F.ngc_version.dev` and GitLab CI in `.gitlab\u002Fstages\u002F01.build.yml`), the post-bump CI loop (re-run functional tests, refresh golden values, mark broken tests), and the gotchas that bit PRs",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2830,2833],{"name":2831,"slug":2832,"type":15},"CI\u002FCD","ci-cd",{"name":2711,"slug":2712,"type":15},"2026-07-14T05:25:59.97109",{"slug":2836,"name":2836,"fn":2837,"description":2838,"org":2839,"tags":2840,"stars":2821,"repoUrl":2822,"updatedAt":2846},"mcore-cicd","manage CI\u002FCD pipelines for Megatron-LM","CI\u002FCD reference for Megatron-LM. Covers CI pipeline structure, PR scope labels, triggering internal GitLab CI (which force-pushes the current branch to a pull-request\u002FBRANCH ref — always dry-run and verify the destination first; never run against shared or protected branches), and CI failure investigation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2841,2842,2843],{"name":2831,"slug":2832,"type":15},{"name":2711,"slug":2712,"type":15},{"name":2844,"slug":2845,"type":15},"GitHub","github","2026-07-27T06:06:12.278222",{"slug":2848,"name":2848,"fn":2849,"description":2850,"org":2851,"tags":2852,"stars":2821,"repoUrl":2822,"updatedAt":2860},"mcore-create-issue","investigate CI failures and create issues","Investigate a failing GitHub Actions run or job and create a GitHub issue for the failure.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2853,2856,2857],{"name":2854,"slug":2855,"type":15},"Debugging","debugging",{"name":2844,"slug":2845,"type":15},{"name":2858,"slug":2859,"type":15},"Triage","triage","2026-07-14T05:25:57.442089",{"slug":2862,"name":2862,"fn":2863,"description":2864,"org":2865,"tags":2866,"stars":2821,"repoUrl":2822,"updatedAt":2873},"mcore-linting-and-formatting","lint and format Megatron-LM code","Linting and formatting for Megatron-LM. Covers running autoformat.sh, tools (ruff, black, isort, pylint, mypy), and code style rules.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2867,2870],{"name":2868,"slug":2869,"type":15},"Best Practices","best-practices",{"name":2871,"slug":2872,"type":15},"Code Analysis","code-analysis","2026-07-14T05:25:56.18433",{"slug":2875,"name":2875,"fn":2876,"description":2877,"org":2878,"tags":2879,"stars":2821,"repoUrl":2822,"updatedAt":2885},"mcore-migrate-gpt-to-hybrid","migrate Megatron-LM models to HybridModel","Migration guide for moving Megatron Core GPTModel checkpoints, model providers, training commands, and layer mappings to HybridModel.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2880,2881,2884],{"name":13,"slug":14,"type":15},{"name":2882,"slug":2883,"type":15},"Migration","migration",{"name":9,"slug":8,"type":15},"2026-07-17T06:07:11.777011",{"slug":2887,"name":2887,"fn":2888,"description":2889,"org":2890,"tags":2891,"stars":2821,"repoUrl":2822,"updatedAt":2896},"mcore-onboard-gb200-1node-tests","onboard functional tests for GB200","Onboard 1-node GitHub MR functional tests for GB200 from existing mr-scoped 2-node tests.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2892,2895],{"name":2893,"slug":2894,"type":15},"QA","qa",{"name":2741,"slug":2742,"type":15},"2026-07-14T05:25:53.673039",{"slug":2898,"name":2898,"fn":2899,"description":2900,"org":2901,"tags":2902,"stars":2821,"repoUrl":2822,"updatedAt":2905},"mcore-run-on-slurm","launch distributed training jobs on SLURM","How to launch distributed Megatron-LM training jobs on a SLURM cluster. Covers a minimal sbatch skeleton, environment-variable setup for torch.distributed.run, CUDA_DEVICE_MAX_CONNECTIONS rules across hardware and parallelism modes, container conventions, monitoring, and per-rank failure diagnosis.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2903,2904],{"name":2711,"slug":2712,"type":15},{"name":2714,"slug":2715,"type":15},"2026-07-14T05:25:49.362534",{"slug":2907,"name":2907,"fn":2908,"description":2909,"org":2910,"tags":2911,"stars":2821,"repoUrl":2822,"updatedAt":2919},"mcore-split-pr","split pull requests to reduce review load","Split a PR into multiple PRs to reduce the number of required CODEOWNERS reviewer groups.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2912,2915,2916],{"name":2913,"slug":2914,"type":15},"Code Review","code-review",{"name":2844,"slug":2845,"type":15},{"name":2917,"slug":2918,"type":15},"Pull Requests","pull-requests","2026-07-14T05:26:01.226578",{"slug":2921,"name":2921,"fn":2922,"description":2923,"org":2924,"tags":2925,"stars":2821,"repoUrl":2822,"updatedAt":2928},"mcore-testing","run and manage Megatron-LM tests","Test system for Megatron-LM. Covers test layout, recipe YAML structure, adding and running unit and functional tests, golden values, marker filters, and CI parity.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2926,2927],{"name":2893,"slug":2894,"type":15},{"name":2741,"slug":2742,"type":15},"2026-07-14T05:25:54.928983",{"slug":2930,"name":2930,"fn":2931,"description":2932,"org":2933,"tags":2934,"stars":2821,"repoUrl":2822,"updatedAt":2937},"nightly-sync","manage nightly main-to-dev sync workflows","Domain knowledge for the nightly main-to-dev sync workflow. Covers merge strategy, CI architecture, failure investigation, and known issues.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2935,2936],{"name":2751,"slug":2752,"type":15},{"name":2831,"slug":2832,"type":15},"2026-07-30T05:29:03.275638",496]