spb/chat-spboucher-ai
Public
1# Chat SPBoucher AI23Interface privée, multi-modèles et multimodale de Simon-Pierre Boucher — **https://chat.spboucher.ai** — déployée sur le cluster MacLustr (nœud M4M64c, PostgreSQL 17 + pgvector, MacLustr Tunnel via BHS64).45> Un seul propriétaire. Tous les modèles OpenAI et Anthropic **vérifiés par requête réelle**. Mémoire persistante. Contrôle complet.67## Phase zéro — ce qui a été vérifié avant de coder89| | OpenAI | Anthropic |10|---|---|---|11| Modèles listés par l'API du compte | 140 | 14 |12| Modèles de chat vérifiés (11 tests réels chacun) | 30 | 14 |13| Listés mais **indisponibles** (404 « deprecated ») | 23 | 0 |14| Spécialisés vérifiés (image / TTS / STT / embeddings / modération) | 18 | — |15| Non exercés (realtime, vidéo, deep-research, completions) | 18 | — |1617Livrables dans `benchmarks/` : `model-discovery.json`, `openai-results.json`, `anthropic-results.json`, `modality-results.json`, `capability-matrix.json`, `pricing.json` (prix copiés des pages officielles le 2026-11-01), `benchmark-report.md`, `routing-recommendations.md`. Coût total du benchmark : ≈ 2,45 $. Relancer : `pnpm bench:discover && pnpm bench && pnpm bench:modalities && pnpm bench:report && pnpm registry:refresh`.1819Le **laboratoire de modèles** (`/models`) affiche ces données ; le **routeur** (`src/lib/ai/router.ts`) ne choisit jamais un modèle non vérifié.2021## Architecture2223```24Internet → BHS64 (Caddy TLS, WireGuard) → M4M64c:8500 Next.js 16 (App Router, React 19)25 ├─ src/proxy.ts garde de session (cookie httpOnly SameSite=Strict)26 ├─ src/lib/auth.ts Argon2id, sessions révocables, rate-limit, Origin check27 ├─ src/lib/ai/ adapters OpenAI (Responses API) & Anthropic (Messages, adaptive thinking,28 │ fallback serveur), registre, routeur, coûts29 ├─ src/lib/chat/ moteur (streaming SSE, boucle d'outils, approbation, mémoire, titre, artefacts)30 ├─ src/lib/tools/ web_search (Tavily), fetch_page, python (sandbox-exec), search_documents (RAG),31 │ generate_image (gpt-image), save_memory32 ├─ src/lib/research/ recherche approfondie (plan → sources → extraction → synthèse citée)33 └─ PostgreSQL 17 + pgvector : conversations, messages (arbre), pièces jointes, chunks, mémoire,34 artefacts, usage_events, comparisons, research_runs, tool_executions35```3637## Développement3839```bash40pnpm install41cp .env.example .env.local # puis remplir (clés API, DATABASE_URL local, SESSION_SECRET)42createdb chat_spboucher && psql chat_spboucher -c 'CREATE EXTENSION vector'43pnpm db:migrate # db/migrations/*.sql44pnpm registry:refresh # charge les modèles (listing live + benchmarks)45pnpm setup:owner # mot de passe du propriétaire (prompt masqué → hash Argon2id)46pnpm dev # http://localhost:850047node scripts/e2e/smoke.mjs # test navigateur (Playwright) : login, chat, palette, mobile48```4950## Production (MacLustr)5152Suivre `docs/OPERATIONS.md` : manifeste `mld` (`deploy/mld-manifest.json` → `M1M32:~/dispatch/apps/chat-spboucher-ai.json`), `mld deploy chat-spboucher-ai --node M4M64c`, route tunnel `chat.spboucher.ai`, sauvegardes chiffrées nocturnes (`scripts/backup.sh`, restauration `scripts/restore.sh`), rafraîchissement du catalogue à 05 h 17.5354La source de vérité du code est le dépôt git **sur le nœud** (`M4M64c:~/apps/chat-spboucher-ai`, origin = spbgit `chat-spboucher-ai.git`) — règle remote-first MacLustr.5556## Sécurité5758- Accès privé : aucune inscription, un seul propriétaire, Argon2id (64 Mio, t=3), 5 échecs / 15 min par IP puis blocage, sessions révocables, `Clear-Site-Data` au logout.59- Secrets uniquement dans `.env.production` (mode 600) et le manifeste `mld` ; jamais dans git. La clé Anthropic collée dans le chat de conception renvoyait 401 : la clé du compte déjà utilisée par les autres apps a été employée (voir `~/Desktop/Cluster/secrets/chat-spboucher-ai.env`).60- Outils : Python exécuté sous `sandbox-exec` (pas de réseau, répertoire jetable, 20 s) ; `fetch_page` refuse les adresses privées ; les artefacts HTML/React s'affichent dans un iframe `sandbox="allow-scripts"` sans origine partagée.61- Mémoire : refus automatique des contenus ressemblant à des identifiants ; approbation optionnelle ; export/suppression.62- Limites de dépenses locales (jour / mois) qui bloquent les nouvelles requêtes ; la facturation réelle des fournisseurs peut différer.63