Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@
# Application
NODE_ENV=development
NEXT_PUBLIC_APP_URL=http://localhost:3000
# URL de la documentation publique (boutons d'aide « i » des modules).
# Défaut : https://louis.data-ring.net/docs. À surcharger seulement si vous
# hébergez votre propre miroir de la doc.
# NEXT_PUBLIC_DOCS_URL=https://louis.data-ring.net/docs

# Base de données (PostgreSQL + pgvector)
# Compatible avec le docker-compose.yml fourni (port 5433 pour ne pas
Expand Down
98 changes: 98 additions & 0 deletions docs/user/getting-started.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
# Prise en main

Ce guide vous fait passer d'une instance Louis vide à votre première
conversation utile, en cinq étapes. Comptez **5 à 10 minutes**.

> Vous découvrez Louis sans l'avoir installé ? L'installation (Docker,
> base de données, secrets) est côté administrateur : voir
> [Installation](../installation/docker-compose.md). Ce guide suppose une
> instance déjà en ligne et un compte créé pour vous.

## Le principe en une phrase

Louis n'embarque **aucune clé** ni **aucun connecteur** par défaut. Vous
branchez les vôtres : vos clés IA restent chez vous, vos données restent
sur votre infrastructure. C'est le sens du « Bring Your Own Key ».

## Étape 1 — Connecter une clé provider IA (obligatoire)

Sans au moins une clé provider active, le chat ne peut pas répondre.

1. Ouvrez **Paramètres → Providers** (`/settings/providers`)
2. Cliquez **Ajouter une clé**, choisissez un provider, collez la clé
3. Activez la clé (toggle **Actif**), puis testez la connexion

**Commencez par Mistral** (🇫🇷) : c'est le seul provider qui fournit aussi
les *embeddings* nécessaires à la recherche sémantique dans vos documents
(RAG) en v0.1. Sans clé Mistral active, le chat fonctionne mais la
recherche dans vos documents est limitée.

→ Détail de chaque provider (souverains FR/UE, international, self-hosted) :
[Configuration des providers](../configuration/providers.md).

## Étape 2 — Connecter vos sources juridiques (optionnel)

Pour que Louis interroge des sources de droit officielles pendant une
conversation :

