OpenClaw Model Manager: eine GUI, damit ich aufhöre, das Modell-Routing-JSON von Hand zu bearbeiten

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.json bearbeitet — 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.

Hauptfenster des OpenClaw Model Manager mit der Model-Usage-Übersicht, einem Status-Panel für Connectivity und Routing sowie farbcodierten API-/Local-Defaults-Profilen
Hauptfenster: das Modell jedes Agenten auf einem Bildschirm, dazu der Live-Verbindungsstatus pro Provider.

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).

Panel „Set Models for All Agents” zum gebündelten Anwenden sowie der Coding-Helper-Bereich mit Modusauswahl und einer Live-Warnung, dass der Cloud-Modus auf dieser Maschine keinen funktionierenden Key hat
Ein Modell auf alle Agenten gleichzeitig anwenden, oder das Backend des Coding Helpers wählen. Die App warnt, wenn der gewählte Modus in Wirklichkeit nicht funktioniert.
Model-Catalog-Ansicht mit Kosten, Kontextlänge und Reasoning-Unterstützung pro Modell sowie den Schaltflächen „Add LM Studio Model” und „Add Anthropic Model”
Der Katalog: Kosten, Kontextlänge und Reasoning-Unterstützung pro Modell, dazu ein Discovery-Button, der LM Studio fragt, was es tatsächlich geladen hat.

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-studio für alles, was das Gateway startet. Auf meiner Maschine hat das still und leise meine interaktiven claude-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, erst systemctl --user cat openclaw-gateway.service ausführen und nach einem Drop-in suchen, bevor man dem Modell die Schuld gibt.
  • Wenn openclaw update das 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.js plus 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: true ist der sichere Default für lokale Modelle. Ein Modell, das reasoning_content ausgibt, während reasoning: false konfiguriert 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.allow ist eine strikte Allowlist. enabled: true bei einem Plugin-Eintrag bewirkt nichts, solange dessen ID nicht auch in allow steht. Die App liest das korrekt aus, schreibt aber absichtlich nie in plugins.* — wenn sich ein Plugin also daneben benimmt, ist dies nicht das Tool, das einem sagt, warum.
  • Das Gateway schreibt openclaw.json auch 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.


← Mehr Tools & Downloads