Huit agents IA, un seul boîtier AMD : ma stack d'agents locaux (OpenClaw)

Publié
11 juillet 2026
Par
Jacob Lloyd — rédigé avec l'aide de l'IA, une fois le projet terminé
Temps de lecture
11 min de lecture

En clair : Une visite guidée des huit assistants IA qui tournent sur un seul petit ordinateur chez moi, chacun avec son propre nom et son propre rôle — répondre aux questions de la famille, rédiger des brouillons d'e-mails. La majorité du travail ne coûte rien car il tourne en local, et les conversations privées ne quittent jamais la maison. Un aperçu de ce à quoi peut ressembler une installation d'IA domestique sans frais mensuels.

Il y a en ce moment huit agents IA nommés qui vivent sur un mini PC chez moi. Ils ont des rôles, une hiérarchie, et un chat de groupe que toute ma famille peut ouvrir depuis un téléphone. Les faire tous tourner coûte environ 24 $ par mois — l'API pas chère de DeepSeek assure la réflexion du quotidien, et les tâches qui ne doivent pas sortir de la maison tournent sur des modèles locaux gratuits.

tl;dr

  • Ce que c'est : OpenClaw, une passerelle d'agents IA auto-hébergée, qui fait tourner 8 agents nommés — chacun avec son rôle, son routage de modèle et ses permissions d'outils — derrière une appli de chat que j'ai construite.
  • Ce que ça coûte : environ 24 $/mois d'API DeepSeek pour le travail quotidien ; 0 $ pour les modèles locaux qui couvrent la vision et le travail privé.
  • Ce qu'il vous faut : une machine avec beaucoup de mémoire (la mienne : 128 Go unifiés, 64 Go en VRAM), Linux, et de la patience pour systemd.
  • Ce que vous obtenez : une seule URL de chat pour toute la maison, des agents qui se passent le travail et qui vont chercher ceux qui se taisent, de la génération d'images en local, et des brouillons d'e-mails que rien n'envoie sans moi.

Ce qu'on obtient

Le quotidien d'abord. Voici DisPatch, l'appli de chat que j'ai construite devant la passerelle — les captures sont des données de démo en bac à sable tirées de cet article, mes vrais fils de discussion restent les miens.

QuoiLe chiffre
Agents nommés8 (Bits, Flash, Brains, Hermes, Doxy, Charley, Alpha, Beta)
Modèles cloud dans la table de routage2 (DeepSeek flash et pro)
Entrées de modèles locaux~7 sur le boîtier principal, 6 de plus sur un second PC pour le débordement
Plus gros modèle localun MoE à 120 milliards de paramètres, tournant sur un GPU intégré
Facture cloud mensuelle mesuréeenviron 24 $ (DeepSeek, le principal poste)
Port de la passerelle18789
Port du chat8765, sur le réseau domestique
Sauvegarde nocturne02:17
Battement de cœur de la passerelletoutes les 2 heures
Fenêtre du chien de garde5 minutes, puis un travailleur silencieux se fait relancer

Le boîtier

