195 lines
10 KiB
Markdown
195 lines
10 KiB
Markdown
# I — Prompt Session 3 : IA + Deploy NAV V2
|
||
|
||
> **Session dédiée Claude Code, modèle Opus pilote avec délégation sous-agents Sonnet autorisée.**
|
||
> Prérequis : Sessions 1 et 2 terminées (front navigable, fiches visibles, formulaire OK).
|
||
> Durée estimée : 6-8h.
|
||
> Autonomie : 6/10 (checkpoints : test pipeline IA sur 3 fiches + deploy final).
|
||
|
||
## Mission
|
||
|
||
Brancher la couche IA et déployer la V2 :
|
||
1. Worker IA async qui enrichit les soumissions (Mistral Nemo)
|
||
2. Chatbot recherche sémantique (Mistral Small)
|
||
3. Bandeau bas stats (coût IA + dons + activité)
|
||
4. Page `/a-propos` (souveraineté, gouvernance, transparence Liberapay)
|
||
5. Deploy production `nav.trans-former.fr`
|
||
6. Test pipeline IA sur les 3 fiches réservées
|
||
|
||
## Fichiers de référence (à LIRE en premier)
|
||
|
||
Tous dans `C:\Users\jules\Dropbox\ATIS - IPCJRA\0 INBOX\NAV-V2-recherches\` :
|
||
- `G-prompt-dev-final.md` (vision V2, étapes 4, 5, 7, 8, 9)
|
||
- `B-provider-ia-souverain.md` (Mistral Nemo + Small, circuit breaker 20€/mois)
|
||
- `C-systeme-dons.md` (Liberapay widget)
|
||
- `F-spec-pipe-collaboration.md` (§3 prompts IA exacts, §4 endpoints)
|
||
- `VPS-check.md` (deploy process)
|
||
- `palette-nav-v2.md` (palette bandeau + /a-propos)
|
||
- `seed-test-pipe-ia.json` (3 fiches CNOA/Archireport/Collectif Fil réservées pour test worker)
|
||
|
||
Journal projet : `1 PROJETS\TECH - infra VPS, website pro, RAG\nav-carte\JOURNAL-V2.md`
|
||
Code en cours : `1 PROJETS\TECH - infra VPS, website pro, RAG\nav-carte\`
|
||
|
||
## Décisions tranchées (Sessions 1 + 2 + pilote S3)
|
||
|
||
- Circuit breaker 20€/mois dépassé → **bandeau "manque de fonds" + CTA Liberapay + pédagogie "1€ = N requêtes" + transparence origine Liberapay**
|
||
- Transparence Liberapay (origine belge, asso non-lucrative, hébergement FR/UE éthique) → section dédiée dans `/a-propos`
|
||
- From email modération : `contact@trans-former.fr`
|
||
- Liberapay URL : `liberapay.com/trans-former.fr` (widgets fournis dans C-systeme-dons.md)
|
||
- **Seuil email modération : 5 fiches `pending`** → envoi mail Jules via Resend
|
||
- **Facteur CO2eq : 0.052 kg CO2/kWh (RTE FR)** pour calcul bandeau carbone
|
||
- **Scraping : crawl4ai seul, pas de fallback httpx+BS4** (diag VPS pilote : crawl4ai occupe 4.3 MB, ms-playwright absent donc crawl4ai tourne en mode statique léger — un seul chemin de code, plus simple à maintenir)
|
||
- **Rate limit chatbot : 10 req/IP/jour** (F §8, fichier JSON `/tmp/nav-ratelimit/{IP_hash}.json`, cron reset journalier)
|
||
- **Prompts Mistral Nemo + Small : copier-coller exact depuis F §3 et §4**, ne pas reformuler
|
||
- **Stack deploy : systemd + Caddy sur nav.trans-former.fr** (même domaine que V1, pas de sous-domaine API)
|
||
- **Endpoint soumission** : `/api/organisations` (POST JSON standard, déjà existant — S2 a utilisé `organisations.post.ts`)
|
||
|
||
## État S1 et S2 — à lire AVANT de coder
|
||
|
||
**Lecture obligatoire en premier** : `1 PROJETS/TECH - infra VPS, website pro, RAG/nav-carte/JOURNAL-V2.md`
|
||
|
||
Points d'attention :
|
||
- 96 fiches importées NocoDB, 3 réservées test pipe IA (CNOA, Archireport, Collectif Fil)
|
||
- 8 anciens records V1 (IDs 1-8, `moderation_status null`) à purger avant deploy prod
|
||
- Divergence taxonomie `moderation_status` tranchée : `approved`/`rejected` partout, `pending` = absence de validation
|
||
- Endpoint NocoDB correct : `/api/v1/db/meta/tables/{id}/columns` (v0.301.5)
|
||
- Disque VPS 76% (21/04) — surveiller pendant scraping, alerter si > 85%
|
||
- Conflit lib Python `rich` résolu avec `--ignore-installed` — vérifier au passage que lightrag tourne toujours (TODO S1)
|
||
|
||
## Préflight avant tout code (obligatoire)
|
||
|
||
1. Lire `JOURNAL-V2.md` en entier
|
||
2. Lire `F-spec-pipe-collaboration.md` §3, §4, §6 (circuit breaker), §7 (endpoints), §9 (worker)
|
||
3. `ssh vps-hetzner "cat /opt/nav-carte/.env | grep -E 'MISTRAL|NOCODB|RESEND'"` → vérifier toutes les clés présentes
|
||
4. `ssh vps-hetzner "df -h /"` → confirmer disque < 85%
|
||
5. Si une clé manque ou disque > 85% → STOP, remonter au pilote Jules
|
||
|
||
## Test coût AVANT de scaler (règle sacrée)
|
||
|
||
Étape 5 (test pipe IA) :
|
||
1. Lancer le worker sur **1 seule fiche** (CNOA)
|
||
2. Vérifier `stats_usage` : tokens_in, tokens_out, cout_eur
|
||
3. Extrapoler coût pour 96 fiches → **si > 1€ pour le batch test, STOP + ping Jules**
|
||
4. Si OK, lancer sur les 2 fiches restantes (Archireport, Collectif Fil)
|
||
|
||
## Credentials
|
||
|
||
```
|
||
VPS : ssh vps-hetzner (port 4422)
|
||
NocoDB : localhost:8070
|
||
Token nav-v2-worker : dans /opt/nav-carte/.env
|
||
Mistral API key : dans /opt/nav-carte/.env (MISTRAL_API_KEY)
|
||
Resend SMTP : /opt/vps-kit/.env
|
||
Deploy : /opt/nav-carte/ (systemd nav-carte.service)
|
||
Domaine : nav.trans-former.fr (Caddy config existante)
|
||
```
|
||
|
||
## Étapes
|
||
|
||
### Étape 4 — Worker IA enrichissement (4-5h)
|
||
|
||
- [ ] Script `worker/enrich.js` (Node.js, lancé via systemd timer toutes les 5 min)
|
||
- [ ] Pipeline :
|
||
1. Fetch `organisations` WHERE `moderation_status=pending` AND `ai_processed=false` (LIMIT 5 par run)
|
||
2. Pour chaque fiche :
|
||
- Scrape URL via **crawl4ai** (timeout 3 min, mode statique) — si échec : flag `scrape_status=failed`, pas de fallback httpx+BS4
|
||
- Truncate contenu scrapé à 4k tokens
|
||
- Appel Mistral Nemo avec prompt **F §3 (copier-coller exact)**
|
||
- Parser réponse → update `description_enrichie`, `points_cles`, `tags_fonction` (si IA propose), `ai_raw_output`, `ai_processed=true`, `scrape_status`
|
||
- Log dans `stats_usage` (model, tokens_in, tokens_out, cout_eur, timestamp, orga_id)
|
||
3. Si **circuit breaker 20€/mois dépassé** : skip enrich, log, trigger bandeau "manque de fonds"
|
||
4. Si **5 fiches en attente modération** : email Jules via Resend (from `contact@trans-former.fr`)
|
||
5. Si scrape échoué : flag `scrape_status=failed`, review manuel
|
||
- [ ] Gestion erreurs : retry 2x, puis flag `scrape_status=failed`
|
||
|
||
### Étape 5 — Test pipeline IA sur 3 fiches (1-2h)
|
||
|
||
Utiliser `seed-test-pipe-ia.json` (3 entrées : CNOA, Archireport, Collectif Fil) :
|
||
- [ ] Injecter manuellement dans NocoDB avec `moderation_status=pending`, `ai_processed=false`
|
||
- [ ] Déclencher worker manuellement (pas attendre cron)
|
||
- [ ] Observer les 3 runs, documenter :
|
||
- Temps d'exécution par fiche
|
||
- Qualité `description_enrichie` et `points_cles`
|
||
- Fonctions détectées par l'IA vs fonctions Jules
|
||
- Coût Mistral (stats_usage)
|
||
- [ ] Produire `1 PROJETS/TECH - infra VPS.../nav-carte/PIPE-IA-DOC.md` : documentation précise du pipeline, input, output, prompts, paramètres — servira de base pour le futur **skill `/mistral-nemo-vps`**
|
||
|
||
### Étape 5bis — Chatbot recherche (3-4h)
|
||
|
||
- [ ] Composant `ChatbotSheet.vue` (bottom-sheet Headless UI, mobile + desktop)
|
||
- [ ] Message onboarding : texte exact E §6
|
||
- [ ] Template requête : champs besoin / thématique / lieu → prompt structuré
|
||
- [ ] API `POST /api/chatbot` :
|
||
- Input : question utilisateur + contexte JSON des fiches (top N matchs par taxonomie)
|
||
- Appel Mistral Small (prompt F §3)
|
||
- Output : fiches recommandées + explication 1-2 lignes par fiche
|
||
- [ ] Rate limit : 10 req/IP/jour, fichier JSON `/tmp/nav-ratelimit/{IP_hash}.json` (F §8, aligné avec S2)
|
||
|
||
### Étape 7 — Bandeau bas + Liberapay (1-2h)
|
||
|
||
- [ ] Composant `BandeauBas.vue`, fond `--nav-primary` 60%
|
||
- [ ] **Gauche** : stats live depuis `stats_usage`
|
||
- Coût mois en cours / 20€
|
||
- Nombre tokens utilisés
|
||
- Carbone estimé : kWh × **0.052 kg CO2eq/kWh (RTE FR)** — valeur tranchée
|
||
- [ ] **Milieu** : CTA "Soutenir NAV" → Liberapay widget (snippet C-systeme-dons.md)
|
||
- [ ] **Droite** : compteurs semaine (nouveaux dons, fiches ajoutées, requêtes chatbot)
|
||
- [ ] **Mode "manque de fonds"** (si circuit breaker dépassé) : bandeau bascule en mode "NAV a épuisé son budget IA ce mois — aide-nous à continuer" + pédagogie "1€ permet ~X requêtes" (calcul depuis prix Mistral)
|
||
|
||
### Étape 8 — Page `/a-propos` (1-2h)
|
||
|
||
- [ ] Sections :
|
||
- **NAV** — mission, esprit collaboratif, pour qui
|
||
- **Souveraineté** — IA française (Mistral), hébergement FR (Hetzner), zéro cookie US
|
||
- **Gouvernance** — qui tient le projet, transparence code (GitHub si public)
|
||
- **Transparence Liberapay** — origine (asso belge Liberapay Recurrent Donations ASBL), non lucrative, pas de cut par défaut, hébergement FR/UE éthique, modèle de dons récurrents
|
||
- **Transparence IA** — modèles utilisés, circuit breaker, coût mensuel visible sur bandeau
|
||
- [ ] Badges : "IA souveraine", "Hébergé en France", "Zéro cookie US"
|
||
- [ ] Lien vers formulaire + widget Liberapay
|
||
|
||
### Étape 9 — Deploy + tests (2-3h)
|
||
|
||
- [ ] Build production (`npm run build`)
|
||
- [ ] **Avant deploy** : purger les 8 anciens records V1 (IDs 1-8, `moderation_status null`) dans NocoDB
|
||
- [ ] Deploy via `git pull && systemctl restart nav-carte.service`
|
||
- [ ] Vérifier DNS `nav.trans-former.fr`, HTTPS Caddy (config V1 déjà présente — vérifier si routes V2 nécessitent ajustement)
|
||
- [ ] **Checkpoint Jules** : test manuel
|
||
- Soumettre une fiche test via `/contribuer`
|
||
- Vérifier passage dans worker (cron 5 min)
|
||
- Jules valide en NocoDB manuellement
|
||
- Vérifier apparition sur la carte
|
||
- [ ] Tester chatbot avec 2-3 requêtes réelles
|
||
- [ ] Tester mobile iOS Safari + Android Chrome
|
||
|
||
## Checkpoints Jules
|
||
|
||
1. Avant étape 5 : valider texte onboarding chatbot + prompt recherche
|
||
2. Étape 5 test pipe : valider qualité enrichissement sur 3 fiches
|
||
3. Étape 8 : review texte `/a-propos` (ton Jules appliqué)
|
||
4. Étape 9 : checkpoint deploy final + submit test
|
||
|
||
## Délégation (Opus pilote)
|
||
|
||
- Sonnet 1 : worker IA + test pipe 3 fiches + PIPE-IA-DOC (étapes 4-5)
|
||
- Sonnet 2 : chatbot (étape 5bis)
|
||
- Sonnet 3 : bandeau + /a-propos (étapes 7-8)
|
||
- Opus : deploy + checkpoint finaux + debug
|
||
|
||
## Règles
|
||
|
||
- Tester pipeline IA sur 1 fiche AVANT de scaler aux 3
|
||
- Circuit breaker 20€ = sacré, jamais dépasser
|
||
- Secrets via `.env`, jamais dans le code
|
||
- Si blocage > 30 min → reporter au pilote
|
||
- À la fin : mettre à jour JOURNAL-V2 avec backlog V3 détaillé
|
||
|
||
## Output attendu
|
||
|
||
1. V2 déployée sur `nav.trans-former.fr`
|
||
2. ~103 fiches sur la carte + 3 fiches enrichies par IA
|
||
3. Worker cron 5 min opérationnel
|
||
4. Chatbot fonctionnel
|
||
5. Bandeau live avec stats
|
||
6. Liberapay relié + page `/a-propos` complète
|
||
7. `PIPE-IA-DOC.md` produit (base skill `/mistral-nemo-vps`)
|
||
8. `JOURNAL-V2.md` final avec backlog V3
|