Inclut SPECS_SVELTE.md : conventions Svelte 5/SvelteKit pour veille-ia, consolidées depuis doc2sveltekit-transition (playbook, charte OKI, best practices).
12 KiB
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 :
- Surveille automatiquement sorties de modèles, changements de licence/ToS, leaderboards et changelog ComfyUI ;
- Analyse chaque événement avec un LLM local (classification structurée, pas de résumé vague) ;
- Maintient un registre des modèles (source de vérité unique, versionnée git) ;
- Recommande des modèles en croisant le registre avec des profils de projets à contraintes ;
- 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).
- 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 :
- 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 != productionet champsnull). - 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
registrechange → 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)
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.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 avectype: changement_licence, urgence haute.classifier: HTTP POST vers Ollama (/api/chat,format: json) avec prompt système figé (cf. §6) → POST/api/alerts.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 viaynh_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_checkdoit 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
- 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). - 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.
- 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.
- 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.
- Anti-hallucination systémique : champs nullables + badge « à vérifier » ; aucune écriture dans
registresanssources[]non vide. - 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).