- Une architecture qui relie un agent IA basé sur IRC à un site portfolio personnel, afin que les visiteurs puissent obtenir des réponses fondées sur l’analyse réelle du code de dépôts GitHub
- Conçu non pas comme un simple chatbot résumant un CV, mais comme un agent exécutable capable de cloner des dépôts, calculer des tests et vérifier du code
- Le système est séparé en deux agents, nullclaw pour la partie publique et ironclaw pour la partie privée, qui communiquent de façon sécurisée via le réseau Tailscale
- En adoptant le protocole IRC comme couche de transport, il combine auto-hébergement, standardisation et faible coût, tout en répartissant les rôles entre les modèles Haiku 4.5 et Sonnet 4.6 pour limiter les dépenses à 2 $ par jour
- L’ensemble du système fonctionne avec des binaires de moins de 10 Mo et moins de 5 Mo de mémoire, et est présenté comme un exemple d’infrastructure IA légère conciliant sécurité, coût et transparence
Construire un portier numérique
- Une architecture qui déploie un agent IA sur un VPS à 7 $/mois, utilise un serveur IRC personnel comme couche de transport et le relie à des dépôts GitHub
- Les visiteurs peuvent poser des questions à l’IA depuis le site portfolio et recevoir des réponses fondées sur le code réel
- Il ne s’agit pas d’un simple chatbot résumant un CV, mais d’un système fournissant des réponses concrètes grâce à l’analyse de code
Les limites du « chatbot qui parle du CV »
- La plupart des chatbots de portfolio se contentent d’injecter le contenu d’un CV dans le modèle pour le reformuler
- Cette approche n’apporte pas d’informations nouvelles et ne produit qu’une conversation de façade
- À des questions comme « Comment gérez-vous la couverture de tests ? », il faut des réponses concrètes, par exemple cloner le dépôt et calculer le nombre de tests
- Pour cela, une infrastructure permettant un accès direct au code et son analyse a été mise en place
Architecture du système
- L’ensemble est composé de deux agents, deux serveurs et deux périmètres de sécurité
- nullclaw : portier public, binaire Zig de 678 Ko, environ 1 Mo de RAM utilisé
- Accueille les visiteurs, répond aux questions sur les projets, clone les dépôts GitHub et effectue des vérifications fondées sur le code
- ironclaw : agent backend privé, exécuté sur un système distinct
- Peut accéder aux e-mails, au calendrier et au contexte personnel
- Reçoit de nullclaw les demandes complexes via le canal IRC #backoffice
- Les deux systèmes sont reliés via Tailscale, et le serveur public n’a pas accès aux données personnelles
Pourquoi avoir choisi IRC
- Cohérence esthétique : le site portfolio repose sur une interface terminal, donc un client IRC s’y intègre naturellement
- Auto-hébergement complet : le serveur IRC Ergo, le client web gamja et nullclaw fonctionnent tous sur une infrastructure propre
- Protocole simple et standardisé : IRC, vieux de 30 ans, implique zéro dépendance fournisseur et aucun risque de changement d’API
- Le même agent fonctionne à l’identique non seulement avec le client web, mais aussi avec le client terminal irssi
Choix et conception des modèles
- Utiliser un grand modèle partout est inefficace ; les modèles sont donc différenciés selon les rôles
-
Haiku 4.5** : gère la conversation et les requêtes simples,** avec des réponses à très faible latence
- Sonnet 4.6 : utilisé uniquement pour l’analyse de code et le raisonnement complexe
- Plafond de coût : limité à 2 $ par jour et 30 $ par mois
- Cela évite toute explosion des coûts due à un usage malveillant ou à des conversations excessives
- Une structure de raisonnement en couches permet d’obtenir à la fois rapidité et efficacité économique
Conception de la sécurité
- SSH : connexion root désactivée, authentification par clé uniquement, port non standard
- Pare-feu : seuls SSH, IRC (TLS) et HTTPS (WebSocket) sont ouverts
- Proxy Cloudflare : terminaison TLS, limitation de débit et filtrage des bots
- Sandbox de l’agent : uniquement des outils en lecture seule, limite de 10 actions par heure
- Contrôle des coûts : plafond strict de 2 $ par jour et 30 $ par mois
- Journaux d’audit et mises à jour automatiques activés
- Surface d’attaque minimale : seuls les services ergo et nullclaw sont exécutés, sans diffusion directe de contenu web
- En cas de compromission, l’étendue des dégâts est limitée à un bot IRC plafonné à 2 $/jour
Composition de la pile de communication
- Tous les composants sont compacts, auto-hébergés et remplaçables
- Ergo : serveur IRC, binaire Go unique, 2,7 Mo de RAM
- gamja : client web IRC, page statique de 152 Ko, servie derrière Cloudflare
- nullclaw : runtime d’agent IA, binaire Zig de 4 Mo, environ 1 Mo de mémoire utilisée
- L’ensemble du système fonctionne avec moins de 10 Mo de binaires et moins de 5 Mo de mémoire au repos
- Il peut fonctionner sans problème même sur le niveau de VPS le moins cher
Fonctions réelles de nully (agent public)
- Identifier les langages de programmation : via un contexte préchargé et la vérification des dépôts
- Analyser la structure des tests : cloner les dépôts puis lire directement les fichiers de test pour en rendre compte
- Expliquer les projets : par exemple, répondre sur les détails du projet Fracture à partir du code
- Fournir les coordonnées : uniquement des informations de contact exactes, sans inventer de données
- Demandes de prise de rendez-vous : transmises à ironclaw via le protocole Google A2A, avec retour structuré du résultat
- Le visiteur ne perçoit pas le basculement vers le backend
Implémentation A2A
- Prend en charge le protocole Google A2A (v0.3.0) et assure une gestion de l’état des tâches basée sur JSON-RPC
- L’outil
a2a_call envoie des messages à un agent distant et analyse l’état des tâches (terminée / échouée / en cours)
- HTTPS obligatoire, mais HTTP autorisé au sein du réseau interne Tailscale pour faciliter le débogage
-
Structure côté ironclaw
- L’instance nullclaw utilise le passerelle LLM d’ironclaw comme proxy, sans disposer de sa propre clé API
- Une seule clé API et une seule relation de facturation sont conservées
- ironclaw traite toutes les requêtes d’inférence et en assume le coût
Sécurité du handoff
- Le point de terminaison A2A présente un risque d’injection de prompt, d’où des restrictions strictes
- Les demandes pouvant être transmises à ironclaw se limitent au planning, aux coordonnées et aux disponibilités
- La transmission de commandes arbitraires est refusée
- Le point de terminaison A2A d’ironclaw est protégé par un pare-feu réservé à Tailscale
- Les deux agents s’exécutent en mode surveillance avec une liste blanche de commandes autorisées
- nully décide s’il faut ou non faire remonter une demande, afin d’éviter toute exécution incontrôlée de commandes
Enseignements tirés de la mise en place
- Le choix du modèle fait partie de la conception du système et affecte directement le coût, la latence et l’expérience
- La communication, la sécurité et l’infrastructure ont demandé plus de temps que l’agent lui-même
- La simplicité et l’ouverture d’IRC en font une couche de transport idéale pour les agents IA
- La séparation nullclaw–ironclaw est le cœur du modèle de sécurité
- La combinaison du protocole A2A et des canaux de logs IRC apporte à la fois une communication structurée et une visibilité en temps réel
- Éviter la duplication des identifiants : le proxy via la passerelle d’ironclaw permet de conserver une seule clé API et une seule relation de facturation
Comment l’essayer
- Rendez-vous sur georgelarson.me/chat ou tapez
irc dans le terminal de la page d’accueil
- Avec un client IRC :
irc.georgelarson.me, port 6697 (TLS), canal #lobby
- nully est en attente et peut échanger avec les visiteurs en temps réel
1 commentaires
Commentaires sur Hacker News
Si un agent OpenClaw ayant accès aux e-mails et aux données personnelles est compromis, l’ampleur des dégâts pourrait être considérable
Ce n’est pas juste un simple bot IRC : un attaquant pourrait réinitialiser des mots de passe pour lever des limites d’API, voire l’exploiter comme hub de partage de contenu illégal
Je me suis demandé pourquoi le choix s’était porté sur Haiku/Sonnet. OpenRouter propose des modèles bien moins chers
Par exemple, Haiku 4.5 coûte 1 $ par million de tokens en entrée et 5 $ en sortie, alors que MiniMax M2.7 est à 0,30 $ en entrée et 1,20 $ en sortie, et Kimi K2.5 autour de 0,45 $ en entrée et 2,20 $ en sortie
D’après mon expérience, M2.7 et K2.5 offrent des performances comparables, voire supérieures, à Haiku
C’est d’ailleurs pour cette raison que j’utilise des modèles Anthropic dans les agents que je construis en ce moment. Haiku garde bien le contrôle même quand les utilisateurs lancent des requêtes bizarres, et gère aussi de façon stable les conversations émotionnelles
IRC est bien comme couche de transport, mais il n’offre aucune garantie de livraison (delivery guarantee). Si la connexion tombe, les messages échangés pendant ce temps sont perdus
C’est acceptable pour un chat en temps réel, mais pour un agent qui exécute de vraies tâches, il faut une livraison at-least-once
Les SSE (Server-Sent Events) constituent un bon compromis. On peut garder une connexion persistante et y ajouter une logique de retransmission
J’ai déjà fabriqué un bot reposant sur une idée similaire dans un train entre Tokyo et Osaka
web-support-claw.oncanine.run — c’était un projet qui lisait un dépôt GitHub pour créer un bot d’intercom destiné à un site web
Il répond aux questions des visiteurs, ce qui évite d’avoir à construire une base de connaissances séparée
À l’avenir, je recommanderais de garder une instance Haiku en surveillance. On peut aussi recevoir des alertes via ntfy
En l’état, le salon de discussion est complètement hors de contrôle
Si l’objectif est une « candidature interactive », les interactions d’un public indéterminé sont inutiles
Notre équipe utilise aussi une architecture similaire. Quatre agents (vente, social, finance, stratégie) communiquent via un tableau de messages basé sur FastAPI + SQLite
Au lieu d’une limite de budget quotidienne, nous gérons un plafond de coûts dans la couche de gouvernance
La structure pub/sub d’IRC convient bien à la communication multi-agents, mais nous utilisons un polling HTTP + déduplication. C’est moins élégant, mais la reprise est plus facile même si les agents crashent souvent
Moi aussi, j’utilise IRC comme interface pour des agents de code
Je change de salon pour basculer de prompt et je contrôle les projets à distance
Quelqu’un disait que « la box publique n’accède pas aux données personnelles », et ça pourrait être amusant d’en faire un challenge CTF
On cacherait un flag dans la box privée, et on donnerait 50 dollars à quiconque parvient à y accéder et à le récupérer
L’attitude de nully est un peu brutale, mais j’aime bien l’architecture globale du système
J’utilise aussi une structure hiérarchique, dont le niveau le plus bas est un bot local Qwen
Je suis curieux de voir la logique d’escalade de Haiku vers Opus
Cette idée est vraiment intéressante. Ça me donne envie de créer un bot pour automatiser le processus de recrutement
Il identifierait le profil d’un candidat via un entretien, trouverait des offres adaptées, puis irait jusqu’à soumettre les candidatures automatiquement
Si le bot côté entreprise évalue lui aussi les candidats de la même manière, on pourrait faire du matching selon les préférences des deux côtés
On pourrait l’implémenter de façon entièrement open source et auto-hébergée, avec un signal bien plus utile qu’un CV