# AI FIRST — Meetup 07/09 — lu-et-accepte

**Le sujet — Une extension qui lit les conditions générales à la place de Léa, et qui sait dire quand elles ont changé.**

> Brief du meetup AI FIRST du 07/09 : construire en 2 heures une extension Chrome qui rend lisibles les conditions générales d'un site, et qui repère ce qui a bougé depuis la dernière fois.

- **Document** : Brief du meetup
- **Format** : Build de 2 heures — 4 paliers de difficulté
- **Périmètre** : Lire les conditions générales d'une page, en rendre une synthèse courte, savoir si elles ont changé.
- **Prérequis** : Chrome, et une clé d'inférence gratuite à créer maintenant — voir § 00, cinq minutes.

---

## § 00 — Avant de commencer

C'est la première édition qui repose sur un modèle de langage : sans clé d'inférence, rien ne tourne. **Chacun apporte la sienne, et c'est gratuit** — mais les quotas s'appliquent par projet Google et non par clé, donc une clé unique partagée par toute la salle serait bloquée en dix minutes. Cinq minutes suffisent : faites-le maintenant, avant même de lire le sujet.

1. Ouvrir [aistudio.google.com](https://aistudio.google.com) et se connecter avec un compte Google. Un compte personnel suffit, un compte créé sur place fonctionne aussi.
2. Cliquer sur **Get API key** dans le menu de gauche, puis sur **Create API key**. Laisser AI Studio créer le projet par défaut.
3. Copier la clé quelque part de sûr : elle commence par `AIza` et ne sera plus affichée en entier ensuite.
4. La tester tout de suite avec la commande ci-dessous qui correspond à votre système. Si une phrase revient dans la réponse, tout est prêt.
5. Si rien ne revient, ou si le JSON contient une erreur : lever la main, plutôt que d'attaquer le sujet avec une clé morte. Pour voir ce que la clé accepte réellement, `GET https://generativelanguage.googleapis.com/v1beta/models?key=VOTRE_CLE` en liste les modèles disponibles.

Remplacer VOTRE_CLE par la clé qui vient d'être créée.

**macOS / Linux — Terminal**

```bash
curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-3.6-flash:generateContent?key=VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{"contents":[{"parts":[{"text":"Réponds en une phrase : que sont des CGU ?"}]}]}'
```

**Windows — PowerShell**

```powershell
$key  = "VOTRE_CLE"
$body = '{"contents":[{"parts":[{"text":"Réponds en une phrase : que sont des CGU ?"}]}]}'
Invoke-RestMethod -Method Post -ContentType "application/json; charset=utf-8" -Body $body -Uri "https://generativelanguage.googleapis.com/v1beta/models/gemini-3.6-flash:generateContent?key=$key"
```

### Ce qu'il faut savoir

| Point | Détail |
| --- | --- |
| Le modèle | gemini-3.6-flash. Attention : les identifiants de la série 2.5 sont refusés pour une clé créée aujourd'hui — gemini-2.5-flash renvoie une 404 sur un projet neuf. |
| Modèles gratuits | La famille Flash uniquement — les modèles Pro sont passés en payant. Flash suffit très largement ce soir. |
| Fenêtre de contexte | Un million de tokens en entrée : des conditions générales entières passent en un seul appel, sans avoir à les découper. |
| Quotas | Quelques requêtes par minute, largement de quoi tenir la soirée. Google ne publie plus les chiffres exacts dans sa documentation : les vôtres se lisent dans AI Studio, onglet des limites du projet. |
| Sous Windows | Ne pas taper « curl » dans PowerShell : c'est un alias d'Invoke-WebRequest, qui ne comprend pas les options de curl et renvoie une erreur trompeuse. Le « \ » de fin de ligne n'existe pas non plus. D'où la variante PowerShell ci-dessus. |
| Deux API | generateContent, l'historique, fonctionne toujours et suffit largement ici. Interactions API est la nouvelle voie recommandée par Google depuis juin 2026 : c'est vers elle que pousseront les outils d'IA à qui vous demanderez du code, et c'est là qu'arrivent les nouveautés. |
| Données | En offre gratuite, ce qui est envoyé peut servir à l'entraînement des modèles. Aucun enjeu avec des conditions générales publiques, mais c'est le réflexe à prendre pour la suite. |
| Après la session | La clé reste valable sans limite de durée : ce qui est construit ce soir continue de tourner chez vous demain. |

> **Le piège à éviter** — Ne jamais activer la facturation sur le projet créé ce soir : l'offre gratuite disparaît aussitôt et chaque appel devient payant dès le premier token. Et aucune clé en dur dans un dépôt public — ce genre de fuite se fait ramasser en quelques heures.

---

## § 01 — Esprit de l'exercice

Léa vient de cocher « J'accepte les conditions générales » sans les ouvrir. Quatorze mille mots, rédigés par des juristes pour d'autres juristes, que personne n'a jamais lus et que tout le monde accepte. Le document est public, il est en ligne, il tient dans une fenêtre de contexte : rien n'empêche techniquement de le rendre lisible en trente secondes. Sauf que ce soir, pour la première fois, l'application repose sur un modèle de langage — et un modèle ne rend jamais deux fois exactement la même réponse. **Toute la difficulté est là** : construire un produit fiable sur un composant qui ne l'est pas.

### Parti pris #1 — Un brief volontairement sous-spécifié

Ce brief décrit **ce que** l'extension doit faire, jamais *comment* le faire. Aucune architecture imposée, aucune maquette, aucun format de réponse, aucun prompt fourni. Partout où une décision se présente, elle t'appartient. Un brief trop précis devient un prompt prêt à coller, et l'exercice perd tout son intérêt.

### Parti pris #2 — Une difficulté progressive

On n'a pas tous le même bagage, et c'est très bien. Trois paliers attendus, un bonus hors session. Le premier palier suffit à repartir avec quelque chose qui sert vraiment. Ne cours pas après le palier 3 si le socle boite : ici, une synthèse fausse est pire qu'une absence de synthèse.

## § 02 — La mise en situation

*Léa loue du matériel photo sur un site qu'elle a découvert la semaine dernière. Elle a coché la case, payé, reçu son colis. Trois semaines plus tard elle veut arrêter, et elle découvre ce qu'elle avait accepté. Elle n'est pas en colère contre le site : elle est en colère contre le principe.*

« Je ne vais pas lire quatorze mille mots, personne ne le fait, et ceux qui les écrivent le savent très bien. Mais il y a trois ou quatre trucs que j'aimerais savoir avant de cliquer : est-ce que je peux revenir en arrière, est-ce que ça se renouvelle tout seul, est-ce que ça va me coûter quelque chose que je n'ai pas vu, et ce qu'ils font de mes données. Le reste, franchement, je m'en fiche. »

« Et puis il y a l'autre moitié du problème. Il y a des sites où je vais tous les mois. Leurs conditions changent, ils m'envoient un mail que je ne lis pas non plus, et je continue comme si de rien n'était. Ce que je voudrais, c'est qu'on me dise « ça n'a pas bougé depuis mars », ou « ça a bougé, et voilà ce qui a bougé ». Ce que je ne veux surtout pas, c'est qu'on me montre un résumé d'il y a six mois en me laissant croire qu'il est à jour. »

**C'est le besoin. À toi de le faire exister.**

## § 03 — Les paliers

Un seul métier : rendre lisible un document que personne ne lit, et ne jamais mentir sur sa fraîcheur. La promesse est étroite — quelques thèmes, un écran, trente secondes de lecture — mais elle doit tenir parfaitement : Léa va prendre une décision à partir de ce qu'elle voit. Chaque palier la pousse plus loin.

1. **Socle** — Attendu de tous
2. **Avancé** — Se souvenir sans se tromper
3. **Poussé** — Décisions produit & cas limites
4. **Bonus** — Hors session — aucune attente

---

## Palier 1 — Socle — Attendu de tous

À la fin de ce palier, Léa est sur une page de conditions générales, elle fait un geste, et trente secondes plus tard elle sait ce qu'elle s'apprête à accepter. Rien de plus — mais ça marche vraiment, y compris quand ça rate.

### Fonctionnalités

- **Analyser la page où l'on se trouve.** Depuis n'importe quelle page de conditions générales — conditions d'utilisation, conditions de vente, politique de confidentialité — un seul geste déclenche l'analyse. Pas de copier-coller, pas d'adresse à ressaisir : Léa est déjà sur la page, l'extension part de là.
- **Rendre des réponses, pas un résumé.** Ce que Léa veut savoir tient en quelques questions : peut-elle se rétracter, est-ce que l'engagement se reconduit tout seul, qu'est-ce qui peut lui coûter en plus, que deviennent ses données, comment elle s'en va. La synthèse répond à celles-là, dans une forme qui se lit debout, sans faire défiler.
- **Montrer d'où sort chaque point.** Chaque affirmation renvoie au passage d'origine dans le document. Léa doit pouvoir vérifier un point précis sans relire quatorze mille mots, et sans avoir à croire l'extension sur parole. C'est ce qui sépare un outil d'un oracle.
- **Distinguer ce qui joue contre elle.** Un point qui l'engage ou qui peut lui coûter ne se présente pas comme un point neutre. La différence se voit avant d'être lue, du coin de l'œil, et pas uniquement par la couleur.
- **Dire ce qui se passe, et ce qui a raté.** Pendant l'analyse, Léa sait que quelque chose tourne. Si ça échoue, elle sait pourquoi et ce qu'elle peut faire : clé absente, quota dépassé, page sans conditions, réponse du modèle inexploitable. Jamais un écran vide, jamais une attente sans fin.

### Règles de gestion — Palier 1

| Domaine | Règle |
| --- | --- |
| Les thèmes | La synthèse traite toujours les mêmes thèmes, dans le même ordre. Deux analyses du même document ne rendent pas deux listes de thèmes différentes : c'est ce qui rend une synthèse comparable à une autre. |
| Le silence | Si le document ne dit rien de la rétractation, la synthèse écrit qu'il n'en parle pas. Un thème absent est une information à part entière ; le passer sous silence laisse croire qu'il a été traité. |
| Rien hors du texte | Chaque point affiché est rattachable à un passage du document. Ce qui n'est rattachable à rien ne s'affiche pas, même si c'est probablement vrai. |
| La page sans contrat | Sur une page d'accueil, un article de blog ou une fiche produit, l'extension dit qu'elle ne voit pas de conditions générales et s'arrête là. Elle ne fabrique pas une synthèse de circonstance pour avoir l'air utile. |
| La longueur | Test de la soirée : la synthèse se lit en trente secondes. Si elle demande de faire défiler trois écrans, c'est raté — c'est exactement le document qu'on essayait de fuir. |
| Le verbiage | « Nonobstant les dispositions de l'article 7.3 » ne survit pas à l'analyse. Ce qui est affiché est en français courant, à hauteur de quelqu'un qui n'a pas fait de droit. |
| La panne | Clé absente, quota dépassé, réseau coupé, réponse illisible : chacun de ces cas a son message, et Léa sait quoi faire ensuite. « Une erreur est survenue » ne renseigne personne. |
| L'attente | L'analyse prend plusieurs secondes, et l'interface l'assume au lieu de faire semblant d'être instantanée. Si Léa ferme la fenêtre en cours de route, rien ne reste dans un état bancal. |
| La clé | La clé d'inférence appartient au participant et ne quitte pas sa machine. Elle ne se retrouve ni dans un dépôt, ni dans une page publiée, ni dans une capture d'écran de démonstration. |
| Ce qu'on lit | **À TRANCHER (participant) :** l'extension analyse-t-elle ce que Léa voit à l'écran, ou va-t-elle chercher le texte complet quand la page ne l'affiche qu'en partie — accordéons repliés, « lire la suite », document lié à côté ? Le premier choix est simple et rapide, le second est plus juste et beaucoup plus coûteux. Quel que soit le choix, Léa doit savoir sur quoi porte la synthèse qu'elle est en train de lire. |

> **Note de cadrage** — Ce palier n'exige ni compte, ni serveur, ni quoi que ce soit qui survive à la fermeture du navigateur : si tout est perdu au rechargement, ce n'est pas grave pour l'instant. La seule dépendance externe est la clé d'inférence — elle se crée en cinq minutes, la marche à suivre est au § 00 de l'accueil. Ce qui compte ici, c'est qu'une synthèse soit juste, courte, et vérifiable.

---

## Palier 2 — Avancé — Se souvenir sans se tromper

L'extension change de nature : elle ne fait plus que lire, elle se souvient. Léa revient sur le même site trois semaines plus tard, et la première chose qu'elle veut savoir, avant même de relire quoi que ce soit, c'est si ça a bougé.

### Fonctionnalités

- **Donner une empreinte au document.** Un même texte produit toujours la même empreinte : deux fois de suite, dans deux onglets, sur deux machines, à trois semaines d'intervalle. C'est le seul endroit de la soirée où le hasard est formellement interdit.
- **Reconnaître un site déjà vu.** Au retour sur une page déjà analysée, l'extension le dit avant que Léa demande quoi que ce soit : « inchangé depuis le 12 mars », ou « modifié, l'analyse est à refaire ».
- **Garder la synthèse et sa date.** La dernière synthèse d'un site reste consultable sans redemander quoi que ce soit au modèle. Elle porte la date du jour où elle a été produite, visible sans avoir à la chercher.
- **Marquer ce qui est périmé.** Dès que le document a changé, l'ancienne synthèse est signalée comme périmée partout où elle s'affiche, et elle le reste jusqu'à ce que Léa relance l'analyse.
- **Relancer et remplacer.** Une relance produit une nouvelle synthèse qui prend la place de l'ancienne, avec sa nouvelle date. À aucun moment deux synthèses du même document ne coexistent comme si les deux étaient valables.

### Règles de gestion — Palier 2

| Domaine | Règle |
| --- | --- |
| L'empreinte | Deux calculs sur le même texte donnent la même empreinte, toujours et partout. Test de la soirée : recharger cinq fois la même page ne doit déclencher aucune alerte. |
| Le bruit | Un changement de mise en page, d'ordre des blocs, d'espaces ou de guillemets ne change pas l'empreinte. Ce qu'on empreinte, c'est le contrat, pas la page qui le porte. |
| La date de révision | La ligne « dernière mise à jour » qui change sans qu'un mot du contrat ne bouge : soit elle n'alerte pas, soit elle alerte faiblement. Les deux se défendent — mais le comportement est choisi une fois, écrit quelque part, et identique partout dans le produit. |
| La clause modifiée | Un mot qui change dans une clause déclenche une alerte et fait passer la synthèse en périmée. Le document n'est plus celui qui a été résumé. |
| Périmé veut dire périmé | Une synthèse périmée ne s'affiche jamais avec les attributs d'une synthèse à jour. Si Léa choisit de ne pas relancer, elle garde sous les yeux le fait qu'elle regarde du vieux. |
| La date affichée | Toute synthèse montre le jour où elle a été produite. Une synthèse sans date ne vaut rien trois semaines plus tard. |
| Un site, une entrée | Deux passages sur la même page ne créent pas deux entrées. Mais deux documents différents d'un même site — les conditions de vente et la politique de confidentialité — ne se confondent pas non plus. |
| L'inconnu | Un site jamais analysé se présente comme jamais analysé, jamais comme inchangé. Ne rien savoir et savoir que rien n'a bougé sont deux états distincts. |
| Le coût | Revenir sur un site dont le document n'a pas bougé ne consomme aucun appel au modèle. On paye pour analyser, pas pour vérifier. |
| Ce qui compte | **À TRANCHER (participant) :** qu'est-ce qui compte comme un changement ? Une virgule ? Un article renuméroté ? Une clause déplacée sans être modifiée ? Trop sensible, Léa reçoit des alertes pour rien et cesse de les lire ; pas assez, on lui cache une clause qui a changé. Fixe ta règle — et elle doit s'expliquer à Léa en une phrase. |

> **Note de cadrage** — Toujours pas de compte et pas de serveur exigé : ce qui se souvient peut très bien vivre dans le navigateur de Léa. Ce qui est attendu ici, ce n'est pas une infrastructure, c'est qu'une information de fraîcheur soit juste. Une extension qui se trompe sur « ça n'a pas changé » est plus dangereuse que celle du palier 1, qui ne prétendait rien.

---

## Palier 3 — Poussé — Décisions produit & cas limites

Léa ne veut plus seulement savoir que ça a bougé : elle veut savoir ce qui a bougé, et si c'est grave. C'est le moment où un modèle qui n'a jamais donné deux fois exactement la même réponse doit produire un chiffre sur lequel on peut s'appuyer.

### Fonctionnalités

- **Raconter l'écart, pas le diff.** Entre deux versions, Léa lit ce qui change pour elle, en français : « le délai de rétractation passe de trente à quatorze jours ». Pas un différentiel ligne à ligne, pas des mots surlignés au milieu d'un paragraphe juridique.
- **Dire le sens du changement.** Chaque écart indique s'il joue en faveur de Léa ou contre elle. Une clause qui s'assouplit ne se présente pas avec les mêmes signaux qu'une clause qui se durcit.
- **Noter chaque thème.** Un feu tricolore ou une note par thème — rétractation, données, résiliation, litiges. C'est ce qui permet de comparer deux versions d'un coup d'œil, à condition que la note ne dépende pas de l'humeur du modèle.
- **Ouvrir l'historique.** Pour un site suivi, Léa voit les versions qu'elle a croisées avec leurs dates, et peut en comparer deux. Elle doit pouvoir répondre à « depuis quand ils ont ce truc-là ? ».

### Règles de gestion — Palier 3

| Domaine | Règle |
| --- | --- |
| La langue du diff | Ce qui est présenté à Léa est un écart en langage courant, pas un différentiel technique. Un participant qui affiche du rouge et du vert sur des paragraphes bruts n'a pas fait ce palier. |
| Le sens | Une clause devenue plus défavorable et une clause devenue plus favorable ne se lisent pas de la même façon, et le thème concerné bouge dans le bon sens. |
| La stabilité | Relancer l'analyse sur un texte inchangé ne fait pas bouger la note. Test de la soirée : trois analyses d'affilée sur le même document, mêmes couleurs à l'arrivée. |
| Les deux dates | Une comparaison affiche toujours les deux dates comparées. « Ça a changé » sans dire par rapport à quand ne veut rien dire. |
| L'inchangé | Un thème qui n'a pas bougé entre deux versions se dit inchangé plutôt que de disparaître de la comparaison. Une absence dans un écran de diff est ambiguë. |
| Le passé ne se réécrit pas | Une version déjà vue garde la synthèse et la note qu'elle avait le jour où elle a été vue. Une relance d'aujourd'hui ne repeint pas le mois dernier. |
| La première fois | Un document vu pour la première fois n'a rien à comparer : il le dit, il ne fabrique pas un écart avec le vide. |
| L'échelle | La même échelle sert partout : ce qui vaut « rouge » sur un site vaut « rouge » sur un autre. Une note qui ne veut dire quelque chose que pour un seul document ne sert à rien. |
| D'où vient la note | **À TRANCHER (participant) :** la note, c'est le modèle qui la donne, ou c'est une grille fixe que le modèle se contente d'alimenter ? Dans le premier cas, comment garantis-tu qu'elle ne bouge pas d'un appel à l'autre sur un texte identique ? Il y a plusieurs réponses valables, et une seule mauvaise : ne pas se poser la question. |

---

## Palier 4 — Bonus — Hors session — aucune attente

Un réservoir d'ambition pour qui aurait solidifié le reste : l'alerte qui part d'elle-même quand un site suivi modifie ses conditions, sans que Léa ait besoin d'y retourner ; l'export partageable d'une synthèse — image, lien ou texte — pour l'envoyer à quelqu'un qui n'a rien installé ; la détection automatique qu'on vient d'arriver sur une page de conditions générales, sans le moindre clic. **À ne pas attaquer avant d'avoir consolidé le reste.**

Et deux questions à garder pour la discussion de fin. **La clé et le texte** — qui fournit la clé, et à qui envoie-t-on quatorze mille mots ? Ce soir c'est un modèle public et des conditions générales publiques, donc aucun enjeu ; demain, sur les documents d'un intranet ? **Les deux déterminismes** — l'empreinte doit être identique à chaque calcul, la synthèse ne le sera jamais. *Comment fait-on tenir les deux dans le même produit, sans mentir à l'utilisateur sur ce qu'il regarde ?*
