OpenClaw Model Manager: una GUI para dejar de editar a mano el JSON de enrutamiento de modelos

Publicado
11 julio 2026
Por
Jacob Lloyd — escrito con ayuda de IA, después del proyecto
Tiempo de lectura
8 min de lectura

En palabras simples: Una app de escritorio gratuita que le da a mi configuración de IA doméstica un panel de control como es debido, en lugar de la edición manual arriesgada de un archivo de ajustes. Muestra qué "cerebro" de IA usa cada ayudante y me deja cambiarlo con un clic, negándose a guardar nada que rompa el sistema. Existe porque una vez una sola errata dejó a un asistente sin funcionar, en silencio.

Una vez tipeé mal el id de un modelo en un archivo JSON y el agente que lo usaba simplemente se quedó callado. Sin error, sin crash. Se quedó ahí hablándole a un modelo que no existía mientras yo buscaba un bug mucho más interesante. Esta app es mi nunca-más.

TL;DR

  • Qué es: una app de escritorio en GTK4/libadwaita que edita openclaw.json, la configuración que decide con qué LLM habla cada agente, subagente y tarea cron de mi stack de OpenClaw.
  • Qué cuesta: gratis, con licencia MIT, código fuente en el zip de abajo.
  • Qué necesitas: Linux con GTK4 + libadwaita + PyGObject (una línea de tu gestor de paquetes), Python 3.11+, y una instalación de OpenClaw — o la configuración de ejemplo incluida para empezar de cero.
  • Qué obtienes: un panel de una sola pantalla con el modelo de cada agente, guardados que no pueden corromper el archivo ni asignar un modelo inexistente, y un interruptor de apuntar-y-hacer-clic que enruta el CLI de Claude Code hacia un modelo local gratuito, DeepSeek barato, o facturación real de Anthropic.

Lo que obtienes

Primero las capturas. Vienen de una copia aislada corriendo contra una configuración ficticia en un HOME desechable. App real, datos falsos, ninguna de mis claves.

Ventana principal de OpenClaw Model Manager mostrando el inventario de Model Usage, un panel de estado de Connectivity and Routing, y perfiles de API/Local Defaults codificados por color
Ventana principal: el modelo de cada agente en una sola pantalla, más el estado de conectividad en vivo por proveedor.

La ventana principal responde la pregunta que antes resolvía haciendo grep sobre el JSON: ¿qué modelo corre dónde, y cuánto cuesta? Cada agente, los valores por defecto de todo el stack, el override de subagentes, las tareas cron, incluso los modelos de un agente de correo hermano. Cada entrada lleva una insignia de color: Local (esta PC), Remote (la segunda PC), o Cloud (la que aparece en una factura).

Panel de aplicación masiva Set Models for All Agents y la sección Coding Helper con un selector de modo y una advertencia en vivo de que el modo Cloud no tiene una clave funcional en esta máquina
Aplica un modelo a todos los agentes de una vez, o elige el backend del Coding Helper. La app avisa cuando el modo que elegiste en realidad no va a funcionar.
Vista del Model Catalog con el costo, la longitud de contexto y el soporte de reasoning por modelo, con botones Add LM Studio Model y Add Anthropic Model
El catálogo: costo, longitud de contexto y soporte de reasoning por modelo, más un botón de descubrimiento que le pregunta a LM Studio qué tiene cargado en realidad.

Por qué existe

OpenClaw es el stack multiagente que uso en casa: varios agentes de IA, cada uno apuntando a un modelo, algunos locales y gratis, otros en la nube y facturados. Todo el enrutamiento vive en un solo archivo, ~/.openclaw/openclaw.json: catálogo de modelos, asignaciones primaria/fallback por agente, configuraciones de proveedor, y el propio token de autenticación del gateway. Editarlo a mano fallaba siempre de dos formas.

Primero, un id de modelo incorrecto falla en silencio. Un valor por defecto obsoleto una vez apuntó un agente a vllm/google/gemma-4-31b-qat, un modelo que el proveedor nunca sirvió. Un guardado mal formado es peor: una edición mala y todo el gateway entra en bucle de crashes.

Segundo, cambiar el CLI de Claude Code entre backends es cirugía invisible de variables de entorno. OpenClaw lanza Claude Code para las tareas de código, y a dónde van esas peticiones — y a quién se le factura — lo deciden las variables de entorno ANTHROPIC_* en la unidad systemd del gateway. Alternar entre local gratis, DeepSeek barato y Anthropic real significaba escribir a mano un drop-in de systemd cada vez. Justo el tipo de tarea en la que me equivoco a las once de la noche.

El camino del guardado

Lo que necesito poder confiar es qué pasa cuando haces clic en Save. Esto es, en orden:

Dos pasos cargan con todo el peso. La validación rechaza cualquier id de modelo que su proveedor no ofrezca, lo que convierte el bug de la introducción en algo estructuralmente imposible, en vez de algo que tengo que acordarme de comprobar. Y la escritura atómica existe porque openclaw.json contiene el token de autenticación del gateway y debe mantenerse en chmod 600: el archivo temporal recibe los permisos del original antes de que se le escriba ningún contenido, y luego se hace fsync y se renombra sobre el original. Si hay un crash a mitad del guardado, el archivo viejo queda intacto.

