vss-deploy-dense-captioning
NVIDIA/skills
Déployez un microservice RT-VLM autonome dédié au sous-titrage dense et testez ses points de terminaison API REST pour le téléchargement de fichiers, la génération de sous-titres, la diffusion en continu, la complétion de messages de chat et l'intégration à Kafka.
...Développer toutObjectif
Déployer le microservice RT-VLM de sous-titrage dense de manière autonome et tester chaque point de terminaison qu’il expose (téléchargement de fichiers, génération de sous-titres, ajout/suppression de flux, complétions de chat, sujets Kafka).
Prérequis
Pour un déploiement autonome de RT-VLM :
- Docker, Docker Compose, NVIDIA Container Toolkit et un GPU accessible.
- Identifiants du registre NGC dans
$NGC_CLI_API_KEYpourla connexion Docker à nvcr.io, le téléchargement d’images et le téléchargement local de modèles/artefacts NGC. curl,jqet tout répertoire de travail accessible en écriture pour la copie autonome de Compose.
Pour les appels API vers un service existant :
- Service RT-VLM en cours d’exécution accessible à l’adresse
$BASE_URL. - Un jeton Bearer dans
$RTVI_VLM_API_KEYou$NGC_CLI_API_KEY, selon la manière dont le service a été configuré.
Pour le déploiement complet d’un profil VSS :
- Utilisez
../vss-deploy-profile/SKILL.md; cette compétence ne déploie pas les profils VSS complets.
Instructions
Suivez les tables de routage et les workflows étape par étape ci-dessous. Chaque section se terminant par « workflow », « quick start » ou « flow » est destinée à être exécutée de haut en bas. La documentation détaillée se trouve dans le répertoire references/; exécutez directement les workflows documentés, sauf si une future révision désigne un assistant spécifique.
Exemples
Des exemples complets et fonctionnels sont conservés dans le répertoire evals/ (chaque manifeste *.json contient un scénario exécutable) et intégrés dans les blocs curl spécifiques à chaque workflow ci-dessous. Exécutez une évaluation de niveau 3 avec nv-base validate pour les reproduire.
Limitations
- Nécessite soit un service RT-VLM autonome déployé via cette compétence, soit un service RT-VLM existant accessible depuis l’appelant.
- Les modèles hébergés sur NGC et les NIM peuvent être soumis à des limites de débit, à des exigences en matière de mémoire GPU et à des restrictions de licence.
- Les limites de concurrence, de mémoire GPU et de stockage dépendent du matériel hôte et du fichier de composition du profil.
- Ne placez pas les fichiers
NGC_CLI_API_KEY,RTVI_VLM_API_KEYet.envdans git ni dans les journaux ; n’affichez pas les valeurs des identifiants et ne les incluez pas dans les réponses finales. - L’accès au groupe Docker et
la commande sudoconfèrent de facto des privilèges de niveau root. Utilisez la commandesudo -n(mode non interactif) dans la référence de déploiement et attendez l’intervention du propriétaire de l’hôte lorsque le sudo sans mot de passe n’est pas disponible.
Dépannage
- Erreur: l’appel REST renvoie une connexion refusée. Cause: le microservice cible ne s’exécute pas. Solution: effectuez une vérification sur
/docsou/health; redéployez viavss-deploy-profileou la compétencevss-deploy-*correspondante. - Erreur: code HTTP 401/403 lors des requêtes NGC. Cause:
clé NGC_CLI_API_KEYmanquante ou périmée. Solution:effectuez une connexion Docker sur nvcr.ioet réexportez la clé avant de réessayer. - Erreur: le conteneur est en OOM ou le modèle ne parvient pas à se charger. Cause: mémoire GPU insuffisante pour le profil sélectionné. Solution: optez pour une variante plus légère ou libérez des GPU via `
docker compose down`.
Déploiement et utilisation de RT-VLM Dense Captioning (VSS 3.2)
RT-VLM est le microservice de vision-langage en temps réel de NVIDIA : décodez une vidéo (fichier ou
RTSP), segmentez-la en morceaux, exécutez un modèle VLM (cosmos-reason1, cosmos-reason2 ou tout autre
modèle compatible avec OpenAI), renvoie les sous-titres denses via SSE/HTTP et publie
les sous-titres, les alertes d’incident et les erreurs vers Kafka. Utilisez cette compétence pour déployer le
service RT-VLM autonome lorsqu’aucun profil VSS complet n’est déjà en cours d’exécution, puis appelez
son API /v1/... pour la génération de légendes, le téléchargement de fichiers, la gestion du flux en direct, les
vérifications d’intégrité, les complétions de chat compatibles NIM ou les métriques Prometheus. Référence de l’API :
https://docs.nvidia.com/vss/latest/real-time-vlm-api.html.
Routage du déploiement
Si l’utilisateur demande le déploiement d’un profil VSS complet, utilisez
../vss-deploy-profile/SKILL.md. Cette compétence
gère le routage des profils, le fichier generated.env, le fichier resolved.yml, le dimensionnement multi-services et le
déploiement/démantèlement de la pile complète.
Si l’utilisateur demande un sous-titrage dense RT-VLM autonome, ou si aucun profil VSS n’est
déjà en cours d’exécution, utilisez le flux RT-VLM autonome dans
references/deploy-rt-vlm-service.md
avant d’appeler l’API. Ce processus suit le même modèle centré sur Docker Compose que
vss-deploy-profile: collecte du contexte, exécution des pré-vérifications, travail à partir d’une copie locale,
simulation avec la configuration Docker Compose, vérification, déploiement, puis attente de la validation de l’état de santé.
Flux de déploiement autonome
Suivez toujours cette séquence. Ne sautez jamais la simulation.
# 1. Copiez le fichier deploy/docker/services/rtvi/rtvi-vlm/rtvi-vlm-docker-compose.yml
# dans n’importe quel répertoire de travail autonome accessible en écriture.
# 2. Déterminez la valeur de RTVI_VLM_IMAGE_TAG à partir de cette copie de Compose.
# 3. Supprimez de la copie le bloc `depends_on` superflu, réservé à l’installation autonome.
# 4. Créez un fichier .env ignoré par Git contenant les valeurs RT-VLM requises.
# 5. Préparez les chemins de montage de l’hôte, tels que $VSS_DATA_DIR/data_log/vst/clip_storage.
# Utilisez `sudo -n` pour corriger les droits de propriété ; si le sudo sans mot de passe n’est pas disponible,
# arrêtez-vous et demandez au propriétaire de l’hôte d’exécuter manuellement la commande affichée.
# 6. docker compose --env-file .env -f rtvi-vlm-docker-compose.yml config --quiet
# 7. Récupérez l’image RT-VLM avec la balise exacte à l’aide de `docker pull`.
# 8. Exécutez `docker compose ... up -d rtvi-vlm`, attendez que le système soit prêt, puis effectuez un test de fonctionnement.
Exécutez les pré-vérifications avant toute commande `pull` ou ` up`; arrêtez-vous et corrigez les échecs à ce stade avant
de déboguer RT-VLM lui-même :
nvidia-smi --query-gpu=index,name --format=csv,noheader
nvidia-container-cli info
docker compose version
docker run --rm --gpus all nvidia/cuda:12.4.0-base-ubuntu22.04 nvidia-smi
Pour les déploiements autonomes à fichier unique, n’exécutez pas directement le fichier brut
deploy/docker/services/rtvi/rtvi-vlm/rtvi-vlm-docker-compose.yml: il
contient des références depends_on à des services VLM/NIM frères qui ne sont
définis dans le projet Compose complet VSS/met-blueprints. La référence « standalone »
indique comment copier le fichier Compose, en dériver la balise d’image actuelle, supprimer
le bloc `depends_on ` et valider le résultat avant l’exécution de la commande `up`.
Pour une validation pilotée par l’agent, ne laissez jamais l’invite sudo s’afficher de manière interactive. Avant toute
opération privilégiée ou opération Docker, utilisez la protection non interactive décrite dans
references/deploy-rt-vlm-service.md:
privilégiez docker en mode simple ; sinon, utilisez sudo -n docker; si sudo -n échoue, arrêtez-vous
en utilisant la commande manuelle exacte pour le propriétaire de l’hôte au lieu de réessayer avec
sudo en mode interactif ou d’affaiblir les permissions.
Si la commande `docker pull` échoue avec une erreur « containerd snapshotter/unpack » sous Docker 28 ou version supérieure,
appliquez la correction ` /etc/docker/daemon.json containerd-snapshotter=false ` dans la
référence « standalone » avant de réessayer.
Valeurs minimales du fichier .env pour le mode autonome :
| Variable d’environnement de l’hôte | Requis lorsque | Objectif |
|---|---|---|
NGC_CLI_API_KEY |
Chemin de déploiement autonome | Extraction d’images du registre NGC et téléchargement de modèles/artefacts NGC |
RTVI_VLM_API_KEY ou NGC_CLI_API_KEY |
Appels API authentifiés | Authentification par support RT-VLM une fois le service en cours d’exécution |
RTVI_VLM_PORT |
Toujours | Port API de l'hôte mappé au conteneur 8000 |
HOST_IP |
Toujours | Hôte de démarrage Kafka (${HOST_IP}:9092) |
VSS_DATA_DIR |
Toujours | Montage lié obligatoire du répertoire de stockage des clips |
RTVI_VLM_MODEL_TO_USE |
Toujours pour le mode autonome | Sélecteur de backend ; utilisez « cosmos-reason2 » pour le modèle local par défaut ou « openai-compat » pour un point de terminaison distant ou frère |
RTVI_VLM_MODEL_PATH |
Modèle local auto-hébergé | Chemin d’accès à Cosmos Reason 2 issu de la source : ngc:nim/nvidia/cosmos-reason2-8b:hf-1208 |
RTVI_VLM_ENDPOINT |
RTVI_VLM_MODEL_TO_USE=openai-compat |
Point de terminaison VLM distant/fratéral compatible OpenAI |
VLM_NAME |
RTVI_VLM_MODEL_TO_USE=openai-compat |
Nom du modèle/déploiement exposé par ce point de terminaison |
Configuration
export BASE_URL="http://localhost:${RTVI_VLM_PORT:-8018}" # port RT-VLM côté hôte
export API_KEY="${NGC_CLI_API_KEY:-${RTVI_VLM_API_KEY:-}}" # jeton « bearer » utilisé par les commandes curl côté hôte
: "${API_KEY:?Définissez NGC_CLI_API_KEY ou RTVI_VLM_API_KEY avant d’appeler les points de terminaison authentifiés}"
Chaque requête ci-dessous utilise Authorization: Bearer $API_KEY. Les points de terminaison de santé
(/v1/health/*, /v1/ready, /v1/live, /v1/startup) fonctionnent généralement sans authentification.
Test de fonctionnement avant utilisation :
curl -fsS "$BASE_URL/v1/health/ready"
MODEL_ID="$(curl -fsS "$BASE_URL/v1/models" -H "Authorization: Bearer $API_KEY" | jq -r '.data[0].id // .id')"
curl -fsS "$BASE_URL/openapi.json" | jq -r '.paths | keys[]' | sort
Exemple de Stream Guard RTSP
Lorsqu’une tâche ou une évaluation mentionne RTSP_SAMPLE_URL, considérez cette variable d’environnement
exacte comme une entrée obligatoire. Vérifiez qu’elle est définie et non vide avant d’interroger ou d’
enregistrer un flux ; si elle est manquante, arrêtez-vous en affichant un message d’échec clair. Ne
dérivez pas de valeur de remplacement à partir de NvStreamer, VIOS, des paquets de données d’échantillon ou de toute autre
solution de secours, car cela validerait un flux différent de celui demandé par l’appelant.
: "${RTSP_SAMPLE_URL:?Définissez RTSP_SAMPLE_URL sur un flux d'échantillon RTSP accessible avant la validation RTSP}"
case "$RTSP_SAMPLE_URL" in
rtsp://*) ;;
*) echo "RTSP_SAMPLE_URL doit être une URL de type rtsp://, valeur reçue : $RTSP_SAMPLE_URL" >&2; exit 1 ;;
esac
if command -v ffprobe >/dev/null 2>&1; then
ffprobe -v error -rtsp_transport tcp \
-select_streams v:0 -show_entries stream=codec_type \
-of csv=p=0 "$RTSP_SAMPLE_URL" | grep -qx video
elif command -v gst-discoverer-1.0 >/dev/null 2>&1; then
gst-discoverer-1.0 "$RTSP_SAMPLE_URL" | grep -qi 'video'
else
echo "Installez ffprobe ou gst-discoverer-1.0 avant la validation RTSP." >&2
exit 1
fi
Démarrage rapide — sous-titres denses à partir d’une vidéo locale
# 1. Téléchargez la vidéo, récupérez son identifiant de fichier
FILE_ID=$(curl -fsS -X POST "$BASE_URL/v1/files" \
-H "Authorization: Bearer $API_KEY" \
-F "file=@/path/to/warehouse.mp4" \
-F "purpose=vision" \
-F "media_type=video" | jq -r '.id')
# 2. Générer des sous-titres et des alertes (flux SSE de réponses par morceaux)
curl -N -X POST "$BASE_URL/v1/generate_captions" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d "{
\"id\": \"$FILE_ID\",
\"prompt\": \"Rédigez une légende concise et percutante pour chaque segment de 10 secondes de cette vidéo d’entrepôt.\",
\"model\": \"$MODEL_ID\",
\"chunk_duration\": 10,
\"stream\": true
}"
Interface API
Utilisez l’OpenAPI en direct comme source de référence avant d’appeler les points de terminaison facultatifs :
curl -fsS "$BASE_URL/openapi.json" | jq -r '.paths | keys[]' | sort
Les chemins d’accès principaux pour VSS 3.2 sont les suivants :
POST /v1/filespour le téléchargement de fichiers multimédias en plusieurs parties ; transmettezl’identifiantdu fichier renvoyé à la génération de sous-titres et supprimez le fichier une fois l’opération terminée.POST /v1/generate_captionspour le sous-titrage de fichiers ou de flux. Utilisez l’ identifiant de modèle exact renvoyé parGET /v1/models; les alias tels quecosmos-reason2sont des sélecteurs de backend, et non des identifiants de modèle de requête.POST /v1/streams/add,GET /v1/streams/get-stream-infoetDELETE /v1/streams/delete/{stream_id}pour le cycle de vie RTSP. Analysez les identifiants de flux à partir deresults[0].id.POST /v1/chat/completionspour les appels textuels et multimodaux compatibles OpenAI. Les versions actuelles 26.05 renvoient un code HTTP 400 pourles appels /v1/completionsen texte seul ; considérez cela comme normal lors de la validation du comportement hérité.GET /v1/health/ready,/v1/models,/v1/assets/statset/v1/metricspour les tests de disponibilité du service. Ne présumez pas que/v1/licenseexiste, sauf si OpenAPI le mentionne.
Les schémas détaillés des points de terminaison, les formats de réponse, les points de terminaison de flux singuliers de type CV,
ainsi que les notes de compatibilité avec la version 26.05 se trouvent dans
references/api-surface-26.05.md.
Workflows courants
- Sous-titrage de fichiers stockés : effectuez un envoi avec
POST /v1/files, appelez/v1/generate_captionsavec l’identifiant du fichier renvoyé, utilisezstream=truepour SSE, puis supprimez le fichier pour libérer de l’espace de stockage. - Sous-titrage en direct RTSP : lorsque l’appelant fournit
RTSP_SAMPLE_URL, utilisez cette URL exacte et exécutez le RTSP Sample Stream Guard avant l’enregistrement. Ne dérivez pas de flux de remplacement à partir de NvStreamer ou VIOS lorsqueRTSP_SAMPLE_URLest vide ; optez plutôt pour un échec rapide. Exigez une entrée « stream/caps » de vidéo réelle avant l’enregistrement ; ajoutez le flux, sous-titrez-le, puis désenregistrez-le. - Messages d’alerte : incluez une ligne déterministe «
Anomalie détectée : Oui/Non». La publication sur Kafka est une configuration côté serveur, s’ajoutant aux réponses HTTP, et documentée dansreferences/kafka-workflows.md. - Validation Kafka : se fier à l’environnement
vss-rtvi-vlmen production pour les noms de sujets. Dans un profil d’alertes VSS en temps réel complet, utiliser le conteneur Kafka VSS existantmdx-kafkapour les vérifications via l’interface en ligne de commande et les commandes finales de traitement des incidents. Pour une validation autonome, utilisez un broker qui publie${HOST_IP}:9092; n’arrêtez et ne remplacez jamais un broker préexistant sans confirmation de l’utilisateur.
Référence des erreurs
Causes courantes : 400 pour une structure de requête ou un identifiant de modèle non valide, 401/403 pour un
jeton « bearer » manquant ou incorrect, 404 pour des fichiers/flux supprimés ou des points de terminaison non pris en charge,
413 pour des téléchargements trop volumineux, 422 pour la validation du schéma, 429 pour un nombre trop élevé de
connexions simultanées, 500 pour des échecs d’inférence ou d’exécution, et 503 lorsque le démarrage est encore
en cours. Consultez les journaux Docker « vss-rtvi-vlm » pour les défaillances côté service.
---
name: vss-deploy-dense-captioning
description: Deploy a standalone RT-VLM dense-captioning microservice and exercise its REST API endpoints for file upload, caption generation, streaming, chat completions, and Kafka integration.
license: Apache-2.0
---
## Purpose
Stand up the RT-VLM dense-captioning microservice on its own and exercise every endpoint it exposes (file upload, generate_captions, stream add/delete, chat-completions, Kafka topics).
## Prerequisites
For standalone RT-VLM deployment:
- Docker, Docker Compose, NVIDIA Container Toolkit, and a visible GPU.
- NGC registry credentials in `$NGC_CLI_API_KEY` for `docker login nvcr.io`,
image pulls, and local NGC model/artifact downloads.
- `curl`, `jq`, and any writable working directory for the standalone compose copy.
For API calls against an existing service:
- Running RT-VLM service reachable at `$BASE_URL`.
- Bearer token in `$RTVI_VLM_API_KEY` or `$NGC_CLI_API_KEY`, depending on how the
service was configured.
For full VSS profile deployment:
- Use `../vss-deploy-profile/SKILL.md`; this skill does not deploy full VSS profiles.
## Instructions
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/`; execute the documented workflows directly unless a future revision names a concrete helper.
## Examples
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.
## Limitations
- Requires either a standalone RT-VLM service deployed via this skill or an
existing RT-VLM service reachable from the caller.
- NGC-hosted models and NIMs may be subject to rate-limits, GPU memory requirements, and license restrictions.
- Concurrency, GPU memory, and storage limits depend on the host hardware and the profile's compose file.
- Keep `NGC_CLI_API_KEY`, `RTVI_VLM_API_KEY`, and `.env` files out of git and out of logs; do not echo credential values or include them in final responses.
- Docker group access and `sudo` are effectively root-level privileges. Use the non-interactive `sudo -n` guard in the deploy reference and stop for host-owner action when passwordless sudo is unavailable.
## Troubleshooting
- **Error**: REST call returns connection refused. **Cause**: target microservice not running. **Solution**: probe `/docs` or `/health`; redeploy via `vss-deploy-profile` or the matching `vss-deploy-*` skill.
- **Error**: HTTP 401/403 from NGC pulls. **Cause**: missing/expired `NGC_CLI_API_KEY`. **Solution**: `docker login nvcr.io` and re-export the key before retrying.
- **Error**: container OOM or model fails to load. **Cause**: insufficient GPU memory for the selected profile. **Solution**: switch to a smaller variant or free GPUs via `docker compose down`.
# Deploy and Use RT-VLM Dense Captioning (VSS 3.2)
RT-VLM is NVIDIA's real-time vision-language microservice: decode video (file or
RTSP), segment it into chunks, run a VLM (`cosmos-reason1`, `cosmos-reason2`, or any
OpenAI-compatible model), stream dense captions back over SSE/HTTP, and publish
captions, incident alerts, and errors to Kafka. Use this skill to deploy the
standalone RT-VLM service when a full VSS profile is not already running, then call
its `/v1/...` API for caption generation, file upload, live-stream management, health
checks, NIM-compatible chat completions, or Prometheus metrics. API reference:
<https://docs.nvidia.com/vss/latest/real-time-vlm-api.html>.
## Deployment Routing
If the user asks to deploy a full VSS profile, use
[`../vss-deploy-profile/SKILL.md`](../vss-deploy-profile/SKILL.md). That skill
owns profile routing, `generated.env`, `resolved.yml`, multi-service sizing, and
full-stack deploy/teardown.
If the user asks for standalone RT-VLM dense captioning, or no VSS profile is
already running, use the standalone RT-VLM flow in
[`references/deploy-rt-vlm-service.md`](references/deploy-rt-vlm-service.md)
before calling the API. This follows the same compose-centric pattern as
`vss-deploy-profile`: gather context, run preflights, work from a local copy,
dry-run with `docker compose config`, review, deploy, then wait for health.
## Standalone Deployment Flow
Always follow this sequence. Never skip the dry-run.
```bash
# 1. Copy deploy/docker/services/rtvi/rtvi-vlm/rtvi-vlm-docker-compose.yml
# into any writable standalone working directory.
# 2. Derive RTVI_VLM_IMAGE_TAG from that compose copy.
# 3. Strip the standalone-only dangling depends_on block from the copy.
# 4. Create a gitignored .env with the required RT-VLM values.
# 5. Prepare host bind paths such as $VSS_DATA_DIR/data_log/vst/clip_storage.
# Use `sudo -n` for ownership fixes; if passwordless sudo is unavailable,
# stop and ask the host owner to run the printed command manually.
# 6. docker compose --env-file .env -f rtvi-vlm-docker-compose.yml config --quiet
# 7. docker pull the exact RT-VLM image tag.
# 8. docker compose ... up -d rtvi-vlm, wait for ready, then smoke test.
```
Run preflights before any pull or `up`; stop and fix failures here before
debugging RT-VLM itself:
```bash
nvidia-smi --query-gpu=index,name --format=csv,noheader
nvidia-container-cli info
docker compose version
docker run --rm --gpus all nvidia/cuda:12.4.0-base-ubuntu22.04 nvidia-smi
```
For standalone single-file deployments, do not run the raw
`deploy/docker/services/rtvi/rtvi-vlm/rtvi-vlm-docker-compose.yml` directly: it
contains `depends_on` references to sibling VLM/NIM services that are only
defined in the full VSS/met-blueprints compose project. The standalone reference
shows how to copy the compose file, derive the current image tag from it, strip
the `depends_on` block, and validate the result before `up`.
For agent-driven validation, never let `sudo` prompt interactively. Before any
privileged ownership or Docker operation, use the non-interactive guard in
[`references/deploy-rt-vlm-service.md`](references/deploy-rt-vlm-service.md):
prefer plain `docker`; otherwise use `sudo -n docker`; if `sudo -n` fails, stop
with the exact manual command for the host owner instead of retrying with
interactive sudo or weakening permissions.
If `docker pull` fails with a containerd snapshotter/unpack error on Docker 28+,
apply the `/etc/docker/daemon.json` `containerd-snapshotter=false` fix in the
standalone reference before retrying.
Minimum standalone `.env` values:
| Host env var | Required when | Purpose |
|---|---|---|
| `NGC_CLI_API_KEY` | Standalone deploy path | NGC registry image pull and NGC model/artifact download |
| `RTVI_VLM_API_KEY` or `NGC_CLI_API_KEY` | Authenticated API calls | RT-VLM bearer auth after the service is running |
| `RTVI_VLM_PORT` | Always | Host API port mapped to container `8000` |
| `HOST_IP` | Always | Kafka bootstrap host (`${HOST_IP}:9092`) |
| `VSS_DATA_DIR` | Always | Required clip-storage bind mount |
| `RTVI_VLM_MODEL_TO_USE` | Always for standalone | Backend selector; use `cosmos-reason2` for the default local model or `openai-compat` for a remote/sibling endpoint |
| `RTVI_VLM_MODEL_PATH` | Local self-hosted model | Source-backed Cosmos Reason 2 path: `ngc:nim/nvidia/cosmos-reason2-8b:hf-1208` |
| `RTVI_VLM_ENDPOINT` | `RTVI_VLM_MODEL_TO_USE=openai-compat` | Remote/sibling OpenAI-compatible VLM endpoint |
| `VLM_NAME` | `RTVI_VLM_MODEL_TO_USE=openai-compat` | Model/deployment name exposed by that endpoint |
## Setup
```bash
export BASE_URL="http://localhost:${RTVI_VLM_PORT:-8018}" # host-side RT-VLM port
export API_KEY="${NGC_CLI_API_KEY:-${RTVI_VLM_API_KEY:-}}" # bearer token used by host-side curl commands
: "${API_KEY:?Set NGC_CLI_API_KEY or RTVI_VLM_API_KEY before calling authenticated endpoints}"
```
Every request below uses `Authorization: Bearer $API_KEY`. Health endpoints
(`/v1/health/*`, `/v1/ready`, `/v1/live`, `/v1/startup`) typically work without auth.
**Smoke test before use:**
```bash
curl -fsS "$BASE_URL/v1/health/ready"
MODEL_ID="$(curl -fsS "$BASE_URL/v1/models" -H "Authorization: Bearer $API_KEY" | jq -r '.data[0].id // .id')"
curl -fsS "$BASE_URL/openapi.json" | jq -r '.paths | keys[]' | sort
```
## RTSP Sample Stream Guard
When a task or eval names `RTSP_SAMPLE_URL`, treat that exact environment
variable as a required input. Verify it is set and non-empty before probing or
registering any stream; if it is missing, stop with a clear failure message. Do
not derive a substitute from NvStreamer, VIOS, sample-data bundles, or any other
fallback, because that validates a different stream than the caller requested.
```bash
: "${RTSP_SAMPLE_URL:?Set RTSP_SAMPLE_URL to a reachable RTSP sample stream before RTSP validation}"
case "$RTSP_SAMPLE_URL" in
rtsp://*) ;;
*) echo "RTSP_SAMPLE_URL must be an rtsp:// URL, got: $RTSP_SAMPLE_URL" >&2; exit 1 ;;
esac
if command -v ffprobe >/dev/null 2>&1; then
ffprobe -v error -rtsp_transport tcp \
-select_streams v:0 -show_entries stream=codec_type \
-of csv=p=0 "$RTSP_SAMPLE_URL" | grep -qx video
elif command -v gst-discoverer-1.0 >/dev/null 2>&1; then
gst-discoverer-1.0 "$RTSP_SAMPLE_URL" | grep -qi 'video'
else
echo "Install ffprobe or gst-discoverer-1.0 before RTSP validation." >&2
exit 1
fi
```
## Quick Start — dense captions from a local video
```bash
# 1. Upload the video, capture its file id
FILE_ID=$(curl -fsS -X POST "$BASE_URL/v1/files" \
-H "Authorization: Bearer $API_KEY" \
-F "file=@/path/to/warehouse.mp4" \
-F "purpose=vision" \
-F "media_type=video" | jq -r '.id')
# 2. Generate captions + alerts (SSE stream of chunked responses)
curl -N -X POST "$BASE_URL/v1/generate_captions" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d "{
\"id\": \"$FILE_ID\",
\"prompt\": \"Write a concise dense caption for each 10-second segment of this warehouse video.\",
\"model\": \"$MODEL_ID\",
\"chunk_duration\": 10,
\"stream\": true
}"
```
## API Surface
Use the live OpenAPI as the source of truth before calling optional endpoints:
```bash
curl -fsS "$BASE_URL/openapi.json" | jq -r '.paths | keys[]' | sort
```
Core paths for VSS 3.2 are:
- `POST /v1/files` for multipart media upload; pass the returned file `id` into
caption generation and delete the file when finished.
- `POST /v1/generate_captions` for file or stream captioning. Use the exact
model id returned by `GET /v1/models`; aliases such as `cosmos-reason2` are
backend selectors, not request model ids.
- `POST /v1/streams/add`, `GET /v1/streams/get-stream-info`, and
`DELETE /v1/streams/delete/{stream_id}` for RTSP lifecycle. Parse stream ids
from `results[0].id`.
- `POST /v1/chat/completions` for OpenAI-compatible text and multimodal calls.
Current 26.05 builds return HTTP 400 for text-only `/v1/completions`; treat
that as expected when validating legacy behavior.
- `GET /v1/health/ready`, `/v1/models`, `/v1/assets/stats`, and `/v1/metrics`
for service probes. Do not assume `/v1/license` exists unless OpenAPI lists it.
Detailed endpoint schemas, response shapes, CV-style singular stream endpoints,
and 26.05 compatibility notes live in
[`references/api-surface-26.05.md`](references/api-surface-26.05.md).
## Common Workflows
- Stored file captioning: upload with `POST /v1/files`, call
`/v1/generate_captions` with the returned file id, use `stream=true` for SSE,
then delete the file to release storage.
- RTSP live captioning: when the caller provides `RTSP_SAMPLE_URL`, use that
exact URL and run the **RTSP Sample Stream Guard** before registration. Do not
derive a replacement stream from NvStreamer or VIOS when `RTSP_SAMPLE_URL` is
empty; fail fast instead. Require an actual video stream/caps entry before
registration; add the stream, caption it, then unregister it.
- Alert prompts: include a deterministic `Anomaly Detected: Yes/No` line.
Kafka publication is server-side config, additive to HTTP responses, and
documented in [`references/kafka-workflows.md`](references/kafka-workflows.md).
- Kafka validation: trust the live `vss-rtvi-vlm` environment for topic names.
In a full VSS alerts real-time profile, use the existing VSS Kafka container
`mdx-kafka` for CLI checks and final incident-consumer commands. For
standalone validation, use a broker that advertises `${HOST_IP}:9092`; never
stop or replace a pre-existing broker without user confirmation.
## Error Reference
Common causes: 400 for invalid request shape or model id, 401/403 for missing
or wrong bearer token, 404 for deleted files/streams or unsupported endpoints,
413 for oversized uploads, 422 for schema validation, 429 for too much
concurrency, 500 for inference/runtime failures, and 503 while startup is still
in progress. Inspect `docker logs vss-rtvi-vlm` for service-side failures.
Tous les fichiers
11 fichiersInstaller vss-deploy-dense-captioning
Téléchargez et décompressez les fichiers de compétences dans votre répertoire .claude/skills/.
Télécharger le ZIPClonez le dépôt et copiez les fichiers de compétence dans votre projet.
git clone https://github.com/NVIDIA/skills/tree/main/skills/vss-deploy-dense-captioning # Copy SKILL.md to your .claude/skills/ directory
Copier





Maison
