dynamo-recipe-runner — Claude Code skill: what it does, how to install
Discovers, validates, patches, and deploys NVIDIA Dynamo Kubernetes recipes for model serving across vLLM or SGLang runtimes.
npx skills add NVIDIA/skills --skill dynamo-recipe-runner -a claude-codeWhat dynamo-recipe-runner does
The skill operates strictly within the existing recipes/ tree of the Dynamo repository. Instead of generating arbitrary Kubernetes manifests, it runs scripts/recipe_tool.py to match the target model, backend framework (vllm, sglang, trtllm, tokenspeed), deployment mode, and GPU count.
Before making changes, it runs read-only cluster preflight checks with kubectl. The skill inspects nodes, namespaces, and storage classes. It patches only target fields such as storageClassName, container image tags, and GPU limits. When the cluster is unreachable, it skips applying changes and outputs the exact bash commands instead.
The operator environment requires Python 3.10+ alongside an active kubectl context. Built-in smoke testing is limited to checking /v1/models, so multi-node transport verification must be handled by dedicated diagnostic tools.
What it helps with
- locate existing Dynamo recipes for models and frameworks like vLLM or SGLang
- validate recipe manifests before applying them to a Kubernetes cluster
- patch storage classes, GPU resource limits, and image tags without rewriting YAML
- deploy model-cache download jobs and frontend services into a namespace
- verify deployment health using a local port-forward to
/v1/models
Example prompts for the agent
- Find and validate a Dynamo recipe for nemotron-3-super-fp8 using sglang
- Deploy the qwen vllm recipe in disagg mode to namespace ai-serving
- Validate the trtllm recipe and print the kubectl commands without running them
How to install dynamo-recipe-runner
1Skills CLI (Vercel)
npx skills add NVIDIA/skills --skill dynamo-recipe-runner -a claude-code2Manually: put the files in place
~/.claude/skills/dynamo-recipe-runner/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/dynamo-recipe-runner/
1Skills CLI (Vercel)
npx skills add NVIDIA/skills --skill dynamo-recipe-runner -a codex2Manually: put the files in place
.agents/skills/dynamo-recipe-runner/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add NVIDIA/skills --skill dynamo-recipe-runner -a cursor2Manually: put the files in place
.cursor/skills/dynamo-recipe-runner/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install NVIDIA/skills dynamo-recipe-runner2Manually: put the files in place
.github/skills/dynamo-recipe-runner/SKILL.md1Skills CLI (Vercel)
npx skills add NVIDIA/skills --skill dynamo-recipe-runner -a gemini-cli2Platform CLI
gemini skills install https://github.com/NVIDIA/skills --path skills/dynamo-recipe-runnerManually: put the files in place
.devin/skills/dynamo-recipe-runner/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add NVIDIA/skills --skill dynamo-recipe-runner -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about dynamo-recipe-runner
How to install dynamo-recipe-runner in Claude Code?
Run npx skills add NVIDIA/skills --skill dynamo-recipe-runner -a claude-code. The skill will be registered in ~/.claude/skills/dynamo-recipe-runner/SKILL.md.
What does dynamo-recipe-runner do?
It discovers, validates, minimally patches, and deploys NVIDIA Dynamo Kubernetes recipes to bring up model endpoints.
What prerequisites must be configured in the cluster?
You need a default StorageClass for model-cache PVCs and a Kubernetes secret named hf-token-secret containing your Hugging Face token.
Source text
SKILL.md · Apache-2.0
--- name: dynamo-recipe-runner description: Select, validate, patch, and deploy existing NVIDIA Dynamo Kubernetes recipes. Use for model/backend/GPU/deployment-mode recipe bring-up; use router-starter for router-only mode work and troubleshoot for broken deployments. license: Apache-2.0 metadata: author: Dan Gil <[email protected]> tags: - dynamo - kubernetes - recipes - bring-up permissions: - file_read - network - kubectl_exec --- # Dynamo Recipe Runner <!-- SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. SPDX-License-Identifier: CC-BY-4.0 --> ## Purpose Get from user intent to a working Dynamo recipe endpoint with minimal back and forth. Do not create new guide content. Operate on the existing `recipes/` tree, patch the smallest necessary set of manifests, deploy when the user has cluster access, and prove success with an OpenAI-compatible smoke request. ## Prerequisites - Python 3.10+ on the operator machine. - `kubectl` configured with a working cluster context. - Cluster has a default storage class for model-cache PVCs. - Hugging Face token stored in a Kubernetes secret named `hf-token-secret` (or equivalent) in the target namespace. - Read access to the `recipes/` tree in the ai-dynamo/dynamo repository. ## Required Inputs Collect or infer these before changing manifests: - recipe target: model, framework (`vllm`, `sglang`, `trtllm`, `tokenspeed`), deployment mode, and GPU type/count - Kubernetes context and namespace - Hugging Face secret name, usually `hf-token-secret` - storage class for model cache PVCs - runtime image tag if the recipe uses a placeholder or stale test image - whether to run commands or only produce exact commands If a required value is missing and cannot be inferred from the selected recipe, ask for only that value. ## Instructions ### 1. Preflight Run read-only checks first: ```bash git status --short python3 scripts/recipe_tool.py list --format table kubectl config current-context kubectl get storageclass kubectl get nodes -o wide kubectl get namespace "${NAMESPACE}" kubectl get secret hf-token-secret -n "${NAMESPACE}" ``` If `kubectl` is unavailable or the cluster is unreachable, continue by selecting and validating the recipe, then return exact commands instead of pretending the deployment ran. ### 2. Select The Recipe Use the recipe matrix from `recipes/README.md` and the scanner: ```bash python3 scripts/recipe_tool.py list \ --query qwen --framework vllm --mode disagg --format table ``` Prefer an exact existing recipe. Do not invent new manifests unless the user explicitly asks to author a new recipe. ### 3. Inspect And Validate Read the selected recipe README, model-cache manifests, `deploy.yaml`, and `perf.yaml` if present. Then run: ```bash python3 scripts/recipe_tool.py validate \ recipes/<model>/<framework>/<mode> ``` Resolve reported blockers before applying manifests: storage class, model cache PVC, image tag, HF token secret, GPU count, frontend service name, and router mode. ### 4. Patch Minimal Values Patch only recipe-specific values needed for this run. Do not reformat whole YAML files. Common patches: - `storageClassName` - image repository/tag - model path or model cache mount path - GPU resource requests/limits - frontend `DYN_ROUTER_MODE` - namespace only when a manifest hardcodes it Never write Hugging Face tokens into files or logs. Use Kubernetes secrets. ### 5. Deploy Follow the selected recipe README when it differs from the default sequence. The default sequence is: ```bash kubectl apply -f recipes/<model>/model-cache/ -n "${NAMESPACE}" kubectl wait --for=condition=Complete job/model-download -n "${NAMESPACE}" --timeout=6000s kubectl apply -f recipes/<model>/<framework>/<mode>/deploy.yaml -n "${NAMESPACE}" kubectl get dynamographdeployment -n "${NAMESPACE}" kubectl get pods -n "${NAMESPACE}" -o wide ``` Wait for the frontend and workers to be ready before testing. ### 6. Smoke Test Port-forward the frontend service, then verify `/v1/models` and one chat completion: ```bash kubectl port-forward svc/<deployment-name>-frontend 8000:8000 -n "${NAMESPACE}" curl http://127.0.0.1:8000/v1/models ``` If `dynamo-router-starter` is also installed, prefer its `scripts/check_router_health.py` for the full OpenAI-compatible smoke test. If this fails, switch to `dynamo-troubleshoot`. ## Available Scripts | Script | Purpose | Arguments | |---|---|---| | `scripts/recipe_tool.py list` | Enumerate available recipes, optionally filtered | `--query`, `--framework`, `--mode`, `--format` | | `scripts/recipe_tool.py validate` | Validate a recipe directory before apply | positional recipe path | Invoke via the agentskills.io `run_script()` protocol: ```python run_script("scripts/recipe_tool.py", args=["list", "--framework", "sglang", "--format", "table"]) run_script("scripts/recipe_tool.py", args=["validate", "recipes/nemotron-3-super-fp8/sglang/agg"]) ``` ## Examples List sglang recipes that fit a single 8xB200 node: ```bash python3 scripts/recipe_tool.py list --framework sglang --format table ``` Validate a specific recipe and resolve blockers before applying: ```bash python3 scripts/recipe_tool.py validate recipes/nemotron-3-super-fp8/sglang/agg ``` Equivalent through the agent protocol: ```python run_script("scripts/recipe_tool.py", args=["validate", "recipes/nemotron-3-super-fp8/sglang/agg"]) ``` ## Output Contract Return: - selected recipe path and why it was selected - exact values patched - commands run or commands to run - endpoint and smoke-test result - unresolved blockers, if any - next troubleshooting step when deployment does not become healthy ## Limitations - Operates on the existing `recipes/` tree only. Does not author new manifests. - Cluster-mutating apply steps require `kubectl` permission to the target namespace. - Smoke-test depth is intentionally minimal; for full router/endpoint coverage use `dynamo-router-starter`. - Multi-node disagg transport correctness is out of scope; use `dynamo-interconnect-check` after deploy. ## Troubleshooting | Symptom | Likely cause | Next step | |---|---|---| | `kubectl` cluster unreachable | Context not set or VPN down | Return exact commands instead of running them; resume when cluster is reachable | | `validate` reports missing storage class | Cluster has no default `StorageClass` | Patch `storageClassName` on the model-cache manifest before applying | | Model-cache job stuck `Pending` | PVC unbound or HF secret missing | Inspect PVC events; create or rename the HF secret to match the recipe | | Worker pods `ImagePullBackOff` | Stale image tag or missing pull secret | Patch the image tag; verify image pull secret in the namespace | | `/v1/models` 4xx/5xx after deploy | Frontend not ready or wrong service port | Wait for pods Ready; re-run port-forward; switch to `dynamo-troubleshoot` if it persists | ## Benchmark See `BENCHMARK.md` for the NVCARPS-EVAL performance report (auto-generated by the NVSkills CI pipeline). To refresh, re-run `/nvskills-ci` on an upstream PR touching this skill. ## References - Read `references/k8s-recipe-workflow.md` for command templates and readiness checks. - Use `scripts/recipe_tool.py` for recipe discovery and lightweight validation.
© Dan Gil · Apache-2.0 · NVIDIA/skills