Un guardado malo está a un solo rename de deshacerse, y conservas cinco generaciones de historial en vez de una.

El drop-in del Coding Helper

Redirigir el CLI de Claude Code es un flujo aparte porque nunca toca openclaw.json. Escribe un drop-in de systemd que sobrescribe el entorno del gateway antes de que este lance Claude Code.

Cuatro modos, un solo desplegable: LM Studio (gratis, local), DeepSeek vía su endpoint compatible con Anthropic (barato), Anthropic Cloud (el predeterminado: sin drop-in de ningún tipo, nada sobrescrito), o Disabled, que apunta el CLI a http://127.0.0.1:9/blocked para que cada llamada falle rápido en vez de quedarse colgada. También hay una prueba en vivo con un clic que dispara un ping con forma real de Anthropic hacia LM Studio o DeepSeek y reporta qué modelo respondió de verdad. No estás confiando en una pantalla de configuración, estás confiando en una petición que acaba de suceder.

Mantener la clave de API fuera del archivo de unidad

El modo DeepSeek necesita una clave de API, y un archivo de unidad systemd es un mal lugar para guardarla: cualquier cosa escrita ahí directamente queda en texto plano en disco y en la salida de systemctl show. Así que el drop-in nunca contiene la clave. En su lugar escribe esto:

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

El truco es $$. En un archivo de unidad, $$ escapa un $ literal. Sin eso, systemd expande la variable él mismo al construir la línea de comandos, y la clave real termina en el argv del proceso, donde ps puede leerla. Con el doble dólar, bash recibe un $DEEPSEEK_API_KEY literal y lo expande en tiempo de ejecución desde el EnvironmentFile del gateway (~/.openclaw/gateway.systemd.env, chmod 600). El secreto nunca aparece en el archivo de unidad, en systemctl show, ni en un listado de procesos — solo dentro del entorno propio de bash, para ese único proceso. La carpeta examples/ del zip documenta el patrón con marcadores CHANGE_ME.

Instalación

Del README incluido en el 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

No hace falta instalar nada con pip aparte de PyGObject; todo lo demás es stdlib de Python 3.11+, tomllib incluido. Todo el proyecto es un único script ejecutable (164KB, 3.570 líneas), un lanzador .desktop, un README, una licencia MIT, y cuatro configuraciones de ejemplo. El zip pesa 49KB.

Trampas comunes

  • El modo Cloud significa «sin drop-in», no «seguro que es mi cuenta de Anthropic». No se sobrescribe nada, así que lo que ya estuviera configurado en la unidad sigue corriendo. La app avisa cuando el modo que elegiste no tiene una clave funcional, pero revísalo de todas formas.
  • El drop-in tapa tu clave real de Anthropic, y es intencional. El modo Local pone ANTHROPIC_API_KEY=lm-studio en todo lo que lanza el gateway. En mi máquina eso redirigió en silencio mis alias interactivos del CLI claude hacia LM Studio — Claude Code seguía «funcionando», solo que las respuestas venían de un modelo local. Si Claude empieza a sonar raro, ejecuta systemctl --user cat openclaw-gateway.service y busca un drop-in antes de echarle la culpa al modelo.
  • Después de que openclaw update cambie el ExecStart del gateway, vuelve a elegir el modo DeepSeek una vez para reenvolver el nuevo comando. La app lee el ExecStart canónico del fragmento de unidad y detecta su propio wrapper (se fija en index.js más la ausencia de $$DEEPSEEK_API_KEY), así que nunca envuelve dos veces — pero no va a corregir sola un comando que no se le ha pedido que vuelva a mirar.
  • reasoning: true es el valor por defecto seguro para modelos locales. Un modelo que emite reasoning_content mientras está configurado con reasoning: false le parece bloqueado al gateway: unos 390 segundos de silencio, y luego un kill. Dejarlo activado no hace daño en modelos que no razonan, así que el diálogo de añadir modelo lo activa por defecto. Este me costó tiempo de depuración de verdad.
  • Un plugins.allow no vacío es una lista de permitidos estricta. enabled: true en una entrada de plugin no hace nada a menos que su id también esté en allow. La app lee esto correctamente y deliberadamente nunca escribe nada en plugins.*, así que si un plugin se porta mal, esta no es la herramienta que te va a decir por qué.
  • El gateway reescribe openclaw.json por su cuenta (reconciliación de identidad, openclaw update). La app rastrea el mtime del archivo y avisa antes de sobrescribir una edición externa, y la copia de seguridad previa al guardado conserva lo que realmente había en disco.
  • Los ids de modelo son provider/raw-id. Un id pelado sin barra se resuelve a través del endpoint local de LM Studio. No es un error, solo una convención que vale la pena conocer antes de ponerte a buscar un campo de proveedor que no existe.

Descargas

Gratis para uso personal. Si te ahorra una tarde, el botón del café está aquí cerca.


← Más de Herramientas y Descargas