OpenClaw Model Manager: eine GUI, damit ich aufhöre, das Modell-Routing-JSON von Hand zu bearbeiten
- Kategorie
- Tools & Downloads
- Veröffentlicht
- 11 Juli 2026
- Von
- Jacob Lloyd — mit KI-Unterstützung geschrieben, im Nachhinein
- Lesezeit
- 7 Min. Lesezeit
Kurz gesagt: Eine kostenlose Desktop-App, die meinem KI-Setup zu Hause ein richtiges Bedienfeld gibt und das riskante Von-Hand-Bearbeiten einer Einstellungsdatei ersetzt. Sie zeigt, welches KI-„Gehirn” jeder Helfer gerade benutzt, und lässt mich das per Klick umschalten — dabei verweigert sie jedes Speichern, das das System kaputt machen würde. Entstanden ist sie, weil ein einziger Tippfehler einmal still und leise einen Assistenten lahmgelegt hat.
Einmal habe ich mich bei einer Modell-ID in einer JSON-Datei vertippt, und der Agent, der sie benutzte, wurde einfach still. Kein Fehler, kein Absturz. Er saß da und redete mit einem Modell, das gar nicht existierte, während ich nach einem viel interessanteren Bug suchte. Diese App ist mein Nie-wieder.
TL;DR
- Was es ist: eine GTK4/libadwaita-Desktop-App, die
openclaw.jsonbearbeitet — die Konfiguration, die festlegt, mit welchem LLM jeder Agent, Subagent und Cron-Job in meinem OpenClaw-Stack spricht. - Was es kostet: nichts, MIT-lizenziert, Quellcode im Zip unten.
- Was Sie brauchen: Linux mit GTK4 + libadwaita + PyGObject (eine Zeile im Paketmanager), Python 3.11+, und eine OpenClaw-Installation — oder die mitgelieferte Beispielkonfiguration, um bei null anzufangen.
- Was am Ende dabei herauskommt: ein Ein-Bildschirm-Dashboard mit dem Modell jedes Agenten, Speichervorgänge, die die Datei weder beschädigen noch ein totes Modell zuweisen können, und ein Klick-Umschalter, der die Claude Code-CLI auf ein kostenloses lokales Modell, günstiges DeepSeek oder echte Anthropic-Abrechnung umleitet.
Was am Ende dabei herauskommt
Erst die Screenshots. Die stammen von einer sandboxed Kopie, die gegen eine Dummy-Konfiguration in einem Wegwerf-HOME läuft. Echte App, gefälschte Daten, keine meiner Keys.
Das Hauptfenster beantwortet die Frage, die ich früher durch Grep-Suchen im JSON beantwortet habe: Welches Modell läuft wo, und was kostet es? Jeder Agent, die stackweiten Defaults, der Subagent-Override, Cron-Jobs, sogar die Modelle eines benachbarten E-Mail-Agenten. Jeder Eintrag bekommt ein Farb-Badge: Local (dieser PC), Remote (der zweite PC) oder Cloud (der, der auf der Rechnung auftaucht).
Warum es das gibt
OpenClaw ist der Multi-Agenten-Stack, den ich zu Hause betreibe: mehrere KI-Agenten, jeder auf ein Modell ausgerichtet, manche lokal und kostenlos, manche in der Cloud und kostenpflichtig. Das gesamte Routing steckt in einer Datei, ~/.openclaw/openclaw.json: Modellkatalog, Primär-/Fallback-Zuweisungen pro Agent, Provider-Konfigurationen und das eigene Auth-Token des Gateways. Das Bearbeiten von Hand ging auf zwei Arten immer wieder schief.
Erstens: Eine falsche Modell-ID scheitert lautlos. Eine veraltete Standardeinstellung zeigte einmal auf vllm/google/gemma-4-31b-qat, ein Modell, das der Provider nie bereitgestellt hat. Eine fehlerhaft gespeicherte Datei ist noch schlimmer: eine einzige schlechte Änderung, und das gesamte Gateway crash-loopt.
Zweitens: Das Umschalten der Claude-Code-CLI zwischen Backends ist unsichtbare Env-Var-Chirurgie. OpenClaw startet Claude Code für Coding-Aufgaben, und wohin diese Anfragen gehen — und wer dafür bezahlt — legen ANTHROPIC_*-Umgebungsvariablen auf der systemd-Unit des Gateways fest. Zwischen kostenlos-lokal, günstigem DeepSeek und echtem Anthropic hin- und herzuwechseln bedeutete, jedes Mal von Hand ein systemd-Drop-in zu schreiben. Genau die Art von Sache, bei der ich um 23 Uhr garantiert etwas falsch mache.
Der Speicherpfad
Der Teil, dem ich vertrauen muss, ist das, was passiert, wenn man auf Save klickt. Hier ist er, der Reihe nach:
Zwei Schritte tragen das Gewicht. Die Validierung verweigert jede Modell-ID, die ihr Provider nicht anbietet — der Tippfehlerbug aus der Einleitung wird dadurch strukturell unmöglich, statt etwas, an das ich denken muss. Und das atomare Schreiben gibt es, weil openclaw.json das Auth-Token des Gateways enthält und chmod 600 bleiben muss: Die Temp-Datei bekommt die Rechte des Originals, bevor irgendein Inhalt geschrieben wird, dann wird sie per fsync gesichert und über das Original umbenannt. Stürzt es mitten im Speichern ab, bleibt die alte Datei unangetastet.
Ein misslungenes Speichern ist nur ein Rename von der Rückgängigmachung entfernt, und man behält fünf Generationen Historie statt nur einer.
Das Coding-Helper-Drop-in
Das Umleiten der Claude-Code-CLI ist ein eigener Ablauf, weil dabei openclaw.json nie angefasst wird. Stattdessen schreibt die App ein systemd-Drop-in, das die Umgebung des Gateways überschreibt, bevor das Gateway Claude Code startet.
Vier Modi, ein Dropdown: LM Studio (kostenlos, lokal), DeepSeek über seinen Anthropic-kompatiblen Endpunkt (günstig), Anthropic Cloud (der Standard: gar kein Drop-in, nichts wird überschrieben), oder Disabled, wodurch die CLI auf http://127.0.0.1:9/blocked zeigt, sodass jeder Aufruf sofort scheitert, statt zu hängen. Es gibt außerdem einen Live-Test per Klick, der einen echten, Anthropic-förmigen ping an LM Studio oder DeepSeek schickt und meldet, welches Modell tatsächlich geantwortet hat. Man vertraut nicht einem Konfigurationsbildschirm, sondern einer Anfrage, die gerade wirklich stattgefunden hat.
Den API-Key aus der Unit-Datei heraushalten
Der DeepSeek-Modus braucht einen API-Key, und eine systemd-Unit-Datei ist ein miserabler Ort dafür: Alles, was dort direkt steht, liegt im Klartext auf der Platte und in der Ausgabe von systemctl show. Deshalb enthält das Drop-in den Key nie. Stattdessen schreibt es das hier:
ExecStart=/usr/bin/bash -c 'export ANTHROPIC_API_KEY="$$DEEPSEEK_API_KEY"; exec <gateway cmd>'
Der Trick ist $$. In einer Unit-Datei escaped $$ ein literales $. Ohne das expandiert systemd die Variable selbst beim Aufbau der Kommandozeile, und der echte Key landet im argv des Prozesses, wo ps ihn lesen kann. Mit dem doppelten Dollar erhält bash ein literales $DEEPSEEK_API_KEY und expandiert es erst zur Laufzeit aus der EnvironmentFile des Gateways (~/.openclaw/gateway.systemd.env, chmod 600). Das Geheimnis erscheint nie in der Unit-Datei, in systemctl show oder in einer Prozessliste — nur innerhalb der eigenen Umgebung von bash, für genau diesen einen Prozess. Der examples/-Ordner im Zip dokumentiert das Muster mit CHANGE_ME-Platzhaltern.
Einrichtung
Aus der im Zip enthaltenen README:
# 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
Keine pip-Installationen außer PyGObject; alles andere ist Python-3.11+-Standardbibliothek, tomllib inklusive. Das Ganze ist ein einziges ausführbares Skript (164 KB, 3.570 Zeilen), ein .desktop-Launcher, eine README, eine MIT-Lizenz und vier Beispielkonfigurationen. Gezippt sind es 49 KB.
Stolperfallen
- Cloud-Modus bedeutet „kein Drop-in”, nicht „garantiert mein Anthropic-Konto”. Nichts wird überschrieben, also läuft weiter, was auf der Unit ohnehin schon konfiguriert war. Die App warnt, wenn der gewählte Modus keinen funktionierenden Key hat, aber trotzdem selbst nachprüfen.
- Das Drop-in überdeckt den echten Anthropic-Key — mit Absicht. Der Local-Modus setzt
ANTHROPIC_API_KEY=lm-studiofür alles, was das Gateway startet. Auf meiner Maschine hat das still und leise meine interaktivenclaude-CLI-Aliase auf LM Studio umgeleitet — Claude Code „funktionierte” scheinbar weiter, die Antworten kamen nur von einem lokalen Modell. Wenn Claude sich seltsam anhört, erstsystemctl --user cat openclaw-gateway.serviceausführen und nach einem Drop-in suchen, bevor man dem Modell die Schuld gibt. - Wenn
openclaw updatedas ExecStart des Gateways ändert, einmal den DeepSeek-Modus neu auswählen, um den neuen Befehl neu einzupacken. Die App liest das kanonische ExecStart aus dem Unit-Fragment und erkennt ihren eigenen Wrapper selbst (Erkennungsmerkmal:index.jsplus das Fehlen von$$DEEPSEEK_API_KEY), sodass sie nie doppelt einpackt — aber sie repariert auch keinen Befehl automatisch, den sie nicht erneut angeschaut hat. reasoning: trueist der sichere Default für lokale Modelle. Ein Modell, dasreasoning_contentausgibt, währendreasoning: falsekonfiguriert ist, wirkt auf das Gateway wie hängen geblieben: rund 390 Sekunden Stille, dann ein Kill. Für Modelle ohne Reasoning ist es unschädlich, eingeschaltet zu bleiben, deshalb steht es im Add-Model-Dialog standardmäßig an. Diese Sache hat echte Debugging-Zeit gekostet.- Ein nicht-leeres
plugins.allowist eine strikte Allowlist.enabled: truebei einem Plugin-Eintrag bewirkt nichts, solange dessen ID nicht auch inallowsteht. Die App liest das korrekt aus, schreibt aber absichtlich nie inplugins.*— wenn sich ein Plugin also daneben benimmt, ist dies nicht das Tool, das einem sagt, warum. - Das Gateway schreibt
openclaw.jsonauch von sich aus um (Identity-Reconcile,openclaw update). Die App verfolgt die mtime der Datei und warnt, bevor sie eine externe Änderung überschreibt, und das Backup vor dem Speichern bewahrt, was tatsächlich auf der Platte lag. - Modell-IDs haben die Form
provider/raw-id. Eine nackte ID ohne Slash wird über den lokalen LM-Studio-Endpunkt aufgelöst. Kein Fehler, nur eine Konvention, die man kennen sollte, bevor man nach einem Provider-Feld sucht, das es gar nicht gibt.
Downloads
Kostenlos für die private Nutzung. Wenn es dir einen Nachmittag erspart, ist der Kaffee-Button gleich in der Nähe.