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

Publicado
11 julio 2026
Actualizado
27 agosto 2026
Por
Jacob Lloyd — escrito con ayuda de IA, después del proyecto
Tiempo de lectura
11 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 escribí 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.

Actualización 2026-08-27 — descarga actualizada. El zip de abajo es ahora la compilación 2026-08. Tres cosas nuevas desde la publicación original: un diálogo Add API Model que agrega cualquier proveedor en la nube desde la GUI (escribiendo el bloque del proveedor y la entrada del catálogo juntos, y poniendo la clave en el archivo de entorno del gateway en vez del config), ventanas de contexto editables en las filas del catálogo, y filas que muestran lo que el proveedor anuncia realmente para cada modelo. Dos correcciones mientras estoy aquí: el servidor de inferencia en mi segunda PC ya no es LM Studio — es un servidor basado en llama.cpp en el mismo puerto, y la app no necesitó ningún cambio para eso, que es justamente la ventaja de leer las URLs base de los proveedores desde el config en vez de dejarlas fijas en el código. Y el agente de correo en el panel de servicios ahora se llama MailForge. Todo lo demás que sigue describe la app tal como se entrega.

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 selector 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). Local y Remote son ambos simplemente servidores compatibles con OpenAI para la app — esta PC corre LM Studio, la segunda corre un servidor basado en llama.cpp, y lo único que le importa a la app es lo que cada uno responde en /v1/models.

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 cada servidor de inferencia 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.

El diálogo Add API Model añadido en la compilación 2026-08 sigue la misma regla desde el otro lado. Agregar un nuevo proveedor en la nube a mano significa editar dos lugares en openclaw.json que tienen que coincidir — un bloque de conexión models.providers.<id> y una entrada de catálogo agents.defaults.models — y fallar en cualquiera de las dos mitades y el modelo simplemente no es seleccionable en ningún lado, sin ningún error que te lo diga. El diálogo escribe ambas en una sola edición. La clave que escribes va a ~/.openclaw/gateway.systemd.env (respaldada primero, 0600 preservado, cualquier definición duplicada de la misma variable colapsada para que una línea obsoleta posterior no pueda ganar), y openclaw.json obtiene solo la cadena "${YOUR_KEY_VAR}". Antes de guardar, un botón Test dispara una petición real al endpoint — que es la única forma de probar que la URL base, el protocolo, la clave y el id del modelo coinciden todos, en vez de descubrir semanas después que un proveedor estaba muerto todo el tiempo.

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 (190KB, 4.188 líneas), un lanzador .desktop, un README, una licencia MIT, y cuatro configuraciones de ejemplo. El zip pesa 57KB.

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.
  • Una ventana de contexto anunciada es una afirmación, no una capacidad. Un servidor no duda en decirte que un modelo tiene una ventana de 500,000 tokens cuando el motor realmente cargado detrás de él solo puede servir una fracción de eso, y el gateway cree el anuncio — así que los prompts largos fallan de una forma que parece culpa del modelo. Por eso las filas del catálogo te dejan editar contextWindow hasta la verdad.
  • Los ids de modelo son provider/raw-id. Un id pelado sin barra se resuelve a través del endpoint de inferencia local. Algunos servidores usan un id crudo más largo — publisher/repo/file-stem — así que pega lo que el proveedor anuncie tal cual, en vez de acortarlo. 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.

Relacionado: el stack de agentes cuya configuración edita esta app, poner DeepSeek detrás de todo, y lo que hago cuando el gateway se rompe.

Descargas

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


← Más de Herramientas y Descargas