- **PISTE** (DILA) — donne accès à **Légifrance**. Inscription sur
[piste.gouv.fr](https://piste.gouv.fr/), puis **Paramètres →
Connecteurs**.
- **Pappers** — base entreprises (SIREN, dirigeants, bénéficiaires
effectifs). Clé sur [pappers.fr/api](https://www.pappers.fr/api).

> Couverture réelle en v0.1 : **Légifrance** et **Pappers** sont
> fonctionnels. Judilibre, JADE, INPI et BODACC sont prévus mais pas
> encore implémentés — voir [État des fonctionnalités](../feature-status.md).

→ Pas à pas et tests : [Configuration des connecteurs](../configuration/connectors.md).

## Étape 3 — Lancer une première conversation

1. Allez sur **Conversations** (`/chat`)
2. Choisissez un provider et un modèle dans le sélecteur (le badge
FR / UE / US reste visible pendant toute la conversation)
3. Tapez votre question, `Entrée` pour envoyer

Si Louis appelle un outil (recherche Légifrance, lecture d'un document…),
une pastille cliquable apparaît dans la réponse : cliquez-la pour voir
exactement ce que le modèle a reçu et renvoyé.

→ Tout le chat (joindre des documents, workflows, export) :
[Utiliser le chat](./chat.md).

## Étape 4 — Importer un document

1. **Documents → Uploader** (PDF, DOCX ou texte, ≤ 25 Mo)
2. Une fois importé, joignez-le à une conversation via l'icône trombone,
ou laissez Louis le retrouver par recherche sémantique

Avec une clé Mistral active, le document est découpé et indexé pour le
RAG. Sans, il reste consultable et joignable (son texte va alors dans le
contexte du message).

→ Dossiers, versions, aperçu : [Gérer les documents](./documents.md).

## Étape 5 — Organiser un dossier client en projet

Un **projet** regroupe les conversations et les documents d'un même
dossier, et **restreint le RAG à ce périmètre** : l'IA ne raisonne que
sur les pièces et échanges du projet.

1. **Projets → Nouveau projet**
2. Rattachez-le à un dossier de documents (nouveau ou existant)
3. Déplacez-y vos conversations et documents via `⋮ → Déplacer vers projet`

→ Détail du fonctionnement : [Travailler par projet](./projects.md).

## Et après ?

- **Workflows** — des prompts cabinet réutilisables (résumé d'arrêt,
analyse de clause…) insérables en un clic dans le chat.
- **Serveurs MCP** — branchez n'importe quel outil métier (base de
précédents, ERP, signature) via le Model Context Protocol :
[Connecteurs → MCP](../configuration/connectors.md).
- **Coûts & usage** — suivez la dépense estimée par conversation et au
global dans **Paramètres → Coûts & usage**.
- **Administration** (si vous êtes admin) — comptes, journal d'audit,
sauvegardes : [Guide admin](../admin/users.md).
66 changes: 66 additions & 0 deletions docs/user/projects.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# Travailler par projet

Un **projet** est un dossier client : il regroupe des conversations et des
documents, et **restreint le raisonnement de l'IA à ce périmètre**. C'est
le bon réflexe dès qu'un dossier prend de l'ampleur.

## Ce qu'un projet change concrètement

Quand vous discutez **dans le contexte d'un projet**, Louis ne prend en
compte que :

- les **documents** rangés dans le dossier du projet (et ses
sous-dossiers, récursivement) ;
- l'**historique des autres conversations** du même projet.

Autrement dit, les outils documentaires (`search_documents`,
`read_document`…) et la recherche d'historique sont **scopés** au projet —
pas de fuite vers les autres dossiers du cabinet, et pas de bruit venu
d'affaires sans rapport. Un document généré dans une conversation de
projet atterrit directement dans le dossier du projet.

> Mental model : un projet = un espace de connaissance fermé (ses pièces
> + ses échanges), à la manière d'un NotebookLM ou d'un Projet Claude —
> pas une recherche globale sur tout le cabinet.

## Créer un projet

1. **Projets → Nouveau projet**
2. Donnez-lui un nom (ex. « Dupont c/ Martin »)
3. Choisissez son **emplacement de stockage** :
- **Nouveau dossier** (pré-rempli au nom du projet), ou
- **Dossier existant** dans votre arborescence `/documents`

Un projet a **toujours** un dossier de stockage : c'est lui qui définit
quels documents appartiennent au projet.

## Rattacher conversations et documents

Depuis une conversation, une entrée de la sidebar ou un document :

> `⋮ → Déplacer vers projet`

- Une **conversation** déplacée vers un projet voit son contexte RAG se
restreindre au projet. Un breadcrumb projet (avec un point bleu)
apparaît en haut du chat.
- Un **document** déplacé est rangé dans le dossier du projet — il entre
donc dans le périmètre RAG du projet.

## Démarrer une conversation déjà dans un projet

Depuis la page d'un projet, lancez une nouvelle conversation : elle est
créée d'emblée rattachée au projet, avec le périmètre RAG correspondant.

## Bon à savoir

- **Sans document dans le projet**, les outils de recherche renvoient
simplement « rien trouvé » plutôt que de retomber sur tous vos
documents — c'est volontaire, pour éviter toute fuite inter-projets.
- L'indexation de l'historique des conversations (pour la recherche
croisée intra-projet) nécessite une **clé Mistral active**. Sans elle,
l'indexation est ignorée silencieusement.
- Hors projet, le comportement historique reste inchangé : l'IA voit
l'ensemble de vos documents.

→ Pour gérer les fichiers eux-mêmes (dossiers, versions, aperçu) :
[Gérer les documents](./documents.md).
116 changes: 14 additions & 102 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -85,5 +85,9 @@
"tsx": "^4.21.0",
"typescript": "^5",
"vitest": "^4.1.6"
},
"overrides": {
"tmp": "^0.2.7",
"postcss": "^8.5.10"
}
}
14 changes: 11 additions & 3 deletions src/app/(app)/chat/chat-shell.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import { DefaultChatTransport, type UIMessage } from "ai";
import ReactMarkdown from "react-markdown";
import remarkGfm from "remark-gfm";
import { LouisLogo } from "@/components/louis-logo";
import { ModuleHelp } from "@/components/module-help";
import { Dropzone, uploadDocument } from "@/components/dropzone";
import { useSmoothText } from "@/lib/use-smooth-text";
import { useStickToBottom } from "@/lib/use-stick-to-bottom";
Expand Down Expand Up @@ -2124,9 +2125,16 @@ function EmptyState() {
<div className="h-full flex flex-col items-center justify-center px-6">
<div className="max-w-xl w-full">
<LouisLogo className="size-10 text-primary mb-6 motion-safe:animate-in motion-safe:fade-in-0 motion-safe:duration-500" />
<h1 className="font-heading text-4xl md:text-5xl tracking-tight motion-safe:animate-in motion-safe:fade-in-0 motion-safe:slide-in-from-bottom-2 motion-safe:duration-700">
Une nouvelle conversation.
</h1>
<div className="flex items-center gap-2 motion-safe:animate-in motion-safe:fade-in-0 motion-safe:slide-in-from-bottom-2 motion-safe:duration-700">
<h1 className="font-heading text-4xl md:text-5xl tracking-tight">
Une nouvelle conversation.
</h1>
<ModuleHelp slug="user/chat" title="Utiliser le chat">
Choisissez un modèle, posez votre question. Joignez un document
(trombone) ou insérez un workflow (étoiles). Chaque appel
d&apos;outil est inspectable.
</ModuleHelp>
</div>
<p className="mt-3 text-base text-muted-foreground motion-safe:animate-in motion-safe:fade-in-0 motion-safe:slide-in-from-bottom-1 motion-safe:duration-700 motion-safe:delay-150">
Tapez votre question dans le composer ci-dessous — ou parcourez
ces points d&apos;entrée.
Expand Down
Loading
Loading