Construire un Agent Vision
build-vision-ai donne aux agents et aux développeurs des capacités de vision prêtes pour les agents via une pile applicative personnalisable et autonome construite sur le NVIDIA VSS Blueprint. Un développeur ou un agent ajoute la vision à son application en sélectionnant les capacités qu'il souhaite (intake guidée) ou en les décrivant en langage naturel, et le skill route vers un profil développeur validé — ou compose la plus petite couche delta par-dessus — et la déploie. Utilisez-le chaque fois que l'utilisateur souhaite que les capacités de vision soient composées pour lui : déployer un profil stock, étendre un déploiement en cours d'exécution, ou créer une petite combinaison personnalisée.
Deux entrées : intake guidée (énoncez une intention ouverte comme « construire un agent vision » / « ajouter des capacités de vision » et le skill vous guide à travers la sélection des capacités) ou piloté par prompt (nommez la capacité ou le profil directement). Les deux aboutissent au même flux de routage et de composition.
Références
references/composition.md— règles de profil delta, sélection de Foundation, contrat des artefacts de build, résolution et validation.references/deployment.md— cycle de vie du déploiement Compose résolu.references/deployment_resolution.md— publication du déploiement deVSS_PUBLIC_URL, mappages de routes publiques et contrat d'endpoint consommé par les skills d'opération.references/teardown.md— nettoyage par défaut du volume du projet, teardown explicite préservant le cache, suppression des volumes obsolètes et nettoyage des données montées.references/prerequisites.md,references/credentials.mdetreferences/ngc.md— vérifications du host, du runtime GPU, du firewall, des credentials, des droits et d'NGC.references/sizing.md— dimensionnement du profil développeur consolidé, placement de modèles, budgets GPU partagés, capacité de stream, ajustement d'utilisation et validation.references/edge.md— routage DGX Spark et Thor, budgétisation de la mémoire unifiée, gestion du cache et recettes de modèles edge.references/env-overrides.md,references/data-directory.md,references/readiness.md,references/troubleshooting.mdetreferences/brev.md— vérifications de déploiement, préparation obligatoire du répertoire de données et conseils runtime spécifiques à l'environnement.references/profiles/— capacités du profil développeur actuel, ensembles de services exacts, mappages de propriétaires, knobs, vérifications de readiness et sources.references/services/— contrats propriétaire-capacité pour les clés de service, pairs requis, knobs d'environnement configurables et sources.
Routage
| Requête | Route |
|---|---|
Déployer, démarrer, exécuter, vérifier ou arrêter un profil base, alerts, lvs ou search nommé |
Mode stock pour ce profil. |
| Toute requête warehouse — déployer, exécuter, vérifier, arrêter, personnaliser | references/profiles/warehouse.md possède chaque fait warehouse. Il ne porte aucune question d'intake ni aucune séquence d'étapes — la sélection de variante est Q2w ci-dessous, et le cycle de vie est les Steps partagés. Warehouse enregistre ses propres sources via bp-configurator-<mode> ; ne provisionnez jamais manuellement un. Sélectionnez une variante par Q2w et développez sa liste COMPOSE_PROFILES_WH_* verbatim. Warehouse est sélection de variante, pas composition : pour changer la forme d'un déploiement, sélectionnez une variante différente. |
| Déployer des capacités qui correspondent exactement à un profil développeur actuel | Mode stock pour la correspondance exacte. |
| Construire, créer, étendre, personnaliser, combiner, ajouter ou supprimer des capacités | Mode delta utilisant le profil développeur actuel le plus proche comme Foundation. |
| Un profil nommé qualifié comme headless | Mode delta sur ce profil, pas un déploiement stock. |
| Déployer des capacités sans correspondance exacte | Construire la plus petite delta, puis la déployer. |
| Provisionner, enregistrer ou ingérer une source (fichier ou stream en direct) dans un build déployé, ou la distribuer aux consommateurs | vss-manage-video-io-storage references/provision-vios-source.md — headless, REST direct (résoudre les ports consommateur de resolved.yml, confirmer l'absence de vss-agent) ; pas vss-search-archive. |
| La résolution laisse un bloqueur que les règles ne peuvent pas résoudre (capacité non mappée ou ambiguë, Foundation en égalité, conflit singleton ou contradiction demandée/exclue) | Clarification gate (references/composition.md) : après une passe déterministe, posez une question structurée, puis résolvez sur la réponse. Ne relancez jamais la même résolution ni ne deviez le bloquer. |
smartcities ou un autre profil industriel |
Arrêt : warehouse est la seule Foundation industrielle supportée. |
| Intention ouverte / générique / « quickstart » sans capacité ou profil nommé | Porte d'entrée guidée (Q1) : Workflow pré-construit (mode stock) ou build personnalisé (mode delta). |
Mode Entrée (Étape 0)
Avant le routage, détectez le mode d'entrée — l'un des trois : piloté par prompt, workflow pré-construit ou build personnalisé. Les trois partagent les mêmes machines en aval (catalogue de profils, sélection de Foundation, composition delta, résolution et déploiement) ; le mode ne détermine que le point d'entrée du flux. Workflow pré-construit est un chemin rapide — il déploie l'ensemble de services autoritaire d'un profil développeur validé inchangé en mode stock (aucune delta de capacité), produisant toujours un _builds/<name>/ stock minimal pour le cycle de vie partagé valider → déployer → readiness → teardown — tandis que build personnalisé est une porte d'entrée guidée sur le mode delta.
Étape 0.0 — Détection du mode d'entrée
Classez la requête avant tout autre travail :
- Une capacité concrète, un microservice, un profil ou un déploiement existant est nommé (par ex. « créer un profil pour le captioning dense en streaming », « ajouter une recherche agentique à mon déploiement de base », « déployer le profil alerts ») → piloté par prompt. Parsez les entrées et continuez à l'étape 1.
- Une intention ouverte / générique / première utilisation / « quickstart » sans capacité extractible (par ex. « construire un agent vision », « ajouter des capacités de vision », « aidez-moi à démarrer », « déployez juste quelque chose »), ou aucune description de capacité du tout → ouvrez la porte d'entrée guidée (Q1 ci-dessous), qui mène au workflow pré-construit (la valeur par défaut recommandée) et offre le build personnalisé.
- Ambigu → posez une question de désambiguïsation, ou basculez vers la porte d'entrée guidée (c'est sûr, réversible et explicite : l'utilisateur fait des sélections avant que quoi que ce soit soit généré ou déployé). Ne supposez jamais silencieusement une capacité ni ne reveniez à un profil par défaut.
Porte d'entrée guidée — Q1
Posez via AskUserQuestion (sélection unique). Ne générez ni ne déployez rien jusqu'à ce que l'utilisateur sélectionne ET confirme en aval (le prompt de déploiement pour le workflow pré-construit ; le diagramme d'architecture de l'étape 6 pour le build personnalisé).
Q1 — Point de départ. « Comment aimeriez-vous démarrer ? »
- Déployer un workflow développeur pré-construit (recommandé pour une première utilisation / quickstart) — Choisissez parmi un profil développeur VSS validé prêt à l'emploi. Chemin le plus rapide vers un système en cours d'exécution ; aucune composition requise. Déployé tel quel ; vous pouvez le personnaliser par la suite. → Q2a
- Déployer un blueprint industriel pré-construit — Perception multi-caméra Warehouse (2D RT-DETR ou 3D Sparse4D) avec analytique comportementale. Déployé tel quel. → Q2w
- Construire une configuration personnalisée — sélectionnez les capacités de vision spécifiques dont vous avez besoin et laissez le skill composer la plus petite couche delta pour elles. → Q2b
Mode : Workflow pré-construit (quickstart)
Le chemin de première utilisation recommandé. Déploie un profil développeur validé via mode stock — il garde le COMPOSE_PROFILES autoritaire du profil inchangé (aucune delta : aucune clé de profil ajoutée ou supprimée, aucune nouvelle composition de service), puis écrit et déploie les artefacts stock standards _builds/<name>/ comme tout autre build (étapes 5-9). Posez Q2a (sélection unique) : « Quel workflow pré-construit voulez-vous déployer ? » et mappez le choix au profil développeur :
| Option | Capacité | Profil |
|---|---|---|
| Base | Dense captioning VLM et Q&A | base |
| Alerts | Alerte VLM en temps réel ou vérification d'alerte | alerts (mode choisi dans Q2a-mode) |
| Résumé Vidéo | Résumés vidéo avec fenêtres temporelles | lvs |
| Recherche | Embeddings objet et vidéo + recherche agentique | search |
Limite de quatre options.
AskUserQuestionaffiche au maximum quatre options par question (sélection unique ou multiple), donc Q2a doit rester sur les quatre profils développeur ci-dessus. Les deux modes du profilalertsne sont pas des lignes de haut niveau séparées (ce serait une cinquième option et serait silencieusement supprimé) ; ils sont choisis dans un suivi, Q2a-mode, ci-dessous. Plus généralement, toute question nécessitant plus de quatre choix ne doit pas utiliser le widgetAskUserQuestion— présentez les options en ligne dans la conversation et collectez une réponse tapée à la place (voir Q2b, qui le fait pour la multi-sélection de capacité).
Q2a-mode — uniquement quand l'utilisateur choisit Alerts (sélection unique) : « Quel mode d'alerte ? » Le profil développeur alerts est livré avec deux modes, sélectionnés par son knob MODE ; chacun a son propre ensemble COMPOSE_PROFILES enregistré dans dev-profile-alerts/overrides.env, donc les deux sont toujours des déploiements stock (aucune delta) :
| Option | Capacité | Mode |
|---|---|---|
| Alerte en temps réel | Inspection RT-VLM continue + APIs d'alerte en temps réel | 2d_vlm |
| Vérification d'alerte | Détection objet avec analytique et contextualisaction d'événement VLM (détection RT-CV + analytique comportementale + vérification VLM + incidents) | 2d_cv |
Ce sont des profils développeur prédéfinis — le skill garde le COMPOSE_PROFILES autoritaire du profil inchangé (mode stock, correspondance exacte de l'étape 5) et suit le cycle de vie de build partagé (étapes 5-9). Pour Alerts, définissez le MODE du profil par Q2a-mode.
Personnaliser un workflow pré-construit → Build personnalisé. Après un déploiement pré-construit (ou à la place du déploiement), offrez : « Voulez-vous personnaliser ce workflow ? J'utiliserai <profil sélectionné> comme point de départ. » En cas de oui, basculez dans le build personnalisé, en ensemençant le profil sélectionné comme Foundation et en calculant une delta de capacité par-dessus (le profil lui-même n'est jamais modifié — il est seulement la ligne de base). Le build stock devient un build delta : les mêmes machines _builds/<name>/ portent maintenant les clés de profil ajoutées/supprimées et tout knob modifié.
Mode : Blueprint industriel pré-construit (warehouse)
Atteint de Q1 → blueprint industriel, ou quand la requête nomme warehouse directement. Développez la liste de services de la variante sélectionnée verbatim — warehouse est sélection de variante, pas composition, donc il n'y a pas de chemin delta. Lisez references/profiles/warehouse.md avant de poser des questions, et appliquez ses contraintes strictes en posant les questions, pas après.
Jusqu'à trois questions de sélection unique, chacune dans la limite de quatre options. Décrivez chaque option à partir du tableau Profile Service Set de warehouse.md ; ne reformulez pas ses listes de services ici, ou ce tableau dérive de celui qui est autoritaire :
| Question | Options |
|---|---|
| Q2w-mode — « Quel mode de perception warehouse ? » | 2d (RT-DETR) · 3d (Sparse4D, conscient de la profondeur) |
| Q2w-profile — « Quelle variante de déploiement ? » | bp_wh · bp_wh_kafka · bp_wh_redis |
| Q2w-size — « Minimal ou étendu ? » | Étendu · Minimal |
Filtrez les options restantes plutôt que de valider les réponses après. Les deux filtres ci-dessous sont ceux de warehouse.md à énoncer ; c'est la source de vérité sur le pourquoi, et cette liste dit seulement quand les appliquer :
- Omettez
bp_whde Q2w-profile quand Q2w-mode est3d— Contraintes strictes :bp_whest 2D uniquement. Le laisser sélectionnable transforme un déploiement impossible en échec runtime tardif. - Ignorez Q2w-size entièrement pour
bp_wh— le tableau Profile Service Set ne liste aucune variante minimale pour celui-ci. - Définissez
SAMPLE_VIDEO_DATASETetNUM_STREAMSà partir de la variante choisie, pas du Foundation par défaut ; l'appairage dataset ↔ variante est une contrainte stricte.
Les réponses sélectionnent exactement une liste COMPOSE_PROFILES_WH_*. Enregistrez son nom dans FOUNDATION_VARIANT, développez-le verbatim dans COMPOSE_PROFILES, et continuez à l'étape 2 avec FOUNDATION=warehouse. Le cycle de vie partagé s'applique de là, avec quatre divergences warehouse : ignorez l'étape 4 (la references/composition.md est le flux delta), l'ensemble de services effectif de l'étape 5 est déjà fixé ci-dessus, l'étape 7 écrit également configurator.env, et l'étape 8 résout par references/profiles/warehouse.md plutôt que le flux delta dans references/composition.md.
Mode : Build personnalisé (guidé)
Pour un utilisateur qui souhaite une composition spécifique. Atteint de Q1 → build personnalisé, ou en personnalisant un workflow pré-construit (ensemencé avec ce profil comme Foundation). Posez Q2b (multi-sélection) : « Quelles capacités de vision voulez-vous ? (sélectionnez tout ce qui s'applique) » Chaque option mappe aux clés de profil de service canoniques possédées par un propriétaire de capacité sous references/services/. Video I/O + storage (VIOS) est toujours inclus — chaque profil en a besoin — ainsi que le pair cache redis partagé qui est livré avec la Foundation ; présentez ceux-ci comme informationnels, pas comme des choix. La pile ELK + Kafka message bus / indexing n'est pas inconditionnelle : elle est ajoutée uniquement quand une capacité sélectionnée est Kafka-backed ou Elasticsearch-indexed (voir la note sous le tableau), donc un build dense-captioning uniquement garde la plus petite delta. (Quand ensemencé d'un workflow pré-construit, les capacités de ce profil sont pré-cochées.)
Offrez à l'utilisateur exactement les capacités du tableau ci-dessous. Le contrat propriétaire de chaque ligne, les clés de profil de service canoniques et le profil Foundation le plus proche sont fixés — n'inventez pas d'options ou de clés en dehors. Parce que cette liste peut dépasser quatre lignes et AskUserQuestion plafonne une question à quatre options, ne posez pas Q2b via le widget AskUserQuestion — présentez ce tableau dans la conversation et faites répondre l'utilisateur avec les capacités qu'il souhaite (par nom ou numéro ; plusieurs autorisées). Revenez à une multi-sélection AskUserQuestion uniquement quand quatre capacités ou moins restent offrisables.
| Option (affichée à l'utilisateur) | Contrat propriétaire (references/services/) |
Clé(s) de profil de service canonique | Foundation la plus proche | Notes pair |
|---|---|---|---|---|
| Dense captioning — descriptions en langage naturel de la vidéo | rt-vlm.md |
rtvi-vlm |
base |
— |
| Object detection & tracking (2D) — cadres de délimitation, étiquettes de classe, IDs de suivi | rt-cv.md |
perception-2d-fusion (search) / perception-alerts (alerts) |
search |
Kafka-backed ; utilisez la clé du profil sélectionné, pas la source extends perception partagée |
| Semantic search over video — embeddings + recherche agentique | search.md (+ rt-embed.md) |
vss-search-analytics-2d-fusion, rtvi-embed |
search |
Nécessite RT-CV + RT-Embed + ELK ; la critique nécessite RT-VLM à moins d'être désactivée |
| Real-time alerting / verification — incidents vérifiés VLM | alerts.md |
alert-bridge, vss-va-mcp, vss-video-analytics-api |
alerts |
Real-time nécessite RT-VLM ; CV-verification nécessite RT-CV + Behavior Analytics |
| Video summarization — résumés avec fenêtres temporelles à la demande | lvs.md |
lvs-server |
lvs |
Nécessite Agent + un LLM accessible + un VLM/RT-VLM |
Toujours inclus — ne l'offrez pas comme choix : VIOS video I/O + storage (vios.md), l'ingress HAProxy (ingress.md) — fournissant une interface stable et unifiée à la pile VSS de sorte que les agents et les skills fassent référence à un endpoint unique plutôt qu'à des ports par service — plus le pair cache redis partagé livré avec la Foundation. Ajoutés conditionnellement, jamais offerts directement : la pile ELK + Kafka broker / indexing (elk.md) est tirée uniquement pour les capacités qui sont Kafka-backed ou Elasticsearch-indexed — recherche sémantique (vss-search-analytics-2d-fusion + rtvi-embed), alerte/vérification en temps réel (alert-bridge nécessite Kafka + Elasticsearch), ou résumé vidéo quand son backend Kafka/ES event ou DB est activé ; RT-VLM ajoute Kafka uniquement quand RTVI_VLM_KAFKA_ENABLED=true. Un build dense-captioning uniquement sur base n'ajoute donc aucun ELK/Kafka, préservant le contrat plus petite-delta. Le backend de modèle LLM NIM (llm-nim.md) et VLM NIM (vlm-nim.md) sont de même activés uniquement quand une capacité sélectionnée nécessite un modèle local (RT-VLM intégré est le propriétaire rt-vlm.md, pas le backend VLM NIM).
Règles pour la multi-sélection :
- Offrez exactement les lignes du tableau dont le contrat propriétaire existe sous
references/services/(toutes les lignes sont présentes sur cette branche) ; affichez toute capacité en attente désactivée avec une courte note « pas encore disponible ». N'offrez jamais un propriétaire fondationnel ou de backend de modèle comme choix — n'offrez pas silencieusement une capacité que le skill ne peut pas résoudre. - Nécessitez au moins une capacité — les services fondationnels seuls ne sont pas un agent vision.
- Les sélections multiples composent dans un déploiement (par ex. captioning + alerting, ou captioning + detection).
Après Q2b, les capacités sélectionnées sont l'ensemble des capacités requises. Sélectionnez le profil développeur actuel le plus proche comme Foundation, calculez la plus petite delta (ajoutez ou supprimez uniquement les clés de profil de service canoniques, modifiez uniquement les knobs demandés), et continuez à l'étape 2. C'est le mode delta (selon le tableau de routage) ; _builds/<name>/ est créé ici.
Étapes
- Détectez le mode d'entrée (voir Mode Entrée (Étape 0) ci-dessus). Puis parsez la requête et toute spécification d'évaluation en capacités requises, capacités exclues, knobs de configuration et vérifications de succès observables. Le build personnalisé fournit l'ensemble des capacités directement via multi-sélection ; le workflow pré-construit garde l'ensemble de services autoritaire d'un profil nommé inchangé (mode stock).
- Lisez le fichier correspondant sous
references/profiles/etreferences/sizing.md. En mode delta, comparez les quatre profils développeur et sélectionnez exactement une Foundation ; demandez uniquement quand deux sont également plausibles.warehousen'entre jamais en concurrence dans cette comparaison — il est sélectionné uniquement par une requête warehouse explicite. Lisezreferences/edge.mdpour DGX Spark ou Thor. - Avant la résolution ou le déploiement, exécutez les vérifications applicables de
references/prerequisites.md,references/credentials.mdetreferences/ngc.md. Lisez les références d'environnement et Brev le cas échéant. - Lisez
references/composition.mdet uniquement les fichiers de propriétaire de capacité sousreferences/services/requis par la requête. - Déterminez l'ensemble de services effectif. Pour une correspondance stock exacte, gardez son ensemble autoritaire inchangé. Sinon, calculez la plus petite delta à partir du
COMPOSE_PROFILESexact de la Foundation : ajoutez ou supprimez uniquement les clés de profil de service canoniques et modifiez uniquement les knobs d'environnement demandés. Si cette passe unique laisse un bloqueur que les règles ne peuvent pas résoudre (une capacité non mappée ou ambiguë, une Foundation en égalité, un conflit singleton ou une contradiction demandée/exclue), appliquez la clarification gate dansreferences/composition.md: posez une question structurée, puis résolvez sur la réponse ; ne relancez jamais la même résolution ni ne deviez le bloquer. - Avant d'écrire les artefacts delta ou de démarrer un déploiement stock ou delta, présentez un diagramme d'architecture compact dans la conversation. Montrez la Foundation, les propriétaires de capacité ajoutés et supprimés et les clés de service, les flux de données et topics principaux, les endpoints externes et le placement GPU/modèle. Ne sauvegardez pas le diagramme comme un artefact de build.
- Pour tout build stock ou delta, écrivez
_builds/<name>/override.env,_builds/<name>/compose.ymlet_builds/<name>/resolved.yml. Mettez la Foundation, l'intégralité desCOMPOSE_PROFILESeffectifs, les valeurs de chemin/host requises au build local et uniquement les valeurs d'environnement qui sont personnalisées ou transitivement dérivées d'une personnalisation dansoverride.env; ne copiez pas les defaults inchangés de Foundation comme les ports stock ou les knobs de modèle. Faites quecompose.ymlinclue le rootdeploy/docker/compose.ymlplus uniquement les fichiers Compose de service minimales modifiés ou nouveaux, le cas échéant. Traitez<name>uniquement comme une étiquette de système de fichiers ; n'ajoutez jamais auCOMPOSE_PROFILES. - Générez
resolved.ymlavecdocker compose configen utilisant les couches d'environnement ordonnées dansreferences/composition.md— ou, pourwarehouse, les couches d'environnement et le pipeline de résolution dansreferences/profiles/warehouse.md— normalisez les dépendances optionnelles en attente avecscripts/normalize_resolved_yml.py, puis exécutez la gate de vérification/création obligatoire dansreferences/data-directory.mdsur chaque build, déployer ou non — elle bloque un buildwarehousedont${VSS_DATA_DIR}n'est pas le bundle app-data fourni — elle prépare le${VSS_DATA_DIR}externe que toute future mise en place a besoin (cet agent ou unedocker compose upexécutée manuellement) et ne touche jamais l'arborescence du repo. Quand l'ensembleCOMPOSE_PROFILESeffectif inclut une clé de perception RT-CV (perception-alerts,perception-2d-fusion), aucun staging de détecteur côté host ou agent n'est requis : le conteneur RT-CV télécharge le détecteur ONNX au premier démarrage (phase ds-start 0) de sonmodels-download.jsonmonté dans le${VSS_DATA_DIR}/modelsaccessible en écriture que la gate vient de créer. Rejetez les placeholders obsolètes et les sources bind enregistrées invalides avecscripts/validate_resolved_yml.py; si la validation trouve une vraie interpolation Compose${...}non résolue, ajoutez uniquement les valeurs concrètes manquantes àoverride.envet régénérez avant de continuer. Ne comptez pas les variables de shell conteneur échappées comme$${HOST_IP}comme une interpolation Compose non résolue. Validez les clés sélectionnées, les services, les images, les pairs requis, le placement GPU, l'utilisation et les vérifications de succès demandées contre ce fichier exact. - Si le déploiement a été demandé, déployez le
_builds/<name>/resolved.ymlexact validé à l'étape précédente, rafraîchissez ses images de registry même quand leurs tags existent déjà localement, utilisezreferences/readiness.mdavec les vérifications de profil correspondantes, et suivezreferences/deployment.mdpour le cycle de vie Compose résolu. Quand une source doit être provisionnée dans le build déployé (un build headless n'en enregistre aucun au bring-up), résolvez les ports consommateur et confirmez que le build est headless (pas devss-agent) deresolved.yml, puis suivezvss-manage-video-io-storagereferences/provision-vios-source.md— sauf pourwarehouse, qui enregistre ses propres sources automatiquement. Quand une requête de tour d'aller-retour de recherche est alors demandée contre le build déployé, exécutezvss configure --base-url <build-origin>(lahttp://$HOST_IP:$HAPROXY_HOST_PORTfrontale) via le point d'entrée project-local (uv run --project <repo>/services/agent --no-dev vss …, perreferences/deployment_resolution.md) — pas unvssbrut — puis déférez entièrement àvss-search-archivepour la décomposition, le mode et la requête elle-même. Pour arrêter ou nettoyer, suivezreferences/teardown.md: supprimez les volumes du projet par défaut et préservez les caches de modèle uniquement quand l'utilisateur le demande explicitement.