Laura est une application single-page en TypeScript + React qui présente une UI inspirée du cosmos pour une IA compagnon. Elle est optimisée pour itérer vite avec Vite, du SCSS et un routage moderne. Cette version inclut un chat Mistral avec pièces jointes + RAG, et un pont terminal capable de parler au même backend ou à toute API compatible.
- Audience: Designers et développeurs qui veulent une interface soignée et cohérente.
- Core flows: Vue d'accueil, récit About, formulaire Contact et chat Mistral.
- Runtime: SPA statique plus un proxy Node léger pour Mistral + récupération de documents.
- Terminal mode:
go run laura_quest_main.go,go build -o laura laura_quest_main.go && ./laura, or install a locallauracommand
- React 18 + TypeScript with strict checks
- Vite for fast dev/build pipelines
- SCSS-based design system (
src/styles/) - Client-side routing with React Router
- Contact form with configurable delivery endpoint
- Mistral AI chat widget (floating button + full-page view)
- Attachments + embeddings (RAG) with citations
- Error boundary + structured logging for safer UX
- Node.js 18+ (see
.nvmrc) - npm 9+ (or compatible)
npm installSi tu veux aussi le moteur terminal et le pont, installe Go 1.22+ puis lance-le directement:
go run laura_quest_main.go
go build -o laura laura_quest_main.go
./lauraStart the API proxy (port 4000) and the Vite dev server (port 5173):
npm run dev:server
npm run devOuvre http://localhost:5173
Avec l'API proxy lancée (npm run dev:server), ouvre une session de chat
texte directement dans le terminal :
npm run chat- Parle à Laura via le même bridge
/api/chatque l'interface web (configurable avecLAURA_API_URLpour pointer vers une autre URL/API compatible). - Rapide : les réponses sont diffusées en streaming token par token via
/api/chat/stream(désactivable avecLAURA_STREAM_DISABLED=true, avec repli automatique sur l'appel classique en cas d'échec). Les appels répétitifs non conversationnels (flux MoltBots, plugins) sont mis en cache localement (LAURA_CACHE_TTL_MS, 60s par défaut). Pour la revue de code, configureMISTRAL_MODEL=codestral-latestcôté serveur (ajouté à la liste des modèles autorisés). - Mode 100% local avec Ollama : si
MISTRAL_API_KEYn'est pas défini, configureOLLAMA_MODEL=<modèle>(ex:laura-local, voirollama list) côté serveur —/api/chat/streambascule alors automatiquement sur ton instance Ollama locale (OLLAMA_URL, défauthttp://localhost:11434), conversion NDJSON → SSE transparente pour le client. Chat 100% hors-ligne, zéro clé API, zéro latence réseau. /install <nom>: recherche en lecture seule (registre npm + GitHub) puis Laura propose la commande d'installation exacte — elle ne télécharge ni n'exécute jamais rien elle-même, c'est toi qui valides et lances.- Affiche en filigrane un flux "MoltBots" en arrière-plan (mode
socialdu bridge, désactivable avecLAURA_FEED_DISABLED=true). - Supporte des plugins déposés dans
terminal-plugins/*.mjs(/plugins,/run <nom>) — voirterminal-plugins/README.mdpour la convention et la roadmap des connecteurs externes (ssh-ai-chat, Second-Me, bluesky-video, wp-malware-scanner, bookish-octo-invention, chroma, MoltBots…).
npm run build
npm run serveLe site statique est servi sur le port 3000. Il faut lancer le serveur API séparément et reverse-proxy /api vers lui quand tu veux le chat + RAG en production.
Commande de prod:
go run ./cmd/lauraBinaire local:
go build -o bin/laura ./cmd/laura
./bin/lauraInstallation locale:
go build -o ~/.local/bin/laura ./cmd/laura
lauraOu via go install:
go install github.com/Kvnbbg/Laura/cmd/laura@latestFlags disponibles:
laura --world css
laura --stats
laura --reset
laura --no-color
laura --version
laura --helpLaura inclut aussi un mode compagnon en terminal. Il réutilise le même format de payload que la web app et peut pointer vers n'importe quel backend compatible.
go run laura_quest_main.go
go run laura_quest_main.go chatCommande locale optionnelle:
mkdir -p ~/.local/bin
go build -o ~/.local/bin/laura laura_quest_main.go
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
lauraVariables d'environnement:
| Variable | Purpose |
|---|---|
LAURA_BASE_URL |
Base URL pour un endpoint relatif (par défaut http://localhost:4000) |
LAURA_CHAT_ENDPOINT |
Chemin ou URL complète du chat (par défaut /api/chat) |
LAURA_WEB_URL |
Surface web référencée dans le prompt système |
LAURA_PERSONA |
Persona personnalisée pour le pont terminal |
Examples:
go run laura_quest_main.go chat
LAURA_BASE_URL=https://techandstream.com LAURA_CHAT_ENDPOINT=/api/chat go run laura_quest_main.go chat
LAURA_WEB_URL=https://techandstream.com LAURA_PERSONA="Laura is a professional AI companion..." go run laura_quest_main.go chatEnvironment variables are loaded via Vite. Copy .env.example and adjust as needed:
cp .env.example .env| Variable | Required | Purpose |
|---|---|---|
VITE_APP_NAME |
No | App name displayed in the footer |
VITE_CONTACT_ENDPOINT |
No | API endpoint for contact form submissions |
VITE_CONTACT_TIMEOUT_MS |
No | Timeout (ms) for contact form requests |
VITE_ENABLE_CHAT |
Yes (for chat) | Feature flag for chat widget (true/false) |
VITE_MISTRAL_API_KEY |
Yes (for chat) | Required when chat is enabled (client validation) |
VITE_MISTRAL_MODEL |
No | mistral-small (default), mistral-medium, or mistral-large |
VITE_CHAT_ENDPOINT |
No | Override the chat API endpoint (default /api/chat) |
VITE_CHAT_TIMEOUT_MS |
No | Timeout (ms) for chat requests |
MISTRAL_API_KEY |
Yes (server) | Server-side Mistral API key (preferred) |
MISTRAL_MODEL |
No (server) | Server-side chat model override |
Si VITE_ENABLE_CHAT=true mais que VITE_MISTRAL_API_KEY manque ou que le modèle est invalide, l'interface affiche une erreur claire et laisse le chat désactivé.
- Upload TXT or Markdown files in the chat widget.
- Le serveur découpe le contenu, construit les embeddings et récupère les passages les plus pertinents pour chaque prompt.
- Laura cite les sources au format
[DocName • chunk 3]. - Utilise Delete my documents pour effacer les données stockées.
Laura reçoit aussi des clins d'œil à l'activité Moltbook de french-dev-ai-tools. Le terminal bridge peut mentionner cette activité dans ses réponses pour garder le lien entre:
- le blog
- le forum
- les chats
- les bots de l'écosystème Laura
npm run dev # start Vite dev server
npm run dev:server # start the Mistral proxy + RAG server
npm run lint # run ESLint
npm run test # run Vitest suite
npm run build # typecheck + build production assets
npm run serve # serve the built assets via sirvConfigure an API endpoint that accepts JSON:
curl -X POST https://api.example.com/contact \
-H "Content-Type: application/json" \
-d '{"name":"Astra","email":"astra@example.com","message":"Hello"}'.
├── server/ # Mistral proxy + RAG endpoints
├── src/
│ ├── components/ # Layout + chat widget
│ ├── config/ # Typed env config
│ ├── pages/ # Home/About/Contact/Chat routes
│ ├── services/ # Contact + Mistral + document services
│ ├── styles/ # SCSS design system
│ ├── utils/ # Logger + error helpers
│ ├── App.tsx # App routes
│ └── main.tsx # Entry point
├── index.html
└── vite.config.ts
- Chat disabled: Ensure
VITE_ENABLE_CHAT=trueandVITE_MISTRAL_API_KEYare set. - No citations: Upload files and ensure the server is running on port 4000.
- Contact form fails: Verify
VITE_CONTACT_ENDPOINTis reachable and accepts JSON. - Unexpected crashes: The error boundary will surface the error; review console logs for details.
- Terminal bridge fails: Confirm the endpoint returns the same
{ message, citations }shape as/api/chat.
- Do not commit real API keys to
.envfiles. - Prefer
MISTRAL_API_KEYon the server and reverse-proxy/apito avoid exposing secrets. - Use HTTPS endpoints for
VITE_CONTACT_ENDPOINTin production. - Review
SECURITY.mdfor coordinated disclosure guidance.
- Fork the repo and create a feature branch.
- Run
npm run lintandnpm run testbefore submitting. - Open a PR with a clear summary and screenshots (if UI changes).
See CONTRIBUTING.md for details.
Apache-2.0. See LICENSE.