OpenClaw Model Manager : une interface graphique pour arrêter de modifier le JSON de routage des modèles à la main

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

En clair : Une application de bureau gratuite qui donne à mon installation d'IA personnelle un vrai panneau de contrôle, à la place de la modification manuelle et risquée d'un fichier de réglages. Elle montre quel « cerveau » IA utilise chaque assistant et permet de les changer d'un clic, en refusant d'enregistrer quoi que ce soit qui casserait le système. Elle existe parce qu'une simple faute de frappe a un jour mis un assistant hors service en silence.

Un jour, j'ai tapé une faute de frappe dans un identifiant de modèle au sein d'un fichier JSON, et l'agent qui l'utilisait s'est simplement tu. Aucune erreur, aucun crash. Il restait là à parler à un modèle qui n'existait pas, pendant que je traquais un bug bien plus intéressant ailleurs. Cette application, c'est mon « plus jamais ça ».

TL;DR

  • Ce que c'est : une application de bureau GTK4/libadwaita qui modifie openclaw.json, la configuration décidant à quel LLM parle chaque agent, sous-agent et tâche cron de ma pile OpenClaw.
  • Ce que ça coûte : gratuit, sous licence MIT, code source dans le zip ci-dessous.
  • Ce qu'il vous faut : Linux avec GTK4 + libadwaita + PyGObject (une ligne de gestionnaire de paquets), Python 3.11+, et une installation OpenClaw — ou l'exemple de configuration fourni pour partir de zéro.
  • Ce que vous obtenez : un tableau de bord sur un seul écran du modèle de chaque agent, des enregistrements qui ne peuvent ni corrompre le fichier ni assigner un modèle inexistant, et un sélecteur en un clic qui route le CLI Claude Code vers un modèle local gratuit, un DeepSeek pas cher, ou une vraie facturation Anthropic.

Ce que vous obtenez

D'abord les captures d'écran. Elles proviennent d'une copie isolée fonctionnant avec une configuration factice dans un HOME jetable. Vraie application, fausses données, aucune de mes clés.

Fenêtre principale d'OpenClaw Model Manager montrant l'inventaire Model Usage, un panneau d'état Connectivity and Routing, et des profils API/Local Defaults à code couleur
Fenêtre principale : le modèle de chaque agent sur un seul écran, avec l'état de connectivité en direct par fournisseur.

La fenêtre principale répond à la question à laquelle je répondais autrefois en faisant un grep dans le JSON : quel modèle tourne où, et combien ça coûte ? Chaque agent, les valeurs par défaut de toute la pile, la surcharge des sous-agents, les tâches cron, et même les modèles d'un agent e-mail voisin. Chaque entrée reçoit un badge de couleur : Local (ce PC), Remote (le second PC), ou Cloud (celui qui apparaît sur une facture).

Panneau d'application en masse Set Models for All Agents et section Coding Helper avec un sélecteur de mode et un avertissement en direct indiquant que le mode Cloud n'a pas de clé fonctionnelle sur cette machine
Appliquez un modèle à tous les agents d'un coup, ou choisissez le backend du Coding Helper. L'application avertit quand le mode choisi ne fonctionnera pas réellement.
Vue Model Catalog listant le coût, la longueur de contexte et le support du reasoning par modèle, avec des boutons Add LM Studio Model et Add Anthropic Model
Le catalogue : coût, longueur de contexte et support du reasoning par modèle, plus un bouton de découverte qui demande à LM Studio ce qu'il a réellement chargé.

Pourquoi cette application existe

OpenClaw est la pile multi-agents que je fais tourner chez moi : plusieurs agents IA, chacun pointé vers un modèle, certains locaux et gratuits, d'autres dans le cloud et facturés. Tout le routage vit dans un seul fichier, ~/.openclaw/openclaw.json : catalogue de modèles, attributions primaire/secours par agent, configurations des fournisseurs, et le jeton d'authentification de la passerelle elle-même. Le modifier à la main finissait toujours par mal tourner, de deux façons.

