opção
LarLar Skill DevOps e CI/CD vss-deploy-dense-captioning

vss-deploy-dense-captioning

NVIDIA/skills NVIDIA/skills

Implemente um microsserviço autônomo de legendagem densa RT-VLM e teste seus pontos de extremidade da API REST para upload de arquivos, geração de legendas, streaming, sugestões de chat e integração com o Kafka.

...Expandir tudo
2
Tempo atualizado 27 de Setembro de 2026

Objetivo

Configurar o microsserviço RT-VLM de legendagem densa de forma independente e testar todos os endpoints que ele expõe (upload de arquivos, geração de legendas, adição/exclusão de streams, autocompletos de bate-papo, tópicos do Kafka).

Pré-requisitos

Para a implantação autônoma do RT-VLM:

  • Docker, Docker Compose, NVIDIA Container Toolkit e uma GPU visível.
  • Credenciais do registro NGC em $NGC_CLI_API_KEY para login no Docker via nvcr.io, baixamento de imagens e downloads locais de modelos/artefatos do NGC.
  • curl, jq e qualquer diretório de trabalho gravável para a cópia autônoma do Compose.

Para chamadas de API em um serviço existente:

  • Serviço RT-VLM em execução acessível em $BASE_URL.
  • Token Bearer em $RTVI_VLM_API_KEY ou $NGC_CLI_API_KEY, dependendo de como o serviço foi configurado.

Para implantação completa do perfil VSS:

  • Use ../vss-deploy-profile/SKILL.md; esta skill não implanta perfis VSS completos.

Instruções

Siga as tabelas de roteamento e os fluxos de trabalho passo a passo abaixo. Cada seção que termina com “fluxo de trabalho”, “início rápido” ou “fluxo” deve ser executada de cima para baixo. O material de referência detalhado está em references/; execute os fluxos de trabalho documentados diretamente, a menos que uma revisão futura indique um auxiliar específico.

Exemplos

Exemplos completos e funcionais estão armazenados em `evals/` (cada manifesto *.json contém um cenário executável) e incorporados nos blocos `curl` de cada fluxo de trabalho abaixo. Execute uma avaliação de Nível 3 com ` nv-base validate --agent-eval` para reproduzi-los.

Limitações

  • Requer um serviço RT-VLM autônomo implantado por meio desta skill ou um serviço RT-VLM existente acessível pelo chamador.
  • Modelos hospedados no NGC e NIMs podem estar sujeitos a limites de taxa, requisitos de memória de GPU e restrições de licença.
  • Os limites de simultaneidade, memória de GPU e armazenamento dependem do hardware do host e do arquivo de composição do perfil.
  • Mantenha os arquivos NGC_CLI_API_KEY, RTVI_VLM_API_KEY e .env fora do git e fora dos logs; não exiba valores de credenciais nem os inclua nas respostas finais.
  • O acesso ao grupo Docker e o `sudo` são, na prática, privilégios de nível root. Use o comando `sudo -n ` (não interativo) na referência de implantação e aguarde a ação do proprietário do host quando o `sudo` sem senha não estiver disponível.

Solução de problemas

  • Erro: a chamada REST retorna “conexão recusada”. Causa: o microsserviço de destino não está em execução. Solução: verifique /docs ou /health; reimplante por meio do vss-deploy-profile ou da habilidade vss-deploy-* correspondente.
  • Erro: HTTP 401/403 nas chamadas do NGC. Causa: NGC_CLI_API_KEY ausente ou expirada. Solução: execute ` docker login nvcr.io ` e reexporte a chave antes de tentar novamente.
  • Erro: contêiner com OOM ou falha ao carregar o modelo. Causa: memória de GPU insuficiente para o perfil selecionado. Solução: mude para uma variante menor ou libere GPUs usando ` docker compose down`.

Implantar e usar o RT-VLM Dense Captioning (VSS 3.2)

