vss-deploy-dense-captioning
NVIDIA/skills
Implementa un microservicio independiente de subtitulado denso RT-VLM y prueba sus puntos finales de la API REST para la carga de archivos, la generación de subtítulos, la transmisión en directo, las sugerencias en el chat y la integración con Kafka.
...Expandir todoObjetivo
Poner en marcha de forma independiente el microservicio RT-VLM de subtitulado denso y probar todos los puntos finales que expone (subida de archivos, generate_captions, añadir/eliminar flujos, autocompletado de chat, temas de Kafka).
Requisitos previos
Para la implementación autónoma de RT-VLM:
- Docker, Docker Compose, NVIDIA Container Toolkit y una GPU visible.
- Credenciales del registro NGC en
$NGC_CLI_API_KEYparael inicio de sesión en Docker en nvcr.io, la obtención de imágenes y las descargas locales de modelos y artefactos de NGC. curl,jqy cualquier directorio de trabajo en el que se pueda escribir para la copia independiente de Compose.
Para llamadas a la API a un servicio existente:
- Servicio RT-VLM en ejecución accesible en
$BASE_URL. - Token «Bearer» en
$RTVI_VLM_API_KEYo$NGC_CLI_API_KEY, dependiendo de cómo se haya configurado el servicio.
Para el despliegue completo del perfil VSS:
- Utiliza
../vss-deploy-profile/SKILL.md; esta skill no implementa perfiles VSS completos.
Instrucciones
Sigue las tablas de enrutamiento y los flujos de trabajo paso a paso que se indican a continuación. Cada sección que termine en «workflow», «quick start» o «flow» debe ejecutarse de arriba abajo. El material de referencia detallado se encuentra en references/; ejecuta directamente los flujos de trabajo documentados, a menos que una revisión futura indique una herramienta de ayuda concreta.
Ejemplos
Los ejemplos completos y funcionales se encuentran en la carpeta «evals/» (cada manifiesto *.json contiene un escenario ejecutable) y, además, se incluyen directamente en los bloques «curl» de cada flujo de trabajo que se muestran a continuación. Ejecuta una evaluación de Nivel 3 con «nv-base validate para reproducirlos.
Limitaciones
- Requiere un servicio RT-VLM independiente implementado a través de esta habilidad o un servicio RT-VLM existente al que pueda acceder el solicitante.
- Los modelos alojados en NGC y los NIM pueden estar sujetos a límites de tasa, requisitos de memoria de GPU y restricciones de licencia.
- Los límites de concurrencia, memoria de GPU y almacenamiento dependen del hardware del host y del archivo de composición del perfil.
- Mantén los archivos
NGC_CLI_API_KEY,RTVI_VLM_API_KEYy.envfuera de Git y de los registros; no muestres los valores de las credenciales ni los incluyas en las respuestas finales. - El acceso al grupo Docker y
el comando «sudo»son, en la práctica, privilegios de nivel root. Utiliza el comando«sudo -n»no interactivo en la referencia de implementación y detén la acción del propietario del host cuando no esté disponible el «sudo» sin contraseña.
Solución de problemas
- Error: la llamada REST devuelve «conexión rechazada». Causa: el microservicio de destino no se está ejecutando. Solución: comprueba
/docso/health; vuelve a implementar mediantevss-deploy-profileo la habilidadvss-deploy-*correspondiente. - Error: código HTTP 401/403 en las consultas a NGC. Causa: falta
la clave NGC_CLI_API_KEYo ha caducado. Solución:inicia sesión en Docker en nvcr.ioy vuelve a exportar la clave antes de volver a intentarlo. - Error: el contenedor está sin memoria (OOM) o el modelo no se carga. Causa: memoria de la GPU insuficiente para el perfil seleccionado. Solución: cambiar a una variante más pequeña o liberar GPU mediante
«docker compose down».
Implementación y uso de RT-VLM Dense Captioning (VSS 3.2)
RT-VLM es el microservicio de visión-lenguaje en tiempo real de NVIDIA: decodifica vídeo (archivo o
RTSP), lo segmenta en fragmentos, ejecuta un VLM (cosmos-reason1, cosmos-reason2 o cualquier
modelo compatible con OpenAI), transmite subtítulos densos a través de SSE/HTTP y publica
subtítulos, alertas de incidentes y errores en Kafka. Utiliza esta habilidad para implementar el
servicio RT-VLM independiente cuando aún no se esté ejecutando un perfil VSS completo y, a continuación, llama a
su API /v1/... para la generación de subtítulos, la subida de archivos, la gestión de la transmisión en directo, las
comprobaciones de estado, las sugerencias de chat compatibles con NIM o las métricas de Prometheus. Referencia de la API:
https://docs.nvidia.com/vss/latest/real-time-vlm-api.html.
Enrutamiento de la implementación
Si el usuario solicita implementar un perfil VSS completo, utiliza
../vss-deploy-profile/SKILL.md. Esa habilidad
se encarga del enrutamiento del perfil, del archivo generated.env, del resolved.yml, del dimensionamiento multiservicio y de
la implementación y desmontaje de la pila completa.
Si el usuario solicita subtitulado denso con RT-VLM independiente, o si no hay ningún perfil VSS
ya en ejecución, utiliza el flujo de RT-VLM independiente en
references/deploy-rt-vlm-service.md
antes de llamar a la API. Esto sigue el mismo patrón centrado en Compose que
vss-deploy-profile: recopilar el contexto, ejecutar comprobaciones previas, trabajar a partir de una copia local,
realizar una simulación con la configuración de Docker Compose, revisar, implementar y, a continuación, esperar a que se compruebe el estado.
Flujo de implementación independiente
Sigue siempre esta secuencia. Nunca te saltes la simulación.
# 1. Copia deploy/docker/services/rtvi/rtvi-vlm/rtvi-vlm-docker-compose.yml
# en cualquier directorio de trabajo independiente en el que se pueda escribir.
# 2. Obtén RTVI_VLM_IMAGE_TAG a partir de esa copia de Compose.
# 3. Elimina de la copia el bloque «depends_on» sobrante, exclusivo de la versión independiente.
# 4. Crea un archivo .env ignorado por Git con los valores RT-VLM necesarios.
# 5. Prepara las rutas de enlace del host, como $VSS_DATA_DIR/data_log/vst/clip_storage.
# Utiliza `sudo -n` para corregir los permisos de propiedad; si no dispones de sudo sin contraseña,
# detente y pide al propietario del host que ejecute manualmente el comando mostrado.
# 6. docker compose --env-file .env -f rtvi-vlm-docker-compose.yml config --quiet
# 7. Descarga con `docker pull` la etiqueta exacta de la imagen RT-VLM.
# 8. Ejecuta `docker compose ... up -d rtvi-vlm`, espera a que esté listo y, a continuación, realiza una prueba de funcionamiento.
Ejecuta las comprobaciones previas antes de cualquier «pull» o «up»; detén el proceso y corrige los errores aquí antes de
depurar el propio RT-VLM:
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
Para implementaciones independientes de un solo archivo, no ejecutes directamente el archivo
deploy/docker/services/rtvi/rtvi-vlm/rtvi-vlm-docker-compose.yml: contiene
referencias «depends_on» a servicios VLM/NIM hermanos que solo están
están definidas en el proyecto completo de Compose de VSS/met-blueprints. La referencia independiente
muestra cómo copiar el archivo de Compose, derivar de él la etiqueta de la imagen actual, eliminar
el bloque «depends_on» y validar el resultado antes de la ejecución.
Para la validación basada en agentes, nunca permitas que el indicador de sudo sea interactivo. Antes de cualquier
operación con privilegios o de Docker, utiliza la protección no interactiva de
references/deploy-rt-vlm-service.md:
prefiere «plain docker»; de lo contrario, utiliza «sudo -n docker»; si «sudo -n» falla, detén el proceso
con el comando manual exacto para el propietario del host, en lugar de volver a intentarlo con
«sudo» interactivo o debilitar los permisos.
Si «docker pull» falla con un error de «snapshotter/unpack» de containerd en Docker 28 o superior,
aplica la corrección «containerd-snapshotter=false» en /etc/docker/daemon.json, tal y como se indica en la
referencia de modo autónomo, antes de volver a intentarlo.
Valores mínimos de .env para la configuración independiente:
| Variable de entorno del host | Requerida cuando | Finalidad |
|---|---|---|
NGC_CLI_API_KEY |
Ruta de implementación independiente | Obtención de imágenes del registro NGC y descarga de modelos/artefactos de NGC |
RTVI_VLM_API_KEY o NGC_CLI_API_KEY |
Llamadas a la API autenticadas | Autenticación de portador RT-VLM una vez que el servicio está en ejecución |
RTVI_VLM_PORT |
Siempre | Puerto de la API del host asignado al contenedor 8000 |
HOST_IP |
Siempre | Host de arranque de Kafka (${HOST_IP}:9092) |
VSS_DATA_DIR |
Siempre | Montaje vinculado obligatorio del almacenamiento de clips |
RTVI_VLM_MODEL_TO_USE |
Siempre para el modo autónomo | Selector de backend; utiliza «cosmos-reason2» para el modelo local predeterminado o «openai-compat» para un punto final remoto o hermano |
RTVI_VLM_MODEL_PATH |
Modelo local autohospedado | Ruta de Cosmos Reason 2 basada en el código fuente: ngc:nim/nvidia/cosmos-reason2-8b:hf-1208 |
RTVI_VLM_ENDPOINT |
RTVI_VLM_MODEL_TO_USE=openai-compat |
Punto final VLM remoto o en el mismo servidor compatible con OpenAI |
VLM_NAME |
RTVI_VLM_MODEL_TO_USE=openai-compat |
Nombre del modelo o de la implementación expuesto por ese punto final |
Configuración
export BASE_URL="http://localhost:${RTVI_VLM_PORT:-8018}" # puerto RT-VLM del lado del host
export API_KEY="${NGC_CLI_API_KEY:-${RTVI_VLM_API_KEY:-}}" # token de portador utilizado por los comandos `curl` del lado del host
: "${API_KEY:?Establece NGC_CLI_API_KEY o RTVI_VLM_API_KEY antes de llamar a los puntos finales autenticados}"
Todas las solicitudes que aparecen a continuación utilizan «Authorization: Bearer $API_KEY». Los puntos finales de estado
(/v1/health/*, /v1/ready, /v1/live, /v1/startup) suelen funcionar sin autenticación.
Prueba de funcionamiento antes de su uso:
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
Cuando una tarea o evaluación mencione RTSP_SAMPLE_URL, considere esa variable de entorno exacta
como una entrada obligatoria. Comprueba que esté definida y que no esté vacía antes de sondear o
registrar cualquier flujo; si falta, detén el proceso con un mensaje de error claro. No
derives un sustituto de NvStreamer, VIOS, paquetes de datos de muestra ni de ningún otro
sistema de respaldo, ya que eso validaría un flujo diferente al solicitado por el llamante.
: "${RTSP_SAMPLE_URL:?Establece RTSP_SAMPLE_URL en una transmisión de muestra RTSP accesible antes de la validación RTSP}"
case "$RTSP_SAMPLE_URL" in
rtsp://*) ;;
*) echo "RTSP_SAMPLE_URL debe ser una URL rtsp://, se ha obtenido: $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 "Instala ffprobe o gst-discoverer-1.0 antes de la validación RTSP." >&2
exit 1
fi
Inicio rápido: subtítulos densos a partir de un vídeo local
# 1. Sube el vídeo y captura su ID de archivo
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. Generar subtítulos y alertas (flujo SSE de respuestas fragmentadas)
curl -N -X POST "$BASE_URL/v1/generate_captions" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d "{
\"id\": \"$FILE_ID\",
\"prompt\": \"Escribe un subtítulo conciso y conciso para cada segmento de 10 segundos de este vídeo del almacén.\",
\"model\": \"$MODEL_ID\",
\"chunk_duration\": 10,
\"stream\": true
}"
Superficie de la API
Utiliza la OpenAPI en tiempo real como fuente de referencia antes de llamar a los puntos finales opcionales:
curl -fsS "$BASE_URL/openapi.json" | jq -r '.paths | keys[]' | sort
Las rutas principales para VSS 3.2 son:
POST /v1/filespara la subida de archivos multimedia en varias partes; pasa elidentificadordel archivo devuelto a la generación de subtítulos y elimina el archivo cuando hayas terminado.POST /v1/generate_captionspara la generación de subtítulos de archivos o transmisiones. Utilice el ID de modelo exacto devuelto porGET /v1/models; los alias comocosmos-reason2son selectores del backend, no ID de modelo de solicitud.POST /v1/streams/add,GET /v1/streams/get-stream-infoyDELETE /v1/streams/delete/{stream_id}para el ciclo de vida de RTSP. Analiza los identificadores de transmisión a partir deresults[0].id.POST /v1/chat/completionspara llamadas de texto y multimodales compatibles con OpenAI. Las compilaciones actuales de la versión 26.05 devuelven un código HTTP 400 para/v1/completionsde solo texto; tenlo en cuenta como algo esperado al validar el comportamiento heredado.GET /v1/health/ready,/v1/models,/v1/assets/statsy/v1/metricspara pruebas de servicio. No des por sentado que existe/v1/licensea menos que OpenAPI lo incluya en la lista.
Los esquemas detallados de los puntos finales, los formatos de respuesta, los puntos finales de flujo único al estilo CV
y las notas de compatibilidad con la versión 26.05 se encuentran en
references/api-surface-26.05.md.
Flujos de trabajo habituales
- Subtítulos de archivos almacenados: sube el archivo con
POST /v1/files, llama a/v1/generate_captionscon el ID del archivo devuelto, utilizastream=truepara SSE, y, a continuación, elimina el archivo para liberar espacio de almacenamiento. - Subtitulado en directo por RTSP: cuando el solicitante proporcione
RTSP_SAMPLE_URL, utiliza esa URL exacta y ejecuta el RTSP Sample Stream Guard antes del registro. No derives una transmisión de sustitución de NvStreamer o VIOS cuandoRTSP_SAMPLE_URLesté vacío; en su lugar, da un error rápido. Exige una entrada real de transmisión de vídeo/subtítulos antes del registro; añade la transmisión, subtítula y, a continuación, da de baja el registro. - Mensajes de alerta: incluye una línea determinista
«Anomalía detectada: Sí/No». La publicación en Kafka es una configuración del lado del servidor, adicional a las respuestas HTTP, y está documentada enreferences/kafka-workflows.md. - Validación de Kafka: confía en el entorno
vss-rtvi-vlmen producción para los nombres de los temas. En un perfil completo de alertas VSS en tiempo real, utiliza el contenedor VSS Kafka existentemdx-kafkapara las comprobaciones de la CLI y los comandos finales del consumidor de incidentes. Para la validación independiente, utiliza un broker que anuncie${HOST_IP}:9092; nunca detengas ni sustituyas un broker preexistente sin la confirmación del usuario.
Referencia de errores
Causas comunes: 400 por formato de solicitud o ID de modelo no válido, 401/403 por falta
o error en el token de portador, 404 por archivos o flujos eliminados o puntos finales no compatibles,
413 por cargas de gran tamaño, 422 por validación de esquema, 429 por exceso de
concurrencia, 500 por fallos de inferencia o de tiempo de ejecución, y 503 mientras el inicio aún
está en curso. Revisa los registros de Docker «vss-rtvi-vlm» para detectar fallos del lado del servicio.
---
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.
Todos los archivos
11 archivosInstalar vss-deploy-dense-captioning
Descarga y descomprime los archivos de habilidades en tu directorio .claude/skills/.
Descargar ZIPClona el repositorio y copia los archivos de la habilidad a tu proyecto.
git clone https://github.com/NVIDIA/skills/tree/main/skills/vss-deploy-dense-captioning # Copy SKILL.md to your .claude/skills/ directory
Copiar





Hogar