D'abord, un mauvais identifiant de modèle échoue en silence. Une valeur par défaut obsolète a un jour pointé un agent vers vllm/google/gemma-4-31b-qat, un modèle que le fournisseur n'a jamais servi. Un enregistrement malformé, c'est pire : une seule mauvaise modification et toute la passerelle part en boucle de crash.

Ensuite, basculer le CLI Claude Code entre différents backends est une chirurgie invisible de variables d'environnement. OpenClaw lance Claude Code pour les tâches de code, et l'endroit où vont ces requêtes — et qui est facturé — est fixé par les variables d'environnement ANTHROPIC_* sur l'unité systemd de la passerelle. Basculer entre le local gratuit, le DeepSeek pas cher et le vrai Anthropic voulait dire écrire à la main un drop-in systemd à chaque fois. Exactement le genre de chose que je rate à 23 h.

Le chemin de l'enregistrement

Ce que j'ai besoin de pouvoir vérifier, c'est ce qui se passe quand on clique sur Save. Voici le déroulé, dans l'ordre :

Deux étapes portent l'essentiel du poids. La validation refuse tout identifiant de modèle que son fournisseur n'annonce pas, ce qui rend le bug de faute de frappe de l'introduction structurellement impossible, plutôt qu'une chose que je dois me souvenir de vérifier. Et l'écriture atomique existe parce que openclaw.json contient le jeton d'authentification de la passerelle et doit rester en chmod 600 : le fichier temporaire reçoit les permissions de l'original avant que le moindre contenu soit écrit, puis il est passé par fsync et renommé par-dessus l'original. Un crash en plein enregistrement laisse l'ancien fichier intact.

Un mauvais enregistrement n'est qu'à un renommage d'être annulé, et vous conservez cinq générations d'historique au lieu d'une seule.

Le drop-in du Coding Helper

Rediriger le CLI Claude Code est un flux séparé, car il ne touche jamais à openclaw.json. L'application écrit un drop-in systemd qui surcharge l'environnement de la passerelle avant que celle-ci ne lance Claude Code.

