Inclut SPECS_SVELTE.md : conventions Svelte 5/SvelteKit pour veille-ia, consolidées depuis doc2sveltekit-transition (playbook, charte OKI, best practices).
190 lines
12 KiB
Markdown
190 lines
12 KiB
Markdown
# 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).
|