Saltar al contenido principal

Autoalojar el Agente Hermes con memoria persistente

· 15 min de lectura
Rafael Fernandes
Ingeniero de PLN y Redactor Técnico en WiLine
Share:
Hermes Agent+SQLite

Hermes Agent es el agente de IA de código abierto (MIT) de Nous Research — "el agente que crece contigo." Su característica destacada es memoria persistente: aprende sobre tus proyectos y no olvida entre reinicios. Esta guía lo despliega en la misma Instancia WEC que ya usas para OpenClaw, lo apunta a un modelo y prueba que la memoria sobrevive a un reinicio completo.

Reproducibilidad

Funciona en la misma Instancia WEC de la serie OpenClaw — sin nueva VM. El instalador descarga su propio Python (a través de uv), herramientas de navegador Node.js y un Playwright Chromium automáticamente. El estado se guarda en ~/.hermes/. La puerta de enlace de mensajería se ejecuta como un servicio de usuario systemd, por lo que coexiste con la pila Docker de OpenClaw. Capturado en vivo en Ubuntu 22.04 con hermes v0.17.0.

Por qué la memoria persistente es importante

Un agente que olvida en cada reinicio es un juguete. Hermes mantiene un almacenamiento duradero en disco bajo ~/.hermes/:

  • ~/.hermes/memories/MEMORY.md — un archivo legible por humanos de hechos que el agente ha decidido recordar.
  • ~/.hermes/state.db — una base de datos SQLite que contiene cada sesión y mensaje, con índices de búsqueda de texto completo FTS5 superpuestos para que el agente pueda buscar su propia historia.

Un despliegue, un fallo o un reinicio no borran lo que aprendió. Esa es la diferencia entre una demostración de chat y un agente en el que puedes confiar día a día — y es exactamente lo que probamos al final.

Las piezas

Todo corre en una sola WEC Instance. Hermes habla con un modelo a través de la WEC Inference API, guarda su memoria en disco local y corre como servicio de usuario de systemd — así se reinicia solo tras un reinicio y su memoria sigue ahí:

Requisitos previos

  • Una Instancia WEC existente con acceso a la terminal (la caja de OpenClaw funciona).
  • Un modelo: ya sea un inicio de sesión en Nous Portal, o tu propia clave API de proveedor (usamos una clave de OpenAI aquí; Modelos WEC con glm-5.2 también funcionan).
  • Nada que preinstalar — el instalador maneja Python, Node.js y el motor del navegador.

Paso 1 — Instalar Hermes

curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash

Ejecutando la línea de instalación — el instalador de Hermes comienza a resolver y descargar paquetes

El instalador resuelve un entorno virtual de Python con uv, instala las herramientas de navegador de Node.js, descarga un Playwright Chromium, sincroniza las habilidades empaquetadas y coloca un lanzador hermes en ~/.local/bin:

Salida
✓ Paquete principal instalado (verificado por hash a través de uv.lock)
✓ Todas las dependencias instaladas
✓ Configuración del motor de navegador completa
✓ Lanzador hermes instalado → ~/.local/bin/hermes
✓ Directorio de configuración listo: ~/.hermes/
→ Iniciando el asistente de configuración...

Luego lanza automáticamente el asistente de configuración. Recarga tu terminal después para que el comando hermes esté en tu PATH:

source ~/.bashrc

Paso 2 — Ejecutar el asistente de configuración

El asistente guía a través del tipo de configuración, backend de terminal y mensajería. En una caja que ya ejecutó OpenClaw, ofrece importar la configuración antigua primero — puedes previsualizar lo que se migraría antes de que cambie algo.

La primera elección es cómo configurar Hermes:

  • Configuración rápida (Nous Portal) — un inicio de sesión OAuth, sin claves API. El Portal agrupa un modelo y una puerta de enlace de herramientas. Requiere una suscripción activa a Nous Portal.
  • Configuración completa (trae tus propias claves) — configuras proveedores y pegas tus propias claves.

El aviso "¿Cómo te gustaría configurar Hermes?" con opciones de Configuración rápida, Configuración completa y Pizarra en blanco

Lo que realmente hicimos

Elegimos Configuración rápida primero. El inicio de sesión en el Portal mostró un código de dispositivo y se quedó en "Esperando aprobación (sondeando)" — necesita una suscripción activa al Portal, que esta cuenta no tenía. Presionamos Ctrl+C para cancelar y en su lugar trajimos nuestro propio modelo en el Paso 3 (a continuación) con una clave de OpenAI. Si tienes un plan de Portal, completa el inicio de sesión aquí y puedes omitir el Paso 3.