Tout ça tourne sur une seule machine. Pas de rack, pas de location de GPU cloud, pas de deuxième hypothèque.

  • AMD Ryzen AI Max+ 395 (« Strix Halo ») — 32 threads, GPU intégré Radeon 8060S
  • 128 Go de mémoire unifiée, dont 64 Go réservés comme VRAM du GPU (l'OS voit environ 62 Go restants)
  • 1 To de NVMe, avec Bazzite Linux (immuable, basé sur Fedora Atomic)
  • ROCm, pas CUDA — se comporte un peu différemment de ce que supposent les tutoriels, mais ça marche

Ce prélèvement de 64 Go, c'est le point important : de quoi faire tourner localement un modèle mixture-of-experts de 120 milliards de paramètres, à une vitesse utilisable, sur un GPU intégré. Un second PC sur mon réseau sert de débordement et de modèles de secours.

La distribution

Plutôt qu'un seul onglet de chat qui parle à un seul modèle, j'ai un petit bureau. Chacun a un rôle et un modèle adapté — le cloud DeepSeek pas cher pour l'essentiel du travail, des modèles locaux gratuits là où la confidentialité ou la vision comptent. (Les modèles locaux étaient le plan de départ ; en pratique, leurs temps de chargement et leur plafond plus bas en ont fait le palier de secours, pas celui par défaut.)

AgentRôleModèle principalTourne sur
BitsAccueil. Me parle, n'exécute elle-même aucun outil, délègue toutDeepSeek (cloud, palier flash)cloud
FlashTâches rapides — résumés, recherches, modifications de routine. Zéro personnalité, outil purDeepSeek (cloud, palier flash)cloud
BrainsRéflexion de fond — architecture, débogage, relecture de codeDeepSeek (cloud, palier pro)cloud
HermesDéploiements et codage, relié via un runtime d'agent séparé. Dry-run par défaut ; les vrais déploiements ont besoin de mon feu vert expliciteDeepSeek (cloud, palier pro)cloud
DoxyTravail de fond en masse. Aucun compteur d'API sur un modèle local, donc ça tourne toute la nuit gratuitementMoE 120B (local)ce boîtier
CharleyVision — regarde vraiment les captures d'écran, les diagrammes, les fenêtres d'erreurGemma-4 31B, compatible vision (local)ce boîtier
Alpha / BetaBots d'« accueil » sûrs pour les appareils de la famille, outils en lecture seule uniquementflash (cloud) / Gemma-4 26B (local)mixte

Chaque agent a des modèles de secours — si le principal est occupé ou en panne, il bascule discrètement sur un modèle de repli, cloud ou local. Beta et Charley sont strictement limités aux outils en lecture seule : chercher des infos, faire des images, jamais toucher aux fichiers ni exécuter de commandes. Exactement ce qu'on veut d'un bot qu'un enfant de dix ans peut ouvrir. La messagerie entre agents est activée, verrouillée par une liste blanche de qui peut parler à qui.

Les pièces

Rien de tout ça n'est un seul programme. Ce sont huit petits services, chacun avec une seule tâche, tous supervisés par systemd plutôt que par un script nounou.

ServiceCe qu'il fait
openclaw-gateway.serviceLa passerelle OpenClaw — le cerveau de la stackport 18789, loopback uniquement, auth par jeton
local-chat.serviceDisPatch, le frontend de chatport 8765, LAN
lm-studio.serviceServeur de modèles locaux (un AppImage extrait) qui sert tous les modèles locaux, plus le modèle d'embeddingport 1234, local
comfyui.serviceGénération d'images (ComfyUI + Z-Image Turbo sur l'iGPU) — les agents et le chat peuvent le démarrer et l'arrêterlocal, à la demande
openclaw-email.serviceTri des e-mails — rédige des réponses, n'en envoie jamais
hermes-gateway.serviceUne passerelle séparée qui relie l'agent de déploiement/codage
openclaw-backup.timerSauvegarde nocturnese déclenche à 02:17
dispatch-tracker-watch.pathLe déclencheur du chien de garde (détails plus bas)

Chaque unité se redémarre toute seule en cas d'échec, réglée pour qu'un crash coûte quelques secondes d'indisponibilité, pas un appel à 2 heures du matin. L'unité LM Studio vérifie l'état de sa propre API avant de se déclarer prête. La config de la passerelle se recharge à chaud, donc la plupart des changements de routage ne demandent aucun redémarrage. La mise à jour automatique est désactivée exprès — une mise à jour a cassé la stack exactement une fois, et depuis, les montées de version se font sur mon calendrier. Pour vérifier tout le zoo :

systemctl --user status openclaw-gateway local-chat lm-studio comfyui
journalctl --user -u openclaw-gateway -f

Comment un message de chat se déplace réellement

Le trajet est celui qu'on devine : navigateur → DisPatch → passerelle → le modèle de l'agent, local ou cloud, et retour par le même chemin. Deux détails comptent : si le modèle principal est occupé ou en panne, un modèle de secours répond à sa place, et la livraison retour vers le navigateur est confirmée par des chemins redondants, donc une connexion coupée ne perd pas le message.

Faire du vrai travail

Les réponses de chat, c'est le cas facile. Le schéma utile, c'est de demander quelque chose de gros et de laisser le roster décider qui s'en occupe.

Le gros du travail — traitement d'images en masse, longs refactorings, tout ce qui est ennuyeux — part chez Doxy sur le 120B local gratuit, qui va broyer pendant une heure pour le prix de l'électricité.

Se surveiller soi-même

Un travail délégué qui meurt en silence est pire qu'un travail jamais commencé — on ne le découvre qu'en allant vérifier. D'où un chien de garde, la seule pièce de cette stack dont je suis vraiment fier.

