Agent IA pour la recherche mathématique : Wolfram Engine + Qwen Code CLI sur Mac mini
Un laboratoire entièrement autonome dédié à la recherche mathématique a été créé, accessible via une application de messagerie — sans API cloud, sans serveurs externes et sans perte de contrôle sur le code ni les données. Le système s’exécute localement sur un Mac mini, reçoit des tâches depuis Delta Chat, génère des algorithmes en Wolfram Language grâce à Qwen Code CLI, les exécute via Wolfram Engine et renvoie les résultats avec des graphiques directement dans le chat. Il ne s’agit pas d’une interface vers une solution préfabriquée : c’est un environnement de recherche qui capture l’intégralité du processus de pensée, de la formulation du problème jusqu’à la vérification.
Architecture sans services intermédiaires
L’ensemble du pipeline de traitement des messages est mis en œuvre sous forme d’un flux de travail local, sans aucune dépendance vis-à-vis d’API tierces ou de plateformes SaaS. L’avantage clé réside dans le contrôle total sur les prompts d’entrée, le code exécuté et les cycles de vie des données. Il n’y a ni appels cachés au cloud, ni envoi automatique de code vers des services LLM, ni collecte de métriques hors de la machine de l’utilisateur.
Un message provenant de Delta Chat (via IMAP/SMTP) arrive dans le bot Python math_bot.py, qui :
- Valide l’expéditeur par rapport à une
WHITELIST_EMAIL; - Démarrer une nouvelle session ou reprendre une session existante ;
- Construit un prompt atomique incluant un préambule système issu de
QWEN_PREAMBLEet le contexte des étapes précédentes ; - Exécute
qwenen mode headless avec les flags--yolo --continue; - Capture stdout au format JSON ;
- Analyse les fichiers graphiques situés dans
/tmp/mrl_graphics/selon leurs extensions.png,.jpg,.svg,.pdf; - Renvoie le résultat dans le chat tout en sauvegardant l’historique dans
sessions/.
Il est important de noter que Qwen Code CLI n’est pas utilisé comme une « boîte noire ». Il est lancé en tant que sous-processus local, et toutes les commandes wolframscript sont exécutées dans un répertoire strictement défini avec des spécifications de chemin explicites. Les graphiques ne sont exportés que dans un dossier temporaire dédié — aucun effet secondaire n’est écrit dans le répertoire personnel ni dans ~/Downloads.
Exigences d’environnement et sécurité d’exécution
Le système est conçu pour macOS 14+, mais il est également compatible avec Linux et Windows grâce à des composants multiplateformes. Les dépendances critiques incluent :
- Wolfram Engine 14.1+ — la version gratuite du moteur disponible pour un usage personnel. Elle est installée via pkg, ajoutant le binaire
wolframscriptà PATH. Toutes les calculs se font localement ; aucune expression n’est envoyée vers Wolfram Cloud. - Qwen Code CLI v3.5 Plus — une version headless du modèle fonctionnant sur Node.js. Elle ne nécessite pas de clé API. Le modèle est chargé localement, pèse environ 2,1 Go (quantisé GGUF), et est lancé via la CLI
qwenavec--model qwen3.5-plus.Q4_K_M.gguf. - Delta Chat RPC Server — un binaire natif (
deltachat-rpc-server) qui gère la connexion à la boîte mail. Il fonctionne en mode--no-verify-ssluniquement lorsqu’il est utilisé localement ; le chiffrement PGP via QR code est recommandé pour une protection de bout en bout.
La configuration de sécurité est mise en œuvre à trois niveaux :
- Réseau : Delta Chat utilise les ports IMAP/SMTP standard sans redirection de port, VPN ni IP blanchies. Le trafic est chiffré avec TLS 1.3.
- Processus : Qwen est lancé avec une limite de temps de
QWEN_TIMEOUT=600, limitant l’exécution de tâches complexes. Si cette limite est dépassée, le processus est forcé de s’arrêter viasubprocess.run(..., timeout=...). - Fichier : Tous les graphiques sont sauvegardés exclusivement dans
/tmp/mrl_graphics/, et les sessions sont stockées dansPROJECT_DIR/sessions/. Le cheminGRAPHICS_DIRest vérifié pour sa validité absolue et son existence viais_dir()avant utilisation.
Mise en œuvre du cycle de vie des sessions
Le bot prend en charge sept commandes de gestion des sessions, chacune modifiant l’état dans SESSIONS_DIR :
/start— crée une nouvelle session avec un UUID unique, initialisesession_YYYYMMDD_HHMMSS.mdet_assets/./continue— reprend la dernière session active./resume <id>— ouvre une session spécifique par ID./peek— affiche les dernièresPEEK_LINES=40lignes du journal actuel./archive— déplace une session dansarchived/, la retirant de l’index./close— finalise une session : copiesolution.wldansalgorithms/, génèresummary.mdet vide_assets/./help— affiche l’aide sans accès aux chemins internes.
Chaque session est un fichier Markdown documentant le dialogue de manière chronologique, chaque étape contenant quatre blocs obligatoires :
- Algorithme verbal (étapes numérotées) ;
- Code Wolfram Language (texte exact prêt à être exécuté) ;
- Résultat réel de
wolframscript(stdout/stderr) ; - Interprétation du résultat (1–2 phrases).
Cela garantit la reproductibilité : toute étape peut être répétée manuellement via wolframscript -code "...", et tous les graphiques peuvent être régénérés à partir de Export[...].
Exemple d’interaction fonctionnelle
Un utilisateur envoie le message suivant dans le chat :
Trouvez les points d’intersection entre y = x^2 et y = 2x + 3. Tracez le graphique.
Le bot transmet la requête à Qwen Code CLI avec le préambule :
Utilisez uniquement wolframscript (pas Python). Enregistrez les graphiques dans /tmp/mrl_graphics/. Les labels sur les graphiques doivent être en caractères latins.
Trouvez les points d’intersection entre y = x^2 et y = 2x + 3. Tracez le graphique.
Qwen renvoie une réponse structurée :
- Algorithme verbal
1. Égalisez les fonctions : x^2 == 2x + 3
2. Réorganisez en forme standard : x^2 - 2x - 3 == 0
3. Résolvez l’équation quadratique
4. Tracez les deux fonctions sur le même graphique
- Code Wolfram
---wl---
eq = x^2 == 2 x + 3;
solutions = Solve[eq, x];
Plot[{x^2, 2 x + 3}, {x, -3, 5},
Epilog -> {Red, PointSize[Large],
Point[{x, x^2} /. solutions]},
PlotLabel -> "Intersection de y=x^2 et y=2x+3",
AxesLabel -> {"x", "y"}]
Export["/tmp/mrl_graphics/intersection.png", %]
---wl---
- Résultat de Wolframscript
{{x -> -1}, {x -> 3}}
$Graphics$
- Interprétation du résultat
Points d’intersection : (-1, 1) et (3, 9). Le graphique est enregistré sous le nom intersection.png.
Le bot extrait le PNG de /tmp/mrl_graphics/, l’envoie dans le chat et ajoute ce bloc au journal de la session.
Ce qui compte
- L’exécution locale garantit la confidentialité : aucun objet mathématique, formule ou graphique ne quitte jamais la machine de l’utilisateur.
- Wolfram Engine n’est pas un remplaçant de Python — c’est une calculatrice spécialisée : elle fournit une algèbre symbolique précise, de la visualisation et des méthodes numériques sans avoir besoin d’écrire des solveurs personnalisés.
- Qwen Code CLI agit comme un générateur de code, pas comme un solveur : le modèle ne produit jamais une « réponse finale » mais seulement du code exécutable et attend le résultat réel de
wolframscript. - Delta Chat assure un chiffrement de bout en bout sans serveurs : les clés PGP sont échangées via QR code, et les messages sont chiffrés sur l’appareil.
- La structure
algorithms/crée un référentiel de solutions reproductibles : chaque algorithme comprenddescription.md,reasoning.mdetsolution.wl— prêts à être intégrés dans des pipelines CI/CD ou des documents.
Installation et déploiement
Pour déployer, vous devrez :
- Installer Wolfram Engine depuis le site officiel et exécuter
wolframscript --install. - Installer Node.js 20+ et exécuter
npm install -g qwen-cli. - Créer un environnement conda :
conda create -n mathbot python=3.12 && conda activate mathbot. - Installer les dépendances :
pip install -r requirements.txt. - Configurer
config.py: spécifierWHITELIST_EMAIL,PROJECT_DIRetQWEN_CMD. - Effectuer l’initialisation :
bash init.sh— cela créerasessions/,algorithms/et_index.md. - Démarrer le bot :
python math_bot.py.
Après le démarrage, le bot commence à interroger la boîte mail toutes les 30 secondes. Pour les tests, envoyez simplement /start depuis une adresse e-mail autorisée. Les sessions sont enregistrées en temps réel, et les erreurs sont consignées dans math_bot.log.
— Editorial Team
Aucun commentaire pour le moment.