Para el resto del asistente:

  • Backend de terminal: Local — los comandos se ejecutan directamente en esta máquina.
  • Mensajería: Omitir por ahora (puedes conectar Telegram/Discord más tarde con hermes setup gateway).

El asistente aplica valores predeterminados sensatos para el agente (máximo de iteraciones, un umbral de compresión de contexto del 50%) y termina con un resumen de disponibilidad de herramientas.

Paso 3 — Conectar un modelo

Fuera de la caja, el modelo predeterminado se enruta a través del Nous Portal / OpenRouter y necesita una clave. Para usar tu propio proveedor en su lugar, ejecuta:

hermes setup model

Luego selecciona OpenAI ▸ OpenAI API, pega tu clave API cuando se te pida (se escribe en ~/.hermes/.env — nunca se muestra), acepta la URL base predeterminada https://api.openai.com/v1, y elige un modelo — usamos gpt-5.5:

Salida
Clave API guardada.
URL base [https://api.openai.com/v1]:
Seleccionar modelo predeterminado:
→ (●) gpt-5.5

Eligiendo el modelo predeterminado en hermes setup model — gpt-5.5 seleccionado de la lista de OpenAI

Usa Modelos WEC en su lugar

Para ejecutar inferencias en el propio endpoint de WiLine, elige Endpoint personalizado, establece la URL base en https://inference.wiline.com/v1, pega tu clave API de WEC y usa un modelo como glm-5.2. Mismo flujo compatible con OpenAI.

Confirma que el modelo y la clave están saludables:

hermes doctor
Salida
◆ Archivos de configuración
✓ El archivo ~/.hermes/.env existe
✓ Clave API o endpoint personalizado configurado
...
◆ Proveedor de memoria
✓ Memoria incorporada activa (no se configuró proveedor externo — esto está bien)

Las líneas restantes en doctor son integraciones de herramientas opcionales (búsqueda web, Discord, generación de imágenes) — no necesarias para esta guía.

Paso 4 — Chatear y guardar una memoria

Inicia una sesión interactiva:

hermes

La pantalla de bienvenida del Agente Hermes TUI — logo ASCII, herramientas y habilidades disponibles, modelo gpt-5.5, y el aviso de chat

Envíale un hecho y pídele que lo recuerde — observa cómo se activa la herramienta 🧠 memory:

En el TUI de Hermes
● Por favor guarda en tu memoria a largo plazo: mi nombre en clave del proyecto WEC es
Bluefin-7, ejecutándose en la caja de OpenClaw.
┊ 🧠 memory ? 0.0s

╭─ ⚕ Hermes ─────────────────────────────────────────────────────────╮
Guardado en la memoria a largo plazo: tu nombre en clave del proyecto WEC es Bluefin-7,
ejecutándose en la caja de OpenClaw.
╰─────────────────────────────────────────────────────────────────────╯

Hermes activando la herramienta de memoria y confirmando que el hecho fue guardado en la memoria a largo plazo

Esa escritura crea ~/.hermes/memories/MEMORY.md. Sal con /exit o Ctrl+D.

Problema al pegar

El TUI envía al presionar enter, por lo que pegar texto de varias líneas puede enviar un mensaje medio escrito. Si un aviso solo captura un fragmento, escríbelo en una línea a mano.

Paso 5 — Probar que la memoria sobrevive a un reinicio

Este es el objetivo principal. La puerta de enlace de Hermes se instala como un servicio de usuario systemd con linger habilitado, por lo que vuelve automáticamente después de un reinicio — sin necesidad de iniciar sesión. Reinicia el servicio y luego reinicia toda la caja para hacer la prueba a prueba de fallos:

systemctl --user restart hermes-gateway # reinicia solo el servicio de puerta de enlace
sudo reboot # luego reinicia toda la caja

Reiniciando la puerta de enlace y reiniciando la caja — la conexión SSH se cierra mientras el host se apaga

Reconéctate una vez que la caja esté activa y confirma que el servicio se reinició por sí mismo:

systemctl --user status hermes-gateway --no-pager
Salida
● hermes-gateway.service - Hermes Agent Gateway - Integración de Plataforma de Mensajería
Cargado: cargado (...; habilitado; ajuste de proveedor: habilitado)
Activo: activo (en ejecución) desde el jue 2026-06-25 21:21:54 UTC; hace 1min 36s

status de systemctl mostrando hermes-gateway activo y en ejecución desde el arranque, iniciado automáticamente por linger después del reinicio

Ahora abre una sesión nueva y pregunta — sin contexto previo, ID de sesión completamente nuevo:

hermes
En el TUI de Hermes
● ¿Cuál es mi nombre en clave del proyecto WEC, y en qué caja se ejecuta?

╭─ ⚕ Hermes ─────────────────────────────────────────────────────────╮
Tu nombre en clave del proyecto WEC es Bluefin-7, y se ejecuta en la
caja de OpenClaw.
╰─────────────────────────────────────────────────────────────────────╯

Una nueva sesión de Hermes después del reinicio recordando correctamente el nombre en clave Bluefin-7 desde el disco

Recordó el hecho desde el disco después de un reinicio completo. Inspecciona dónde vive ese estado duradero:

cat ~/.hermes/memories/MEMORY.md
file ~/.hermes/state.db && du -h ~/.hermes/state.db
Salida
El nombre en clave del proyecto WEC del usuario es Bluefin-7, ejecutándose en la caja de OpenClaw.

/home/ubuntu/.hermes/state.db: base de datos SQLite 3.x, ...
176K /home/ubuntu/.hermes/state.db

Un MEMORY.md en texto plano que puedes leer y editar, respaldado por un state.db de SQLite para sesiones. Esa es la memoria persistente — y acaba de sobrevivir a un reinicio.

Cómo se almacena la memoria — dos archivos, dos trabajos

Cuando le pides a Hermes que recuerde algo, escribe el hecho en ~/.hermes/memories/MEMORY.md — Markdown plano que puedes abrir, leer e incluso editar a mano. Por separado, tu historial completo de conversación se mantiene en ~/.hermes/state.db, una base de datos SQLite. Ambos viven en disco, por lo que un reinicio no los pierde.

La forma más sencilla de ver lo que sabe el agente es simplemente leer el Markdown:

cat ~/.hermes/memories/MEMORY.md

Para mirar dentro de la base de datos, ten en cuenta que el motor de SQLite está integrado en Python, por lo que Hermes lo usa sin ninguna instalación adicional. La opcional herramienta de línea de comandos sqlite3 — para navegar por la base de datos a mano — no está instalada por defecto. Si la quieres:

sudo apt install -y sqlite3
sqlite3 ~/.hermes/state.db '.tables'

Salida de .tables en state.db — tablas de sesiones y mensajes junto a la familia de mensajes_fts FTS5

Verás tablas sessions y messages que contienen la conversación, además de una familia de tablas messages_fts*. Esos son índices de texto completo FTS5 de SQLite — incluyendo una variante de trigramas para coincidencias difusas — que permiten a Hermes buscar sus propias conversaciones pasadas:

Salida (de .schema)
CREATE VIRTUAL TABLE messages_fts USING fts5(content);
CREATE VIRTUAL TABLE messages_fts_trigram USING fts5(content, tokenize='trigram');

Y cada sesión es una fila que puedes inspeccionar — aquí están las dos de esta guía, la segunda creada después del reinicio:

sqlite3 -header -column ~/.hermes/state.db \
"SELECT substr(id,1,15) AS id, model, message_count FROM sessions ORDER BY started_at;"
Salida
id model message_count
--------------- ------- -------------
20260625_211227 gpt-5.5 8
20260625_212333 gpt-5.5 2

Nunca necesitas la CLI para que Hermes funcione — es solo para inspeccionar la base de datos tú mismo. Día a día, el MEMORY.md legible por humanos es todo lo que tienes que mirar.

Bonificación — leer la conversación que el agente almacenó

La tabla messages contiene el texto real de cada turno. Cada fila tiene un roleuser (lo que escribiste), assistant (la respuesta de Hermes), o tool (el resultado de una herramienta) — así que puedes reproducir todo el intercambio:

sqlite3 -header -column ~/.hermes/state.db \
"SELECT substr(session_id,10,6) AS sess, role, substr(content,1,55) AS content
FROM messages ORDER BY timestamp;"
Salida
sess role content
------ --------- -------------------------------------------------------
211227 user hello, can you hear me?
211227 assistant Yes — I can hear you. How can I help?
211227 user Please save to your long-term memory: my WEC project...
211227 tool {"success": true, "done": true, "target": "memory", ...
211227 assistant Saved to long-term memory: your WEC project codename...
212333 user What's my WEC project codename, and which box does...
212333 assistant Your WEC project codename is Bluefin-7, and it runs...

La tabla de mensajes en state.db mostrando la conversación completa — filas de usuario, asistente y herramienta a través de ambas sesiones

La parte interesante es cómo se escribió la memoria. El asistente no editó un archivo directamente — emitió una llamada a la herramienta memory, y esa herramienta es la que escribió MEMORY.md. Puedes ver la llamada exacta registrada en el historial:

sqlite3 ~/.hermes/state.db \
"SELECT tool_calls FROM messages WHERE tool_calls LIKE '%memory%' LIMIT 1;"
Salida
{"function": {"name": "memory", "arguments":
"{\"target\":\"memory\",\"operations\":[
{\"action\":\"add\",
\"content\":\"El nombre en clave del proyecto WEC del usuario es Bluefin-7, ejecutándose en la caja de OpenClaw.\"}]}"}}

La llamada a la herramienta de memoria registrada en la tabla de mensajes — la operación de adición que escribió el hecho de Bluefin-7 en MEMORY.md

Así que la cadena completa es: tú escribes → el agente decide que vale la pena conservar → llama a la herramienta memory con action: add → eso escribe el hecho en MEMORY.md, mientras que toda la conversación permanece en state.db, completamente buscable a través de FTS5. Dos almacenes, una memoria duradera.

¿Qué puedes hacer con ello?

Una memoria que sobrevive a los reinicios solo importa por lo que el agente hace con ella. Con Hermes en funcionamiento, la misma instalación ofrece estas capacidades (las viste en la lista de herramientas de hermes doctor) — aquí está lo que desbloquean día a día:

  • Realiza trabajo real en la caja. Las herramientas terminal y code_execution le permiten actuar, no solo chatear — por ejemplo, "clona este repositorio, instala dependencias y ejecuta las pruebas," o "verifica por qué se está llenando el disco." Lo hace en la Instancia WEC y reporta de vuelta.
  • Controla desde tu teléfono. Una puerta de enlace de mensajería (Telegram, Discord, Slack, y más) significa que puedes darle una tarea desde cualquier lugar — sin SSH. (Configuración en la Parte 2.)
  • Ponlo en un horario. La herramienta cronjob ejecuta trabajos recurrentes: un informe matutino, un informe semanal de uso del disco, o vigila un servicio y avísame cuando falle — entregado a tu canal de mensajería. (Parte 3.)
  • Navega y busca en la web. Con las herramientas de navegador y búsqueda web puede obtener información en vivo y actuar en páginas reales. (Estas necesitan claves API de proveedor — consulta hermes setup tools.)
  • Desarrolla habilidades reutilizables y delega. Puede construir habilidades a partir de lo que aprende y delegar subtareas a subagentes — la parte "agente que crece contigo".
  • Recuerda a través de todo ello. Todo lo anterior está respaldado por la memoria persistente que acabas de configurar, por lo que el contexto se lleva de una tarea — y un día — al siguiente.

El resto de esta serie convierte cada una de estas en una guía práctica (consulta Qué sigue).

Solución de problemas (real)

  • La Configuración rápida (Nous Portal) se queda atascada en "Esperando aprobación (sondeando)". El inicio de sesión en el Portal necesita una suscripción/crédito activo. Si no tienes uno, presiona Ctrl+C y usa Configuración completa con tu propia clave en su lugar (Paso 3).

  • doctor muestra "No se encontró clave API en ~/.hermes/.env". El modelo predeterminado apunta a Portal/OpenRouter. Ejecuta hermes setup model, elige tu proveedor y pega la clave — doctor luego informa "Clave API o endpoint personalizado configurado."

  • Advertencia de .env obsoleta al iniciar la puerta de enlace (por ejemplo, MESSAGING_CWD). Inofensiva; sigue la sugerencia para mover la configuración a config.yaml cuando sea conveniente.

  • Repetidos WARNING [Telegram] … en los registros de la puerta de enlace. Si seguiste las partes anteriores de OpenClaw y agregaste un canal de Telegram, la configuración de Hermes detectó OpenClaw y importó esas configuraciones de mensajería en ~/.hermes/.env. Como omitimos terminar la mensajería aquí, la puerta de enlace tiene un token pero no una configuración completa, por lo que sigue reintentando y registrando esta advertencia. (Una caja nueva sin configuración de Telegram de OpenClaw no lo verá.) Elimina las entradas sobrantes y reinicia:

    sed -i '/^TELEGRAM_ALLOWED_USERS=/d; /^TELEGRAM_BOT_TOKEN=/d' ~/.hermes/.env
    systemctl --user restart hermes-gateway

    Si ese token alguna vez fue expuesto, revócalo en @BotFather de Telegram y emite uno nuevo.

Qué sigue

Ahora que Hermes está funcionando con memoria duradera, el resto de la serie convierte cada capacidad anterior en una guía práctica:

  • Parte 2 — Controla a Hermes desde Telegram. Termina de migrar el canal de Telegram que Hermes ya importó de OpenClaw (hermes setup gateway, listas de permitidos, verifica que el bot responda), para que puedas darle tareas desde tu teléfono.
  • Parte 3 — Ponlo en un horario. Usa la herramienta cron para un informe matutino, un informe semanal, y una alerta de salud del servicio entregada a tu canal.
  • Parte 4 — Habilidades personalizadas y subagentes. Enséñale habilidades reutilizables y delega trabajo.

Los enlaces aparecerán aquí a medida que cada parte se publique.