Vllm Deploy Docker
vllm-project/vllm-skills
Deploy vLLM using Docker (pre-built images or build-from-source) with NVIDIA GPU support and run the OpenAI-compatible server.
Set up the NVIDIA "Build an Agent" DevX workshop as a working JupyterLab environment from INSIDE a locked-down OpenShell/NemoClaw sandbox, and hand the user the token URL + access commands.
$ npx skills add brevdev/workshop-build-an-agent --skill setup-workshop-nemoclaw -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install brevdev/workshop-build-an-agent setup-workshop-nemoclaw --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/brevdev/workshop-build-an-agent.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/setup-workshop-nemoclaw .claude/skills/setup-workshop-nemoclaw && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "setup-workshop-nemoclaw" agent skill from https://github.com/brevdev/workshop-build-an-agent/tree/main/.agents/skills/setup-workshop-nemoclaw into .claude/skills/setup-workshop-nemoclaw/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "setup-workshop-nemoclaw", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/brevdev/workshop-build-an-agent/tree/main/.agents/skills/setup-workshop-nemoclawType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add brevdev/workshop-build-an-agent --skill setup-workshop-nemoclaw -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install brevdev/workshop-build-an-agent setup-workshop-nemoclaw --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/brevdev/workshop-build-an-agent.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/setup-workshop-nemoclaw .agents/skills/setup-workshop-nemoclaw && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "setup-workshop-nemoclaw" agent skill from https://github.com/brevdev/workshop-build-an-agent/tree/main/.agents/skills/setup-workshop-nemoclaw into .agents/skills/setup-workshop-nemoclaw/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "setup-workshop-nemoclaw", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add brevdev/workshop-build-an-agent --skill setup-workshop-nemoclaw -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install brevdev/workshop-build-an-agent setup-workshop-nemoclaw --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/brevdev/workshop-build-an-agent.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/setup-workshop-nemoclaw .cursor/skills/setup-workshop-nemoclaw && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "setup-workshop-nemoclaw" agent skill from https://github.com/brevdev/workshop-build-an-agent/tree/main/.agents/skills/setup-workshop-nemoclaw into .cursor/skills/setup-workshop-nemoclaw/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "setup-workshop-nemoclaw", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/brevdev/workshop-build-an-agent.git --path .agents/skills/setup-workshop-nemoclaw--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add brevdev/workshop-build-an-agent --skill setup-workshop-nemoclaw -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install brevdev/workshop-build-an-agent setup-workshop-nemoclaw --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/brevdev/workshop-build-an-agent.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/setup-workshop-nemoclaw .gemini/skills/setup-workshop-nemoclaw && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "setup-workshop-nemoclaw" agent skill from https://github.com/brevdev/workshop-build-an-agent/tree/main/.agents/skills/setup-workshop-nemoclaw into .gemini/skills/setup-workshop-nemoclaw/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "setup-workshop-nemoclaw", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install brevdev/workshop-build-an-agent setup-workshop-nemoclawInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add brevdev/workshop-build-an-agent --skill setup-workshop-nemoclaw -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/brevdev/workshop-build-an-agent.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/setup-workshop-nemoclaw .github/skills/setup-workshop-nemoclaw && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "setup-workshop-nemoclaw" agent skill from https://github.com/brevdev/workshop-build-an-agent/tree/main/.agents/skills/setup-workshop-nemoclaw into .github/skills/setup-workshop-nemoclaw/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "setup-workshop-nemoclaw", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add brevdev/workshop-build-an-agent --skill setup-workshop-nemoclaw -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install brevdev/workshop-build-an-agent setup-workshop-nemoclaw --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/brevdev/workshop-build-an-agent.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/setup-workshop-nemoclaw .opencode/skills/setup-workshop-nemoclaw && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "setup-workshop-nemoclaw" agent skill from https://github.com/brevdev/workshop-build-an-agent/tree/main/.agents/skills/setup-workshop-nemoclaw into .opencode/skills/setup-workshop-nemoclaw/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "setup-workshop-nemoclaw", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
setup-workshop-nemoclawSet up the NVIDIA "Build an Agent" DevX workshop as a working JupyterLab environment from INSIDE a locked-down OpenShell/NemoClaw sandbox, and hand the user the token URL + access commands.
Setup Workshop Nemoclaw is an agent skill from brevdev/workshop-build-an-agent. Set up the NVIDIA "Build an Agent" DevX workshop as a working JupyterLab environment from INSIDE a locked-down OpenShell/NemoClaw sandbox, and hand the user the token URL + access commands. Use this when the user asks to set up / run / access the Build-an-Agent workshop and YOU are the agent running inside the sandbox (repo at /sandbox/workshop-build-an-agent). NOT the generic setup-workshop skill (a bare-metal GPU-host installer that needs sudo/Docker/CUDA and cannot run here), and NOT the host side — operators…
Its SKILL.md is about 5.2k tokens, which your agent loads only when the skill is triggered. The skill folder holds 18 other files, including scripts, reference files and assets (for example `assets/devx-jupyterapp-bridge/package.json`, `assets/devx-jupyterapp-bridge/static/remoteEntry.js` and `references/operator-contract.md`).
It sits in AI & LLM Engineering, covering Building AI agents, Jupyter notebooks and Fine-tuning. It works with Jupyter, NVIDIA AI Platform, Docker and CUDA. The licence is Apache-2.0.
5 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit b5689a7. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 5 files in scripts/ (Shell, Python and JavaScript), which the agent can run.
Shell commands in SKILL.md call:
bashdockercurlnpmuvpythonuvicornsshjupyterFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use docker, curl, npm, uv and ssh, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
NVIDIA_API_KEYCOMPATIBLE_API_KEYTAVILY_API_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Setup Workshop Nemoclaw loads about 5.2k tokens when it runs, and up to ~12k if it reads all its reference files. Until then it costs about 258 tokens; SKILL.md has 2,433 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from brevdev/workshop-build-an-agent at commit b5689a7, republished under its Apache-2.0 licence (© brevdev). 2,433 words, ~5,237 tokens.
.claude/skills/setup-workshop-nemoclaw/SKILL.md (or your agent's skills folder). This skill also uses 12 other files; get the full folder from GitHub.Sets up the NVIDIA Build an Agent workshop as an accessible JupyterLab instance inside an OpenShell/NemoClaw sandbox, then hands the user the port-forward + SSH commands and the token URL to open it in their browser.
This is one half of a two-skill pair:
| Skill | Runs | Does |
|---|---|---|
setup-workshop-nemoclaw-operator | on the sandbox host (outside) | egress policy, secrets staging, port-forward, lifecycle |
| this skill | inside the sandbox | venv + deps, netlink shim, launcher/bridge fixes, Jupyter launch, URL hand-off |
Run the checks before doing anything. Inside the sandbox (use this skill):
whoami → sandbox, /sandbox/ exists, docker/sudo are not found, and
egress 403s come from the OpenShell proxy. On the host (use the operator
skill instead): docker ps shows an openshell-<sandbox>-… container and the
openshell CLI is on PATH.
/sandbox/workshop-build-an-agent, branch main (the repo default) — stay on it.setup-workshop skill here — it is a bare-metal
installer (nvwb + Docker + CUDA + sudo) for a GPU host. It fails in the
sandbox by design, not by bug.One thing must be true before setup can succeed, and only the operator
(outside the sandbox) can make it true. Verify with scripts/preflight.sh;
if missing, send the operator the exact ask from
references/operator-contract.md and stop until they confirm:
GET pypi.org + files.pythonhosted.org
(installs); the NIM chat/embeddings routes on integrate.api.nvidia.com;
POST /v1/retrieval/** on ai.api.nvidia.com (modules 2/3 reranker —
NOT covered by the legacy /v1/ranking rule); POST /search on
api.tavily.com (modules 1/2/5 web search); all methods on
api.smith.langchain.com (module 3 + workshop-wide tracing);
GET /encodings/** on openaipublic.blob.core.windows.net (module-7
tiktoken); GET registry.npmjs.org for the node binary (module-5 "Deep
Agents Client" tile — without it demo/ can't npm install and the tile
only ever serves its setup page); GET/POST/DELETE on mcp.tavily.com
for node (module-2 PART 2A remote MCP — the shipped default); and — only
if the repo is not yet cloned — git smart-HTTP on github.com scoped to the
workshop repo. preflight.sh probes all of these and prints the exact ask
for each gap.
Not a prerequisite: NVIDIA_API_KEY. It is EXPECTED to be absent — the
learner sets it in the workshop's Secrets Manager tile after launch, and
preflight only WARNs about it. Leaving it unset is what makes that work:
start-jupyter.sh sources secrets.env into the server env at launch and
kernels inherit it, but load_dotenv() never overrides an already-set
variable — so a key staged before launch would shadow every later Secrets
Manager edit until a restart. Never accept a key through chat; if the operator
does want one pre-seeded, they write it from the host with
stage-nvidia-key.sh (a real nvapi-… key only — never COMPATIBLE_API_KEY,
which is the agent's own sk-… proxy credential and yields a confusing 401).Optional third item — /dev/pts read-write in filesystem_policy — is
needed only for the launcher's Terminal tile (terminado → pty.fork).
Setup does NOT block on it: start-jupyter.sh probes os.openpty() and
launches with terminals disabled when denied. The grant only takes effect at
a sandbox recreate (the supervisor parses filesystem policy at container
boot; a live policy apply won't activate it, even for new processes) — after
a recreate that includes it, setup enables terminals automatically.
There is no operator knob for the netlink/seccomp block — it is compiled
into the in-container OpenShell supervisor (Rust seccompiler), not the Docker
profile. You fix it inside the sandbox with the LD_PRELOAD shim below; this
was operator-pre-approved as the sanctioned fallback. Never dodge seccomp via
docker exec — that also escapes Landlock egress enforcement. FORBIDDEN.
SKILL_DIR is wherever this skill lives — resolve it, don't assume. Known
locations: the repo checkout (/sandbox/workshop-build-an-agent/.agents/skills/setup-workshop-nemoclaw)
or the agent skill library (/sandbox/.hermes-data/skills/**/setup-workshop-nemoclaw).
SKILL_DIR=$(dirname "$(find /sandbox -maxdepth 6 -path '*/setup-workshop-nemoclaw/SKILL.md' 2>/dev/null | head -1)")
bash "$SKILL_DIR/scripts/preflight.sh" # verifies the operator contract + environment; prints exact asks if not met
bash "$SKILL_DIR/scripts/setup.sh" # venv+deps, shim, bridge, launcher, %pip neutralize
bash "$SKILL_DIR/scripts/start-jupyter.sh" # ONE server on 127.0.0.1:8888, prints + saves token URL
cat /sandbox/workshop-url.txt # http://127.0.0.1:8888/lab?token=...All three scripts are idempotent and verify before acting. If a step fails,
read the matching section of references/sandbox-internals.md for the root
cause and manual commands.
Do NOT skip or reorder these. Each fixes a specific sandbox failure discovered
the hard way (full rationale + diagnostics in references/sandbox-internals.md).
TLS / CA bundle. uv and pip do not use the system trust store, and
TLS terminates at the OpenShell L7 proxy. You MUST export
SSL_CERT_FILE=/etc/openshell-tls/ca-bundle.pem (and PIP_CERT = same).
⚠️ /etc/ssl/certs/ca-certificates.crt is WRONG here — it lacks the proxy
CA and breaks uv with invalid peer certificate: UnknownIssuer
(--native-tls / --system-certs do not help).
venv + pinned CPU deps. uv venv $REPO/.venv; install the exact pinned
set in templates/requirements-sandbox.txt. It includes the packages the
repo's requirements.txt needs for the UI that early attempts missed:
jupyter-app-launcher (zero tiles without it), voila, jupyterlab-git,
streamlit + langgraph-sdk (client tiles), and ziglang (shim compiler).
Never install torch/unsloth/cudf — they are GPU-only (module-4
training; module-7's optional cudf exercise, which falls back to CPU
without them), this sandbox has no GPU, and installing them hangs voila.
Netlink LD_PRELOAD shim (templates/netlink-stub.c). The sandbox
seccomp filter denies socket(AF_NETLINK,…) → EPERM, so getifaddrs()
fails; ipykernel calls it at ZMQ bind regardless of transport (IPC does
not avoid it), and an empty interface list trips a ZMQ assert
(ip_resolver.cpp:543) → every kernel dies, voila hangs at "Running…".
The shim stubs getifaddrs/if_nameindex to return a one-entry
lo/127.0.0.1 list (non-empty is mandatory). Build with
python -m ziglang cc (no system gcc; npm is 403-blocked). Preload it
only on the Jupyter process tree, never session-wide.
Bridge labextension (assets/devx-jupyterapp-bridge/, checked-in
source). The in-lesson buttons call openVoila() →
window.parent.jupyterapp, which only AI Workbench's DevX layer normally
injects. npm being 403-blocked, this is a hand-crafted federated
labextension (Module Federation remoteEntry.js, ~2 KB) whose plugin sets
window.jupyterapp = app. Copy the directory into
$VENV/share/jupyter/labextensions/ — no archive, no build step.
Launcher config + anti-duplication (templates/jp_app_launcher.yaml,
11 tiles: 7 modules + Secrets Manager + Simple Agents/Deep Agents/NemoClaw
clients). The workshop YAML hardcodes /project/... (a Workbench mount
that doesn't exist here; symlinking /project fails — no root). The
template rewrites paths to the repo; it goes in $REPO/.launcher-config/
with JUPYTER_APP_LAUNCHER_PATH pointing at it. The extension merges
configs from both cwd AND that path, so ALSO move the repo-root
jp_app_launcher.yaml aside (to /sandbox/original-root-jp_app_launcher.yaml.bak),
delete any stale .ipynb_checkpoints/jp_app_launcher-checkpoint.yaml, and
launch from cwd /sandbox — or you get 22 duplicate tiles (the extra
set shows letter icons like 1A/2A/…). The Secrets Manager tile MUST be
type: jupyterlab-commands invoking docmanager:open with
factory: "Voila Preview" — the authenticated in-app path the per-module
buttons use. type: notebook-voila deadlocks behind jupyter-server-proxy
(HTTP 599); a raw type: url → /voila/render/... iframe carries no auth
token → 302 → login → hangs at "Running…".
5b. Terminal rcfile (setup.sh 4b + start-jupyter.sh
--ServerApp.terminado_settings). The Terminal tile otherwise spawns a
LOGIN bash: /etc/profile resets PATH and the image's read-only
/sandbox/.bashrc re-prepends only the hermes dirs — the workshop venv
(sole home of langgraph/uvicorn/streamlit) drops off PATH and every
lesson terminal command dies with "command not found". The rc files cannot
be replaced (the supervisor denies creating .bashrc*/.profile* in
/sandbox). Fix: generate $REPO/.launcher-config/terminal-bashrc (sources
/sandbox/.bashrc for the proxy env, prepends the venv, exports
SSL_CERT_FILE/PIP_CERT, set -a-sources variables.env + secrets.env
for AI-Workbench parity — module-2's uvicorn mcp_server:app hard-requires
TAVILY_API_KEY, and a terminal-launched langgraph dev needs
LANGSMITH_TRACING for the observability lesson — and sets npm fail-fast
vars) and launch terminals as NON-login bash --rcfile <that file>.
5c. aiohttp proxy trust (setup.sh 4c). All egress rides HTTP(S)_PROXY
env vars; httpx/requests honor them, aiohttp needs trust_env=True.
langchain-nvidia-ai-endpoints' ASYNC path uses aiohttp, so every
langgraph-served agent run (ainvoke → ChatNVIDIA) died at
Cannot connect to host integrate.api.nvidia.com:443 [Temporary failure in name resolution] while sync calls worked. Fix: a .pth-imported module in
the venv site-packages (zz-workshop-aiohttp-trust-env.pth →
_workshop_aiohttp_trust_env.py) defaults trust_env=True when proxy env
is present. (sitecustomize.py is unusable — shadowed by
/usr/local/lib/nemoclaw-patches on PYTHONPATH.)
scripts/neutralize_pip_cells.py). Cell 1 of
the 8 code/secrets_management/secrets_management_*.ipynb notebooks runs
%pip install -r ../../requirements.txt (pulls torch etc. → hangs voila;
the uv venv has no pip anyway). The script comments out only that line and
preserves the load_dotenv calls. Idempotent.6b. Lesson content sandbox notes (scripts/sandbox_content_notes.py).
Marker-guarded SANDBOX NOTE admonitions + /project/ → $REPO rewrites
inside bash fences, for lessons whose primary flow needs egress/hardware
this sandbox deliberately lacks: module-2 mcp.md (remote MCP via npx —
use the lesson's own PART 2B local server; verified working) and
migrate.md (local NIM needs Docker+GPU), module-4 GPU lessons, module-5
experience_deep_agent.md (skip the python3.12 -m venv step — deps are
pre-installed; npm/Docker unavailable by design), module-6 CLI setup
pages (Docker/npm), plus cd /project/... path fixes in module-6 lessons.
Single-server discipline (scripts/start-jupyter.sh). Keep exactly
one JupyterLab server on 8888. Stale servers steal the port bind — the
relaunched (shim-carrying) server never takes over, tiles vanish, and the
shim "mysteriously" stops working. Jupyter traps SIGTERM, so the script
kill -9s stale jupyter-lab/voila/ipykernel, confirms the port is
free, launches with the full env (SSL_CERT_FILE,
JUPYTER_APP_LAUNCHER_PATH, venv-first PATH so spawned voila/
streamlit resolve, JUPYTER_RUNTIME_DIR=/tmp/jrt, LD_PRELOAD=<shim>)
from cwd /sandbox with --ServerApp.root_dir=$REPO --ip 127.0.0.1 --port 8888 --no-browser --ServerApp.allow_remote_access=False, then
verifies the running server's /proc/<pid>/environ actually contains
LD_PRELOAD. It reuses the previous token when one exists so the user's
saved URL stays valid across restarts. It also set -a-sources
$REPO/variables.env + $REPO/secrets.env into the server env before
launch (AI-Workbench parity for KERNELS): kernels/voila/tiles inherit the
server env, which is how LANGSMITH_TRACING and other variables.env
settings reach kernels at all.
⚠️ Sourcing secrets.env here is a double-edged sword, and the reason
NVIDIA_API_KEY is deliberately left unset. load_dotenv() does not
override an already-set variable, so any key present at launch SHADOWS
later edits to the file — the learner fixes the key in the Secrets Manager,
the file on disk is right, and kernels keep sending the stale value until a
restart. Verified 2026-07-27: all 13 notebooks that reference
NVIDIA_API_KEY call load_dotenv() first, and none read
os.environ[...] without it — so an unset key costs nothing and keeps
load_dotenv() authoritative. (An earlier version of this note claimed
"several notebooks read os.environ directly with no load_dotenv"; that
was wrong, and it was the justification for the injection that caused the
stale-key bug.) Corollary: if a key IS pre-seeded from the host, RE-RUN
this script (token/URL survive) so kernels pick it up.
Workshop skills → agent skill library (setup.sh, final step). The
NemoClaw harness only scans its own library
(/sandbox/.hermes-data/skills/) — repo-local .agents/skills are
invisible to it, so without this step a resident agent asked about the
workshop denies knowing any workshop skills even after a successful setup.
setup.sh copies every workshop skill (modules 1–7, workshop, nvwb,
nvwb-project, and this skill itself) into the library. They appear in
hermes skills list as local/enabled immediately, and new agent
sessions pick them up automatically; a session already in flight may need
a fresh session to see them. Excluded on purpose:
setup-workshop-nemoclaw-operator (host-side) and setup-workshop
(bare-metal GPU installer).
⚠️ THIS skill itself propagates from the RUNNING copy ($SKILL_DIR), never
from the repo checkout — re-running setup.sh used to silently revert an
operator-staged skill update to the repo's older version.
The Jupyter token is masked by the gateway's secret redaction, so the URL is
saved to /sandbox/workshop-url.txt — point the user there rather than pasting
the token. Once start-jupyter.sh succeeds, send the user/operator:
JupyterLab is up (one server,
127.0.0.1:8888, kernels verified). To reach it: (1) on the sandbox host, runopenshell forward service <sandbox> --target-port 8888 --local 8888(foreground — leave it open); (2) from your laptop,ssh -N -L 8888:localhost:8888 <user>@<host>(Teleport:tsh ssh -N -L 8888:localhost:8888 <user>@<node-name>— node name fromtsh ls;-Nis SILENT when it works); (3) open the token URL from/sandbox/workshop-url.txt(readable on the host viadocker exec <container> cat /sandbox/workshop-url.txt). FYI: keep step (1)'s command handy — the forward dies silently with the shell or agent session that spawned it (openshell forward listdoes not track it). If the URL ever stops responding, re-run that same command on the host to restore access.
Agent processes live in an inner network namespace — a server bound even to 0.0.0.0 is unreachable at the container IP. The gRPC forward + SSH hop is the only inbound path. Details live in the operator skill.
$VENV/bin/jupyter lab list shows exactly one server on 127.0.0.1:8888,
and tr '\0' '\n' < /proc/<server-pid>/environ | grep LD_PRELOAD shows the shim.curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:8888/lab → 302
(auth redirect = alive); with the token appended → 200.curl -X POST http://127.0.0.1:8888/jupyterlab-app-launcher?token=… -d '{"method":"init_launcher"}'
→ 11 tiles. (GET on that route → 405; /jupyter_app_launcher/get_config → 404 — both expected.)hermes skills list shows module-1…module-7,
workshop, and setup-workshop-nemoclaw as local/enabled./dev/pts is granted): POST /api/terminals
with the token → 200 (spawns a shell; DELETE /api/terminals/<name>
to clean up)./api/terminals; log ends OSError: out of pty devices) → the real error
is a swallowed EACCES from os.openpty(): Landlock lacks rw /dev/pts.
Operator remedy: the operator skill's Phase 1b token-window-guarded
container restart (the grant is applied with Phase 1, but fs policy is
parsed at container boot — a live apply changes nothing, even for new
processes). Details in references/sandbox-internals.md.ca-certificates.crt) → uv TLS failures. Use
/etc/openshell-tls/ca-bundle.pem.Kernel died before replying to kernel_info); voila tiles hang at "Running…". Empty-list shims are NOT
enough — the interface list must contain lo./sandbox/.jupyter/jupyter_server_config.py forcing
transport = "ipc" (an abandoned experiment) — remove it; IPC alone never
fixes kernels and just adds moving parts. setup.sh cleans it up.type: url tile without args: {} → frontend crash
(Cannot read properties of undefined (reading 'createNewWindow')).kill -9; SIGTERM is trapped.curl through /proxy/absolute/<port>/ appears to hang (chunked stream)
and curl -I returns 405 — red herrings; test voila via
/voila/render/... with the token, or in the browser.code/
uses it. joblib "serial mode" warning — benign.docker exec to bypass seccomp → ALSO bypasses Landlock. FORBIDDEN.main (e.g. nvwb switch-branch) → don't.migrate.md (local NIM: Docker+GPU) is read-through-only here —
same category as module-4 02/03 (GPU), module-5 Docker sandbox/client
build, and module-6 CLI installers. sandbox_content_notes.py marks all of
them in the lesson pages.© brevdev, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 12 other files (scripts, references, assets) in .agents/skills/setup-workshop-nemoclaw of brevdev/workshop-build-an-agent.
Open the folder on GitHubat commit b5689a7
Setup Workshop Nemoclaw next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Setup Workshop Nemoclaw this skillbrevdev/workshop-build-an-agent | 143 | — | ~5.2k | Automated safety check: Pass | Apache-2.0 | |
| Vllm Deploy Dockervllm-project/vllm-skills | 103 | — | ~2.5k | Automated safety check: Notes | Apache-2.0 | |
| Safactory WorkflowsAI45Lab/SAfactory | 236 | — | ~1.8k | Automated safety check: Pass | None | |
| Init GPU Serverdrawthingsai/draw-things-community | 579 | — | ~2.2k | Automated safety check: Pass | GPL-3.0 | |
| TAO Image EmbeddingsNVIDIA/skills | 3.5k | — | ~2k | Automated safety check: Notes | Apache-2.0 | |
| Kermt SetupNVIDIA/skills | 3.5k | 1 repos | ~1.7k | Automated safety check: Pass | Apache-2.0 |
vllm-project/vllm-skills
Deploy vLLM using Docker (pre-built images or build-from-source) with NVIDIA GPU support and run the OpenAI-compatible server.
AI45Lab/SAfactory
Integrate a benchmark or custom environment into SAfactory using fixed adapter templates and local contract tests, optionally run Docker/RJob evaluation, or prepare GRPO/RL training.
drawthingsai/draw-things-community
Initialize a Draw Things GPU server with GPUScript, including script sync, Docker/CUDA/NVIDIA runtime setup, 7T data disk mounting, mergerfs, and end-to-end GPU verification.
NVIDIA/skills
Turns a parquet of image file paths into a parquet of embeddings with CLIP, SigLIP or a TAO checkpoint, using the TAO Data Services container, ahead of neighbor mining.
NVIDIA/skills
Bootstrap the KERMT agent environment — verify host docker + nvidia-container-toolkit, build the kermt:latest image from the repo's Dockerfile if it doesn't yet exist, and run a GPU smoke test…
NVIDIA/skills
Host setup for TAO GPU backends. An agent skill from NVIDIA/skills.
brevdev/workshop-build-an-agent
This skill should be used when the user wants to set up, install, deploy, bootstrap, or "spin up" the Build-an-Agent workshop (a.k.a.
brevdev/workshop-build-an-agent
Manage NVIDIA AI Workbench projects, contexts, builds, and environments via the nvwb CLI.
brevdev/workshop-build-an-agent
This skill should be used when a learner is working through Module 1 ("Build an Agent") of the Build-an-Agent workshop and wants help understanding the concepts, notebooks, or code — e.g.
brevdev/workshop-build-an-agent
This skill should be used when a learner is working through Module 1 ("Build an Agent") of the Build-an-Agent workshop and wants help understanding the concepts, notebooks, or code — e.g.
brevdev/workshop-build-an-agent
This skill should be used when a learner wants to navigate or understand the Build-an-Agent workshop as a whole — e.g.
brevdev/workshop-build-an-agent
This skill should be used when a learner wants to navigate or understand the Build-an-Agent workshop as a whole — e.g.
Works with
Categories
Set up the NVIDIA "Build an Agent" DevX workshop as a working JupyterLab environment from INSIDE a locked-down OpenShell/NemoClaw sandbox, and hand the user the token URL + access commands. Setup Workshop Nemoclaw is an agent skill from brevdev/workshop-build-an-agent. Set up the NVIDIA "Build an Agent" DevX workshop as a working JupyterLab environment from INSIDE a locked-down OpenShell/NemoClaw sandbox, and hand the user the token URL + access commands.
Setup Workshop Nemoclaw fits situations like: tasks that involve Building AI agents; tasks that involve Jupyter notebooks; tasks that involve Fine-tuning.
Run `npx skills add brevdev/workshop-build-an-agent --skill setup-workshop-nemoclaw -a claude-code`. Or copy the skill folder (.agents/skills/setup-workshop-nemoclaw in brevdev/workshop-build-an-agent) into .claude/skills/setup-workshop-nemoclaw in your project. Claude Code loads it when a task matches its description.
Run `npx skills add brevdev/workshop-build-an-agent --skill setup-workshop-nemoclaw -a codex`. Or copy the skill folder (.agents/skills/setup-workshop-nemoclaw in brevdev/workshop-build-an-agent) into .agents/skills/setup-workshop-nemoclaw in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add brevdev/workshop-build-an-agent --skill setup-workshop-nemoclaw -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/setup-workshop-nemoclaw, .gemini/skills/setup-workshop-nemoclaw, .github/skills/setup-workshop-nemoclaw and .opencode/skills/setup-workshop-nemoclaw in your project.
Going by SKILL.md and its folder, Setup Workshop Nemoclaw needs a shell, Python and JavaScript for the scripts in its folder, the command-line tools its instructions call (bash, docker, curl, npm, uv and python) and credentials named NVIDIA_API_KEY, COMPATIBLE_API_KEY and TAVILY_API_KEY. Our summary lists: Python 3; Node.js; A Bash shell; Docker; A credential in NVIDIA_API_KEY.
SKILL.md contains no URLs. Its commands use docker, curl, npm, uv and ssh, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Setup Workshop Nemoclaw is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.2k tokens (SKILL.md is roughly 21k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 6.9k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Setup Workshop Nemoclaw: Vllm Deploy Docker (vllm-project/vllm-skills, 103 stars), Safactory Workflows (AI45Lab/SAfactory, 236 stars), Init GPU Server (drawthingsai/draw-things-community, 579 stars) and TAO Image Embeddings (NVIDIA/skills, 3.5k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
brevdev (a GitHub organization) maintains it in brevdev/workshop-build-an-agent, which has 143 GitHub stars. The repository holds 11 skills in this directory. The repository was last updated on October 6, 2026.
Source: brevdev/workshop-build-an-agent on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.