opción
HogarHogar Skill DevOps y CI/CD vss-deploy-dense-captioning

vss-deploy-dense-captioning

NVIDIA/skills 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 todo
2
Tiempo actualizado 27 de septiembre de 2026

Objetivo

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_KEY para el 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, jq y 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_KEY o $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 --agent-eval» 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_KEY y .env fuera 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 /docs o /health; vuelve a implementar mediante vss-deploy-profile o la habilidad vss-deploy-* correspondiente.
  • Error: código HTTP 401/403 en las consultas a NGC. Causa: falta la clave NGC_CLI_API_KEY o ha caducado. Solución: inicia sesión en Docker en nvcr.io y 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/files para la subida de archivos multimedia en varias partes; pasa el identificador del archivo devuelto a la generación de subtítulos y elimina el archivo cuando hayas terminado.
  • POST /v1/generate_captions para la generación de subtítulos de archivos o transmisiones. Utilice el ID de modelo exacto devuelto por GET /v1/models; los alias como cosmos-reason2 son selectores del backend, no ID de modelo de solicitud.
  • POST /v1/streams/add, GET /v1/streams/get-stream-info y DELETE /v1/streams/delete/{stream_id} para el ciclo de vida de RTSP. Analiza los identificadores de transmisión a partir de results[0].id.
  • POST /v1/chat/completions para 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/completions de solo texto; tenlo en cuenta como algo esperado al validar el comportamiento heredado.
  • GET /v1/health/ready, /v1/models, /v1/assets/stats y /v1/metrics para pruebas de servicio. No des por sentado que existe /v1/license a 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_captions con el ID del archivo devuelto, utiliza stream=true para 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 cuando RTSP_SAMPLE_URL esté 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 en references/kafka-workflows.md.
  • Validación de Kafka: confía en el entorno vss-rtvi-vlm en producción para los nombres de los temas. En un perfil completo de alertas VSS en tiempo real, utiliza el contenedor VSS Kafka existente mdx-kafka para 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.

Ver en GitHub
---
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.

Instalar vss-deploy-dense-captioning

Descarga y descomprime los archivos de habilidades en tu directorio .claude/skills/.

Descargar ZIP

Clona 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 Copiar
Configuración rápida: Copia la carpeta de la habilidad en .claude/skills/ Claude detectará y utilizará automáticamente la habilidad
Repositorio NVIDIA/skills

Habilidades relacionadas

klingai-upgrade-migration
Tiempo actualizado 3 de julio de 2026
Verification &amp; Quality Assurance
Tiempo actualizado 29 de junio de 2026
base44-cli
Tiempo actualizado 29 de junio de 2026
Railway CLI Management
Tiempo actualizado 2 de julio de 2026
OR