SPB Git

adopt: état déployé sur M4M64c adopté comme source de vérité (remote-first, 2026-11-01)

mld committed (Nov 1, 2026) Browse files

31 changed files +20,001 −0

added .env.example +12 −0
@@ -0,0 +1,12 @@
1+# Chat SPBoucher AI — copy to .env.local (dev) or .env.production (node). Never commit real values.
2+DATABASE_URL=postgres://chat_spb:CHANGE_ME@127.0.0.1:5432/chat_spboucher
3+SESSION_SECRET=CHANGE_ME_64_hex_chars # openssl rand -hex 32
4+DATA_DIR=./data # uploads + generated files (mode 600)
5+OPENAI_API_KEY=
6+ANTHROPIC_API_KEY=
7+TAVILY_API_KEY= # optional: web search / page extraction tools
8+PYTHON_BIN=python3 # sandboxed python tool
9+APP_URL=https://chat.spboucher.ai
10+SESSION_TTL_DAYS=30
11+MAX_UPLOAD_MB=50
12+BENCHMARKS_DIR=./benchmarks
added .env.production +12 −0
@@ -0,0 +1,12 @@
1+NODE_ENV=production
2+PORT=8500
3+HOSTNAME=0.0.0.0
4+DATABASE_URL=postgres://chat_spb:5efb1a670099bf3ba7584d379634b8d2a2a74ddfe270982b@127.0.0.1:5432/chat_spboucher
5+SESSION_SECRET=616e8f5bc0ff53785292f78d11536c95b68cb8ddf82d0c98db12f4a0ef333e22
6+DATA_DIR=/Users/simon-pierreboucher/apps/chat-spboucher-ai/data
7+OPENAI_API_KEY=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
8+ANTHROPIC_API_KEY=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
9+TAVILY_API_KEY=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
10+PYTHON_BIN=/opt/homebrew/bin/python3
11+APP_URL=https://chat.spboucher.ai
12+BENCHMARKS_DIR=/Users/simon-pierreboucher/apps/chat-spboucher-ai/benchmarks
added .gitignore +9 −0
@@ -0,0 +1,9 @@
1+node_modules
2+.env
3+.env.local
4+.env.*.local
5+.next
6+data/
7+uploads/
8+*.log
9+.DS_Store
added .mldignore +9 −0
@@ -0,0 +1,9 @@
1+node_modules/
2+.next/
3+data/
4+.env
5+.env.local
6+.env.production
7+e2e-shots/
8+tsconfig.tsbuildinfo
9+.DS_Store
added AGENTS.md +9 −0
@@ -0,0 +1,9 @@
1+<!-- BEGIN:nextjs-agent-rules -->
2+
3+## This is NOT the Next.js you know
4+
5+This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` (resolved from this file's directory; in monorepos the `next` package may not be visible from the repo root) before writing any code. Heed deprecation notices.
6+
7+This block is written and re-added by `next dev` — verify at `node_modules/next/dist/server/lib/generate-agent-files.js`. Removing it from a diff only re-creates the uncommitted change; committing it with your work keeps the tree clean.
8+
9+<!-- END:nextjs-agent-rules -->
added README.md +62 −0
@@ -0,0 +1,62 @@
1+# Chat SPBoucher AI
2+
3+Interface 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).
4+
5+> 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.
6+
7+## Phase zéro — ce qui a été vérifié avant de coder
8+
9+| | 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 | — |
16+
17+Livrables 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`.
18+
19+Le **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é.
20+
21+## Architecture
22+
23+```
24+Internet → 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 check
27+ ├─ src/lib/ai/ adapters OpenAI (Responses API) & Anthropic (Messages, adaptive thinking,
28+ │ fallback serveur), registre, routeur, coûts
29+ ├─ 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_memory
32+ ├─ 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_executions
35+```
36+
37+## Développement
38+
39+```bash
40+pnpm install
41+cp .env.example .env.local # puis remplir (clés API, DATABASE_URL local, SESSION_SECRET)
42+createdb chat_spboucher && psql chat_spboucher -c 'CREATE EXTENSION vector'
43+pnpm db:migrate # db/migrations/*.sql
44+pnpm registry:refresh # charge les modèles (listing live + benchmarks)
45+pnpm setup:owner # mot de passe du propriétaire (prompt masqué → hash Argon2id)
46+pnpm dev # http://localhost:8500
47+node scripts/e2e/smoke.mjs # test navigateur (Playwright) : login, chat, palette, mobile
48+```
49+
50+## Production (MacLustr)
51+
52+Suivre `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.
53+
54+La 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.
55+
56+## Sécurité
57+
58+- 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.
added benchmarks/anthropic-results.json +2854 −0
Large diff (2,855 lines) is not loaded by default to keep the page fast.Load diff
added benchmarks/artifacts/chatgpt-image-latest.png +0 −0

Binary file not shown.

added benchmarks/artifacts/gpt-image-1-mini.png +0 −0

Binary file not shown.

added benchmarks/artifacts/gpt-image-1.5.png +0 −0

Binary file not shown.

added benchmarks/artifacts/gpt-image-2.5-flare.png +0 −0

Binary file not shown.

added benchmarks/artifacts/gpt-image-2.5-sunburst.png +0 −0

Binary file not shown.

added benchmarks/artifacts/gpt-image-2.png +0 −0

Binary file not shown.

added benchmarks/artifacts/tts-sample.mp3 +0 −0

Binary file not shown.

added benchmarks/benchmark-report.md +228 −0
Large diff (228 lines) is not loaded by default to keep the page fast.Load diff
added benchmarks/capability-matrix.json +3610 −0
Large diff (3,611 lines) is not loaded by default to keep the page fast.Load diff
added benchmarks/modality-results.json +241 −0
Large diff (242 lines) is not loaded by default to keep the page fast.Load diff
added benchmarks/model-discovery.json +1940 −0
Large diff (1,941 lines) is not loaded by default to keep the page fast.Load diff
added benchmarks/openai-results.json +5869 −0
Large diff (5,870 lines) is not loaded by default to keep the page fast.Load diff
added benchmarks/pricing.json +98 −0
Large diff (98 lines) is not loaded by default to keep the page fast.Load diff
added benchmarks/routing-recommendations.json +89 −0
Large diff (90 lines) is not loaded by default to keep the page fast.Load diff
added benchmarks/routing-recommendations.md +38 −0
Large diff (38 lines) is not loaded by default to keep the page fast.Load diff
added benchmarks/vision-test.png +0 −0

Binary file not shown.

added db/migrations/001_init.sql +311 −0
Large diff (311 lines) is not loaded by default to keep the page fast.Load diff
added deploy/mld-manifest.json +18 −0
Large diff (18 lines) is not loaded by default to keep the page fast.Load diff
added docs/OPERATIONS.md +77 −0
Large diff (77 lines) is not loaded by default to keep the page fast.Load diff
added eslint.config.mjs +23 −0
Large diff (23 lines) is not loaded by default to keep the page fast.Load diff
added next-env.d.ts +7 −0
Large diff (7 lines) is not loaded by default to keep the page fast.Load diff
added next.config.ts +17 −0
Large diff (17 lines) is not loaded by default to keep the page fast.Load diff
added package.json +73 −0
Large diff (73 lines) is not loaded by default to keep the page fast.Load diff
added pnpm-lock.yaml +4395 −0
Large diff (4,395 lines) is not loaded by default to keep the page fast.Load diff

Diff truncated — file too large.

Menu

Theme