Quatre modes, un seul menu déroulant : LM Studio (gratuit, local), DeepSeek via son endpoint compatible Anthropic (pas cher), Anthropic Cloud (le défaut : aucun drop-in, rien n'est surchargé), ou Disabled, qui pointe le CLI vers http://127.0.0.1:9/blocked pour que chaque appel échoue vite au lieu de rester bloqué. Il existe aussi un test en direct en un clic qui envoie un vrai ping au format Anthropic à LM Studio ou DeepSeek, et rapporte quel modèle a réellement répondu. On ne fait pas confiance à un écran de configuration, on fait confiance à une requête qui vient d'avoir lieu.

Garder la clé API hors du fichier unit

Le mode DeepSeek a besoin d'une clé API, et un fichier unit systemd est un très mauvais endroit pour ça : tout ce qui y est écrit directement reste en clair sur le disque et dans la sortie de systemctl show. Le drop-in ne contient donc jamais la clé. Il écrit ceci à la place :

ExecStart=/usr/bin/bash -c 'export ANTHROPIC_API_KEY="$$DEEPSEEK_API_KEY"; exec <gateway cmd>'

L'astuce, c'est $$. Dans un fichier unit, $$ échappe un $ littéral. Sans ça, systemd développe lui-même la variable en construisant la ligne de commande, et la vraie clé se retrouve dans l'argv du processus, où ps peut la lire. Avec le double dollar, bash reçoit un $DEEPSEEK_API_KEY littéral et le développe à l'exécution à partir de l'EnvironmentFile de la passerelle (~/.openclaw/gateway.systemd.env, chmod 600). Le secret n'apparaît jamais dans le fichier unit, dans systemctl show, ni dans une liste de processus — seulement dans l'environnement propre à bash, pour ce seul processus. Le dossier examples/ du zip documente ce modèle avec des placeholders CHANGE_ME.

Installation

Extrait du README fourni dans le zip :

# 1. Install GTK4 + libadwaita + PyGObject from your distro's packages
#    (one dnf/apt line — see README-SETUP.md for the exact package names)

# 2. Install the app and its launcher
install -Dm755 openclaw-model-manager ~/.local/bin/openclaw-model-manager
# .desktop file goes to ~/.local/share/applications/

# 3. If you don't already have an OpenClaw config:
cp examples/openclaw.json.example ~/.openclaw/openclaw.json
chmod 600 ~/.openclaw/openclaw.json
# then replace every CHANGE_ME placeholder inside it

# 4. Optional — API keys, both chmod 600, examples provided:
#    ~/.openclaw/.env
#    ~/.openclaw/gateway.systemd.env

Aucune installation pip en dehors de PyGObject ; tout le reste est de la bibliothèque standard Python 3.11+, tomllib inclus. L'ensemble tient en un seul script exécutable (164 Ko, 3 570 lignes), un lanceur .desktop, un README, une licence MIT, et quatre exemples de configuration. Le zip pèse 49 Ko.

Pièges à éviter

  • Le mode Cloud veut dire « aucun drop-in », pas « c'est sûrement mon compte Anthropic ». Rien n'est surchargé, donc ce qui était déjà configuré sur l'unité continue de tourner tel quel. L'application avertit quand le mode choisi n'a pas de clé fonctionnelle, mais vérifiez quand même.
  • Le drop-in masque volontairement votre vraie clé Anthropic. Le mode Local définit ANTHROPIC_API_KEY=lm-studio pour tout ce que la passerelle lance. Sur ma machine, cela a silencieusement redirigé mes alias CLI claude interactifs vers LM Studio — Claude Code continuait de « fonctionner », sauf que les réponses venaient d'un modèle local. Si Claude commence à sonner faux, lancez systemctl --user cat openclaw-gateway.service et cherchez un drop-in avant d'accuser le modèle.
  • Après qu'openclaw update a changé l'ExecStart de la passerelle, resélectionnez une fois le mode DeepSeek pour ré-envelopper la nouvelle commande. L'application lit l'ExecStart canonique du fragment d'unité et détecte son propre wrapper (elle se base sur index.js plus l'absence de $$DEEPSEEK_API_KEY), donc elle ne double-enveloppe jamais — mais elle ne corrigera pas automatiquement une commande qu'on ne lui a pas redemandé de regarder.
  • reasoning: true est le réglage par défaut sûr pour les modèles locaux. Un modèle qui émet du reasoning_content alors qu'il est configuré en reasoning: false apparaît comme bloqué aux yeux de la passerelle : environ 390 secondes de silence, puis un kill. Le laisser activé est inoffensif pour les modèles sans réflexion, donc la boîte de dialogue d'ajout de modèle l'active par défaut. Celui-là a vraiment coûté du temps de débogage.
  • Un plugins.allow non vide est une liste blanche stricte. enabled: true sur une entrée de plugin ne fait rien tant que son id n'est pas aussi dans allow. L'application lit ceci correctement et n'écrit délibérément jamais dans plugins.*, donc si un plugin se comporte mal, ce n'est pas cet outil qui vous dira pourquoi.
  • La passerelle réécrit openclaw.json de son propre chef (réconciliation d'identité, openclaw update). L'application suit le mtime du fichier et avertit avant d'écraser une modification externe, et la sauvegarde pré-enregistrement conserve ce qui se trouvait réellement sur le disque.
  • Les identifiants de modèle sont au format provider/raw-id. Un identifiant nu sans barre oblique se résout via l'endpoint local de LM Studio. Ce n'est pas une erreur, juste une convention utile à connaître avant de partir chercher un champ provider qui n'existe pas.

Téléchargements

Gratuit pour un usage personnel. Si ça vous fait gagner un après-midi, le bouton café n'est pas loin.


← Plus de Outils et Téléchargements