Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use this skill when the user wants to deploy, run, debug, tear down, or call the REST API of the RTVI-CV 2D detection / tracking microservice. Trigger when the user says things like 'deploy rtvi-cv', 'start warehouse 2d', 'add a stream', 'check rtvi-cv health', or 'stop the perception container'. Not for VLM, embedding, or analytics — use the matching vss-* skill.
.claude/skills/nvidia-vss-deploy-detection-tracking-2d/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-13 | ✗→✓ | ▲ Improved | 338% | 0% |
| case-18 | ✗→✓ | ▲ Improved | 66% | 0% |
| case-15 | ✗→✓ | ▲ Improved | 325% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 193% | 0% |
| case-19 | ✗→✓ | ▲ Improved | 187% | 0% |
Deploy, debug, and operate the RTVI-CV detection / tracking 2D microservice and drive its REST API.
$HOST_IP (see vss-deploy-profile and references/).$NGC_CLI_API_KEY and $NVIDIA_API_KEY for any image pulls.curl, jq, and Docker available on the caller.Follow the routing tables and step-by-step workflows below. Each section that ends in workflow, quick start, or flow is intended to be executed top-to-bottom. Detailed reference material lives in references/ and helper scripts live in scripts/ — call them via run_script when the skill points to a script by name.
Worked end-to-end examples are kept under evals/ (each *.json manifest contains a runnable scenario) and inline in the per-workflow curl blocks below. Run a Tier-3 evaluation with nv-base validate <this-skill-dir> --agent-eval to replay them.
/docs or /health; redeploy via vss-deploy-profile or the matching vss-deploy-* skill.NGC_CLI_API_KEY. Solution: docker login nvcr.io and re-export the key before retrying.docker compose down.Unified skill for the Real Time Video Intelligence CV (RTVI-CV) microservice. Two action surfaces in one skill:
references/deploy-vss-detection-tracking-2d.mdreferences/usage-vss-detection-tracking-2d.md> Service: rtvi-cv (metropolis_perception_app) > Image: nvcr.io/<org>/<repo>:<tag> — user-supplied at deploy time > REST port: 9000 (/api/v1 — /live, /ready, /startup, /metrics, /stream/add, /stream/remove, embeddings) > Hardware: x86/aarch64 dGPU (T4, A100, L40, H100, B200, RTX), SBSA (Spark, Grace-Hopper), Jetson (Thor, Orin, Xavier)
| User intent (sample phrasing) | Flow | Load this reference | |-------------------------------|------|---------------------| | deploy rtvi-cv warehouse 2d, run rtvicv warehouse-3d with 4 streams, start smartcity gdino, launch perception app, bring up sparse4d | DEPLOY | references/deploy-vss-detection-tracking-2d.md | | stop rtvi-cv, tear down, kill the perception container, cleanup rtvicv-perception-docker | TEARDOWN (handled by deploy doc → "Mode Selection") | references/deploy-vss-detection-tracking-2d.md + references/teardown-flow.md | | check rtvi-cv logs, diagnose rtvi-cv crashing, troubleshoot healthcheck failing, rtvi-cv won't start | DEBUG | references/deploy-vss-detection-tracking-2d.md + references/troubleshooting.md | | add a stream, remove camera, list streams, health check, is rtvi-cv ready, get metrics, what's the FPS, check GPU usage, generate text embeddings, call rtvi-cv api | API USAGE | references/usage-vss-detection-tracking-2d.md + references/api-reference.md |
Selection rule: match the user's phrasing against the table above and immediately load the corresponding reference file. Do not mix the flows — DEPLOY assumes no running container yet; API USAGE assumes the container is already running on http://<host>:9000.
If intent is genuinely ambiguous (e.g., the user says just "I want to use rtvi-cv"), ask one AskQuestion: deploy a new instance, or call an already-running one?
vss-deploy-detection-tracking-2d/
├── SKILL.md # this file (routing + contracts)
├── assets/ # data files (deploy-defaults.yml — single source of truth for tags / refs / paths / GPU)
├── evals/ # Tier-3 eval manifests (deploy-evals.json, usage-evals.json)
├── scripts/ # 23 bash + python helpers (see `scripts/` for the full inventory)
└── references/ # workflow runbooks (deploy / api-usage / teardown / troubleshooting / …)For the full per-file inventory and what each reference covers, see references/workflow-reference.md.
All scripts are invoked from the skill root via $SKILL_DIR/scripts/<name> — paths inside the deploy reference doc are preserved verbatim and resolve correctly when the agent runs from skill root.
Helpers live in scripts/ and are invoked from the skill root by name — call each via run_script("scripts/<name>") so the agent records a proper tool invocation.
| Script | Purpose | Arguments | | --- | --- | --- | | load_defaults.sh | Detect platform (x86 dGPU / SBSA / Jetson) and resolve YAML defaults from assets/deploy-defaults.yml. | --usecase <name> | | fetch_resources.sh | Download + extract NGC resources, scan for layout. | --ngc-ref <ref> (optional) | | apply_in_container.sh | Host-side wrapper for Step 4 (apply_config.sh inside the running container). | <container_name> | | apply_config.sh | In-container path-substitution, batch, sink, sources, engine cache. | <usecase> <stream_count> <sink_type> | | start_app_in_container.sh | Host-side wrapper for Step 5 (run_app_and_wait.sh). | <container_name> | | run_app_and_wait.sh | In-container app launch + readiness + metrics + log. | <config_path> | | add_streams.sh / update_stream_sources.sh | REST stream lifecycle for Step 6. | <rtsp_or_file_uri>... | | collect_metrics.sh | Pull /api/v1/metrics snapshot. | none | | discover_streams.sh | Enumerate active streams via /stream/get-stream-info. | none | | synthesize_docker_run.sh | Print the platform-correct docker run line for the resolved env. | none | | render_box.sh | Render the fixed-width step receipt. | <step_label> | | calibration_manager.py | Manage calibration artefacts + per-use-case engine cache invalidation. | --usecase <name> --reset |
For the full inventory of helpers (cache, GPU checks, setup) browse scripts/; each script's --help describes its arguments.
vss-deploy-detection-tracking-2d (deploy/teardown/debug) and rtvicv-api (REST API) — every step ordering invariant, bash-batching rule, box-rendering rule, and AskQuestion contract is retained.TodoWrite array of 5 todos, OR 5 successive TaskCreate calls on newer Claude Code) → Step 1 question. Do not narrate, do not pre-flight, and never print "loading TodoWrite/TaskCreate" or any deferred-tool resolution prose — the planning tool is loaded silently.When running the DEPLOY / TEARDOWN / DEBUG flow, the agent MUST honour all four items below on every successful deploy. These are the user's only feedback channel between steps; skipping any of them is a behaviour regression.
targets, Step 2 Pipeline configuration, Step 3 Container, Step 4 Apply configuration, Step 5 Plan + Results. Not just the final summary. The box is the user's step receipt. Geometry is fixed (see § "Universal box format" below). Per-step content rules (what rows go inside each box) live in references/deploy-vss-detection-tracking-2d.md under "Step N box content rule".
AskUserQuestionfrom references/next-steps.md § "11.c" — never replace it with a free-form Next steps bullet list. The menu is the deploy's exit handle: it lets the user run metrics, manage streams, tail logs, or tear down with one click instead of having to remember curl URLs.
AskUserQuestion from references/next-steps.md § "11.d" — never substitute prose + ready-to-copy curl examples + a free-text "want me to run X?" question. Each bucket has its own menu of concrete actions; the user picks the action, then the skill emits the API box and runs the curl. Per-bucket follow-ups:
options dynamically from /stream/get-stream-info — one option per active stream labelled <camera_id> · <camera_url> plus "Remove ALL" when ACTIVE > 1 (full spec: § "remove_streams sub-flow").
collect_metrics.shdirectly after printing the /api/v1/metrics API box.
health endpoints after printing their API boxes.
rendering the box is necessary but not sufficient. Each step has a row composition spec in references/deploy-vss-detection-tracking-2d.md under "Step N box content rule". Step 4 (Apply configuration) is where the agent collapses most often — its canonical per-use-case key list lives in references/apply-config.md § "Per-use-case complete edit list", and the agent MUST emit one ✔ [section] key=value — annotation row per key in that table for the active use case + settings. A section with 5 keys → 5 rows; a section with 6 keys → 6 rows. Never one overview row per section.
Forbidden (these are the shortcuts the agent falls back to under pressure, and they break the user's UX):
TodoWrite (a deferred tool the skill calls for the task widget)", "Loading TaskCreate…", "Calling ToolSearch for the planning tool…", or any other text about resolving / loading / fetching deferred tools. The agent loads tools silently. The user only ever sees the ✔ <pinned-values> summary line followed by the widget — never any scaffolding around tool resolution.
TaskCreate'sdescription field. When TaskCreate is the available planning tool, issue 5 separate TaskCreate calls back-to-back (one per step). See references/task-list.md § "Initial TaskCreate calls" for the verbatim template. Same rule for TodoWrite — one call with all 5 todos in the todos:[…] array; never one todo whose content is a multi-line list.
dynamic stream-mode. The skill default isstream_mode=static — the agent bakes auto-discovered file:// URLs into the DS main config's [source-list] block before app start. Switch to dynamic only when the user explicitly asks ("add streams later via REST", "use dynamic stream mode") OR when they pick dynamic in the Step 2 AskQuestion. Picking dynamic for a generic "deploy rtvi-cv with N streams" query breaks the deploy rubric and the user's /metrics expectations. See references/pipeline-config.md § "Defaults — the skill is static-mode by default" for the full rationale.
✔ App ready in Ns, N streams, fps total Y in place ofthe Step 5 Results box.
+, -, =, *) instead of lightbox-drawing chars (┌ ─ ┐ │ └ ┘).
blocks + a closing "want me to run any of these?" — that's the shape the agent falls back to and it bypasses both the 11.d menu and the per-API-call box. The user picks from a menu; the skill shows the resolved API box; the skill runs it. No free-text Q.
deploy doc's Step 4 content rule:
✔ Batch size 3 (tile grid: 1×3) → required: 5 separate rows([streammux] batch-size=3, [primary-gie] batch-size=3, [source-list] max-batch-size=3, [tiled-display] rows=1, [tiled-display] columns=3).
✔ Output sink eglsink → required: one row per sink key(4 keys for eglsink, e.g. [sink0] enable=1, type=2, sync=0, qos=0 — read apply-config.md for the exact list).
✔ Sources static (3 streams, http-port=9000) → required: sixannotated [source-list] rows.
✔ Tile grid 1 row × 3 cols (single row) → required: tworows, [tiled-display] rows=1 and [tiled-display] columns=3.
The geometry contract for every step-exit box (Step 1 through Step 5 Results). The same shape across every box; only the title and the body rows change per step.
┌ at column 1, ┐ atcolumn 128. Wider terminals leave the box flush-left; do not stretch it. Inner content area is 124 chars (with one space margin on each side inside the │ borders).
┌ ─ ┐ │ └ ┘. No +, -, =,* ASCII fallbacks.
┌ + N₁ dashes + ␣ + title + ␣+ N₂ dashes + ┐, where N₁ + N₂ + len(title) + 2 = 126. Distribute the pad: N₁ = floor((126 − len(title) − 2) / 2), N₂ = 126 − len(title) − 2 − N₁. N₁ and N₂ differ by at most 1.
│ <content padded to inner-content 124> │ per fact.Each fact line uses the ✔ <key-padded-to-13> <value> form (two spaces in, glyph, key right-padded to 13, two spaces, value).
│ <124 spaces> │ betweenlogical groups (e.g. Identity / Model / Videos in Step 1) so the user can scan the box at a glance.
└ + 126 dashes + ┘ — solid border, no title.Standard step titles (used at the top of each step's box):
┌─────────────────────────────────────────────────────── Deploy targets ───────────────────────────────────────────────────────┐
┌─────────────────────────────────────────────────── Pipeline configuration ───────────────────────────────────────────────────┐
┌───────────────────────────────────────────────────────── Container ──────────────────────────────────────────────────────────┐
┌──────────────────────────────────────────────────── Apply configuration ─────────────────────────────────────────────────────┐
┌──────────────────────────────────────────────── Perception Application — Plan ───────────────────────────────────────────────┐
┌────────────────────────────────────────────── Perception Application — Results ──────────────────────────────────────────────┐Per-step content rules (which rows go in which box, mode-aware row hiding, the apply-config sectioned layout, the Step 5 PLAN-then-RESULT pattern, the Step 3 docker run synthesis requirement) live in references/deploy-vss-detection-tracking-2d.md under "Step N box content rule" — read those when rendering the corresponding step.
| Phrase | Flow | |--------|------| | deploy rtvicv warehouse 2d with 4 streams and display | DEPLOY | | run smartcity gdino on gpu 1 | DEPLOY | | stop the perception container | TEARDOWN (deploy doc) | | rtvi-cv healthcheck failing | DEBUG (deploy doc + troubleshooting) | | add a stream to rtvi-cv | API USAGE | | is rtvi-cv ready on localhost:9000 | API USAGE | | get rtvi-cv metrics | API USAGE | | generate text embeddings via rtvi-cv | API USAGE |
bump:1
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 29,546 | 10,067 | -66% | 1 | 1 | 0% | 5,460 | 5,813 | +6% | 0 | 0 | — |
case-20 | pass→pass | 9,929 | 3,906 | -61% | 1 | 1 | 0% | 1,498 | 5,537 | +270% | 0 | 0 | — |
case-07 | pass→pass | 7,734 | 3,726 | -52% | 1 | 1 | 0% | 1,423 | 5,633 | +296% | 0 | 0 | — |
case-08 | pass→pass | 13,191 | 5,955 | -55% | 1 | 1 | 0% | 1,935 | 5,853 | +202% | 0 | 0 | — |
case-09 | pass→pass | 10,204 | 7,241 | -29% | 1 | 1 | 0% | 1,818 | 6,094 | +235% | 0 | 0 | — |
case-02 | fail→fail | 7,932 | 9,606 | +21% | 1 | 1 | 0% | 1,669 | 5,564 | +233% | 0 | 0 | — |
case-03 | pass→fail | 10,406 | 7,830 | -25% | 1 | 1 | 0% | 1,947 | 5,417 | +178% | 0 | 0 | — |
case-04 | fail→fail | 27,928 | 45,964 | +65% | 1 | 1 | 0% | 4,680 | 6,868 | +47% | 0 | 0 | — |
case-05 | fail→fail | 17,463 | 21,496 | +23% | 1 | 1 | 0% | 3,445 | 8,668 | +152% | 0 | 0 | — |
case-06 | fail→fail | 24,260 | 13,378 | -45% | 1 | 1 | 0% | 4,396 | 7,559 | +72% | 0 | 0 | — |
case-10 | pass→pass | 12,519 | 5,163 | -59% | 1 | 1 | 0% | 2,174 | 5,714 | +163% | 0 | 0 | — |
case-11 | fail→fail | 10,514 | 4,214 | -60% | 1 | 1 | 0% | 1,855 | 5,618 | +203% | 0 | 0 | — |
case-12 | fail→fail | 7,697 | 5,912 | -23% | 1 | 1 | 0% | 1,021 | 5,154 | +405% | 0 | 0 | — |
case-13 | fail→pass | 7,987 | 5,826 | -27% | 1 | 1 | 0% | 1,325 | 5,806 | +338% | 0 | 0 | — |
case-18 | fail→pass | 36,984 | 2,973 | -92% | 1 | 1 | 0% | 3,207 | 5,320 | +66% | 0 | 0 | — |
case-14 | pass→pass | 6,791 | 2,006 | -70% | 1 | 1 | 0% | 1,032 | 5,215 | +405% | 0 | 0 | — |
case-15 | fail→pass | 13,340 | 3,293 | -75% | 1 | 1 | 0% | 1,274 | 5,412 | +325% | 0 | 0 | — |
case-16 | fail→pass | 9,377 | 2,544 | -73% | 1 | 1 | 0% | 1,762 | 5,168 | +193% | 0 | 0 | — |
case-17 | fail→fail | 7,883 | 6,448 | -18% | 1 | 1 | 0% | 1,473 | 5,126 | +248% | 0 | 0 | — |
case-19 | fail→pass | 11,457 | 2,381 | -79% | 1 | 1 | 0% | 1,842 | 5,286 | +187% | 0 | 0 | — |
case-21 | fail→pass | 4,459 | 3,127 | -30% | 1 | 1 | 0% | 676 | 5,375 | +695% | 0 | 0 | — |
case-22 | fail→fail | 12,062 | 8,870 | -26% | 1 | 1 | 0% | 1,873 | 5,657 | +202% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 17 counted toward the lift figure. The other 5 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +23 percentage points is the difference between those two pass rates over the 17 comparable cases. 4 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.