# PRD — « veille-ia » : observatoire souverain des modèles génératifs ## Application YunoHost custom (SvelteKit) pour cyber-mawonaj.net **Version :** 1.0 — 1er août 2026 **Porteur :** factotum numérique indépendant (Guadeloupe) **Contraintes :** 100 % open-source (licences OSI uniquement), self-hosted YunoHost, ~0 €/mois marginal, pas de dépendance SaaS obligatoire. --- ## 1. Problème à résoudre Les modèles génératifs (image, vidéo, SVG, LLM, audio) et leurs **licences** changent toutes les 72 h. Le porteur produit dans 5 contextes aux contraintes juridiques différentes (VN Ren'Py CC BY-NC-ND, vente d'images, clips vendus, jeux Steam/itch.io, diffusion libre). La veille manuelle est chronophage ; aucun outil existant ne fait la boucle complète **surveiller → analyser → recommander selon le besoin → adapter les workflows**. ## 2. Vision Un observatoire personnel qui : 1. **Surveille** automatiquement sorties de modèles, changements de licence/ToS, leaderboards et changelog ComfyUI ; 2. **Analyse** chaque événement avec un LLM local (classification structurée, pas de résumé vague) ; 3. **Maintient un registre** des modèles (source de vérité unique, versionnée git) ; 4. **Recommande** des modèles en croisant le registre avec des profils de projets à contraintes ; 5. **Régénère** les documents (guides markdown) et **adapte** les workflows ComfyUI paramétriques sans réinventer le graphe. ## 3. Architecture ``` ┌─ cyber-mawonaj.net (YunoHost) ─────────────────────────────────────┐ │ │ │ changedetection_ynh ──webhook──┐ │ │ (surveillance pages licences, │ │ │ leaderboards, blogs) ▼ │ │ nodered_ynh (Apache 2.0, ~100 Mo) │ │ flows: ingestion RSS, appel LLM, │ │ routage, notifications │ │ │ ▲ │ │ HTTP/classifier │ │ HTTP /api/alerts │ │ ▼ │ │ │ Ollama (local machine ou VPS — voir §8.4) │ │ Qwen3-32B / Kimi K2.5 — classifieur JSON structuré │ │ │ │ │ ▼ │ │ ★ veille-ia (APP CUSTOM — ce projet) │ │ SvelteKit + adapter-node, service systemd, SSO YunoHost │ │ - Registre modèles (YAML + git via Gitea_ynh) │ │ - Profils projets (YAML) │ │ - Moteur de recommandation │ │ - Inbox alertes │ │ - Exporteur de documents markdown │ │ - (Phase 2) Templates ComfyUI paramétriques + smoke tests │ │ │ │ FreshRSS_ynh (flux RSS sources) · Gitea_ynh (versioning) │ └────────────────────────────────────────────────────────────────────┘ ``` **Principe d'intégration YunoHost :** toutes les briques périphériques existent dans le catalogue officiel — ne rien ré-empaqueter. Le projet ne package **que** l'app `veille-ia`. ## 4. Modules fonctionnels de l'app ### 4.1 Registre des modèles (MVP) CRUD sur `data/registre_modeles.yaml`, versionné git (commit à chaque modification, push optionnel vers Gitea_ynh). ```yaml - id: krea-2-turbo nom: Krea 2 Turbo editeur: Krea AI modalites: [image] licence: nom: Krea 2 Community License url: https://huggingface.co/krea/Krea-2-Turbo commercial_ok: true seuil: "équipes <50 sièges" attribution_requise: false poids_ouverts: true garde_fous_obligatoires: true # anti-NCII/CSAM capacites: nsfw_ok: true # en local, sous réserve garde-fous licence vram_gb: 12 # fp8 resolution_max: "2K" comfyui_natif: true # ≥ 0.25.0 licence_outputs: "commercialisables" scores: arena_image: 6 # rang Artificial Analysis, juin 2026 statut: production # production | early-access | annonce | mort derniere_verif: 2026-08-01 sources: ["https://..."] notes: "Encodeur Qwen3-VL, VAE Qwen Image. LoRA-friendly." ``` ⚠️ Règle anti-hallucination gravée dans le modèle de données : tout champ non vérifié publiquement prend la valeur `null` + affichage « ⚠️ à vérifier » — jamais de valeur inventée. ### 4.2 Profils projets (MVP) CRUD sur `data/profils_projets.yaml` — pré-rempli avec les 5 contextes : ```yaml - id: vn_renpy_adulte nom: "VN Ren'Py (CC BY-NC / BY-NC-ND)" requiert: [commercial_ok] exclut: [] preferences: nsfw_ok: obligatoire poids_ouverts: fortement_prefere comfyui_natif: prefere plateformes: [steam, itch_io] contraintes_specifiques: "Déclaration IA Steam + tag itch.io obligatoires. NSFW => local uniquement." - id: prestation_images nom: "Vente d'images (prestataire)" requiert: [commercial_ok, licence_outputs_commercialisables] exclut: [attribution_requise] # configurable selon client ... - id: clips_vendus / jeu_steam_itch / diffusion_libre # idem ``` ### 4.3 Moteur de recommandation (MVP) - Entrée : `profil_id` + filtres ad hoc (`modalite`, `vram_max`, `budget: 0`). - Logique : filtrage dur (requiert/exclut) → scoring pondéré (préférences, rang arena, fraîcheur `derniere_verif`, pénalité `statut != production` et champs `null`). - Sortie : shortlist classée **avec justification par modèle** (pourquoi éligible, quels warnings : attribution, seuil, licence à vérifier, déclaration plateforme). - Route API `POST /api/recommander` + page UI dédiée. ### 4.4 Inbox alertes (MVP) - `POST /api/alerts` (token secret) reçoit les événements classifiés depuis Node-RED. - Schéma : `{type: nouvelle_sortie|changement_licence|changement_classement|comfyui_support, modele_id?, titre, resume, impact_profils: [...], urgence, sources[], date}`. - UI : inbox filtrable par profil impacté ; action « Créer/MAJ fiche modèle » qui pré-remplit le registre ; action « Marquer traité ». ### 4.5 Exporteur de documents (MVP) Bouton « Régénérer » : produit les guides markdown (licences, classements) **depuis le registre** — les documents deviennent des exports, plus des fichiers maintenus à la main. Templates markdown éditables dans l'UI. ### 4.6 Templates ComfyUI (Phase 2) - Stockage de workflows JSON paramétrés (variables : `{{modele_checkpoint}}`, `{{vram_profile}}`, `{{resolution}}`). - Quand `registre` change → régénération des JSON concrets + commit git. - Smoke test headless : POST du prompt canari sur l'API ComfyUI (`/prompt`) de la machine de prod, remontée du statut dans l'UI. - ⚠️ Ne pas promettre la réécriture automatique de graphes : on paramètre, on ne régénère pas la topologie. ## 5. Flows Node-RED à livrer (JSON importables) 1. **`rss-ingest`** : poll flux (HF blog, BFL, MiniMax, Krea, Artificial Analysis, changelog ComfyUI, GitHub releases) via FreshRSS API ou nodes RSS → dédup → POST classifier. 2. **`license-watch`** : réception webhooks changedetection_ynh (URLs ToS/licences configurées : BFL, MiniMax Community License, cards HF, Midjourney, Runway, Suno, Steam/itch.io policies) → diff → POST classifier avec `type: changement_licence`, urgence haute. 3. **`classifier`** : HTTP POST vers Ollama (`/api/chat`, `format: json`) avec prompt système figé (cf. §6) → POST `/api/alerts`. 4. **`notify`** : routage urgence haute → email (SMTP YunoHost) et/ou ntfy/Matrix ; le reste reste en inbox. ## 6. Prompt système du classifieur (figé, versionné) ``` Tu es un classifieur d'événements IA pour un créateur indépendant. Réponds UNIQUEMENT en JSON valide respectant ce schéma : {type, modele, editeur, modalites[], licence: {nom, commercial_ok(nullable), seuil(nullable), attribution_requise(nullable), poids_ouverts(nullable)}, nsfw_ok(nullable), vram_gb(nullable), comfyui_natif(nullable), statut, impact_profils[], resume(2 phrases max), sources[], confiance: haute|moyenne|faible} RÈGLES STRICTES : si une information n'est pas explicitement présente dans le texte source, mets null. N'invente jamais une licence, un prix ou un benchmark. Signale les benchmarks auto-rapportés par l'éditeur (confiance: moyenne max). ``` ## 7. Packaging YunoHost (`veil-le-ia_ynh`) - Format packaging v2 (`manifest.toml`), helpers officiels, doc : doc.yunohost.org/packaging_apps. - Ressources : `ports` (1 port node), `nodejs` (version LTS), `system_user`, `install_dir` (`/var/www/veille-ia`), `data_dir` (`/home/yunohost.app/veille-ia` : YAML + git). - Service systemd via `ynh_add_systemd_config`, reverse proxy nginx via `ynh_add_nginx_config`. - **SSO** : permission `visitors: false` — app privée derrière SSOwat ; header SSO validé côté SvelteKit (hooks) ou auth par défaut admin uniquement. - Scripts : `install`, `remove`, `upgrade`, `backup`, `restore`, `change_url`. - CI : `package_check` doit passer (niveau ≥ 7 visé). - Licence du package et de l'app : AGPL-3.0 (cohérent libriste ; AGPL car app web). ## 8. Contraintes techniques & décisions 1. **Svelte** : recommandations détaillées fournies séparément par le porteur (`SPECS_SVELTE.md` à la racine du projet — le code doit les suivre strictement ; si absent, appliquer : SvelteKit + TypeScript strict + adapter-node, pas de framework CSS lourd sans accord). 2. **Persistance : fichiers YAML + git** (pas de base de données au MVP — lisible, sauvegardable, diffable). SQLite via Drizzle admis en Phase 2 si le volume d'alertes le justifie. 3. **Zéro appel API payant** : tout le LLM passe par Ollama local. OpenRouter optionnel derrière un flag de config, désactivé par défaut. 4. **Ollama** : si paquet YunoHost indisponible/non maintenu → installation Docker hors YNH ou sur la machine locale du porteur, joignable par HTTP (wireguard/lan). Documenter les deux chemins dans le README. 5. **Anti-hallucination systémique** : champs nullables + badge « à vérifier » ; aucune écriture dans `registre` sans `sources[]` non vide. 6. **i18n** : français d'abord, structure prête pour créole/anglais. ## 9. Roadmap | Phase | Contenu | Critère de sortie | |---|---|---| | 0 | Socle app SvelteKit + packaging YNH minimal (install/remove/backup OK) | `package_check` vert, app accessible via SSO | | 1 | Registre + profils + moteur de recommandation + UI | Shortlist correcte sur les 5 profils pré-remplis | | 2 | Inbox alertes + flow Node-RED `classifier` + export markdown | Une alerte changedetection réelle arrive classifiée dans l'inbox | | 3 | Templates ComfyUI + smoke tests | Régénération JSON + test canari vert | | 4 | Durcissement : i18n, SQLite si besoin, niveau 8 package_check | — | ## 10. Hors périmètre (v1) - Réécriture automatique de graphes ComfyUI (topologie) — paramétrage seulement. - Scraping de plateformes à login (X/Twitter, Discord) — sources RSS/Atom/web uniquement. - Multi-utilisateurs (app personnelle). - Notifications push mobile natives (ntfy suffit).