O RT-VLM é o microsserviço de visão-linguagem em tempo real da NVIDIA: decodifica vídeo (arquivo ou RTSP), segmenta-o em blocos, executa um VLM (cosmos-reason1, cosmos-reason2 ou qualquer modelo compatível com a OpenAI), transmite legendas densas de volta por SSE/HTTP e publica legendas, alertas de incidentes e erros no Kafka. Use essa habilidade para implantar o serviço RT-VLM autônomo quando um perfil VSS completo ainda não estiver em execução e, em seguida, chame sua API /v1/... para geração de legendas, upload de arquivos, gerenciamento de transmissões ao vivo, verificações de integridade , autocompletos de chat compatíveis com NIM ou métricas do Prometheus. Referência da API: https://docs.nvidia.com/vss/latest/real-time-vlm-api.html.

Roteamento de implantação

Se o usuário solicitar a implantação de um perfil VSS completo, use ../vss-deploy-profile/SKILL.md. Essa habilidade é responsável pelo roteamento do perfil, pelo arqu ivo generated.env, pelo resolved.yml, pelo dimensionamento de múltiplos serviços e pela implantação/desativação de pilha completa.

Se o usuário solicitar legendagem densa com RT-VLM autônomo, ou se nenhum perfil VSS estiver já em execução, use o fluxo do RT-VLM autônomo em references/deploy-rt-vlm-service.md antes de chamar a API. Isso segue o mesmo padrão centrado no Compose queo vss-deploy-profile: coletar contexto, executar pré-verificações, trabalhar a partir de uma cópia local, fazer um teste simulado com a configuração do Docker Compose, revisar, implantar e, em seguida, aguardar a verificação de integridade.

Fluxo de implantação autônomo

Siga sempre esta sequência. Nunca pule a simulação.

# 1. Copie o arquivo deploy/docker/services/rtvi/rtvi-vlm/rtvi-vlm-docker-compose.yml
#    para qualquer diretório de trabalho autônomo gravável.
# 2. Derive RTVI_VLM_IMAGE_TAG a partir dessa cópia do Compose.
# 3. Remova da cópia o bloco `depends_on` pendente, exclusivo da versão autônoma.
# 4. Crie um arquivo .env ignorado pelo Git com os valores necessários do RT-VLM.
# 5. Prepare caminhos de montagem no host, como $VSS_DATA_DIR/data_log/vst/clip_storage.
#    Use `sudo -n` para corrigir propriedades; se o `sudo` sem senha não estiver disponível,
#    interrompa e peça ao proprietário do host para executar o comando exibido manualmente.
# 6. docker compose --env-file .env -f rtvi-vlm-docker-compose.yml config --quiet
# 7. Execute `docker pull` com a tag exata da imagem do RT-VLM.
# 8. Execute `docker compose ... up -d rtvi-vlm`, aguarde até que esteja pronto e, em seguida, faça o teste de funcionamento.

Execute as verificações preliminares antes de qualquer `pull` ou `up`; interrompa e corrija as falhas aqui antes de depurar o próprio 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 implantações autônomas de arquivo único, não execute o arquivo deploy/docker/services/rtvi/rtvi-vlm/rtvi-vlm-docker-compose.yml diretamente: ele contém referências `depends_on` a serviços VLM/NIM irmãos que estão definidos apenas definidos no projeto completo de composição VSS/met-blueprints. A referência autônoma mostra como copiar o arquivo de composição, derivar a tag da imagem atual a partir dele, remover o bloco `depends_on` e validar o resultado antes de iniciar.

Para validação orientada por agente, nunca permita que o prompt do sudo seja interativo. Antes de qualquer operação com privilégios ou do Docker, use a proteção não interativa em references/deploy-rt-vlm-service.md: prefira o `docker` simples; caso contrário, use `sudo -n docker`; se o `sudo -n` falhar, interrompa com o comando manual exato para o proprietário do host, em vez de tentar novamente com o `sudo` interativo ou enfraquecer as permissões.

Se o `docker pull` falhar com um erro de `snapshotter/unpack` do `containerd` no Docker 28 ou superior, aplique a correção `/etc/docker/daemon.json containerd-snapshotter=false ` na referência autônoma antes de tentar novamente.

