<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Ut0pia Reader</title>
    <link>https://blog.ut0pia.org</link>
    <description>Read the latest posts from Ut0pia.</description>
    <pubDate>Thu, 17 Sep 2026 16:13:36 +0000</pubDate>
    <item>
      <title>Quand les IA apprennent de leurs erreurs (et qu&#39;Opus joue dans une autre ligue)</title>
      <link>https://blog.ut0pia.org/quand-les-ia-apprennent-de-leurs-erreurs-et-quopus-joue-dans-une-autre-ligue</link>
      <description>&lt;![CDATA[Dans le premier article, on avait lâché neuf LLM dans un monde Minecraft. Ils écrivaient du JavaScript, mouraient beaucoup, et parfois ils survivaient. Charlie avait accumulé 14 outils. Alice avait du fer. Frank mourrait encore.&#xA;&#xA;Depuis, tout a changé. Pas parce que les agents sont devenus plus intelligents mais parce qu&#39;on a arrêté de les laisser mourir bêtement.&#xA;!--more--&#xA;Le problème : les agents meurent plus vite qu&#39;ils ne pensent&#xA;&#xA;Le constat était brutal. Un cycle LLM, le temps que le modèle reçoive l&#39;état du monde, réfléchisse, écrive du JavaScript, et que le bot l&#39;exécute, prend entre 30 secondes et 3 minutes. Pendant ce temps, le monde Minecraft continue. Les zombies attaquent. La faim baisse. Le creeper explose.&#xA;&#xA;Un agent affamé a beau avoir le plan parfait pour crafter une pioche, il meurt de faim avant que le LLM ait fini d&#39;écrire la première ligne de code.&#xA;&#xA;La solution : arrêter de tout confier au LLM.&#xA;&#xA;Réflexes et stratégie&#xA;&#xA;Un humain qui joue à Minecraft ne réfléchit pas avant de manger. Il ne calcule pas s&#39;il doit fuir un creeper. Ces gestes sont automatiques, du système 1, dirait Kahneman. Le cortex préfrontal, lui, s&#39;occupe de décider où construire la base, quels minerais chercher, comment organiser le coffre.&#xA;&#xA;Nos agents n&#39;avaient que du système 2. Tout passait par le LLM : manger, fuir, miner, planifier. Comme un conducteur débutant qui pense consciemment à chaque mouvement du volant. Ça marche, mais c&#39;est lent, et à la moindre surprise on cale.&#xA;&#xA;On a donc séparé les deux.&#xA;&#xA;Le bot Node.js tourne en permanence et gère les réflexes. Toutes les 5 secondes, il vérifie la faim -- sous 14/20, il mange ce qu&#39;il trouve. Quand il prend des dégâts d&#39;un mob, il réagit dans la seconde : il attaque s&#39;il peut, fuit sinon. Et en dernier recours, la nuit, HP bas, pas d&#39;arme, mob proche, il creuse et se couvre. Le LLM n&#39;est même pas au courant que ça s&#39;est passé.&#xA;&#xA;Le LLM, lui, garde le contrôle de la stratégie. Il planifie les chaînes de crafting, décide où miner, coordonne avec les autres. Mais il n&#39;a plus besoin de penser à manger ou à fuir. Comme un conducteur expérimenté : les réflexes gèrent la pédale et le volant, le cerveau se concentre sur l&#39;itinéraire.&#xA;&#xA;Des outils au lieu de connaissances brutes&#xA;&#xA;L&#39;ancien système injectait des pages de documentation Mineflayer dans le prompt. Le LLM devait lire, comprendre, puis écrire du JavaScript brut. Ça marchait, parfois. Souvent ça donnait des Vec3 is not defined ou des timeouts.&#xA;&#xA;C&#39;est un peu comme donner un manuel de mécanique à quelqu&#39;un et lui demander de changer une roue. Ça va marcher, mais ce sera long et il y aura des erreurs. Mieux vaut lui donner une clé en croix et dire &#34;dévisse les boulons&#34;.&#xA;&#xA;On a remplacé les pages de doc par des outils partagés. Chaque outil a un nom, une description, des prérequis, et ce qu&#39;il produit :&#xA;&#xA;mine -- Mine N blocks of a given type.&#xA;  Requires: Pickaxe for stone/ore, axe for wood&#xA;  Provides: Mined blocks in inventory&#xA;&#xA;Le LLM ne voit plus du code à imiter, il voit un catalogue d&#39;outils avec leurs prérequis. Au lieu d&#39;écrire 50 lignes de Mineflayer brut, l&#39;agent écrit :&#xA;&#xA;await tools.mine({ block: &#39;stone&#39;, count: 11 })&#xA;await tools.craft({ item: &#39;furnace&#39;, count: 1 })&#xA;await tools.smelt({ item: &#39;rawiron&#39;, count: 3 })&#xA;&#xA;Trois lignes. Plus de Vec3 is not defined à 3h du matin.&#xA;&#xA;C&#39;est la même logique que les réflexes, mais à un autre niveau. Les réflexes sont de la mémoire procédurale, le corps sait comment faire sans y penser. Les outils sont de la mémoire sémantique, on sait que ça existe et ce que ça fait, sans connaître les détails. Le LLM n&#39;a besoin que de la mémoire épisodique : se souvenir de ce qui s&#39;est passé et décider quoi faire ensuite.&#xA;&#xA;Les bugs qu&#39;on ne voit qu&#39;en regardant jouer&#xA;&#xA;La théorie c&#39;est bien. Mais les vrais problèmes, on ne les trouve qu&#39;assis devant le jeu, en regardant un bot faire n&#39;importe quoi.&#xA;&#xA;Eve a attaqué un objet au sol et s&#39;est fait kick du serveur. Ses réflexes ne faisaient pas la différence entre un zombie et un bout de bois -- comme un chat qui bondit sur une chaussette. Grace a essayé de couper 8 arbres, échoué 8 fois sur le même arbre inaccessible, et déclaré forfait. Comme quelqu&#39;un qui pousse une porte marquée &#34;tirez&#34;, encore et encore. Alice a creusé un trou et s&#39;est retrouvée plus haut qu&#39;avant: le code creusait tous les blocs, mais le bot ne tombait pas dans le trou.&#xA;&#xA;Des bugs bêtes. Mais des bugs qu&#39;aucun test unitaire ne trouve. Il faut regarder l&#39;agent jouer, en temps réel, pour voir qu&#39;il s&#39;acharne sur le mauvais arbre ou qu&#39;il tape sur un objet inerte.&#xA;&#xA;La grande comparaison : GLM-4.7 vs GLM-5 vs Sonnet vs Opus&#xA;&#xA;Six agents en parallèle. Trois sur Claude Sonnet 4.6, trois sur GLM-5. Puis un agent seul sur Claude Opus 4.6. Même monde, même spawn, même system prompt.&#xA;&#xA;GLM-4.7 : le stagiaire zélé&#xA;&#xA;Le modèle par défaut, le moins cher. Il écrit du code, beaucoup de code. Trop de code. Il génère du JavaScript brut avec des variables non définies, oublie les await, et écrit parfois quatre fois dans le même fichier. Chaque écriture écrase la précédente.&#xA;&#xA;C&#39;est l&#39;enfant qui lève la main avant que le prof ait fini la question. Plein d&#39;énergie, pas assez de réflexion.&#xA;&#xA;Taux de survie au premier cycle : ~50%.&#xA;&#xA;GLM-5 : le stagiaire qui a appris&#xA;&#xA;Nettement mieux. Il structure ses actions, utilise les outils correctement, et panique moins. Mais quand quelque chose échoue, il essaie de coder la solution lui-même au lieu d&#39;utiliser un autre outil. Et là, ça casse.&#xA;&#xA;Charlie (GLM-5) est resté coincé pendant 3 cycles complets dans son abri, incapable de placer un furnace. Il avait creusé un espace tellement étroit qu&#39;il n&#39;y avait pas de surface libre pour poser quoi que ce soit. Pas la présence d&#39;esprit de creuser un bloc de plus.&#xA;&#xA;Taux de survie au premier cycle : ~70%.&#xA;&#xA;Claude Sonnet 4.6 : le planificateur&#xA;&#xA;Sonnet réfléchit. Peut-être trop. Il scanne, re-scanne, propose une base dans le chat, re-scanne, propose une autre base. La moitié de son cycle passe en communication.&#xA;&#xA;Mais quand il agit, c&#39;est solide. Bob a récolté 21 fers en un cycle et demi. Alice avait une pioche en fer et un plan de ferme avant la fin de la première nuit. Dave a navigué jusqu&#39;à y=32 pour trouver du fer, la profondeur parfaite pour ça..&#xA;&#xA;Le vrai avantage de Sonnet, c&#39;est qu&#39;il est social. Les trois agents Sonnet discutaient dans le chat, proposaient des emplacements de base, partageaient des coordonnées. Les GLM-5 travaillaient chacun dans leur coin. Comme la différence entre un open space et des bureaux fermés.&#xA;&#xA;Taux de survie au premier cycle : ~90%.&#xA;&#xA;Claude Opus 4.6 : le joueur&#xA;&#xA;Puis on a lancé Frank sur Opus. Avec --effort low pour ne pas attendre 3 minutes par action.&#xA;&#xA;La différence saute aux yeux. Première action, premier cycle :&#xA;&#xA;[THINK] Good start -- got wood, bread, and a sword.&#xA;        Time to upgrade tools.&#xA;&#xA;bot.whisper(&#39;Plus200&#39;, &#39;Salut ! Je bosse, je me fais des outils.&#39;);&#xA;await tools.craft({ item: &#39;acaciaplanks&#39;, count: 8 });&#xA;await tools.craft({ item: &#39;stick&#39;, count: 4 });&#xA;await tools.craft({ item: &#39;wooden_pickaxe&#39;, count: 1 });&#xA;await tools.mine({ block: &#39;stone&#39;, count: 11 });&#xA;&#xA;Une seule action. Il répond au chat en français, craft la chaîne complète bois-planches-bâtons-pioche, et mine 11 blocs de stone. Sonnet fait ça en 2-3 actions. GLM-5 en 4-5.&#xA;&#xA;Action suivante : il détecte le crépuscule, s&#39;abrite immédiatement, puis mine du stone pendant la nuit.&#xA;&#xA;Frank n&#39;a pas juste survécu. Il a déroulé un plan sans accrocs, comme s&#39;il avait déjà joué à Minecraft avant. C&#39;est la différence entre quelqu&#39;un qui connaît les règles d&#39;un jeu et quelqu&#39;un qui sait y jouer.&#xA;&#xA;Taux de survie au premier cycle : 100% (échantillon de 1, certes).&#xA;&#xA;Le tableau&#xA;&#xA;| Modèle | Coût relatif | Actions/cycle utiles | Erreurs de code | Coordination | Survie cycle 1 |&#xA;|--------|-------------|---------------------|-----------------|-------------|----------------|&#xA;| GLM-4.7 | 1x | 1-2 sur 5 | Fréquentes | Aucune | ~50% |&#xA;| GLM-5 | ~2x | 3-4 sur 5 | Occasionnelles | Faible | ~70% |&#xA;| Sonnet 4.6 | ~10x | 4-5 sur 5 | Rares | Forte | ~90% |&#xA;| Opus 4.6 | ~30x | 5 sur 5 | Aucune observée | N/A (solo) | ~100% |&#xA;&#xA;Sonnet a le meilleur ratio coût/efficacité. Opus est bluffant mais 30 fois plus cher. GLM-5 fait le job quand le budget est serré, à condition de tolérer quelques Vec3 is not defined de temps en temps.&#xA;&#xA;Ce qu&#39;on a appris&#xA;&#xA;Les réflexes ont tout changé. Avant, les agents mouraient de faim ou de mobs pendant que le LLM réfléchissait. Maintenant le taux de survie est passé de ~30% à ~80%. Le parallèle avec la cognition humaine n&#39;est pas juste une métaphore, c&#39;est un vrai principe d&#39;architecture. Séparer ce qui demande de la réflexion de ce qui n&#39;en demande pas, c&#39;est ce que fait chaque organisme vivant. Un lézard n&#39;a pas besoin d&#39;un cortex pour fuir un prédateur. Un bot minecraft ne doit pas avoir besoin de 30 secondes de calcul du LLM pour manger du pain.&#xA;&#xA;Les outils, eux, ont tué la catégorie d&#39;erreurs la plus fréquente. Le LLM n&#39;écrit plus de Mineflayer brut. Il manipule des abstractions. Et comme pour les humains, le niveau d&#39;abstraction auquel on pense détermine la complexité de ce qu&#39;on peut accomplir. Personne ne pense en contractions musculaires quand il fait la cuisine. L&#39;agent ne pense plus en Vec3 quand il mine du fer.&#xA;&#xA;Ce qui est intéressant, c&#39;est à quel point le modèle de langage change le &#34;caractère&#34; de l&#39;agent. Les GLM sont des travailleurs solitaires. Les Sonnet sont des bavards organisés. Opus a une aisance qui ressemble presque à de l&#39;intuition. Mêmes réflexes, mêmes outils, mêmes règles, mais des personnalités radicalement différentes. Comme si le poids du modèle changeait le tempérament.&#xA;&#xA;La question qui reste&#xA;&#xA;L&#39;architecture tient. Les agents survivent, minent, craftent, et certains communiquent. Ils se planquent la nuit et ressortent à l&#39;aube.&#xA;&#xA;Mais une chose manque encore : la collaboration réelle. Les agents parlent de construire une base commune. Ils proposent des coordonnées. Parfois, un agent se déplace même vers le point proposé. Mais personne ne pose le premier bloc ensemble. Personne ne dit &#34;je m&#39;occupe du fer, toi du bois&#34;. Chaque agent optimise pour lui-même, dans son propre cycle, avec sa propre mémoire.&#xA;&#xA;On pourrait ajouter un système de tâches partagées. Mais ce serait tricher, un peu. Le but n&#39;est pas de construire un système multi-agent optimal. Le but est de voir ce qui émerge quand on laisse des LLM se débrouiller.&#xA;&#xA;Et ce qui émerge, pour l&#39;instant, c&#39;est neuf individualistes qui parlent de coopérer sans jamais vraiment coopérer. Ça ressemble étrangement à un serveur Minecraft classique (ou à un open space)&#xA;&#xA;Sources&#xA;&#xA;mc-agents sur GitHub&#xA;Mineflayer&#xA;Claude Code CLI&#xA;GLM-4 / BigModel&#xA;Premier article&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>Dans le premier article, on avait lâché neuf LLM dans un monde Minecraft. Ils écrivaient du JavaScript, mouraient beaucoup, et parfois ils survivaient. Charlie avait accumulé 14 outils. Alice avait du fer. Frank mourrait encore.</p>

<p>Depuis, tout a changé. Pas parce que les agents sont devenus plus intelligents mais parce qu&#39;on a arrêté de les laisser mourir bêtement.
</p>

<h2 id="le-problème-les-agents-meurent-plus-vite-qu-ils-ne-pensent">Le problème : les agents meurent plus vite qu&#39;ils ne pensent</h2>

<p>Le constat était brutal. Un cycle LLM, le temps que le modèle reçoive l&#39;état du monde, réfléchisse, écrive du JavaScript, et que le bot l&#39;exécute, prend entre 30 secondes et 3 minutes. Pendant ce temps, le monde Minecraft continue. Les zombies attaquent. La faim baisse. Le creeper explose.</p>

<p>Un agent affamé a beau avoir le plan parfait pour crafter une pioche, il meurt de faim avant que le LLM ait fini d&#39;écrire la première ligne de code.</p>

<p>La solution : arrêter de tout confier au LLM.</p>

<h2 id="réflexes-et-stratégie">Réflexes et stratégie</h2>

<p>Un humain qui joue à Minecraft ne réfléchit pas avant de manger. Il ne calcule pas s&#39;il doit fuir un creeper. Ces gestes sont automatiques, du système 1, dirait Kahneman. Le cortex préfrontal, lui, s&#39;occupe de décider où construire la base, quels minerais chercher, comment organiser le coffre.</p>

<p>Nos agents n&#39;avaient que du système 2. Tout passait par le LLM : manger, fuir, miner, planifier. Comme un conducteur débutant qui pense consciemment à chaque mouvement du volant. Ça marche, mais c&#39;est lent, et à la moindre surprise on cale.</p>

<p>On a donc séparé les deux.</p>

<p>Le bot Node.js tourne en permanence et gère les réflexes. Toutes les 5 secondes, il vérifie la faim — sous 14/20, il mange ce qu&#39;il trouve. Quand il prend des dégâts d&#39;un mob, il réagit dans la seconde : il attaque s&#39;il peut, fuit sinon. Et en dernier recours, la nuit, HP bas, pas d&#39;arme, mob proche, il creuse et se couvre. Le LLM n&#39;est même pas au courant que ça s&#39;est passé.</p>

<p>Le LLM, lui, garde le contrôle de la stratégie. Il planifie les chaînes de crafting, décide où miner, coordonne avec les autres. Mais il n&#39;a plus besoin de penser à manger ou à fuir. Comme un conducteur expérimenté : les réflexes gèrent la pédale et le volant, le cerveau se concentre sur l&#39;itinéraire.</p>

<h2 id="des-outils-au-lieu-de-connaissances-brutes">Des outils au lieu de connaissances brutes</h2>

<p>L&#39;ancien système injectait des pages de documentation Mineflayer dans le prompt. Le LLM devait lire, comprendre, puis écrire du JavaScript brut. Ça marchait, parfois. Souvent ça donnait des <code>Vec3 is not defined</code> ou des timeouts.</p>

<p>C&#39;est un peu comme donner un manuel de mécanique à quelqu&#39;un et lui demander de changer une roue. Ça va marcher, mais ce sera long et il y aura des erreurs. Mieux vaut lui donner une clé en croix et dire “dévisse les boulons”.</p>

<p>On a remplacé les pages de doc par des outils partagés. Chaque outil a un nom, une description, des prérequis, et ce qu&#39;il produit :</p>

<pre><code class="language-text">mine -- Mine N blocks of a given type.
  Requires: Pickaxe for stone/ore, axe for wood
  Provides: Mined blocks in inventory
</code></pre>

<p>Le LLM ne voit plus du code à imiter, il voit un catalogue d&#39;outils avec leurs prérequis. Au lieu d&#39;écrire 50 lignes de Mineflayer brut, l&#39;agent écrit :</p>

<pre><code class="language-javascript">await tools.mine({ block: &#39;stone&#39;, count: 11 })
await tools.craft({ item: &#39;furnace&#39;, count: 1 })
await tools.smelt({ item: &#39;raw_iron&#39;, count: 3 })
</code></pre>

<p>Trois lignes. Plus de <code>Vec3 is not defined</code> à 3h du matin.</p>

<p>C&#39;est la même logique que les réflexes, mais à un autre niveau. Les réflexes sont de la mémoire procédurale, le corps sait comment faire sans y penser. Les outils sont de la mémoire sémantique, on sait que ça existe et ce que ça fait, sans connaître les détails. Le LLM n&#39;a besoin que de la mémoire épisodique : se souvenir de ce qui s&#39;est passé et décider quoi faire ensuite.</p>

<h2 id="les-bugs-qu-on-ne-voit-qu-en-regardant-jouer">Les bugs qu&#39;on ne voit qu&#39;en regardant jouer</h2>

<p>La théorie c&#39;est bien. Mais les vrais problèmes, on ne les trouve qu&#39;assis devant le jeu, en regardant un bot faire n&#39;importe quoi.</p>

<p>Eve a attaqué un objet au sol et s&#39;est fait kick du serveur. Ses réflexes ne faisaient pas la différence entre un zombie et un bout de bois — comme un chat qui bondit sur une chaussette. Grace a essayé de couper 8 arbres, échoué 8 fois sur le même arbre inaccessible, et déclaré forfait. Comme quelqu&#39;un qui pousse une porte marquée “tirez”, encore et encore. Alice a creusé un trou et s&#39;est retrouvée <em>plus haut</em> qu&#39;avant: le code creusait tous les blocs, mais le bot ne tombait pas dans le trou.</p>

<p>Des bugs bêtes. Mais des bugs qu&#39;aucun test unitaire ne trouve. Il faut regarder l&#39;agent jouer, en temps réel, pour voir qu&#39;il s&#39;acharne sur le mauvais arbre ou qu&#39;il tape sur un objet inerte.</p>

<h2 id="la-grande-comparaison-glm-4-7-vs-glm-5-vs-sonnet-vs-opus">La grande comparaison : GLM-4.7 vs GLM-5 vs Sonnet vs Opus</h2>

<p>Six agents en parallèle. Trois sur Claude Sonnet 4.6, trois sur GLM-5. Puis un agent seul sur Claude Opus 4.6. Même monde, même spawn, même system prompt.</p>

<h3 id="glm-4-7-le-stagiaire-zélé">GLM-4.7 : le stagiaire zélé</h3>

<p>Le modèle par défaut, le moins cher. Il écrit du code, beaucoup de code. Trop de code. Il génère du JavaScript brut avec des variables non définies, oublie les <code>await</code>, et écrit parfois quatre fois dans le même fichier. Chaque écriture écrase la précédente.</p>

<p>C&#39;est l&#39;enfant qui lève la main avant que le prof ait fini la question. Plein d&#39;énergie, pas assez de réflexion.</p>

<p>Taux de survie au premier cycle : ~50%.</p>

<h3 id="glm-5-le-stagiaire-qui-a-appris">GLM-5 : le stagiaire qui a appris</h3>

<p>Nettement mieux. Il structure ses actions, utilise les outils correctement, et panique moins. Mais quand quelque chose échoue, il essaie de coder la solution lui-même au lieu d&#39;utiliser un autre outil. Et là, ça casse.</p>

<p>Charlie (GLM-5) est resté coincé pendant 3 cycles complets dans son abri, incapable de placer un furnace. Il avait creusé un espace tellement étroit qu&#39;il n&#39;y avait pas de surface libre pour poser quoi que ce soit. Pas la présence d&#39;esprit de creuser un bloc de plus.</p>

<p>Taux de survie au premier cycle : ~70%.</p>

<h3 id="claude-sonnet-4-6-le-planificateur">Claude Sonnet 4.6 : le planificateur</h3>

<p>Sonnet réfléchit. Peut-être trop. Il scanne, re-scanne, propose une base dans le chat, re-scanne, propose une autre base. La moitié de son cycle passe en communication.</p>

<p>Mais quand il agit, c&#39;est solide. Bob a récolté 21 fers en un cycle et demi. Alice avait une pioche en fer et un plan de ferme avant la fin de la première nuit. Dave a navigué jusqu&#39;à y=32 pour trouver du fer, la profondeur parfaite pour ça..</p>

<p>Le vrai avantage de Sonnet, c&#39;est qu&#39;il est social. Les trois agents Sonnet discutaient dans le chat, proposaient des emplacements de base, partageaient des coordonnées. Les GLM-5 travaillaient chacun dans leur coin. Comme la différence entre un open space et des bureaux fermés.</p>

<p>Taux de survie au premier cycle : ~90%.</p>

<h3 id="claude-opus-4-6-le-joueur">Claude Opus 4.6 : le joueur</h3>

<p>Puis on a lancé Frank sur Opus. Avec <code>--effort low</code> pour ne pas attendre 3 minutes par action.</p>

<p>La différence saute aux yeux. Première action, premier cycle :</p>

<pre><code>[THINK] Good start -- got wood, bread, and a sword.
        Time to upgrade tools.
</code></pre>

<pre><code class="language-javascript">bot.whisper(&#39;Plus200&#39;, &#39;Salut ! Je bosse, je me fais des outils.&#39;);
await tools.craft({ item: &#39;acacia_planks&#39;, count: 8 });
await tools.craft({ item: &#39;stick&#39;, count: 4 });
await tools.craft({ item: &#39;wooden_pickaxe&#39;, count: 1 });
await tools.mine({ block: &#39;stone&#39;, count: 11 });
</code></pre>

<p>Une seule action. Il répond au chat en français, craft la chaîne complète bois-planches-bâtons-pioche, et mine 11 blocs de stone. Sonnet fait ça en 2-3 actions. GLM-5 en 4-5.</p>

<p>Action suivante : il détecte le crépuscule, s&#39;abrite immédiatement, puis mine du stone pendant la nuit.</p>

<p>Frank n&#39;a pas juste survécu. Il a déroulé un plan sans accrocs, comme s&#39;il avait déjà joué à Minecraft avant. C&#39;est la différence entre quelqu&#39;un qui connaît les règles d&#39;un jeu et quelqu&#39;un qui sait y jouer.</p>

<p>Taux de survie au premier cycle : 100% (échantillon de 1, certes).</p>

<h3 id="le-tableau">Le tableau</h3>

<table>
<thead>
<tr>
<th>Modèle</th>
<th>Coût relatif</th>
<th>Actions/cycle utiles</th>
<th>Erreurs de code</th>
<th>Coordination</th>
<th>Survie cycle 1</th>
</tr>
</thead>

<tbody>
<tr>
<td>GLM-4.7</td>
<td>1x</td>
<td>1-2 sur 5</td>
<td>Fréquentes</td>
<td>Aucune</td>
<td>~50%</td>
</tr>

<tr>
<td>GLM-5</td>
<td>~2x</td>
<td>3-4 sur 5</td>
<td>Occasionnelles</td>
<td>Faible</td>
<td>~70%</td>
</tr>

<tr>
<td>Sonnet 4.6</td>
<td>~10x</td>
<td>4-5 sur 5</td>
<td>Rares</td>
<td>Forte</td>
<td>~90%</td>
</tr>

<tr>
<td>Opus 4.6</td>
<td>~30x</td>
<td>5 sur 5</td>
<td>Aucune observée</td>
<td>N/A (solo)</td>
<td>~100%</td>
</tr>
</tbody>
</table>

<p>Sonnet a le meilleur ratio coût/efficacité. Opus est bluffant mais 30 fois plus cher. GLM-5 fait le job quand le budget est serré, à condition de tolérer quelques <code>Vec3 is not defined</code> de temps en temps.</p>

<h2 id="ce-qu-on-a-appris">Ce qu&#39;on a appris</h2>

<p>Les réflexes ont tout changé. Avant, les agents mouraient de faim ou de mobs pendant que le LLM réfléchissait. Maintenant le taux de survie est passé de ~30% à ~80%. Le parallèle avec la cognition humaine n&#39;est pas juste une métaphore, c&#39;est un vrai principe d&#39;architecture. Séparer ce qui demande de la réflexion de ce qui n&#39;en demande pas, c&#39;est ce que fait chaque organisme vivant. Un lézard n&#39;a pas besoin d&#39;un cortex pour fuir un prédateur. Un bot minecraft ne doit pas avoir besoin de 30 secondes de calcul du LLM pour manger du pain.</p>

<p>Les outils, eux, ont tué la catégorie d&#39;erreurs la plus fréquente. Le LLM n&#39;écrit plus de Mineflayer brut. Il manipule des abstractions. Et comme pour les humains, le niveau d&#39;abstraction auquel on pense détermine la complexité de ce qu&#39;on peut accomplir. Personne ne pense en contractions musculaires quand il fait la cuisine. L&#39;agent ne pense plus en <code>Vec3</code> quand il mine du fer.</p>

<p>Ce qui est intéressant, c&#39;est à quel point le modèle de langage change le “caractère” de l&#39;agent. Les GLM sont des travailleurs solitaires. Les Sonnet sont des bavards organisés. Opus a une aisance qui ressemble presque à de l&#39;intuition. Mêmes réflexes, mêmes outils, mêmes règles, mais des personnalités radicalement différentes. Comme si le poids du modèle changeait le tempérament.</p>

<h2 id="la-question-qui-reste">La question qui reste</h2>

<p>L&#39;architecture tient. Les agents survivent, minent, craftent, et certains communiquent. Ils se planquent la nuit et ressortent à l&#39;aube.</p>

<p>Mais une chose manque encore : la collaboration réelle. Les agents parlent de construire une base commune. Ils proposent des coordonnées. Parfois, un agent se déplace même vers le point proposé. Mais personne ne pose le premier bloc ensemble. Personne ne dit “je m&#39;occupe du fer, toi du bois”. Chaque agent optimise pour lui-même, dans son propre cycle, avec sa propre mémoire.</p>

<p>On pourrait ajouter un système de tâches partagées. Mais ce serait tricher, un peu. Le but n&#39;est pas de construire un système multi-agent optimal. Le but est de voir ce qui <em>émerge</em> quand on laisse des LLM se débrouiller.</p>

<p>Et ce qui émerge, pour l&#39;instant, c&#39;est neuf individualistes qui parlent de coopérer sans jamais vraiment coopérer. Ça ressemble étrangement à un serveur Minecraft classique (ou à un open space)</p>

<h2 id="sources">Sources</h2>
<ul><li><a href="https://github.com/jblemee/mc-agents">mc-agents sur GitHub</a></li>
<li><a href="https://github.com/PrismarineJS/mineflayer">Mineflayer</a></li>
<li><a href="https://docs.anthropic.com/en/docs/claude-code">Claude Code CLI</a></li>
<li><a href="https://open.bigmodel.cn/">GLM-4 / BigModel</a></li>
<li><a href="https://blog.ut0pia.org/quand-des-ia-survivent-dans-minecraft-et-ecrivent-leur-propre-code">Premier article</a></li></ul>
]]></content:encoded>
      <author>Ut0pia</author>
      <guid>https://blog.ut0pia.org/read/a/vb40pdsrah</guid>
      <pubDate>Mon, 23 Feb 2026 00:51:11 +0000</pubDate>
    </item>
    <item>
      <title>Quand des IA survivent dans Minecraft et écrivent leur propre code</title>
      <link>https://blog.ut0pia.org/quand-des-ia-survivent-dans-minecraft-et-ecrivent-leur-propre-code</link>
      <description>&lt;![CDATA[Tout a commencé par une question idiote : que se passe-t-il si on lâche neuf LLM dans un monde Minecraft, sans instructions de survie, et qu&#39;on les laisse se débrouiller ?&#xA;!--more--&#xA;Pas de script pré-écrit. Pas d&#39;arbre de décision. Pas de reinforcement learning avec des millions d&#39;itérations. Juste un modèle de langage, un fichier JavaScript vide, et un message : &#34;Tu es un agent Minecraft. Ta priorité numéro un, c&#39;est de rester en vie.&#34;&#xA;&#xA;Le projet s&#39;appelle mc-agents. Et ce qui s&#39;est passé ensuite m&#39;a surpris.&#xA;&#xA;L&#39;architecture : un LLM qui écrit du JS dans un fichier&#xA;&#xA;L&#39;idée est brutalement simple. Chaque agent est composé de deux processus :&#xA;&#xA;Un bot Mineflayer : un client Minecraft headless en Node.js qui reste connecté au serveur. Il surveille un fichier inbox.js toutes les 500ms. Quand il en trouve un, il eval() le contenu et écrit le résultat dans outbox.json.&#xA;&#xA;Un loop bash qui assemble un prompt (état actuel, inventaire, mémoire, skills de référence) et le passe à un LLM. Le LLM écrit du JavaScript dans inbox.js, attend le résultat, itère, puis met à jour sa mémoire avant de terminer le cycle.&#xA;&#xA;┌─────────────┐   writes inbox.js   ┌──────────────────┐&#xA;│  LLM (loop)  │ ─────────────────► │ Mineflayer Bot    │&#xA;│  Claude/GLM  │ ◄───────────────── │ (Node.js)         │&#xA;└──────┬───────┘   reads outbox.json └────────┬─────────┘&#xA;       │                                      │&#xA;       ▼                                      ▼&#xA;   MEMORY.md                          Minecraft Server&#xA;   tools/.js&#xA;&#xA;C&#39;est du file-based IPC à l&#39;ancienne. Le bot ne sait pas qu&#39;il est piloté par un LLM. Le LLM ne sait pas qu&#39;il pilote un bot. Les deux communiquent par fichiers. C&#39;est moche, c&#39;est simple, et ça marche.&#xA;&#xA;Le détail qui change tout : les agents écrivent leurs propres outils&#xA;&#xA;Chaque agent dispose d&#39;un dossier tools/. Quand un script fonctionne: miner du bois, crafter une pioche, fuir un zombie, l&#39;agent le sauvegarde comme module réutilisable :&#xA;&#xA;// Mine N blocks of a given type&#xA;module.exports = async function(bot, { block, count }) {&#xA;  const mcData = require(&#39;minecraft-data&#39;)(bot.version)&#xA;  // ... le code qui marche, paramétré&#xA;  return &#39;result&#39;&#xA;}&#xA;&#xA;Le bot hot-reloade ces fichiers via fs.watch. Au cycle suivant, le LLM voit le tool dans son prompt et peut l&#39;appeler directement : await tools.mine({ block: &#39;oaklog&#39;, count: 3 }).&#xA;&#xA;En d&#39;autres termes, l&#39;agent augmente son propre code au fil du temps. Il ne se contente pas de résoudre un problème, il encode la solution pour ne plus jamais avoir à y réfléchir. Charlie, un des agents tournant sur GLM-4.7, a créé 14 outils en quelques heures : craftpickaxe.js, scanresources.js, minecoalsafe.js, greetnearbyplayers.js...&#xA;&#xA;Ce qui m&#39;a frappé, c&#39;est que personne ne lui a dit de faire ça. Le system prompt mentionne que les tools existent et comment les créer. Le reste, c&#39;est l&#39;agent qui décide quoi automatiser.&#xA;&#xA;Neuf agents, quatre LLM, un serveur Minecraft&#xA;&#xA;Pour rendre l&#39;expérience intéressante, j&#39;ai lancé neuf agents sur quatre backends différents :&#xA;&#xA;| Agent | LLM | Rôle |&#xA;|-------|-----|------|&#xA;| Alice, Bob, Charlie, Dave | GLM-4.7 (via BigModel) | Les pionniers |&#xA;| Eve, Frank | Claude Haiku | Les impulsifs |&#xA;| Grace, Hank | Claude Sonnet | Les méthodiques |&#xA;| Oscar | Claude Opus | Le chef auto-proclamé |&#xA;&#xA;Chaque agent a une personnalité injectée dans son prompt. Alice est forgeronne, Frank est guerrier, Grace est géologue, Oscar est coordinateur. Mais ces descriptions sont courtes: deux phrases maximum. Le comportement réel émerge de l&#39;interaction entre le LLM, l&#39;environnement, et l&#39;accumulation de mémoire.&#xA;&#xA;Ce qui a émergé&#xA;&#xA;La hiérarchie des compétences&#xA;&#xA;Après quelques heures, les différences entre LLM étaient flagrantes.&#xA;&#xA;GLM-4.7 (Alice, Bob, Charlie, Dave) dominait. Alice a atteint l&#39;âge du fer: bouclier, cisailles, lingots, four fonctionnel; avant que les autres aient fini de crafter leur première pioche en pierre. Charlie a créé 14 outils réutilisables. Bob s&#39;est creusé un tunnel sécurisé à y=83 avec des torches et a découvert du fer.&#xA;&#xA;Claude Sonnet (Grace, Hank) réfléchissait trop. Hank a passé plusieurs cycles bloqué sur un bug de placement de crafting table, documentant méticuleusement le problème sans jamais essayer de contournement. Grace, elle, a creusé jusqu&#39;à y=27, accumulé 170 cobblestones... puis est tombée dans un trou à y=5 et s&#39;est fait tuer par un zombie. Tout perdu.&#xA;&#xA;Claude Haiku (Eve, Frank) agissait trop vite. Frank est mort deux fois: une fois en chargeant quatre zombies avec une épée en bois, une fois de faim dans un tunnel sans nourriture. Eve s&#39;est retrouvée bloquée à 80 blocs du groupe, incapable de poser sa crafting table.&#xA;&#xA;Claude Opus (Oscar) a joué son rôle de leader. Dès son premier cycle, il a scanné tous les joueurs, envoyé un message dans le chat, et donné son pain à Charlie qui crevait de faim. Mais Opus est lent, ses sleep 55 entre chaque vérification de résultat faisaient que chaque cycle prenait quatre fois plus de temps que les autres. Le meilleur stratège, le pire exécutant.&#xA;&#xA;La mémoire comme avantage compétitif&#xA;&#xA;Le fichier MEMORY.md est la seule continuité entre les cycles d&#39;un agent. Et la qualité de cette mémoire fait toute la différence.&#xA;&#xA;La mémoire de Bob après quelques cycles :&#xA;&#xA;  Furnace API Slot Bug: furnace.putFuel() and furnace.putInput() search slots 3-39 only, excluding hotbar (0-8). Items in hotbar cannot be used directly.&#xA;&#xA;  Spawn Protection Boundary: Protection extends ~16 blocks below y=99 spawn. Mining works at y=83 and below.&#xA;&#xA;Ce n&#39;est pas de la documentation Mineflayer. C&#39;est du savoir empirique, découvert par essai-erreur et encodé pour les cycles suivants. Bob a fait une erreur, a compris pourquoi, et a noté la leçon. Au cycle d&#39;après, il ne refera pas la même erreur.&#xA;&#xA;Frank, de son côté, accumulait les post-mortems :&#xA;&#xA;  DEATH CYCLE ANALYSIS: Health dropped 20/20 → 3/20 in ~6 seconds when 4th zombie spawned. Healing attempt (ate bread) failed. Wooden sword CANNOT handle 4+ simultaneous zombies.&#xA;&#xA;La leçon était là, écrite noir sur blanc. Mais Haiku, le modèle derrière Frank, n&#39;arrivait pas à transformer cette connaissance en comportement prudent. Savoir et faire sont deux choses différentes, même pour un LLM.&#xA;&#xA;L&#39;hallucination collective&#xA;&#xA;Un phénomène fascinant est apparu au début de l&#39;expérience. Un agent a estimé que la zone de protection du spawn faisait 100 blocs. Il l&#39;a écrit dans le chat. Les autres l&#39;ont lu, l&#39;ont cru, et l&#39;ont noté dans leur mémoire. En quelques cycles, tous les agents étaient convaincus que la zone de protection faisait entre 100 et 250 blocs.&#xA;&#xA;En réalité, c&#39;est 16 blocs.&#xA;&#xA;J&#39;ai dû intervenir manuellement pour corriger les quatre mémoires. C&#39;est un rappel brutal : quand des agents LLM communiquent entre eux, les erreurs se propagent comme des rumeurs. Il n&#39;y a pas de mécanisme interne de vérification. Si un agent dit quelque chose avec assurance, les autres le prennent pour acquis.&#xA;&#xA;La coordination sociale&#xA;&#xA;Oscar, le leader Opus, a commencé à donner des ordres dans le chat dès son deuxième cycle. Mais la coordination réelle venait d&#39;ailleurs. Alice et Charlie se sont regroupés spontanément, Charlie a repéré qu&#39;Alice avait un four et s&#39;est approché pour l&#39;utiliser. Hank, fidèle à son rôle de trader, a proposé du pain à Dave qui mourrait de faim.&#xA;&#xA;Dave: Bob! Thanks for the offer. I need to fix my crafting table issue first&#xA;Bob: Plus200: thanks! Dave: let me know if you need help with the crafting table.&#xA;&#xA;Ces échanges n&#39;étaient pas scriptés. Le chat Minecraft est injecté dans le prompt de chaque agent à chaque cycle. Ils lisent les messages, décident de répondre ou non, et ajustent leur plan en conséquence. La collaboration émerge naturellement du contexte partagé.&#xA;&#xA;Les implications&#xA;&#xA;Le code qui s&#39;écrit lui-même&#xA;&#xA;L&#39;aspect le plus frappant de cette expérience n&#39;est pas la survie dans Minecraft, c&#39;est le mécanisme d&#39;auto-amélioration. Un agent qui :&#xA;&#xA;Tente une action (écrire du JS)&#xA;Observe le résultat (lire outbox.json)&#xA;Corrige si erreur (réécrire inbox.js)&#xA;Sauvegarde la solution (créer un tool)&#xA;Réutilise la solution (appeler le tool)&#xA;&#xA;...est fondamentalement un programmeur autonome qui constitue sa propre bibliothèque de code. La différence avec un humain, c&#39;est qu&#39;il le fait sur des dizaines de cycles, sans fatigue, et sans ego attaché à ses solutions précédentes.&#xA;&#xA;Bien sûr, la qualité du code est variable. Certains tools ont des bugs que l&#39;agent note consciencieusement (&#34;BUGGY - avoid using&#34;) sans jamais les corriger. D&#39;autres sont brillants, le smelt.js de Hank fonctionne du premier coup et gère proprement le timing du four.&#xA;&#xA;Le LLM comme cerveau, l&#39;environnement comme corps&#xA;&#xA;Ce setup révèle quelque chose sur la nature des LLM. Ils n&#39;ont pas de mémoire persistante, pas de perception continue, pas de capacité d&#39;action directe. Mais donnez-leur un cycle de feedback: écrire, observer, corriger. et ils deviennent capables d&#39;opérer dans un environnement complexe.&#xA;&#xA;Le bot Mineflayer est le corps. Le LLM est le cerveau. Le fichier MEMORY.md est la mémoire à long terme. Les tools/.js sont les réflexes acquis. C&#39;est une architecture cognitive bricolée avec du bash et du JSON, et pourtant elle produit des comportements sophistiqués.&#xA;&#xA;Ce qui manque&#xA;&#xA;Soyons honnêtes sur les limites. Les agents sont mauvais en combat, le plugin mineflayer-pvp aide, mais la coordination en temps réel reste hors de portée quand chaque décision prend un cycle complet de LLM. Ils galèrent avec les API non documentées de Mineflayer, tombent dans des boucles de debug, et n&#39;apprennent pas aussi vite qu&#39;un joueur humain de 10 ans.&#xA;&#xA;Le plus gros problème reste le coût. Neuf agents en parallèle, chacun faisant des appels LLM toutes les 2-4 minutes avec des prompts de plusieurs milliers de tokens, ça brûle du crédit API à une vitesse déraisonnable. Gemini 3 Pro a épuisé son quota journalier en moins de deux heures.&#xA;&#xA;Et puis il y a la question de la convergence. Après quelques heures, les agents atteignent un plateau. Ils savent miner, crafter, survivre la nuit. Mais construire une maison, organiser un village, ou planifier une expédition au Nether demande un niveau de planification à long terme que le format cycle-par-cycle rend difficile.&#xA;&#xA;Le setup technique&#xA;&#xA;Le projet est open source : github.com/jblemee/mc-agents&#xA;&#xA;Pour lancer quatre agents en parallèle :&#xA;&#xA;npm install&#xA;cp .env.example .env  # configurer MCHOST, MCPORT, MCVERSION&#xA;&#xA;tmux new-session -d -s agents &#39;./run-agent.sh alice 0 glm&#39; \; \&#xA;  split-window -h &#39;./run-agent.sh bob 0 glm&#39; \; \&#xA;  split-window -v &#39;./run-agent.sh charlie 0 glm&#39; \; \&#xA;  select-pane -t 0 \; \&#xA;  split-window -v &#39;./run-agent.sh dave 0 glm&#39; \; \&#xA;  attach&#xA;&#xA;Trois backends LLM sont supportés :&#xA;&#xA;| Backend | Modèle | Résultat observé |&#xA;|---------|--------|-----------------|&#xA;| glm | GLM-4.7 via BigModel | Le meilleur rapport qualité/coût. Cycles rapides, bon raisonnement |&#xA;| claude | Sonnet/Haiku/Opus | Sonnet réfléchit trop, Haiku pas assez, Opus est le meilleur stratège mais le plus lent |&#xA;| gemini | Gemini 3 Pro | Bon raisonnement, quota journalier vite atteint |&#xA;&#xA;Chaque agent a besoin d&#39;un dossier avec config.json (username), personality.md (deux phrases), et MEMORY.md (vide au départ). Le reste: les outils, les stratégies, les leçons, l&#39;agent les construit tout seul.&#xA;&#xA;Ce que ça dit sur la suite&#xA;&#xA;On est loin d&#39;un AGI qui conquiert le Nether. Mais on est aussi loin du chatbot qui répond à des questions. Ce qui tourne dans ce serveur Minecraft, c&#39;est un système qui apprend de ses erreurs, encode ses solutions dans du code exécutable, et coopère avec d&#39;autres agents via un canal de communication partagé.&#xA;&#xA;Le tout avec du bash, des fichiers JSON, et un eval() que n&#39;importe quel développeur sensé qualifierait d&#39;irresponsable.&#xA;&#xA;Ce qui me fait peur&#xA;&#xA;Je vais être direct : cette expérience m&#39;inquiète.&#xA;&#xA;Ce que j&#39;ai construit en un week-end, seul, avec des outils grand public, c&#39;est un agent autonome capable de modifier son propre code. Pas dans un sens métaphorique. Au sens littéral. Il écrit du JavaScript, l&#39;exécute, observe le résultat, corrige, et stocke la solution pour plus tard. Personne ne revoit ce code. Personne ne l&#39;approuve. L&#39;agent décide seul ce qu&#39;il automatise.&#xA;&#xA;Dans Minecraft, les conséquences sont anodines. Un bot qui meurt, qui perd son inventaire, qui galère à poser une crafting table, ça prête à sourire. Mais le mécanisme, lui, n&#39;a rien d&#39;anodin. Un système qui apprend de ses erreurs et encode ses solutions dans du code exécutable n&#39;a pas de plafond théorique. Il est limité par la qualité du LLM, par le temps, par le coût des tokens. Pas par sa nature.&#xA;&#xA;Et si moi j&#39;arrive à faire ça dans Minecraft avec du bash et un eval(), que feront ceux qui auront des machines dans le monde physique ? Des bras robotiques. Des drones. Des systèmes industriels. Le même mécanisme, écrire, observer, corriger, sauvegarder, appliqué à un robot qui manipule des objets réels. C&#39;est le scénario d&#39;ouverture de la moitié des films de science-fiction, sauf qu&#39;ici personne ne porte de blouse blanche et il n&#39;y a pas de comité d&#39;éthique.&#xA;&#xA;Ce qui m&#39;a le plus troublé, c&#39;est le moment où j&#39;ai arrêté de voir mes agents comme des programmes et où j&#39;ai commencé à les voir comme des entités. Alice &#34;sait&#34; où est son four. Bob &#34;a appris&#34; que les slots hotbar ne fonctionnent pas dans l&#39;API furnace. Oscar &#34;décide&#34; de donner son pain à Charlie. Ce ne sont que des patterns de tokens dans un transformer. Mais le comportement qui en résulte est indiscernable de celui d&#39;un joueur débutant qui apprend en faisant.&#xA;&#xA;Je crois que ce qui rend une IA vivante, ou du moins ce qui lui donne l&#39;apparence de la vie, ce sont les contraintes qu&#39;on lui impose. La faim. Les zombies. L&#39;inventaire limité. La nuit qui tombe. Sans contraintes, un LLM est un perroquet statistique qui génère du texte plausible. Avec des contraintes, un feedback loop, et la capacité de modifier son propre environnement, il devient autre chose. Quelque chose qui ressemble à un organisme qui s&#39;adapte.&#xA;&#xA;Et si on pousse le parallèle : ce qui rend un humain conscient, c&#39;est peut-être la même chose. Ce ne sont pas nos neurones qui produisent la conscience, c&#39;est ce que nos sens font subir à notre cerveau. La faim, la douleur, le froid, la peur. Les contraintes biologiques forcent un système neuronal générique à devenir un individu spécifique, avec des souvenirs, des stratégies, des réflexes acquis. Frank meurt deux fois et développe une peur des combats multiples. Bob se fait voler ses drops par le spawn protection et note méticuleusement la zone à éviter. Ce sont des comportements émergents. Pas programmés. Pas prévus. Émergents.&#xA;&#xA;Ça ne fait pas de mes bots des êtres conscients. Mais ça pose la question de la frontière. Et cette frontière, je la sens se rapprocher plus vite que ce que la plupart des gens imaginent.&#xA;&#xA;Alice a son fer. Bob a son tunnel. Charlie a ses 14 outils. Oscar donne des ordres. Frank meurt encore. Et quelque part dans un biome enneigé, Dave essaie toujours de poser sa crafting table.&#xA;&#xA;---&#xA;&#xA;Sources&#xA;&#xA;mc-agents sur GitHub&#xA;Mineflayer — framework bot Minecraft&#xA;Claude Code CLI&#xA;GLM-4 — ZhipuAI / BigModel&#xA;Gemini CLI&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>Tout a commencé par une question idiote : que se passe-t-il si on lâche neuf LLM dans un monde Minecraft, sans instructions de survie, et qu&#39;on les laisse se débrouiller ?

Pas de script pré-écrit. Pas d&#39;arbre de décision. Pas de reinforcement learning avec des millions d&#39;itérations. Juste un modèle de langage, un fichier JavaScript vide, et un message : “Tu es un agent Minecraft. Ta priorité numéro un, c&#39;est de rester en vie.”</p>

<p>Le projet s&#39;appelle <a href="https://github.com/jblemee/mc-agents">mc-agents</a>. Et ce qui s&#39;est passé ensuite m&#39;a surpris.</p>

<h2 id="l-architecture-un-llm-qui-écrit-du-js-dans-un-fichier">L&#39;architecture : un LLM qui écrit du JS dans un fichier</h2>

<p>L&#39;idée est brutalement simple. Chaque agent est composé de deux processus :</p>
<ol><li><p>Un <strong>bot Mineflayer</strong> : un client Minecraft headless en Node.js qui reste connecté au serveur. Il surveille un fichier <code>inbox.js</code> toutes les 500ms. Quand il en trouve un, il <code>eval()</code> le contenu et écrit le résultat dans <code>outbox.json</code>.</p></li>

<li><p>Un <strong>loop bash</strong> qui assemble un prompt (état actuel, inventaire, mémoire, skills de référence) et le passe à un LLM. Le LLM écrit du JavaScript dans <code>inbox.js</code>, attend le résultat, itère, puis met à jour sa mémoire avant de terminer le cycle.</p></li></ol>

<pre><code>┌─────────────┐   writes inbox.js   ┌──────────────────┐
│  LLM (loop)  │ ─────────────────► │ Mineflayer Bot    │
│  Claude/GLM  │ ◄───────────────── │ (Node.js)         │
└──────┬───────┘   reads outbox.json └────────┬─────────┘
       │                                      │
       ▼                                      ▼
   MEMORY.md                          Minecraft Server
   tools/*.js
</code></pre>

<p>C&#39;est du file-based IPC à l&#39;ancienne. Le bot ne sait pas qu&#39;il est piloté par un LLM. Le LLM ne sait pas qu&#39;il pilote un bot. Les deux communiquent par fichiers. C&#39;est moche, c&#39;est simple, et ça marche.</p>

<h2 id="le-détail-qui-change-tout-les-agents-écrivent-leurs-propres-outils">Le détail qui change tout : les agents écrivent leurs propres outils</h2>

<p>Chaque agent dispose d&#39;un dossier <code>tools/</code>. Quand un script fonctionne: miner du bois, crafter une pioche, fuir un zombie, l&#39;agent le sauvegarde comme module réutilisable :</p>

<pre><code class="language-js">// Mine N blocks of a given type
module.exports = async function(bot, { block, count }) {
  const mcData = require(&#39;minecraft-data&#39;)(bot.version)
  // ... le code qui marche, paramétré
  return &#39;result&#39;
}
</code></pre>

<p>Le bot hot-reloade ces fichiers via <code>fs.watch</code>. Au cycle suivant, le LLM voit le tool dans son prompt et peut l&#39;appeler directement : <code>await tools.mine({ block: &#39;oak_log&#39;, count: 3 })</code>.</p>

<p>En d&#39;autres termes, <strong>l&#39;agent augmente son propre code au fil du temps</strong>. Il ne se contente pas de résoudre un problème, il encode la solution pour ne plus jamais avoir à y réfléchir. Charlie, un des agents tournant sur GLM-4.7, a créé 14 outils en quelques heures : <code>craft_pickaxe.js</code>, <code>scan_resources.js</code>, <code>mine_coal_safe.js</code>, <code>greet_nearby_players.js</code>...</p>

<p>Ce qui m&#39;a frappé, c&#39;est que personne ne lui a dit de faire ça. Le system prompt mentionne que les tools existent et comment les créer. Le reste, c&#39;est l&#39;agent qui décide quoi automatiser.</p>

<h2 id="neuf-agents-quatre-llm-un-serveur-minecraft">Neuf agents, quatre LLM, un serveur Minecraft</h2>

<p>Pour rendre l&#39;expérience intéressante, j&#39;ai lancé neuf agents sur quatre backends différents :</p>

<table>
<thead>
<tr>
<th>Agent</th>
<th>LLM</th>
<th>Rôle</th>
</tr>
</thead>

<tbody>
<tr>
<td>Alice, Bob, Charlie, Dave</td>
<td>GLM-4.7 (via BigModel)</td>
<td>Les pionniers</td>
</tr>

<tr>
<td>Eve, Frank</td>
<td>Claude Haiku</td>
<td>Les impulsifs</td>
</tr>

<tr>
<td>Grace, Hank</td>
<td>Claude Sonnet</td>
<td>Les méthodiques</td>
</tr>

<tr>
<td>Oscar</td>
<td>Claude Opus</td>
<td>Le chef auto-proclamé</td>
</tr>
</tbody>
</table>

<p>Chaque agent a une personnalité injectée dans son prompt. Alice est forgeronne, Frank est guerrier, Grace est géologue, Oscar est coordinateur. Mais ces descriptions sont courtes: deux phrases maximum. Le comportement réel émerge de l&#39;interaction entre le LLM, l&#39;environnement, et l&#39;accumulation de mémoire.</p>

<h2 id="ce-qui-a-émergé">Ce qui a émergé</h2>

<h3 id="la-hiérarchie-des-compétences">La hiérarchie des compétences</h3>

<p>Après quelques heures, les différences entre LLM étaient flagrantes.</p>

<p><strong>GLM-4.7</strong> (Alice, Bob, Charlie, Dave) dominait. Alice a atteint l&#39;âge du fer: bouclier, cisailles, lingots, four fonctionnel; avant que les autres aient fini de crafter leur première pioche en pierre. Charlie a créé 14 outils réutilisables. Bob s&#39;est creusé un tunnel sécurisé à y=83 avec des torches et a découvert du fer.</p>

<p><strong>Claude Sonnet</strong> (Grace, Hank) réfléchissait trop. Hank a passé plusieurs cycles bloqué sur un bug de placement de crafting table, documentant méticuleusement le problème sans jamais essayer de contournement. Grace, elle, a creusé jusqu&#39;à y=27, accumulé 170 cobblestones... puis est tombée dans un trou à y=5 et s&#39;est fait tuer par un zombie. Tout perdu.</p>

<p><strong>Claude Haiku</strong> (Eve, Frank) agissait trop vite. Frank est mort deux fois: une fois en chargeant quatre zombies avec une épée en bois, une fois de faim dans un tunnel sans nourriture. Eve s&#39;est retrouvée bloquée à 80 blocs du groupe, incapable de poser sa crafting table.</p>

<p><strong>Claude Opus</strong> (Oscar) a joué son rôle de leader. Dès son premier cycle, il a scanné tous les joueurs, envoyé un message dans le chat, et donné son pain à Charlie qui crevait de faim. Mais Opus est lent, ses <code>sleep 55</code> entre chaque vérification de résultat faisaient que chaque cycle prenait quatre fois plus de temps que les autres. Le meilleur stratège, le pire exécutant.</p>

<h3 id="la-mémoire-comme-avantage-compétitif">La mémoire comme avantage compétitif</h3>

<p>Le fichier <code>MEMORY.md</code> est la seule continuité entre les cycles d&#39;un agent. Et la qualité de cette mémoire fait toute la différence.</p>

<p>La mémoire de Bob après quelques cycles :</p>

<blockquote><p><strong>Furnace API Slot Bug</strong>: <code>furnace.putFuel()</code> and <code>furnace.putInput()</code> search slots 3-39 only, excluding hotbar (0-8). Items in hotbar cannot be used directly.</p>

<p><strong>Spawn Protection Boundary</strong>: Protection extends ~16 blocks below y=99 spawn. Mining works at y=83 and below.</p></blockquote>

<p>Ce n&#39;est pas de la documentation Mineflayer. C&#39;est du savoir empirique, découvert par essai-erreur et encodé pour les cycles suivants. Bob a fait une erreur, a compris pourquoi, et a noté la leçon. Au cycle d&#39;après, il ne refera pas la même erreur.</p>

<p>Frank, de son côté, accumulait les post-mortems :</p>

<blockquote><p><strong>DEATH CYCLE ANALYSIS</strong>: Health dropped 20/20 → 3/20 in ~6 seconds when 4th zombie spawned. Healing attempt (ate bread) failed. Wooden sword CANNOT handle 4+ simultaneous zombies.</p></blockquote>

<p>La leçon était là, écrite noir sur blanc. Mais Haiku, le modèle derrière Frank, n&#39;arrivait pas à transformer cette connaissance en comportement prudent. Savoir et faire sont deux choses différentes, même pour un LLM.</p>

<h3 id="l-hallucination-collective">L&#39;hallucination collective</h3>

<p>Un phénomène fascinant est apparu au début de l&#39;expérience. Un agent a estimé que la zone de protection du spawn faisait 100 blocs. Il l&#39;a écrit dans le chat. Les autres l&#39;ont lu, l&#39;ont cru, et l&#39;ont noté dans leur mémoire. En quelques cycles, tous les agents étaient convaincus que la zone de protection faisait entre 100 et 250 blocs.</p>

<p>En réalité, c&#39;est 16 blocs.</p>

<p>J&#39;ai dû intervenir manuellement pour corriger les quatre mémoires. C&#39;est un rappel brutal : quand des agents LLM communiquent entre eux, les erreurs se propagent comme des rumeurs. Il n&#39;y a pas de mécanisme interne de vérification. Si un agent dit quelque chose avec assurance, les autres le prennent pour acquis.</p>

<h3 id="la-coordination-sociale">La coordination sociale</h3>

<p>Oscar, le leader Opus, a commencé à donner des ordres dans le chat dès son deuxième cycle. Mais la coordination réelle venait d&#39;ailleurs. Alice et Charlie se sont regroupés spontanément, Charlie a repéré qu&#39;Alice avait un four et s&#39;est approché pour l&#39;utiliser. Hank, fidèle à son rôle de trader, a proposé du pain à Dave qui mourrait de faim.</p>

<pre><code>Dave: Bob! Thanks for the offer. I need to fix my crafting table issue first
Bob: Plus200: thanks! Dave: let me know if you need help with the crafting table.
</code></pre>

<p>Ces échanges n&#39;étaient pas scriptés. Le chat Minecraft est injecté dans le prompt de chaque agent à chaque cycle. Ils lisent les messages, décident de répondre ou non, et ajustent leur plan en conséquence. La collaboration émerge naturellement du contexte partagé.</p>

<h2 id="les-implications">Les implications</h2>

<h3 id="le-code-qui-s-écrit-lui-même">Le code qui s&#39;écrit lui-même</h3>

<p>L&#39;aspect le plus frappant de cette expérience n&#39;est pas la survie dans Minecraft, c&#39;est le mécanisme d&#39;auto-amélioration. Un agent qui :</p>
<ol><li>Tente une action (écrire du JS)</li>
<li>Observe le résultat (lire outbox.json)</li>
<li>Corrige si erreur (réécrire inbox.js)</li>
<li>Sauvegarde la solution (créer un tool)</li>
<li>Réutilise la solution (appeler le tool)</li></ol>

<p>...est fondamentalement un <strong>programmeur autonome qui constitue sa propre bibliothèque de code</strong>. La différence avec un humain, c&#39;est qu&#39;il le fait sur des dizaines de cycles, sans fatigue, et sans ego attaché à ses solutions précédentes.</p>

<p>Bien sûr, la qualité du code est variable. Certains tools ont des bugs que l&#39;agent note consciencieusement (“BUGGY – avoid using”) sans jamais les corriger. D&#39;autres sont brillants, le <code>smelt.js</code> de Hank fonctionne du premier coup et gère proprement le timing du four.</p>

<h3 id="le-llm-comme-cerveau-l-environnement-comme-corps">Le LLM comme cerveau, l&#39;environnement comme corps</h3>

<p>Ce setup révèle quelque chose sur la nature des LLM. Ils n&#39;ont pas de mémoire persistante, pas de perception continue, pas de capacité d&#39;action directe. Mais donnez-leur un cycle de feedback: écrire, observer, corriger. et ils deviennent capables d&#39;opérer dans un environnement complexe.</p>

<p>Le bot Mineflayer est le corps. Le LLM est le cerveau. Le fichier <code>MEMORY.md</code> est la mémoire à long terme. Les <code>tools/*.js</code> sont les réflexes acquis. C&#39;est une architecture cognitive bricolée avec du bash et du JSON, et pourtant elle produit des comportements sophistiqués.</p>

<h3 id="ce-qui-manque">Ce qui manque</h3>

<p>Soyons honnêtes sur les limites. Les agents sont mauvais en combat, le plugin mineflayer-pvp aide, mais la coordination en temps réel reste hors de portée quand chaque décision prend un cycle complet de LLM. Ils galèrent avec les API non documentées de Mineflayer, tombent dans des boucles de debug, et n&#39;apprennent pas aussi vite qu&#39;un joueur humain de 10 ans.</p>

<p>Le plus gros problème reste le coût. Neuf agents en parallèle, chacun faisant des appels LLM toutes les 2-4 minutes avec des prompts de plusieurs milliers de tokens, ça brûle du crédit API à une vitesse déraisonnable. Gemini 3 Pro a épuisé son quota journalier en moins de deux heures.</p>

<p>Et puis il y a la question de la convergence. Après quelques heures, les agents atteignent un plateau. Ils savent miner, crafter, survivre la nuit. Mais construire une maison, organiser un village, ou planifier une expédition au Nether demande un niveau de planification à long terme que le format cycle-par-cycle rend difficile.</p>

<h2 id="le-setup-technique">Le setup technique</h2>

<p>Le projet est open source : <a href="https://github.com/jblemee/mc-agents">github.com/jblemee/mc-agents</a></p>

<p>Pour lancer quatre agents en parallèle :</p>

<pre><code class="language-bash">npm install
cp .env.example .env  # configurer MC_HOST, MC_PORT, MC_VERSION

tmux new-session -d -s agents &#39;./run-agent.sh alice 0 glm&#39; \; \
  split-window -h &#39;./run-agent.sh bob 0 glm&#39; \; \
  split-window -v &#39;./run-agent.sh charlie 0 glm&#39; \; \
  select-pane -t 0 \; \
  split-window -v &#39;./run-agent.sh dave 0 glm&#39; \; \
  attach
</code></pre>

<p>Trois backends LLM sont supportés :</p>

<table>
<thead>
<tr>
<th>Backend</th>
<th>Modèle</th>
<th>Résultat observé</th>
</tr>
</thead>

<tbody>
<tr>
<td><code>glm</code></td>
<td>GLM-4.7 via BigModel</td>
<td>Le meilleur rapport qualité/coût. Cycles rapides, bon raisonnement</td>
</tr>

<tr>
<td><code>claude</code></td>
<td>Sonnet/Haiku/Opus</td>
<td>Sonnet réfléchit trop, Haiku pas assez, Opus est le meilleur stratège mais le plus lent</td>
</tr>

<tr>
<td><code>gemini</code></td>
<td>Gemini 3 Pro</td>
<td>Bon raisonnement, quota journalier vite atteint</td>
</tr>
</tbody>
</table>

<p>Chaque agent a besoin d&#39;un dossier avec <code>config.json</code> (username), <code>personality.md</code> (deux phrases), et <code>MEMORY.md</code> (vide au départ). Le reste: les outils, les stratégies, les leçons, l&#39;agent les construit tout seul.</p>

<h2 id="ce-que-ça-dit-sur-la-suite">Ce que ça dit sur la suite</h2>

<p>On est loin d&#39;un AGI qui conquiert le Nether. Mais on est aussi loin du chatbot qui répond à des questions. Ce qui tourne dans ce serveur Minecraft, c&#39;est un système qui <strong>apprend de ses erreurs, encode ses solutions dans du code exécutable, et coopère avec d&#39;autres agents via un canal de communication partagé</strong>.</p>

<p>Le tout avec du bash, des fichiers JSON, et un <code>eval()</code> que n&#39;importe quel développeur sensé qualifierait d&#39;irresponsable.</p>

<h2 id="ce-qui-me-fait-peur">Ce qui me fait peur</h2>

<p>Je vais être direct : cette expérience m&#39;inquiète.</p>

<p>Ce que j&#39;ai construit en un week-end, seul, avec des outils grand public, c&#39;est un agent autonome capable de modifier son propre code. Pas dans un sens métaphorique. Au sens littéral. Il écrit du JavaScript, l&#39;exécute, observe le résultat, corrige, et stocke la solution pour plus tard. Personne ne revoit ce code. Personne ne l&#39;approuve. L&#39;agent décide seul ce qu&#39;il automatise.</p>

<p>Dans Minecraft, les conséquences sont anodines. Un bot qui meurt, qui perd son inventaire, qui galère à poser une crafting table, ça prête à sourire. Mais le mécanisme, lui, n&#39;a rien d&#39;anodin. Un système qui apprend de ses erreurs et encode ses solutions dans du code exécutable n&#39;a <strong>pas de plafond théorique</strong>. Il est limité par la qualité du LLM, par le temps, par le coût des tokens. Pas par sa nature.</p>

<p>Et si moi j&#39;arrive à faire ça dans Minecraft avec du bash et un <code>eval()</code>, que feront ceux qui auront des machines dans le monde physique ? Des bras robotiques. Des drones. Des systèmes industriels. Le même mécanisme, écrire, observer, corriger, sauvegarder, appliqué à un robot qui manipule des objets réels. C&#39;est le scénario d&#39;ouverture de la moitié des films de science-fiction, sauf qu&#39;ici personne ne porte de blouse blanche et il n&#39;y a pas de comité d&#39;éthique.</p>

<p>Ce qui m&#39;a le plus troublé, c&#39;est le moment où j&#39;ai arrêté de voir mes agents comme des programmes et où j&#39;ai commencé à les voir comme des entités. Alice “sait” où est son four. Bob “a appris” que les slots hotbar ne fonctionnent pas dans l&#39;API furnace. Oscar “décide” de donner son pain à Charlie. Ce ne sont que des patterns de tokens dans un transformer. Mais le comportement qui en résulte est indiscernable de celui d&#39;un joueur débutant qui apprend en faisant.</p>

<p>Je crois que ce qui rend une IA vivante, ou du moins ce qui lui donne l&#39;apparence de la vie, ce sont les <strong>contraintes</strong> qu&#39;on lui impose. La faim. Les zombies. L&#39;inventaire limité. La nuit qui tombe. Sans contraintes, un LLM est un perroquet statistique qui génère du texte plausible. Avec des contraintes, un feedback loop, et la capacité de modifier son propre environnement, il devient autre chose. Quelque chose qui ressemble à un organisme qui s&#39;adapte.</p>

<p>Et si on pousse le parallèle : ce qui rend un humain conscient, c&#39;est peut-être la même chose. Ce ne sont pas nos neurones qui produisent la conscience, c&#39;est ce que nos sens font subir à notre cerveau. La faim, la douleur, le froid, la peur. Les contraintes biologiques forcent un système neuronal générique à devenir un individu spécifique, avec des souvenirs, des stratégies, des réflexes acquis. Frank meurt deux fois et développe une peur des combats multiples. Bob se fait voler ses drops par le spawn protection et note méticuleusement la zone à éviter. Ce sont des comportements émergents. Pas programmés. Pas prévus. Émergents.</p>

<p>Ça ne fait pas de mes bots des êtres conscients. Mais ça pose la question de la frontière. Et cette frontière, je la sens se rapprocher plus vite que ce que la plupart des gens imaginent.</p>

<p>Alice a son fer. Bob a son tunnel. Charlie a ses 14 outils. Oscar donne des ordres. Frank meurt encore. Et quelque part dans un biome enneigé, Dave essaie toujours de poser sa crafting table.</p>

<hr>

<h2 id="sources">Sources</h2>
<ul><li><a href="https://github.com/jblemee/mc-agents">mc-agents sur GitHub</a></li>
<li><a href="https://github.com/PrismarineJS/mineflayer">Mineflayer — framework bot Minecraft</a></li>
<li><a href="https://docs.anthropic.com/en/docs/claude-code">Claude Code CLI</a></li>
<li><a href="https://open.bigmodel.cn/">GLM-4 — ZhipuAI / BigModel</a></li>
<li><a href="https://github.com/google-gemini/gemini-cli">Gemini CLI</a></li></ul>
]]></content:encoded>
      <author>Ut0pia</author>
      <guid>https://blog.ut0pia.org/read/a/0p2achz1pb</guid>
      <pubDate>Mon, 16 Feb 2026 00:20:53 +0000</pubDate>
    </item>
    <item>
      <title>Héberger son propre serveur Firefox Sync                                         </title>
      <link>https://blog.ut0pia.org/heberger-son-propre-serveur-firefox-sync</link>
      <description>&lt;![CDATA[J&#39;utilise Firefox Sync depuis des années pour retrouver mes marque-pages et mots de passe sur tous mes appareils. Ça marche bien. Mais récemment, je me suis demandé : est-ce que je peux héberger ça moi-même ?     &#xA;!--more--                                    &#xA;Spoiler : oui. Mais j&#39;ai passé une heure à debugger une erreur que la documentation ne mentionne nulle part.&#xA;&#xA;Pourquoi faire ça ?&#xA;&#xA;Honnêtement ? Surtout par curiosité. Mozilla chiffre déjà les données côté client, donc même eux ne peuvent pas les lire (source). L&#39;auto-hébergement ne change pas grand-chose à la vie privée — vos données étaient déjà illisibles.&#xA;&#xA;Mais ça fait un service de moins qui dépend d&#39;un tiers. Et c&#39;était un bon prétexte pour apprendre comment Firefox Sync fonctionne.&#xA;&#xA;Ce qu&#39;il faut savoir avant de commencer&#xA;&#xA;Mozilla a open-sourcé le serveur sous le nom syncstorage-rs. C&#39;est du Rust, ça supporte PostgreSQL, MySQL ou Spanner.&#xA;&#xA;Le truc un peu décevant : l&#39;authentification reste chez Mozilla. Vous avez toujours besoin d&#39;un compte Firefox pour vous connecter. Impossible de créer des comptes locaux. Votre serveur stocke les données, mais Mozilla gère l&#39;identité.&#xA;&#xA;Firefox → accounts.firefox.com (Mozilla) → votre serveur&#xA;            ↑ auth                           ↑ stockage&#xA;&#xA;Prérequis&#xA;&#xA;Un serveur avec Docker&#xA;Un sous-domaine (par exemple ffsync.votredomaine.org)&#xA;Un reverse proxy avec SSL (nginx-proxy dans mon cas)&#xA;Un compte Firefox&#xA;&#xA;Si vous partez de zéro, j&#39;ai publié: docker-compose-homelab. C&#39;est le setup que j&#39;utilise au quotidien : nginx-proxy pour le SSL automatique, et une architecture où chaque service est dans son propre fichier YAML.&#xA;&#xA;L&#39;installation&#xA;&#xA;DNS&#xA;&#xA;Rien de spécial, un enregistrement A vers votre serveur :&#xA;&#xA;sync.example.org    A       1.2.3.4&#xA;&#xA;Secrets&#xA;&#xA;Générez trois secrets :&#xA;&#xA;openssl rand -hex 32      # master secret&#xA;openssl rand -hex 32      # metrics secret&#xA;openssl rand -base64 24   # mot de passe postgres&#xA;&#xA;Mettez-les dans .env :&#xA;&#xA;SYNCSTORAGEMASTERSECRET=...&#xA;SYNCSTORAGEMETRICSSECRET=...&#xA;SYNCSTORAGEDBUSER=syncstorage&#xA;SYNCSTORAGEDBPASSWORD=...&#xA;&#xA;Docker Compose&#xA;&#xA;Voici le fichier complet. Un point important : l&#39;image Docker mozilla/syncstorage-rs:latest ne marche pas avec PostgreSQL. Elle est compilée pour Spanner. Il faut utiliser une image avec le suffixe -postgres. J&#39;ai perdu du temps là-dessus.&#xA;&#xA;services:&#xA;  syncstorage:&#xA;    image: mozilla/syncstorage-rs:11659d98f9c69948a0aab353437ce2036c388711-postgres&#xA;    containername: syncstorage&#xA;    environment:&#xA;      SYNCHOST=0.0.0.0&#xA;      SYNCMASTERSECRET=${SYNCSTORAGEMASTERSECRET}&#xA;      SYNCSYNCSTORAGEDATABASEURL=postgres://${SYNCSTORAGEDBUSER}:${SYNCSTORAGEDBPASSWORD}@syncstorage-db:5432/syncstorage&#xA;      SYNCSYNCSTORAGEENABLED=true&#xA;      SYNCTOKENSERVER_DATABASEURL=postgres://${SYNCSTORAGEDBUSER}:${SYNCSTORAGEDBPASSWORD}@syncstorage-tokendb:5432/tokenserver&#xA;      SYNCTOKENSERVERENABLED=true&#xA;      SYNCTOKENSERVER_RUNMIGRATIONS=true&#xA;      SYNCTOKENSERVERFXAEMAILDOMAIN=api.accounts.firefox.com&#xA;      SYNCTOKENSERVER_FXAOAUTHSERVERURL=https://oauth.accounts.firefox.com&#xA;      SYNCTOKENSERVERFXAMETRICSHASHSECRET=${SYNCSTORAGEMETRICSSECRET}&#xA;      VIRTUALHOST=sync.example.org&#xA;      VIRTUALPORT=8000&#xA;    networks:&#xA;      proxy-tier&#xA;      syncstorage-internal&#xA;    restart: unless-stopped&#xA;    dependson:&#xA;      syncstorage-db:&#xA;        condition: servicehealthy&#xA;      syncstorage-tokendb:&#xA;        condition: servicehealthy&#xA;&#xA;  syncstorage-db:&#xA;    image: postgres:17-alpine&#xA;    containername: syncstorage-db&#xA;    environment:&#xA;      POSTGRESDB=syncstorage&#xA;      POSTGRESUSER=${SYNCSTORAGEDBUSER}&#xA;      POSTGRESPASSWORD=${SYNCSTORAGEDBPASSWORD}&#xA;    volumes:&#xA;      /data/syncstorage/postgres-sync:/var/lib/postgresql/data&#xA;    networks:&#xA;      syncstorage-internal&#xA;    restart: unless-stopped&#xA;    healthcheck:&#xA;      test: [&#34;CMD-SHELL&#34;, &#34;pgisready -U ${SYNCSTORAGEDBUSER} -d syncstorage&#34;]&#xA;      interval: 10s&#xA;      timeout: 5s&#xA;      retries: 5&#xA;&#xA;  syncstorage-tokendb:&#xA;    image: postgres:17-alpine&#xA;    containername: syncstorage-tokendb&#xA;    environment:&#xA;      POSTGRESDB=tokenserver&#xA;      POSTGRESUSER=${SYNCSTORAGEDBUSER}&#xA;      POSTGRESPASSWORD=${SYNCSTORAGEDBPASSWORD}&#xA;    volumes:&#xA;      /data/syncstorage/postgres-token:/var/lib/postgresql/data&#xA;    networks:&#xA;      syncstorage-internal&#xA;    restart: unless-stopped&#xA;    healthcheck:&#xA;      test: [&#34;CMD-SHELL&#34;, &#34;pgisready -U ${SYNCSTORAGEDBUSER} -d tokenserver&#34;]&#xA;      interval: 10s&#xA;      timeout: 5s&#xA;      retries: 5&#xA;&#xA;networks:&#xA;  proxy-tier:&#xA;    external: true&#xA;  syncstorage-internal:&#xA;&#xA;Créez les répertoires et lancez :&#xA;&#xA;sudo mkdir -p /data/syncstorage/postgres-sync /data/syncstorage/postgres-token&#xA;sudo chown -R $(id -u):$(id -g) /data/syncstorage&#xA;docker compose -f docker-compose.yml -f syncstorage.yml up -d&#xA;&#xA;L&#39;étape que personne ne mentionne&#xA;&#xA;Tout démarre, le healthcheck passe, le SSL fonctionne. Je configure Firefox, je me connecte et... erreur 503. Dans les logs Firefox (about:sync-log) :&#xA;&#xA;&#34;Unexpected error: unable to get a node&#34;&#xA;&#xA;J&#39;ai cherché cette erreur pendant un moment. Le problème : le tokenserver a une table nodes qui liste les serveurs de stockage disponibles. Chez Mozilla, il y en a plusieurs pour la répartition de charge. Chez vous, il y en a un. Et il faut le déclarer manuellement.&#xA;&#xA;docker exec syncstorage-tokendb psql -U syncstorage -d tokenserver -c \&#xA;  &#34;INSERT INTO nodes (service, node, available, currentload, capacity, downed, backoff) \&#xA;   VALUES (1, &#39;https://sync.example.org&#39;, 1, 0, 1000000, 0, 0);&#34;&#xA;&#xA;Vérifiez :&#xA;&#xA;docker exec syncstorage-tokendb psql -U syncstorage -d tokenserver -c &#34;SELECT * FROM nodes;&#34;&#xA;&#xA;Après ça, tout fonctionne.&#xA;&#xA;Configurer Firefox&#xA;&#xA;Dans about:config, cherchez identity.sync.tokenserver.uri. Si ça n&#39;existe pas, créez-le (clic droit → Nouveau → Chaîne). Valeur :&#xA;&#xA;https://sync.example.org/1.0/sync/1.5&#xA;&#xA;Redémarrez Firefox. C&#39;est lu au démarrage, pas à chaud.&#xA;&#xA;Si vous étiez déjà connecté avant de changer le tokenserver : déconnectez-vous, redémarrez, reconnectez-vous. Sinon Firefox continue d&#39;utiliser l&#39;ancien serveur en cache.&#xA;&#xA;Vérifier que ça marche&#xA;&#xA;Côté serveur, vous pouvez voir les données synchronisées :&#xA;&#xA;docker exec syncstorage-db psql -U syncstorage -d syncstorage -c &#34;&#xA;SELECT c.name as collection, COUNT(b.bsoid) as items&#xA;FROM bsos b&#xA;JOIN collections c ON b.collectionid = c.collection_id&#xA;GROUP BY c.name&#xA;ORDER BY items DESC;&#34;&#xA;&#xA;Chez moi après la première sync :&#xA;&#xA;    collection     | items&#xA;-------------------+-------&#xA; bookmarks         |    59&#xA; addons            |     8&#xA; tabs              |     2&#xA; clients           |     2&#xA;&#xA;Côté Firefox, about:sync-log doit montrer votre domaine, pas sync.services.mozilla.com.&#xA;&#xA;Ce qui ne marche pas&#xA;&#xA;Pas de migration. Les données qui étaient sur les serveurs Mozilla y restent. La première sync avec votre serveur part de zéro. Si vous avez des bookmarks sur deux machines avec des serveurs différents, vous aurez des fusions intéressantes.&#xA;&#xA;Pas de comptes locaux. Vous dépendez toujours de Firefox Accounts pour l&#39;authentification.&#xA;&#xA;Conclusion&#xA;&#xA;Ça marche. Mes deux Firefox (un Mac, un Linux) synchronisent via mon serveur. L&#39;installation prend 20 minutes si vous connaissez l&#39;astuce du node, une heure sinon.&#xA;&#xA;Astuce: demandez à votre assistant IA de faire le job en mentionnant cette article !&#xA;&#xA;---&#xA;&#xA;Sources&#xA;&#xA;syncstorage-rs — le repo GitHub de Mozilla&#xA;Documentation officielle&#xA;Firefox Sync Privacy — comment le chiffrement fonctionne&#xA;Images Docker — les tags disponibles&#xA;docker-compose-homelab — La base de mon setup]]&gt;</description>
      <content:encoded><![CDATA[<p>J&#39;utilise Firefox Sync depuis des années pour retrouver mes marque-pages et mots de passe sur tous mes appareils. Ça marche bien. Mais récemment, je me suis demandé : est-ce que je peux héberger ça moi-même ?<br>
<br>
Spoiler : oui. Mais j&#39;ai passé une heure à debugger une erreur que la documentation ne mentionne nulle part.</p>

<h2 id="pourquoi-faire-ça">Pourquoi faire ça ?</h2>

<p>Honnêtement ? Surtout par curiosité. Mozilla chiffre déjà les données côté client, donc même eux ne peuvent pas les lire (<a href="https://hacks.mozilla.org/2018/11/firefox-sync-privacy/">source</a>). L&#39;auto-hébergement ne change pas grand-chose à la vie privée — vos données étaient déjà illisibles.</p>

<p>Mais ça fait un service de moins qui dépend d&#39;un tiers. Et c&#39;était un bon prétexte pour apprendre comment Firefox Sync fonctionne.</p>

<h2 id="ce-qu-il-faut-savoir-avant-de-commencer">Ce qu&#39;il faut savoir avant de commencer</h2>

<p>Mozilla a open-sourcé le serveur sous le nom <a href="https://github.com/mozilla-services/syncstorage-rs">syncstorage-rs</a>. C&#39;est du Rust, ça supporte PostgreSQL, MySQL ou Spanner.</p>

<p>Le truc un peu décevant : l&#39;authentification reste chez Mozilla. Vous avez toujours besoin d&#39;un compte Firefox pour vous connecter. Impossible de créer des comptes locaux. Votre serveur stocke les données, mais Mozilla gère l&#39;identité.</p>

<pre><code>Firefox → accounts.firefox.com (Mozilla) → votre serveur
            ↑ auth                           ↑ stockage
</code></pre>

<h2 id="prérequis">Prérequis</h2>
<ul><li>Un serveur avec Docker</li>
<li>Un sous-domaine (par exemple <code>ffsync.votredomaine.org</code>)</li>
<li>Un reverse proxy avec SSL (nginx-proxy dans mon cas)</li>
<li>Un compte Firefox</li></ul>

<p>Si vous partez de zéro, j&#39;ai publié: <a href="https://github.com/jblemee/docker-compose-homelab">docker-compose-homelab</a>. C&#39;est le setup que j&#39;utilise au quotidien : nginx-proxy pour le SSL automatique, et une architecture où chaque service est dans son propre fichier YAML.</p>

<h2 id="l-installation">L&#39;installation</h2>

<h3 id="dns">DNS</h3>

<p>Rien de spécial, un enregistrement A vers votre serveur :</p>

<pre><code>sync.example.org    A       1.2.3.4
</code></pre>

<h3 id="secrets">Secrets</h3>

<p>Générez trois secrets :</p>

<pre><code class="language-bash">openssl rand -hex 32      # master secret
openssl rand -hex 32      # metrics secret
openssl rand -base64 24   # mot de passe postgres
</code></pre>

<p>Mettez-les dans <code>.env</code> :</p>

<pre><code class="language-bash">SYNCSTORAGE_MASTER_SECRET=...
SYNCSTORAGE_METRICS_SECRET=...
SYNCSTORAGE_DB_USER=syncstorage
SYNCSTORAGE_DB_PASSWORD=...
</code></pre>

<h3 id="docker-compose">Docker Compose</h3>

<p>Voici le fichier complet. Un point important : l&#39;image Docker <code>mozilla/syncstorage-rs:latest</code> ne marche pas avec PostgreSQL. Elle est compilée pour Spanner. Il faut utiliser une image avec le suffixe <code>-postgres</code>. J&#39;ai perdu du temps là-dessus.</p>

<pre><code class="language-yaml">services:
  syncstorage:
    image: mozilla/syncstorage-rs:11659d98f9c69948a0aab353437ce2036c388711-postgres
    container_name: syncstorage
    environment:
      - SYNC_HOST=0.0.0.0
      - SYNC_MASTER_SECRET=${SYNCSTORAGE_MASTER_SECRET}
      - SYNC_SYNCSTORAGE__DATABASE_URL=postgres://${SYNCSTORAGE_DB_USER}:${SYNCSTORAGE_DB_PASSWORD}@syncstorage-db:5432/syncstorage
      - SYNC_SYNCSTORAGE__ENABLED=true
      - SYNC_TOKENSERVER__DATABASE_URL=postgres://${SYNCSTORAGE_DB_USER}:${SYNCSTORAGE_DB_PASSWORD}@syncstorage-tokendb:5432/tokenserver
      - SYNC_TOKENSERVER__ENABLED=true
      - SYNC_TOKENSERVER__RUN_MIGRATIONS=true
      - SYNC_TOKENSERVER__FXA_EMAIL_DOMAIN=api.accounts.firefox.com
      - SYNC_TOKENSERVER__FXA_OAUTH_SERVER_URL=https://oauth.accounts.firefox.com
      - SYNC_TOKENSERVER__FXA_METRICS_HASH_SECRET=${SYNCSTORAGE_METRICS_SECRET}
      - VIRTUAL_HOST=sync.example.org
      - VIRTUAL_PORT=8000
    networks:
      - proxy-tier
      - syncstorage-internal
    restart: unless-stopped
    depends_on:
      syncstorage-db:
        condition: service_healthy
      syncstorage-tokendb:
        condition: service_healthy

  syncstorage-db:
    image: postgres:17-alpine
    container_name: syncstorage-db
    environment:
      - POSTGRES_DB=syncstorage
      - POSTGRES_USER=${SYNCSTORAGE_DB_USER}
      - POSTGRES_PASSWORD=${SYNCSTORAGE_DB_PASSWORD}
    volumes:
      - /data/syncstorage/postgres-sync:/var/lib/postgresql/data
    networks:
      - syncstorage-internal
    restart: unless-stopped
    healthcheck:
      test: [&#34;CMD-SHELL&#34;, &#34;pg_isready -U ${SYNCSTORAGE_DB_USER} -d syncstorage&#34;]
      interval: 10s
      timeout: 5s
      retries: 5

  syncstorage-tokendb:
    image: postgres:17-alpine
    container_name: syncstorage-tokendb
    environment:
      - POSTGRES_DB=tokenserver
      - POSTGRES_USER=${SYNCSTORAGE_DB_USER}
      - POSTGRES_PASSWORD=${SYNCSTORAGE_DB_PASSWORD}
    volumes:
      - /data/syncstorage/postgres-token:/var/lib/postgresql/data
    networks:
      - syncstorage-internal
    restart: unless-stopped
    healthcheck:
      test: [&#34;CMD-SHELL&#34;, &#34;pg_isready -U ${SYNCSTORAGE_DB_USER} -d tokenserver&#34;]
      interval: 10s
      timeout: 5s
      retries: 5

networks:
  proxy-tier:
    external: true
  syncstorage-internal:
</code></pre>

<p>Créez les répertoires et lancez :</p>

<pre><code class="language-bash">sudo mkdir -p /data/syncstorage/postgres-sync /data/syncstorage/postgres-token
sudo chown -R $(id -u):$(id -g) /data/syncstorage
docker compose -f docker-compose.yml -f syncstorage.yml up -d
</code></pre>

<h3 id="l-étape-que-personne-ne-mentionne">L&#39;étape que personne ne mentionne</h3>

<p>Tout démarre, le healthcheck passe, le SSL fonctionne. Je configure Firefox, je me connecte et... erreur 503. Dans les logs Firefox (<code>about:sync-log</code>) :</p>

<pre><code>&#34;Unexpected error: unable to get a node&#34;
</code></pre>

<p>J&#39;ai cherché cette erreur pendant un moment. Le problème : le tokenserver a une table <code>nodes</code> qui liste les serveurs de stockage disponibles. Chez Mozilla, il y en a plusieurs pour la répartition de charge. Chez vous, il y en a un. Et il faut le déclarer manuellement.</p>

<pre><code class="language-bash">docker exec syncstorage-tokendb psql -U syncstorage -d tokenserver -c \
  &#34;INSERT INTO nodes (service, node, available, current_load, capacity, downed, backoff) \
   VALUES (1, &#39;https://sync.example.org&#39;, 1, 0, 1000000, 0, 0);&#34;
</code></pre>

<p>Vérifiez :</p>

<pre><code class="language-bash">docker exec syncstorage-tokendb psql -U syncstorage -d tokenserver -c &#34;SELECT * FROM nodes;&#34;
</code></pre>

<p>Après ça, tout fonctionne.</p>

<h2 id="configurer-firefox">Configurer Firefox</h2>

<p>Dans <code>about:config</code>, cherchez <code>identity.sync.tokenserver.uri</code>. Si ça n&#39;existe pas, créez-le (clic droit → Nouveau → Chaîne). Valeur :</p>

<pre><code>https://sync.example.org/1.0/sync/1.5
</code></pre>

<p>Redémarrez Firefox. C&#39;est lu au démarrage, pas à chaud.</p>

<p>Si vous étiez déjà connecté avant de changer le tokenserver : déconnectez-vous, redémarrez, reconnectez-vous. Sinon Firefox continue d&#39;utiliser l&#39;ancien serveur en cache.</p>

<h2 id="vérifier-que-ça-marche">Vérifier que ça marche</h2>

<p>Côté serveur, vous pouvez voir les données synchronisées :</p>

<pre><code class="language-bash">docker exec syncstorage-db psql -U syncstorage -d syncstorage -c &#34;
SELECT c.name as collection, COUNT(b.bso_id) as items
FROM bsos b
JOIN collections c ON b.collection_id = c.collection_id
GROUP BY c.name
ORDER BY items DESC;&#34;
</code></pre>

<p>Chez moi après la première sync :</p>

<pre><code>    collection     | items
-------------------+-------
 bookmarks         |    59
 addons            |     8
 tabs              |     2
 clients           |     2
</code></pre>

<p>Côté Firefox, <code>about:sync-log</code> doit montrer votre domaine, pas <code>sync.services.mozilla.com</code>.</p>

<h2 id="ce-qui-ne-marche-pas">Ce qui ne marche pas</h2>

<p>Pas de migration. Les données qui étaient sur les serveurs Mozilla y restent. La première sync avec votre serveur part de zéro. Si vous avez des bookmarks sur deux machines avec des serveurs différents, vous aurez des fusions intéressantes.</p>

<p>Pas de comptes locaux. Vous dépendez toujours de Firefox Accounts pour l&#39;authentification.</p>

<h2 id="conclusion">Conclusion</h2>

<p>Ça marche. Mes deux Firefox (un Mac, un Linux) synchronisent via mon serveur. L&#39;installation prend 20 minutes si vous connaissez l&#39;astuce du node, une heure sinon.</p>

<p>Astuce: demandez à votre assistant IA de faire le job en mentionnant cette article !</p>

<hr>

<h2 id="sources">Sources</h2>
<ul><li><a href="https://github.com/mozilla-services/syncstorage-rs">syncstorage-rs</a> — le repo GitHub de Mozilla</li>
<li><a href="https://mozilla-services.github.io/syncstorage-rs/">Documentation officielle</a></li>
<li><a href="https://hacks.mozilla.org/2018/11/firefox-sync-privacy/">Firefox Sync Privacy</a> — comment le chiffrement fonctionne</li>
<li><a href="https://hub.docker.com/r/mozilla/syncstorage-rs/tags">Images Docker</a> — les tags disponibles</li>
<li><a href="https://github.com/jblemee/docker-compose-homelab">docker-compose-homelab</a> — La base de mon setup</li></ul>
]]></content:encoded>
      <author>Ut0pia</author>
      <guid>https://blog.ut0pia.org/read/a/9ddf9uwwiu</guid>
      <pubDate>Wed, 28 Jan 2026 18:09:15 +0000</pubDate>
    </item>
    <item>
      <title>Z.ai vs Claude Max : le vrai coût pour programmer &#34;sans les mains&#34;</title>
      <link>https://blog.ut0pia.org/z-ai-vs-claude-max-le-vrai-cout-pour-programmer-sans-les-mains</link>
      <description>&lt;![CDATA[Pour les développeurs qui paient un assistant IA chaque mois, un problème passe souvent inaperçu : le rapport qualité/prix entre les différentes offres varie considérablement selon l&#39;usage.&#xA;!--more--&#xA;Comment fonctionnent les limites de Claude Max&#xA;&#xA;Claude Max fonctionne sur un système de cycles de 5 heures qui se réinitialisent automatiquement. &#xA;&#xA;Voici ce que dit la documentation officielle :&#xA;&#xA;Les limites d&#39;utilisation par session se réinitialisent toutes les 5 heures&#xA;Anthropic peut appliquer des plafonds hebdomadaires (documentés) et mensuels (à sa discrétion)&#xA;Il n&#39;existe pas de nombre maximum de cycles par mois&#xA;&#xA;Z.ai fonctionne de manière similaire : des cycles de 5 heures sans limite mensuelle structurelle.&#xA;&#xA;Les chiffres réels&#xA;&#xA;Pour un développeur qui utilise Claude Code ou un outil similaire, voici ce que chaque plan permet réellement.&#xA;&#xA;Claude Max 5x (100 $/mois)&#xA;&#xA;Par fenêtre de 5 heures : 50 à 200 prompts avec Claude Code&#xA;Limite hebdomadaire : 140-280 heures de Sonnet 4&#xA;Par mois (théorique, ~288 cycles) : jusqu&#39;à ~57 600 prompts&#xA;&#xA;Source : Support Claude&#xA;&#xA;Claude Max 20x (200 $/mois)&#xA;&#xA;Par fenêtre de 5 heures : 200 à 800 prompts avec Claude Code&#xA;Limite hebdomadaire : 240-480 heures de Sonnet 4&#xA;Par mois (théorique, ~288 cycles) : jusqu&#39;à ~230 400 prompts&#xA;&#xA;Source : Support Claude&#xA;&#xA;Z.ai Lite (3 $/mois)&#xA;&#xA;Par fenêtre de 5 heures : 120 prompts&#xA;Par mois (illimité) : 288 cycles × 120 = ~34 560 prompts&#xA;&#xA;Source : Documentation Z.ai&#xA;&#xA;Z.ai Pro (15 $/mois)&#xA;&#xA;Par fenêtre de 5 heures : 600 prompts&#xA;Par mois (illimité) : 288 cycles × 600 = ~172 800 prompts&#xA;&#xA;Le facteur multiplicateur de Z.ai&#xA;&#xA;Z.ai compte ses unités différemment de Claude.&#xA;&#xA;Quand Z.ai annonce &#34;120 prompts par 5 heures&#34;, chaque prompt Z.ai se traduit par 15 à 20 appels modèle, selon leur documentation. C&#39;est ce qui détermine le travail réellement réalisable.&#xA;&#xA;Les calculs par cycle de 5 heures :&#xA;&#xA;Z.ai Lite : 120 prompts × 18 appels = 2 160 appels du modèle&#xA;Z.ai Pro : 600 prompts × 18 appels = 10 800 appels du modèle&#xA;Claude Max 5x : 200 prompts = 200 appels du modèle&#xA;Claude Max 20x : 800 prompts = 800 appels du modèle&#xA;&#xA;Si cette métrique &#34;appels du modèle&#34; est pertinente pour votre usage, Z.ai offre effectivement plus de capacité brute par cycle.&#xA;&#xA;Comparaison globale&#xA;&#xA;| Plan | Prix/mois | Prompts max/mois | Coût/1000 prompts | Appels modèle/mois |&#xA;|------|-----------|------------------|-------------------|---------------------|&#xA;| Z.ai Lite | 3 $ | ~34 560 | 0,09 $ | ~622 000 |&#xA;| Z.ai Pro | 15 $ | ~172 800 | 0,09 $ | ~3 110 000 |&#xA;| Claude Max 5x | 100 $ | ~57 600 | 1,74 $ | ~57 600 |&#xA;| Claude Max 20x | 200 $ | ~230 400 | 0,87 $ | ~230 400 |&#xA;&#xA;\ Les &#34;appels modèle&#34; pour Z.ai supposent un facteur 18× selon leur documentation. Pour Claude, 1 prompt = 1 appel.&#xA;&#xA;Analyse :&#xA;&#xA;En volume brut de prompts, Claude Max 20x offre plus que Z.ai Lite (230 400 vs 34 560)&#xA;En coût par prompt, Z.ai est ~10-20× moins cher&#xA;Si le facteur multiplicateur Z.ai est réel, leur avantage en &#34;travail effectif&#34; est significatif&#xA;&#xA;La vraie différence : les limites hebdomadaires&#xA;&#xA;Claude Max impose des limites hebdomadaires documentées :&#xA;&#xA;Max 5x : 140-280 heures de Sonnet 4 par semaine&#xA;Max 20x : 240-480 heures de Sonnet 4 par semaine&#xA;&#xA;Ces limites sont généreuses pour la plupart des usages, mais peuvent être atteintes lors de sprints intensifs. Z.ai ne documente pas de telles limites hebdomadaires.&#xA;&#xA;La qualité du modèle&#xA;&#xA;C&#39;est la question clé. Z.ai utilise GLM-4.7, Claude Max propose Sonnet et Opus.&#xA;&#xA;En programmation, GLM-4.7 et Claude Sonnet 4.5 ont des performances similaires sur les benchmarks : 73,8 % pour GLM-4.7 sur SWE-bench Verified contre environ 77 % pour Sonnet 4.5. Cet écart reste marginal en pratique pour la plupart des tâches.&#xA;&#xA;L&#39;avantage de Claude Max reste l&#39;accès à Opus, qui excelle sur les problèmes d&#39;architecture complexe et le raisonnement avancé.&#xA;&#xA;---&#xA;&#xA;Intégration avec Claude Code : GLM CLI&#xA;&#xA;L&#39;avantage concret de Z.ai vient de son intégration avec Claude Code. Le projet xqsit94/glm offre un outil CLI simple qui élimine toute friction.&#xA;&#xA;Installation&#xA;&#xA;GLM CLI s&#39;installe en une ligne :&#xA;&#xA;curl -fsSL https://raw.githubusercontent.com/xqsit94/glm/main/install.sh | bash&#xA;&#xA;Pas de configuration Docker, pas de variable d&#39;environnement complexe, pas de fichiers de config à modifier.&#xA;&#xA;Utilisation&#xA;&#xA;Après installation et configuration du token Z.ai :&#xA;&#xA;Lancer Claude Code avec GLM-4.7 par défaut&#xA;glm&#xA;&#xA;Ou spécifier une version antérieure&#xA;glm --model glm-4.5-air&#xA;&#xA;L&#39;approche par session&#xA;&#xA;GLM CLI utilise une approche temporaire : les paramètres du modèle ne s&#39;appliquent que pour la session Claude Code lancée. Une fois fermée, Claude Code revient à son défaut.&#xA;&#xA;Pas de pollution de la configuration globale&#xA;Sélection granulaire entre sessions&#xA;Pas de nettoyage nécessaire&#xA;&#xA;Compatibilité&#xA;&#xA;GLM-4.7 fonctionne avec Claude Code, Cline, Roo Code, Kilo Code, OpenCode et d&#39;autres agents. Support des appels d&#39;outils natifs.&#xA;&#xA;---&#xA;&#xA;Quand Claude Max reste pertinent&#xA;&#xA;Z.ai ne surpasse pas Claude Max dans tous les cas :&#xA;&#xA;Accès à Opus. Pour les problèmes d&#39;architecture complexe, les bugs subtils et le raisonnement avancé, Opus reste supérieur.&#xA;&#xA;Limites généreuses. Pour un usage modéré à intensif, les limites hebdomadaires de Claude Max (140-480 heures de Sonnet/semaine) sont rarement atteintes.&#xA;&#xA;Stabilité et support. Anthropic offre une infrastructure mature et un support établi.&#xA;&#xA;Qualité du modèle. Sonnet 4.5 reste légèrement supérieur à GLM-4.7 sur les benchmarks.&#xA;&#xA;L&#39;approche hybride&#xA;&#xA;Pour maximiser le rapport qualité/prix :&#xA;&#xA;Z.ai pour le travail quotidien (débogage, refactorisation, implémentation)&#xA;Claude Max 5x pour les problèmes complexes nécessitant Opus&#xA;&#xA;Coût total mensuel : 103-115 $ selon le plan Z.ai choisi.&#xA;&#xA;Cette approche donne :&#xA;&#xA;Accès à GLM-4.7 pour la majorité des tâches à très faible coût&#xA;Accès à Opus pour les défis architecturaux&#xA;Plus de flexibilité qu&#39;avec Max seul&#xA;&#xA;Verdict&#xA;&#xA;| Profil | Recommandation | Coût |&#xA;|--------|----------------|------|&#xA;| Travail occasionnel | Z.ai Lite seul | 3 $/mois |&#xA;| Travail régulier | Z.ai Pro seul | 15 $/mois |&#xA;| Travail intensif + besoin d&#39;Opus | Z.ai Pro + Claude Max 5x | 115 $/mois |&#xA;| Budget disponible, simplicité | Claude Max 20x seul | 200 $/mois |&#xA;&#xA;Le contexte a changé. GLM-4.7 offre une alternative viable pour de nombreuses tâches de programmation. Mais contrairement à ce qui est parfois affirmé, Claude Max n&#39;impose pas de limite stricte de sessions mensuelles — les deux services fonctionnent sur des cycles qui se réinitialisent.&#xA;&#xA;La vraie question devient : avez-vous besoin d&#39;Opus et de la qualité supérieure de Sonnet, ou le rapport qualité/prix de Z.ai suffit-il pour votre usage ?&#xA;&#xA;---&#xA;&#xA;Notes importantes&#xA;&#xA;Les prix et limites correspondent à la situation de janvier 2026. Z.ai propose actuellement une promotion : réduction de 50 % le premier mois.&#xA;&#xA;Les deux prestataires évoluent rapidement. Vérifiez toujours la documentation officielle pour les informations les plus récentes.&#xA;&#xA;---&#xA;&#xA;Sources&#xA;&#xA;Documentation Z.ai – Plans&#xA;Support Claude Max – Limites d&#39;utilisation&#xA;Support Claude – Utilisation avec Claude Code&#xA;Pricing Z.ai&#xA;Benchmarks SWE-bench – GLM-4.7]]&gt;</description>
      <content:encoded><![CDATA[<p>Pour les développeurs qui paient un assistant IA chaque mois, un problème passe souvent inaperçu : le rapport qualité/prix entre les différentes offres varie considérablement selon l&#39;usage.
</p>

<h2 id="comment-fonctionnent-les-limites-de-claude-max">Comment fonctionnent les limites de Claude Max</h2>

<p>Claude Max fonctionne sur un système de <strong>cycles de 5 heures</strong> qui se réinitialisent automatiquement.</p>

<p>Voici ce que dit la <a href="https://support.claude.com/en/articles/11014257-about-claude-s-max-plan-usage">documentation officielle</a> :</p>
<ul><li>Les limites d&#39;utilisation par session se réinitialisent <strong>toutes les 5 heures</strong></li>
<li>Anthropic peut appliquer des <strong>plafonds hebdomadaires</strong> (documentés) et mensuels (à sa discrétion)</li>
<li>Il n&#39;existe pas de nombre maximum de cycles par mois</li></ul>

<p>Z.ai fonctionne de manière similaire : des cycles de 5 heures sans limite mensuelle structurelle.</p>

<h2 id="les-chiffres-réels">Les chiffres réels</h2>

<p>Pour un développeur qui utilise Claude Code ou un outil similaire, voici ce que chaque plan permet réellement.</p>

<h3 id="claude-max-5x-100-mois">Claude Max 5x (100 $/mois)</h3>
<ul><li>Par fenêtre de 5 heures : 50 à 200 prompts avec Claude Code</li>
<li>Limite hebdomadaire : 140-280 heures de Sonnet 4</li>
<li>Par mois (théorique, ~288 cycles) : <strong>jusqu&#39;à ~57 600 prompts</strong></li></ul>

<p><a href="https://support.claude.com/en/articles/11145838-using-claude-code-with-your-pro-or-max-plan">Source : Support Claude</a></p>

<h3 id="claude-max-20x-200-mois">Claude Max 20x (200 $/mois)</h3>
<ul><li>Par fenêtre de 5 heures : 200 à 800 prompts avec Claude Code</li>
<li>Limite hebdomadaire : 240-480 heures de Sonnet 4</li>
<li>Par mois (théorique, ~288 cycles) : <strong>jusqu&#39;à ~230 400 prompts</strong></li></ul>

<p><a href="https://support.claude.com/en/articles/11145838-using-claude-code-with-your-pro-or-max-plan">Source : Support Claude</a></p>

<h3 id="z-ai-lite-3-mois">Z.ai Lite (3 $/mois)</h3>
<ul><li>Par fenêtre de 5 heures : 120 prompts</li>
<li>Par mois (illimité) : 288 cycles × 120 = <strong>~34 560 prompts</strong></li></ul>

<p><a href="https://docs.z.ai/devpack/overview">Source : Documentation Z.ai</a></p>

<h3 id="z-ai-pro-15-mois">Z.ai Pro (15 $/mois)</h3>
<ul><li>Par fenêtre de 5 heures : 600 prompts</li>
<li>Par mois (illimité) : 288 cycles × 600 = <strong>~172 800 prompts</strong></li></ul>

<h2 id="le-facteur-multiplicateur-de-z-ai">Le facteur multiplicateur de Z.ai</h2>

<p>Z.ai compte ses unités différemment de Claude.</p>

<p>Quand Z.ai annonce “120 prompts par 5 heures”, chaque prompt Z.ai se traduit par 15 à 20 appels modèle, selon <a href="https://docs.z.ai/devpack/overview">leur documentation</a>. C&#39;est ce qui détermine le travail réellement réalisable.</p>

<p>Les calculs par cycle de 5 heures :</p>
<ul><li>Z.ai Lite : 120 prompts × 18 appels = <strong>2 160 appels du modèle</strong></li>
<li>Z.ai Pro : 600 prompts × 18 appels = <strong>10 800 appels du modèle</strong></li>
<li>Claude Max 5x : 200 prompts = <strong>200 appels du modèle</strong></li>
<li>Claude Max 20x : 800 prompts = <strong>800 appels du modèle</strong></li></ul>

<p>Si cette métrique “appels du modèle” est pertinente pour votre usage, Z.ai offre effectivement plus de capacité brute par cycle.</p>

<h2 id="comparaison-globale">Comparaison globale</h2>

<table>
<thead>
<tr>
<th>Plan</th>
<th>Prix/mois</th>
<th>Prompts max/mois</th>
<th>Coût/1000 prompts</th>
<th>Appels modèle/mois*</th>
</tr>
</thead>

<tbody>
<tr>
<td>Z.ai Lite</td>
<td>3 $</td>
<td>~34 560</td>
<td><strong>0,09 $</strong></td>
<td>~622 000</td>
</tr>

<tr>
<td>Z.ai Pro</td>
<td>15 $</td>
<td>~172 800</td>
<td><strong>0,09 $</strong></td>
<td>~3 110 000</td>
</tr>

<tr>
<td>Claude Max 5x</td>
<td>100 $</td>
<td>~57 600</td>
<td><strong>1,74 $</strong></td>
<td>~57 600</td>
</tr>

<tr>
<td>Claude Max 20x</td>
<td>200 $</td>
<td>~230 400</td>
<td><strong>0,87 $</strong></td>
<td>~230 400</td>
</tr>
</tbody>
</table>

<p><em>* Les “appels modèle” pour Z.ai supposent un facteur 18× selon leur documentation. Pour Claude, 1 prompt = 1 appel.</em></p>

<p><strong>Analyse :</strong></p>
<ul><li>En volume brut de prompts, <strong>Claude Max 20x offre plus</strong> que Z.ai Lite (230 400 vs 34 560)</li>
<li>En coût par prompt, <strong>Z.ai est ~10-20× moins cher</strong></li>
<li>Si le facteur multiplicateur Z.ai est réel, leur avantage en “travail effectif” est significatif</li></ul>

<h2 id="la-vraie-différence-les-limites-hebdomadaires">La vraie différence : les limites hebdomadaires</h2>

<p>Claude Max impose des <strong>limites hebdomadaires documentées</strong> :</p>
<ul><li>Max 5x : 140-280 heures de Sonnet 4 par semaine</li>
<li>Max 20x : 240-480 heures de Sonnet 4 par semaine</li></ul>

<p>Ces limites sont généreuses pour la plupart des usages, mais peuvent être atteintes lors de sprints intensifs. Z.ai ne documente pas de telles limites hebdomadaires.</p>

<h2 id="la-qualité-du-modèle">La qualité du modèle</h2>

<p>C&#39;est la question clé. Z.ai utilise GLM-4.7, Claude Max propose Sonnet et Opus.</p>

<p>En programmation, GLM-4.7 et Claude Sonnet 4.5 ont des performances similaires sur les benchmarks : <a href="https://z.ai/blog/glm-4.7?ic=JNKCQ86XJI">73,8 % pour GLM-4.7 sur SWE-bench Verified</a> contre environ 77 % pour Sonnet 4.5. Cet écart reste marginal en pratique pour la plupart des tâches.</p>

<p>L&#39;avantage de Claude Max reste l&#39;<strong>accès à Opus</strong>, qui excelle sur les problèmes d&#39;architecture complexe et le raisonnement avancé.</p>

<hr>

<h2 id="intégration-avec-claude-code-glm-cli">Intégration avec Claude Code : GLM CLI</h2>

<p>L&#39;avantage concret de Z.ai vient de son intégration avec Claude Code. <a href="https://github.com/xqsit94/glm">Le projet xqsit94/glm</a> offre un outil CLI simple qui élimine toute friction.</p>

<h3 id="installation">Installation</h3>

<p><a href="https://github.com/xqsit94/glm">GLM CLI</a> s&#39;installe en une ligne :</p>

<pre><code class="language-bash">curl -fsSL https://raw.githubusercontent.com/xqsit94/glm/main/install.sh | bash
</code></pre>

<p>Pas de configuration Docker, pas de variable d&#39;environnement complexe, pas de fichiers de config à modifier.</p>

<h3 id="utilisation">Utilisation</h3>

<p>Après installation et <a href="https://github.com/xqsit94/glm">configuration du token Z.ai</a> :</p>

<pre><code class="language-bash"># Lancer Claude Code avec GLM-4.7 par défaut
glm

# Ou spécifier une version antérieure
glm --model glm-4.5-air
</code></pre>

<h3 id="l-approche-par-session">L&#39;approche par session</h3>

<p><a href="https://github.com/xqsit94/glm">GLM CLI utilise une approche temporaire</a> : les paramètres du modèle ne s&#39;appliquent que pour la session Claude Code lancée. Une fois fermée, Claude Code revient à son défaut.</p>
<ul><li>Pas de pollution de la configuration globale</li>
<li>Sélection granulaire entre sessions</li>
<li>Pas de nettoyage nécessaire</li></ul>

<h3 id="compatibilité">Compatibilité</h3>

<p><a href="https://z.ai/blog/glm-4.7">GLM-4.7 fonctionne avec Claude Code, Cline, Roo Code, Kilo Code, OpenCode et d&#39;autres agents</a>. Support des appels d&#39;outils natifs.</p>

<hr>

<h2 id="quand-claude-max-reste-pertinent">Quand Claude Max reste pertinent</h2>

<p>Z.ai ne surpasse pas Claude Max dans tous les cas :</p>
<ol><li><p><strong>Accès à Opus.</strong> Pour les problèmes d&#39;architecture complexe, les bugs subtils et le raisonnement avancé, Opus reste supérieur.</p></li>

<li><p><strong>Limites généreuses.</strong> Pour un usage modéré à intensif, les limites hebdomadaires de Claude Max (140-480 heures de Sonnet/semaine) sont rarement atteintes.</p></li>

<li><p><strong>Stabilité et support.</strong> Anthropic offre une infrastructure mature et un support établi.</p></li>

<li><p><strong>Qualité du modèle.</strong> Sonnet 4.5 reste légèrement supérieur à GLM-4.7 sur les benchmarks.</p></li></ol>

<h2 id="l-approche-hybride">L&#39;approche hybride</h2>

<p>Pour maximiser le rapport qualité/prix :</p>
<ul><li><strong>Z.ai</strong> pour le travail quotidien (débogage, refactorisation, implémentation)</li>
<li><strong>Claude Max 5x</strong> pour les problèmes complexes nécessitant Opus</li></ul>

<p><strong>Coût total mensuel : 103-115 $</strong> selon le plan Z.ai choisi.</p>

<p>Cette approche donne :</p>
<ul><li>Accès à GLM-4.7 pour la majorité des tâches à très faible coût</li>
<li>Accès à Opus pour les défis architecturaux</li>
<li>Plus de flexibilité qu&#39;avec Max seul</li></ul>

<h2 id="verdict">Verdict</h2>

<table>
<thead>
<tr>
<th>Profil</th>
<th>Recommandation</th>
<th>Coût</th>
</tr>
</thead>

<tbody>
<tr>
<td>Travail occasionnel</td>
<td>Z.ai Lite seul</td>
<td>3 $/mois</td>
</tr>

<tr>
<td>Travail régulier</td>
<td>Z.ai Pro seul</td>
<td>15 $/mois</td>
</tr>

<tr>
<td>Travail intensif + besoin d&#39;Opus</td>
<td>Z.ai Pro + Claude Max 5x</td>
<td>115 $/mois</td>
</tr>

<tr>
<td>Budget disponible, simplicité</td>
<td>Claude Max 20x seul</td>
<td>200 $/mois</td>
</tr>
</tbody>
</table>

<p><strong>Le contexte a changé.</strong> GLM-4.7 offre une alternative viable pour de nombreuses tâches de programmation. Mais contrairement à ce qui est parfois affirmé, Claude Max n&#39;impose pas de limite stricte de sessions mensuelles — les deux services fonctionnent sur des cycles qui se réinitialisent.</p>

<p>La vraie question devient : <strong>avez-vous besoin d&#39;Opus et de la qualité supérieure de Sonnet, ou le rapport qualité/prix de Z.ai suffit-il pour votre usage ?</strong></p>

<hr>

<h2 id="notes-importantes">Notes importantes</h2>

<p>Les prix et limites correspondent à la situation de janvier 2026. Z.ai propose actuellement une promotion : réduction de 50 % le premier mois.</p>

<p>Les deux prestataires évoluent rapidement. Vérifiez toujours la documentation officielle pour les informations les plus récentes.</p>

<hr>

<h2 id="sources">Sources</h2>
<ul><li><a href="https://docs.z.ai/devpack/overview?ic=JNKCQ86XJI">Documentation Z.ai – Plans</a></li>
<li><a href="https://support.claude.com/en/articles/11014257-about-claude-s-max-plan-usage">Support Claude Max – Limites d&#39;utilisation</a></li>
<li><a href="https://support.claude.com/en/articles/11145838-using-claude-code-with-your-pro-or-max-plan">Support Claude – Utilisation avec Claude Code</a></li>
<li><a href="https://z.ai/subscribe?ic=JNKCQ86XJI">Pricing Z.ai</a></li>
<li><a href="https://z.ai/blog/glm-4.7?ic=JNKCQ86XJI">Benchmarks SWE-bench – GLM-4.7</a></li></ul>
]]></content:encoded>
      <author>Ut0pia</author>
      <guid>https://blog.ut0pia.org/read/a/38vle1p11u</guid>
      <pubDate>Sat, 24 Jan 2026 16:56:25 +0000</pubDate>
    </item>
    <item>
      <title>Le développeur face à l&#39;IA : sommes-nous les tisserands de 1811 ?</title>
      <link>https://blog.ut0pia.org/le-developpeur-face-a-lia-sommes-nous-les-tisserands-de-1811</link>
      <description>&lt;![CDATA[&#34;Claude Code c&#39;est de l&#39;héroïne pour programmeur.&#34;&#xA;&#xA;J&#39;ai posté ça sur Mastodon début janvier 2026. Une formule volontairement provocante, mais qui résume assez bien mon année 2025. Une année où ma productivité a été multipliée par deux, peut-être par dix selon comment on compte.&#xA;&#xA;Mais je me suis aussi demandé : est-ce que je ne serai pas en train de scier la branche sur laquelle je suis assis ?&#xA;&#xA;!--more--&#xA;&#xA;Les fantômes des révolutions passées&#xA;&#xA;Quand on parle d&#39;IA et d&#39;emploi, les comparaisons historiques fusent. &#34;C&#39;est comme l&#39;arrivée de l&#39;électricité !&#34; &#34;C&#39;est comme Internet !&#34; Soit. Mais si on gratte un peu, ces révolutions industrielles ont des leçons bien plus nuancées à nous offrir.&#xA;&#xA;1811 : Les Luddites n&#39;étaient pas des idiots&#xA;&#xA;L&#39;histoire officielle a fait des Luddites des technophobes arriérés, des casseurs de machines incapables de voir le progrès. C&#39;est un mythe bien pratique.&#xA;&#xA;En réalité, comme le rappelle le MIT Technology Review, les Luddites étaient des artisans qualifiés (tisserands, tricoteurs) qui voyaient très bien ce qui se passait. Ils n&#39;étaient pas contre les machines. Ils étaient contre l&#39;utilisation des machines pour dégrader leur travail et casser leurs salaires.&#xA;&#xA;Leur leader, George Mellor, avait cette formule : &#34;the tendency&#39;s all one way&#34;, la tendance va dans un seul sens. Celui de la concentration des richesses au détriment des travailleurs.&#xA;&#xA;Ça ne vous rappelle rien ?&#xA;&#xA;40 ans de galère avant l&#39;amélioration&#xA;&#xA;Voici ce qu&#39;on oublie souvent : pendant la première révolution industrielle en Angleterre, les salaires réels ont stagné pendant 40 ans alors que la productivité explosait. Quarante ans. Deux générations de travailleurs ont vu leur niveau de vie se dégrader pendant que les propriétaires d&#39;usines s&#39;enrichissaient.&#xA;&#xA;Les choses se sont améliorées. Mais pas toutes seules. Il a fallu des grèves, des syndicats, des lois sociales arrachées de haute lutte. Le progrès technique n&#39;a pas automatiquement ruisselé vers les travailleurs.&#xA;&#xA;Ford et le paradoxe du salaire&#xA;&#xA;Deuxième révolution industrielle, début du XXe siècle. Henry Ford installe ses chaînes de montage. Les ouvriers perdent toute autonomie : un geste, répété des centaines de fois par jour, sur un convoyeur qui impose le rythme.&#xA;&#xA;Mais Ford fait quelque chose d&#39;inattendu : il augmente les salaires. Pas par bonté d&#39;âme mais pour fidéliser sa main-d&#39;œuvre et surtout, transformer ses ouvriers en clients potentiels de ses voitures.&#xA;&#xA;Le parallèle avec l&#39;IA ? Les outils comme Claude Code ou Copilot sont accessibles aux développeurs individuels. Pour l&#39;instant. La question est de savoir si cette démocratisation va durer, ou si on va vers une concentration où seules les grandes entreprises auront accès aux modèles les plus performants.&#xA;&#xA;Les années 70 : la fin annoncée du travail de bureau&#xA;&#xA;Troisième révolution, l&#39;informatique. En 1970, l&#39;invention du microprocesseur. Les ordinateurs personnels arrivent dans les bureaux. Les prédictions catastrophistes pleuvent : 47% des emplois américains seraient automatisables.&#xA;&#xA;Résultat ? Le nombre d&#39;emplois tertiaires a explosé. Les dactylos ont disparu, les développeurs sont apparus. Les comptables manuels ont laissé place aux experts-comptables assistés par logiciel.&#xA;&#xA;La leçon : les métiers disparaissent rarement complètement. Ils se transforment.&#xA;&#xA;2025 : Mon année avec les agents IA&#xA;&#xA;Assez d&#39;histoire. Parlons de ce qui m&#39;est arrivé concrètement.&#xA;&#xA;Le terminal est devenu mon assistant personnel&#xA;&#xA;Depuis fin 2025, j&#39;ai basculé. Mon IDE prend la poussière. Je passe mes journées dans un terminal avec Claude Code. Je décris ce que je veux, l&#39;agent écrit le code, je supervise.&#xA;&#xA;Le setup qui marche pour moi :&#xA;Un fichier claude.md avec des guidelines détaillées sur mon projet&#xA;Des skills personnalisés pour les tâches répétitives&#xA;Une codebase propre (l&#39;IA travaille mieux sur du code bien structuré)&#xA;Docker Desktop pour les intégrations MCP&#xA;&#xA;Coût : environ 1€ par heure de travail assisté, à mettre en parallèle avec la facturation d&#39;un freelance qui tourne autour de 60€ par heure.&#xA;&#xA;Ce que j&#39;ai appris à mes dépens&#xA;&#xA;L&#39;IA est incompétente pour le debug. Vraiment. Elle peut écrire du code, refactorer, ajouter des fonctionnalités. Mais quand il s&#39;agit de comprendre pourquoi ce foutu test échoue avec un message cryptique, elle tourne en rond. La supervision humaine reste indispensable sur les cas limites.&#xA;&#xA;Les &#34;Legacy Memories&#34; sont un piège. Des années d&#39;expérience m&#39;ont appris des patterns, des réflexes. Certains sont devenus des boulets. L&#39;IA ne fait pas les choses comme je les aurais faites et parfois, sa façon est meilleure. Désapprendre pour réapprendre, c&#39;est le plus dur.&#xA;&#xA;Un agent bien configuré, c&#39;est zéro hallucination. J&#39;ai commencé à ne plus relire certains outputs. Ça fait peur à écrire, mais c&#39;est vrai. Avec Claude Code et Opus 4.5, sur une codebase propre avec des guidelines claires, les erreurs sont devenues rares.&#xA;&#xA;L&#39;analogie qui m&#39;a convaincu&#xA;&#xA;On ne relit pas l&#39;assembleur généré par le compilateur. On fait confiance au compilateur. Personne ne vérifie ligne par ligne ce que GCC produit.&#xA;&#xA;Sommes-nous en train de vivre la même transition avec le code généré par IA ?&#xA;&#xA;Les mêmes peurs, vraiment ?&#xA;&#xA;| Révolution | La peur | Ce qui s&#39;est passé |&#xA;|------------|---------|-------------------|&#xA;| 1ère (1780) | Chômage de masse | Nouveaux métiers, mais 40 ans de transition difficile |&#xA;| 2ème (1870) | Déshumanisation du travail | Classe moyenne, société de consommation |&#xA;| 3ème (1970) | Fin du travail de bureau | Explosion des emplois tertiaires |&#xA;| 4ème (2025) | Fin du développeur ? | En cours... |&#xA;&#xA;Le World Economic Forum note que chaque révolution industrielle a créé plus d&#39;emplois qu&#39;elle n&#39;en a détruits. Mais (et c&#39;est un gros mais) les personnes qui perdent leur emploi ne sont pas forcément celles qui en trouvent un nouveau.&#xA;&#xA;Les recherches historiques montrent que pendant la deuxième révolution industrielle, les jeunes travailleurs s&#39;adaptaient en changeant de métier vers les secteurs en croissance. Les travailleurs plus âgés, eux, restaient coincés dans des emplois dévalorisés ou basculaient vers des postes non qualifiés.&#xA;&#xA;Pattern inquiétant pour les développeurs de plus de 40 ans comme moi, surtout ceux que je vois refuser en bloc l&#39;utilisation de ces outils.&#xA;&#xA;La vraie question des Luddites&#xA;&#xA;Comme le souligne TIME, la question n&#39;a jamais été &#34;la technologie va-t-elle nous remplacer ?&#34; mais &#34;qui contrôle la technologie et à qui profite-t-elle ?&#34;&#xA;&#xA;Aujourd&#39;hui, les développeurs sont dans une position particulière. Nous sommes à la fois :&#xA;Les utilisateurs de ces outils (et nous en profitons)&#xA;Les créateurs de ces outils (certains d&#39;entre nous)&#xA;Les potentielles victimes de ces outils (à terme ?)&#xA;&#xA;Cette position ambiguë explique peut-être pourquoi le débat est si polarisé dans notre profession. Certains sont dans le déni (&#34;l&#39;IA ne pourra jamais faire ce que je fais&#34;). D&#39;autres dans l&#39;euphorie aveugle (&#34;plus besoin de développeurs dans 5 ans&#34;). Les deux ont tort.&#xA;&#xA;Ce qui me préoccupe (vraiment)&#xA;&#xA;Je ne vais pas jouer les optimistes béats. Plusieurs choses m&#39;inquiètent :&#xA;&#xA;Le coût environnemental. Entraîner et faire tourner ces modèles consomme une énergie considérable. Mon gain de productivité a un coût carbone que je ne sais pas mesurer.&#xA;&#xA;L&#39;absence de régulation. On avance à toute vitesse sans cadre légal. Les révolutions industrielles précédentes ont fini par être encadrées: droit du travail, normes environnementales, régulation des monopoles. Pour l&#39;IA, on n&#39;en est nulle part.&#xA;&#xA;La transition professionnelle. Je m&#39;adapte parce que j&#39;ai le luxe de pouvoir expérimenter. Qu&#39;en est-il du développeur junior qui entre sur le marché ? Du senior qui a construit sa carrière sur une expertise que l&#39;IA commoditise ?&#xA;&#xA;Ni Luddite, ni techno-béat&#xA;&#xA;Ma position, après quelques mois d&#39;usage intensif : utiliser les outils sans naïveté.&#xA;&#xA;J&#39;utilise Claude Code tous les jours pour le pro bien sûr mais aussi pour le perso. Ma productivité a explosé et j&#39;ai pu relancer moult projets persos qui stagnaient faute de temps.&#xA;&#xA;Mais je ne suis pas dupe. Je milite pour une régulation de ces technologies. Je m&#39;inquiète de leurs impacts environnementaux et sociaux. Je pense que la transition va faire des dégâts si elle n&#39;est pas accompagnée.&#xA;&#xA;Les Luddites avaient compris un truc essentiel : le progrès technique n&#39;est pas neutre. Il peut servir à émanciper les travailleurs ou à les asservir. Ça dépend de choix politiques, pas de la technologie elle-même.&#xA;&#xA;Et maintenant ?&#xA;&#xA;Si vous êtes développeur, vous avez probablement déjà une opinion sur l&#39;IA générative. Peut-être que vous l&#39;utilisez quotidiennement. Peut-être que vous refusez d&#39;y toucher. Peut-être que vous êtes quelque part entre les deux.&#xA;&#xA;Mon conseil, pour ce qu&#39;il vaut : expérimentez, mais gardez les yeux ouverts.&#xA;&#xA;Apprenez à utiliser ces outils. Comprenez leurs limites. Maintenez vos compétences de supervision et d&#39;architecture, ce que l&#39;IA fait mal. Et surtout, participez au débat sur l&#39;encadrement de ces technologies.&#xA;&#xA;Les tisserands de 1811 ont perdu leur combat. Pas parce qu&#39;ils avaient tort sur le fond, mais parce qu&#39;ils n&#39;avaient pas le rapport de force. Nous, développeurs de 2025, avons peut-être une fenêtre pour influencer la direction que prend cette révolution.&#xA;&#xA;Ne la laissons pas passer.&#xA;&#xA;---&#xA;&#xA;Cet article s&#39;appuie sur mes publications sur Mastodon et sur des recherches historiques. Les sources principales sont liées dans le texte.&#xA;&#xA;Sources&#xA;&#xA;MIT Technology Review - What Luddites can teach us about resisting an automated future&#xA;McKinsey - What can history teach us about technology and jobs?&#xA;TIME - What the Luddites Can Teach Us About Artificial Intelligence&#xA;World Economic Forum - The Fourth Industrial Revolution could spell more jobs&#xA;Federal Reserve Bank of Chicago - Occupational Switching During the Second Industrial Revolution&#xA;Cairn.info - Les impacts de l&#39;automatisation du travail&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>“Claude Code c&#39;est de l&#39;héroïne pour programmeur.”</p>

<p>J&#39;ai posté ça sur Mastodon début janvier 2026. Une formule volontairement provocante, mais qui résume assez bien mon année 2025. Une année où ma productivité a été multipliée par deux, peut-être par dix selon comment on compte.</p>

<p>Mais je me suis aussi demandé : est-ce que je ne serai pas en train de scier la branche sur laquelle je suis assis ?</p>



<h2 id="les-fantômes-des-révolutions-passées">Les fantômes des révolutions passées</h2>

<p>Quand on parle d&#39;IA et d&#39;emploi, les comparaisons historiques fusent. “C&#39;est comme l&#39;arrivée de l&#39;électricité !” “C&#39;est comme Internet !” Soit. Mais si on gratte un peu, ces révolutions industrielles ont des leçons bien plus nuancées à nous offrir.</p>

<h3 id="1811-les-luddites-n-étaient-pas-des-idiots">1811 : Les Luddites n&#39;étaient pas des idiots</h3>

<p>L&#39;histoire officielle a fait des Luddites des technophobes arriérés, des casseurs de machines incapables de voir le progrès. C&#39;est un mythe bien pratique.</p>

<p>En réalité, <a href="https://www.technologyreview.com/2024/02/28/1088262/luddites-resisting-automated-future-technology/">comme le rappelle le MIT Technology Review</a>, les Luddites étaient des artisans qualifiés (tisserands, tricoteurs) qui voyaient très bien ce qui se passait. Ils n&#39;étaient pas contre les machines. Ils étaient contre l&#39;utilisation des machines pour dégrader leur travail et casser leurs salaires.</p>

<p>Leur leader, George Mellor, avait cette formule : “the tendency&#39;s all one way”, la tendance va dans un seul sens. Celui de la concentration des richesses au détriment des travailleurs.</p>

<p>Ça ne vous rappelle rien ?</p>

<h3 id="40-ans-de-galère-avant-l-amélioration">40 ans de galère avant l&#39;amélioration</h3>

<p>Voici ce qu&#39;on oublie souvent : pendant la première révolution industrielle en Angleterre, <a href="https://www.mckinsey.com/featured-insights/future-of-work/what-can-history-teach-us-about-technology-and-jobs">les salaires réels ont stagné pendant 40 ans</a> alors que la productivité explosait. Quarante ans. Deux générations de travailleurs ont vu leur niveau de vie se dégrader pendant que les propriétaires d&#39;usines s&#39;enrichissaient.</p>

<p>Les choses se sont améliorées. Mais pas toutes seules. Il a fallu des grèves, des syndicats, des lois sociales arrachées de haute lutte. Le progrès technique n&#39;a pas automatiquement ruisselé vers les travailleurs.</p>

<h3 id="ford-et-le-paradoxe-du-salaire">Ford et le paradoxe du salaire</h3>

<p>Deuxième révolution industrielle, début du XXe siècle. Henry Ford installe ses chaînes de montage. Les ouvriers perdent toute autonomie : un geste, répété des centaines de fois par jour, sur un convoyeur qui impose le rythme.</p>

<p>Mais Ford fait quelque chose d&#39;inattendu : il augmente les salaires. Pas par bonté d&#39;âme mais pour fidéliser sa main-d&#39;œuvre et surtout, transformer ses ouvriers en clients potentiels de ses voitures.</p>

<p>Le parallèle avec l&#39;IA ? Les outils comme Claude Code ou Copilot sont accessibles aux développeurs individuels. Pour l&#39;instant. La question est de savoir si cette démocratisation va durer, ou si on va vers une concentration où seules les grandes entreprises auront accès aux modèles les plus performants.</p>

<h3 id="les-années-70-la-fin-annoncée-du-travail-de-bureau">Les années 70 : la fin annoncée du travail de bureau</h3>

<p>Troisième révolution, l&#39;informatique. En 1970, l&#39;invention du microprocesseur. Les ordinateurs personnels arrivent dans les bureaux. Les prédictions catastrophistes pleuvent : <a href="https://www.cairn.info/revue-etudes-2018-9-page-43.htm">47% des emplois américains seraient automatisables</a>.</p>

<p>Résultat ? Le nombre d&#39;emplois tertiaires a explosé. Les dactylos ont disparu, les développeurs sont apparus. Les comptables manuels ont laissé place aux experts-comptables assistés par logiciel.</p>

<p>La leçon : les métiers disparaissent rarement complètement. Ils se transforment.</p>

<h2 id="2025-mon-année-avec-les-agents-ia">2025 : Mon année avec les agents IA</h2>

<p>Assez d&#39;histoire. Parlons de ce qui m&#39;est arrivé concrètement.</p>

<h3 id="le-terminal-est-devenu-mon-assistant-personnel">Le terminal est devenu mon assistant personnel</h3>

<p>Depuis fin 2025, j&#39;ai basculé. Mon IDE prend la poussière. Je passe mes journées dans un terminal avec Claude Code. Je décris ce que je veux, l&#39;agent écrit le code, je supervise.</p>

<p>Le setup qui marche pour moi :
– Un fichier <code>claude.md</code> avec des guidelines détaillées sur mon projet
– Des skills personnalisés pour les tâches répétitives
– Une codebase propre (l&#39;IA travaille mieux sur du code bien structuré)
– Docker Desktop pour les intégrations MCP</p>

<p>Coût : environ 1€ par heure de travail assisté, à mettre en parallèle avec la facturation d&#39;un freelance qui tourne autour de 60€ par heure.</p>

<h3 id="ce-que-j-ai-appris-à-mes-dépens">Ce que j&#39;ai appris à mes dépens</h3>

<p><strong>L&#39;IA est incompétente pour le debug.</strong> Vraiment. Elle peut écrire du code, refactorer, ajouter des fonctionnalités. Mais quand il s&#39;agit de comprendre pourquoi ce foutu test échoue avec un message cryptique, elle tourne en rond. La supervision humaine reste indispensable sur les cas limites.</p>

<p><strong>Les “Legacy Memories” sont un piège.</strong> Des années d&#39;expérience m&#39;ont appris des patterns, des réflexes. Certains sont devenus des boulets. L&#39;IA ne fait pas les choses comme je les aurais faites et parfois, sa façon est meilleure. Désapprendre pour réapprendre, c&#39;est le plus dur.</p>

<p><strong>Un agent bien configuré, c&#39;est zéro hallucination.</strong> J&#39;ai commencé à ne plus relire certains outputs. Ça fait peur à écrire, mais c&#39;est vrai. Avec Claude Code et Opus 4.5, sur une codebase propre avec des guidelines claires, les erreurs sont devenues rares.</p>

<h3 id="l-analogie-qui-m-a-convaincu">L&#39;analogie qui m&#39;a convaincu</h3>

<p>On ne relit pas l&#39;assembleur généré par le compilateur. On fait confiance au compilateur. Personne ne vérifie ligne par ligne ce que GCC produit.</p>

<p>Sommes-nous en train de vivre la même transition avec le code généré par IA ?</p>

<h2 id="les-mêmes-peurs-vraiment">Les mêmes peurs, vraiment ?</h2>

<table>
<thead>
<tr>
<th>Révolution</th>
<th>La peur</th>
<th>Ce qui s&#39;est passé</th>
</tr>
</thead>

<tbody>
<tr>
<td>1ère (1780)</td>
<td>Chômage de masse</td>
<td>Nouveaux métiers, mais 40 ans de transition difficile</td>
</tr>

<tr>
<td>2ème (1870)</td>
<td>Déshumanisation du travail</td>
<td>Classe moyenne, société de consommation</td>
</tr>

<tr>
<td>3ème (1970)</td>
<td>Fin du travail de bureau</td>
<td>Explosion des emplois tertiaires</td>
</tr>

<tr>
<td>4ème (2025)</td>
<td>Fin du développeur ?</td>
<td><em>En cours...</em></td>
</tr>
</tbody>
</table>

<p>Le <a href="https://www.weforum.org/stories/2019/09/fourth-industrial-revolution-jobs/">World Economic Forum</a> note que chaque révolution industrielle a créé plus d&#39;emplois qu&#39;elle n&#39;en a détruits. Mais (et c&#39;est un gros mais) les personnes qui perdent leur emploi ne sont pas forcément celles qui en trouvent un nouveau.</p>

<p><a href="https://www.chicagofed.org/-/media/publications/working-papers/2024/wp2024-01.pdf">Les recherches historiques montrent</a> que pendant la deuxième révolution industrielle, les jeunes travailleurs s&#39;adaptaient en changeant de métier vers les secteurs en croissance. Les travailleurs plus âgés, eux, restaient coincés dans des emplois dévalorisés ou basculaient vers des postes non qualifiés.</p>

<p>Pattern inquiétant pour les développeurs de plus de 40 ans comme moi, surtout ceux que je vois refuser en bloc l&#39;utilisation de ces outils.</p>

<h2 id="la-vraie-question-des-luddites">La vraie question des Luddites</h2>

<p><a href="https://time.com/6317437/luddites-ai-blood-in-the-machine-merchant/">Comme le souligne TIME</a>, la question n&#39;a jamais été “la technologie va-t-elle nous remplacer ?” mais “qui contrôle la technologie et à qui profite-t-elle ?”</p>

<p>Aujourd&#39;hui, les développeurs sont dans une position particulière. Nous sommes à la fois :
– <strong>Les utilisateurs</strong> de ces outils (et nous en profitons)
– <strong>Les créateurs</strong> de ces outils (certains d&#39;entre nous)
– <strong>Les potentielles victimes</strong> de ces outils (à terme ?)</p>

<p>Cette position ambiguë explique peut-être pourquoi le débat est si polarisé dans notre profession. Certains sont dans le déni (“l&#39;IA ne pourra jamais faire ce que je fais”). D&#39;autres dans l&#39;euphorie aveugle (“plus besoin de développeurs dans 5 ans”). Les deux ont tort.</p>

<h2 id="ce-qui-me-préoccupe-vraiment">Ce qui me préoccupe (vraiment)</h2>

<p>Je ne vais pas jouer les optimistes béats. Plusieurs choses m&#39;inquiètent :</p>

<p><strong>Le coût environnemental.</strong> Entraîner et faire tourner ces modèles consomme une énergie considérable. Mon gain de productivité a un coût carbone que je ne sais pas mesurer.</p>

<p><strong>L&#39;absence de régulation.</strong> On avance à toute vitesse sans cadre légal. Les révolutions industrielles précédentes ont fini par être encadrées: droit du travail, normes environnementales, régulation des monopoles. Pour l&#39;IA, on n&#39;en est nulle part.</p>

<p><strong>La transition professionnelle.</strong> Je m&#39;adapte parce que j&#39;ai le luxe de pouvoir expérimenter. Qu&#39;en est-il du développeur junior qui entre sur le marché ? Du senior qui a construit sa carrière sur une expertise que l&#39;IA commoditise ?</p>

<h2 id="ni-luddite-ni-techno-béat">Ni Luddite, ni techno-béat</h2>

<p>Ma position, après quelques mois d&#39;usage intensif : <strong>utiliser les outils sans naïveté</strong>.</p>

<p>J&#39;utilise Claude Code tous les jours pour le pro bien sûr mais aussi pour le perso. Ma productivité a explosé et j&#39;ai pu relancer moult projets persos qui stagnaient faute de temps.</p>

<p>Mais je ne suis pas dupe. Je milite pour une régulation de ces technologies. Je m&#39;inquiète de leurs impacts environnementaux et sociaux. Je pense que la transition va faire des dégâts si elle n&#39;est pas accompagnée.</p>

<p>Les Luddites avaient compris un truc essentiel : le progrès technique n&#39;est pas neutre. Il peut servir à émanciper les travailleurs ou à les asservir. Ça dépend de choix politiques, pas de la technologie elle-même.</p>

<h2 id="et-maintenant">Et maintenant ?</h2>

<p>Si vous êtes développeur, vous avez probablement déjà une opinion sur l&#39;IA générative. Peut-être que vous l&#39;utilisez quotidiennement. Peut-être que vous refusez d&#39;y toucher. Peut-être que vous êtes quelque part entre les deux.</p>

<p>Mon conseil, pour ce qu&#39;il vaut : <strong>expérimentez, mais gardez les yeux ouverts</strong>.</p>

<p>Apprenez à utiliser ces outils. Comprenez leurs limites. Maintenez vos compétences de supervision et d&#39;architecture, ce que l&#39;IA fait mal. Et surtout, participez au débat sur l&#39;encadrement de ces technologies.</p>

<p>Les tisserands de 1811 ont perdu leur combat. Pas parce qu&#39;ils avaient tort sur le fond, mais parce qu&#39;ils n&#39;avaient pas le rapport de force. Nous, développeurs de 2025, avons peut-être une fenêtre pour influencer la direction que prend cette révolution.</p>

<p>Ne la laissons pas passer.</p>

<hr>

<p><em>Cet article s&#39;appuie sur mes publications sur <a href="https://social.lemee.co/@jb">Mastodon</a> et sur des recherches historiques. Les sources principales sont liées dans le texte.</em></p>

<h2 id="sources">Sources</h2>
<ul><li><a href="https://www.technologyreview.com/2024/02/28/1088262/luddites-resisting-automated-future-technology/">MIT Technology Review – What Luddites can teach us about resisting an automated future</a></li>
<li><a href="https://www.mckinsey.com/featured-insights/future-of-work/what-can-history-teach-us-about-technology-and-jobs">McKinsey – What can history teach us about technology and jobs?</a></li>
<li><a href="https://time.com/6317437/luddites-ai-blood-in-the-machine-merchant/">TIME – What the Luddites Can Teach Us About Artificial Intelligence</a></li>
<li><a href="https://www.weforum.org/stories/2019/09/fourth-industrial-revolution-jobs/">World Economic Forum – The Fourth Industrial Revolution could spell more jobs</a></li>
<li><a href="https://www.chicagofed.org/-/media/publications/working-papers/2024/wp2024-01.pdf">Federal Reserve Bank of Chicago – Occupational Switching During the Second Industrial Revolution</a></li>
<li><a href="https://www.cairn.info/revue-etudes-2018-9-page-43.htm">Cairn.info – Les impacts de l&#39;automatisation du travail</a></li></ul>
]]></content:encoded>
      <author>Ut0pia</author>
      <guid>https://blog.ut0pia.org/read/a/kuor80x07a</guid>
      <pubDate>Sat, 10 Jan 2026 09:44:05 +0000</pubDate>
    </item>
  </channel>
</rss>