Ça a remplacé une idée franchement mauvaise : un cron LLM perpétuel toutes les cinq minutes. Il spammait le modèle et provoquait lui-même ses propres dépassements de délai — le chien de garde créait exactement le problème qu'il était censé attraper. La version pilotée par événements ne s'arme que quand il y a un envoi à surveiller, puis s'efface dans tous les cas.

Ce que ça coûte

L'économie, c'est tout l'intérêt de séparer le roster. Tarifs cloud, par million de jetons :

ModèleEntréeSortie
DeepSeek palier flash (Bits, Flash, Alpha)0,14 $ / M jetons0,28 $ / M jetons
DeepSeek palier pro (Brains, Hermes)0,435 $ / M jetons0,87 $ / M jetons
120B local (Doxy), vision locale (Charley), Gemma local (Beta)0 $0 $

Même le palier « cher » représente des fractions de centime par requête typique. La vraie économie tient à l'endroit où se trouve le volume : les tâches répétitives de plusieurs milliers de jetons partent vers le modèle local gratuit ; le compteur cloud ne tourne que pour les jugements qui comptent. La recherche en mémoire tourne elle aussi sur un modèle d'embedding local, donc les recherches constantes en arrière-plan ne touchent jamais non plus une API payante.

Les règles qu'il ne franchira pas

Une passerelle capable de lancer des agents et d'exécuter des outils a besoin de garde-fous qui ne dépendent pas de la bonne volonté du modèle.

  • L'accès à la caméra, l'enregistrement d'écran, les SMS et les commandes contacts/calendrier sont refusés d'office au niveau de la passerelle — pas « l'agent ne devrait pas », vraiment bloqué.
  • Beta et Charley n'ont que des outils en lecture seule. Pas d'écriture de fichiers, pas de shell, peu importe la gentillesse de la demande.
  • Les plugins suivent une liste blanche stricte de sept éléments : deux fournisseurs de modèles locaux, DeepSeek, la recherche web Brave, un navigateur headless, la mémoire agent-à-agent, et le pont de déploiement. Rien d'autre ne se charge, installé ou non.
  • Hermes — le seul agent qui peut toucher la production — fait du dry-run par défaut. Un vrai déploiement a besoin de mon feu vert explicite, et les déploiements de mon site professionnel sont derrière le même verrou.

Pièges à éviter

La liste honnête — ce qui a vraiment cassé, dans l'ordre où ça m'a mordu :

  • Les modèles locaux ont besoin de reasoning: true explicite. Les miens émettent un flux de raisonnement séparé avant la vraie réponse ; avec le drapeau mal réglé, la passerelle prenait ça pour un blocage et tuait la requête vers 6,5 minutes. Le modèle n'était pas coincé — il réfléchissait à voix haute sur un canal que la passerelle ne connaissait pas.
  • Tous les délais par défaut sont calibrés pour la vitesse du cloud. Un 120B sur un iGPU est lent, pas cassé. J'ai relevé les délais de fournisseur, de tour et d'abandon à environ 20, 30 et 35 minutes ; avant ça, les longues tâches se faisaient tuer en plein raisonnement pour le crime d'être locales.
  • L'AppImage de LM Studio plantait avec un SIGBUS chaque fois que son point de montage FUSE /tmp était recyclé sous pression mémoire — une vraie erreur de bus, pas un kill OOM. Extraire l'AppImage et le faire tourner comme un simple service systemd a réglé le problème.
  • La liste blanche de messagerie est sensible à la casse, mais la passerelle met les ID d'agents en minuscules en interne. Les envois entre agents échouaient jusqu'à ce que j'ajoute des doublons en minuscules de chaque nom. Aucune erreur, aucune ligne de log — juste rien qui n'arrivait.
  • La messagerie entre agents a besoin de deux interrupteurs séparés — le drapeau de fonctionnalité et le réglage de visibilité de session. Activez l'un sans l'autre, et le réglage par défaut bloque silencieusement chaque envoi.
  • Un chien de garde LLM planifié est une panne auto-infligée — l'histoire du cron toutes les cinq minutes ci-dessus. Le pilotage par événements a largement battu le planifié.
  • Un agent a un jour ressuscité sa propre mauvaise config. Une passe de réconciliation d'identité a réinjecté un fichier d'espace de travail périmé et a fait boucler la passerelle en crash-loop. Une config qu'un agent peut toucher est une config qui peut vous mordre en retour.
  • Une liste blanche de plugins non vide est absolue. Marquer une entrée enabled: true ne sert à rien si son ID n'est pas aussi dans la liste blanche. C'est la liste blanche qui gagne, en silence.

← Plus de IA et LLM locaux