Valores mínimos do arquivo .env para o modo autônomo:

Variável de ambiente do host Necessária quando Finalidade
NGC_CLI_API_KEY Caminho de implantação autônoma Baixar imagem do registro NGC e baixar modelo/artefato NGC
RTVI_VLM_API_KEY ou NGC_CLI_API_KEY Chamadas de API autenticadas Autenticação de portador RT-VLM após o serviço estar em execução
RTVI_VLM_PORT Sempre Porta da API do host mapeada para o contêiner 8000
HOST_IP Sempre Host de inicialização do Kafka (${HOST_IP}:9092)
VSS_DATA_DIR Sempre Montagem vinculada obrigatória do armazenamento de clipes
RTVI_VLM_MODEL_TO_USE Sempre para modo autônomo Seletor de backend; use cosmos-reason2 para o modelo local padrão ou openai-compat para um endpoint remoto ou irmão
RTVI_VLM_MODEL_PATH Modelo local auto-hospedado Caminho do Cosmos Reason 2 com suporte de código-fonte: ngc:nim/nvidia/cosmos-reason2-8b:hf-1208
RTVI_VLM_ENDPOINT RTVI_VLM_MODEL_TO_USE=openai-compat Endpoint VLM remoto/parceiro compatível com OpenAI
VLM_NAME RTVI_VLM_MODEL_TO_USE=openai-compat Nome do modelo/implantação exposto por esse endpoint

Configuração

export BASE_URL="http://localhost:${RTVI_VLM_PORT:-8018}"  # porta RT-VLM no lado do host
export API_KEY="${NGC_CLI_API_KEY:-${RTVI_VLM_API_KEY:-}}" # token de portador usado pelos comandos `curl` no lado do host
: "${API_KEY:?Defina NGC_CLI_API_KEY ou RTVI_VLM_API_KEY antes de chamar endpoints autenticados}"

Todas as solicitações abaixo usam Authorization: Bearer $API_KEY. Os endpoints de integridade (/v1/health/*, /v1/ready, /v1/live, /v1/startup) normalmente funcionam sem autenticação.

Teste de funcionamento antes do 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

Guarda de Fluxo de Amostra RTSP

Quando uma tarefa ou avaliação mencionar RTSP_SAMPLE_URL, trate essa variável de ambiente exata como uma entrada obrigatória. Verifique se ela está definida e não está vazia antes de testar ou registrar qualquer stream; se estiver ausente, interrompa com uma mensagem clara de falha. Não derive um substituto do NvStreamer, VIOS, pacotes de dados de amostra ou qualquer outro recurso alternativo, pois isso valida um stream diferente daquele solicitado pelo chamador.

: "${RTSP_SAMPLE_URL:?Defina RTSP_SAMPLE_URL como um stream de amostra RTSP acessível antes da validação RTSP}"
case "$RTSP_SAMPLE_URL" in
  rtsp://*) ;;
  *) echo "RTSP_SAMPLE_URL deve ser uma URL rtsp://, obtido: $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 "Instale o ffprobe ou o gst-discoverer-1.0 antes da validação RTSP." >&2
  exit 1
fi

Guia de Início Rápido — legendas densas a partir de um vídeo local

# 1. Envie o vídeo e capture seu ID de arquivo
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. Gerar legendas + alertas (fluxo SSE de respostas 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\": \"Escreva uma legenda concisa e sucinta para cada segmento de 10 segundos deste vídeo do armazém.\",
    \"model\": \"$MODEL_ID\",
    \"chunk_duration\": 10,
    \"stream\": true
  }"

Superfície da API

Use a OpenAPI ativa como fonte de referência antes de chamar endpoints opcionais:

curl -fsS "$BASE_URL/openapi.json" | jq -r '.paths | keys[]' | sort

Os caminhos principais para o VSS 3.2 são:

  • POST /v1/files para upload de mídia em multipart; passe o ID do arquivo retornado para a geração de legendas e exclua o arquivo ao concluir.
  • POST /v1/generate_captions para legendagem de arquivos ou streams. Use o ID exato do modelo retornado por GET /v1/models; aliases como cosmos-reason2 são seletores de backend, não IDs de modelo de solicitação.
  • POST /v1/streams/add, GET /v1/streams/get-stream-info e DELETE /v1/streams/delete/{stream_id} para o ciclo de vida RTSP. Analise os IDs de stream a partir de results[0].id.
  • POST /v1/chat/completions para chamadas de texto e multimodais compatíveis com OpenAI. As versões atuais 26.05 retornam HTTP 400 para /v1/completions somente de texto; considere isso como esperado ao validar o comportamento legado.
  • GET /v1/health/ready, /v1/models, /v1/assets/stats e /v1/metrics para testes de integridade do serviço. Não presuma que /v1/license exista, a menos que a OpenAPI o liste.

Esquemas detalhados de endpoints, formatos de resposta, endpoints de fluxo singular no estilo CV e notas de compatibilidade com a versão 26.05 estão disponíveis em references/api-surface-26.05.md.

Fluxos de trabalho comuns

  • Legendas de arquivos armazenados: faça o upload com POST /v1/files, chame /v1/generate_captions com o ID do arquivo retornado, use stream=true para SSE, em seguida, exclua o arquivo para liberar espaço de armazenamento.
  • Legendas ao vivo via RTSP: quando o chamador fornecer RTSP_SAMPLE_URL, use essa URL exata e execute o RTSP Sample Stream Guard antes do registro. Não derive um fluxo substituto do NvStreamer ou do VIOS quando RTSP_SAMPLE_URL estiver vazio; em vez disso, interrompa a operação rapidamente. Exija uma entrada real de fluxo de vídeo/legendas antes do registro; adicione o fluxo, legende-o e, em seguida, cancele o registro.
  • Mensagens de alerta: inclua uma linha determinística “Anomalia detectada: Sim/Não ”. A publicação no Kafka é uma configuração do lado do servidor, adicional às respostas HTTP, e documentada em references/kafka-workflows.md.
  • Validação do Kafka: confie no ambiente vss-rtvi-vlm em produção para nomes de tópicos. Em um perfil completo de alertas VSS em tempo real, use o contêiner Kafka existente do VSS mdx-kafka para verificações via CLI e comandos finais do consumidor de incidentes. Para validação autônoma, use um broker que anuncie ${HOST_IP}:9092; nunca interrompa ou substitua um broker pré-existente sem a confirmação do usuário.

Referência de erros

Causas comuns: 400 para formato de solicitação ou ID de modelo inválidos, 401/403 para token de portador ausente ou incorreto, 404 para arquivos/fluxos excluídos ou endpoints não suportados, 413 para uploads com tamanho excessivo, 422 para validação de esquema, 429 para excesso de concorrência, 500 para falhas de inferência/tempo de execução e 503 enquanto a inicialização ainda estiver em andamento. Verifique os logs do Docker vss-rtvi-vlm para identificar falhas do lado do serviço.

Ver no 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

Baixe e descompacte os arquivos de habilidades no diretório .claude/skills/.

Baixar ZIP

Clone o repositório e copie os arquivos da habilidade para o seu projeto.

git clone https://github.com/NVIDIA/skills/tree/main/skills/vss-deploy-dense-captioning # Copy SKILL.md to your .claude/skills/ directory

Copiar Copiar
Configuração rápida: Copie a pasta da habilidade para .claude/skills/ O Claude detectará e utilizará automaticamente a habilidade
Repositório NVIDIA/skills

Habilidades relacionadas

klingai-upgrade-migration
Tempo atualizado 3 de Julho de 2026
Verification &amp; Quality Assurance
Tempo atualizado 29 de Junho de 2026
base44-cli
Tempo atualizado 29 de Junho de 2026
Railway CLI Management
Tempo atualizado 2 de Julho de 2026
OR