Desarrollo de plugins de Hermes Agent y prácticas de producción
Este capítulo está dirigido a usuarios avanzados: cómo ampliar Hermes mediante el sistema de plugins, cómo migrar desde OpenClaw y las mejores prácticas de seguridad y costos para implementar Hermes en entornos de producción.
Introducción al desarrollo de plugins
Hermes admite tres tipos de plugins: plugins universales (herramientas + hooks), proveedores de memoria y motores de contexto.
Ejemplo
hermes plugins
# Gestión mediante línea de comandos
hermes plugins list
hermes plugins install <path>
hermes plugins enable <name>
hermes plugins disable <name>
Puedes gestionar los plugins desde el panel de control. Usa el siguiente comando para iniciar el Dashboard:
hermes dashboard
Abre el panel de control en el navegador, accede a la lista de plugins de la izquierda y verás los plugins instalados:

Sistema de hooks
La capacidad de plugin más común es el hook: inyectar lógica personalizada en los puntos clave del ciclo de vida del agente:
Ejemplo
# Ejemplo de plugin simple: registra todas las llamadas al LLM
from hermes.plugins import Plugin, hook
class LoggingPlugin(Plugin):
name = "logging-plugin"
@hook("pre_llm_call")
async def before_call(self, ctx):
# Se activa antes de cada llamada al LLM
print(f"[LOG] A punto de llamar al LLM, longitud actual del contexto: {len(ctx.messages)}")
@hook("post_llm_call")
async def after_call(self, ctx, response):
# Se activa después de cada llamada al LLM
print(f"[LOG] Llamada al LLM completada, longitud de la respuesta: {len(response.content)}")
Puntos de hook disponibles
| Hook | Momento de activación | Usos típicos |
|---|---|---|
| pre_llm_call | Antes de la llamada al LLM | Registrar el contexto, modificar el prompt |
| post_llm_call | Después de la llamada al LLM | Registrar la respuesta, análisis estadístico |
| pre_tool_call | Antes de la llamada a la herramienta (se puede interceptar/modificar) | Verificación de permisos, filtrado de parámetros |
| post_tool_call | Después de la llamada a la herramienta | Auditoría de resultados, registro de logs |
| on_message_received | Al recibir un mensaje del usuario | Preprocesamiento de mensajes, filtrado de palabras sensibles |
| on_session_start | Al iniciar la sesión | Inicializar recursos, inyectar contexto |
| on_session_end | Al finalizar la sesión | Limpiar recursos, generar un resumen |
Registrar herramientas personalizadas
Añade nuevas capacidades de herramienta al agente mediante plugins:
Ejemplo
# Registrar herramienta personalizada: el agente puede usarla igual que las herramientas integradas
from hermes.plugins import Plugin
class MyPlugin(Plugin):
name = "my-tools"
def register_tools(self, ctx):
"Esta herramienta hace algo; se usa cuando el usuario necesita X"
ctx.register_tool(
name="my_custom_tool",
description="Descripción de los parámetros de entrada",
parameters={
"type": "object",
"properties": {
"input": {
"type": "string",
"description": # Lógica de ejecución real de la herramienta
}
},
"required": ["input"]
},
handler=self.my_tool_handler
)
async def my_tool_handler(self, **kwargs):
# ... lógica de procesamiento ...
input_text = kwargs.get("input", "")
Migración desde OpenClaw
return {"result": "done"}
Migración desde OpenClaw
Ejemplo
Ejemplo
openclaw export --format hermes > openclaw-config.json
# Verificar el resultado de la migración
hermes import --from openclaw openclaw-config.json
Correspondencia de conceptos principales
hermes doctor
Correspondencia de conceptos principales
| Definición de agente | OpenClaw | Hermes |
|---|---|---|
| Configuración de agente JSON | Flujo de trabajo | SOUL.md + config.yaml |
| Flujo YAML escrito manualmente | Skill (SKILL.md) | Backend de memoria |
| Base de datos externa | SQLite integrado + intercambiable | Skills/herramientas |
| Plugins de código | Archivos de Skill en Markdown | Múltiples instancias |
| Configuración multiproceso | Sistema de Profile | Mejores prácticas para entornos de producción |
Mejores prácticas para entornos de producción
Lista de verificación de seguridad
Ejemplo
Ejemplo
# Obligatorio: aislar el entorno de ejecución de comandos del agente
terminal:
backend: docker # Los comandos peligrosos requieren aprobación (o manual es más estricto)
approvals:
mode: smart # Las tareas programadas rechazan por defecto los comandos peligrosos
cron_mode: deny # Enmascarar automáticamente la información sensible en los registros (activado por defecto)
security:
redact_secrets: true Control de acceso mediante variables de entorno:
Ejemplo
Ejemplo
# No permitir nunca a todos los usuarios
GATEWAY_ALLOW_ALL_USERS=false =tu ID de usuario
TELEGRAM_ALLOWED_USERS# Lista blanca explícitaControl de costos de tokens
Control de costos de tokens
Ejemplo
Ejemplo
# No es necesario usar el modelo principal
auxiliary:
background_review:
provider: openrouter
model: google/gemini-3-flash-preview Monitoreo de gateway para múltiples Profile
vision:
provider: openrouter
model: google/gemini-2.5-flash-preview
session_search:
provider: openrouter
model: google/gemini-3-flash-preview
Monitoreo de gateway para múltiples Profile
Ejemplo
hermes profile list
Estrategia de actualización
for profile in coder assistant researcher; do
$profile gateway restart
done
Estrategia de actualización
Ejemplo
Ejemplo
hermes update
# → Sincronización de skills:
# default (ya está actualizado)
# coder (+2 nuevas skills)
# assistant (+2 nuevas skills)
Las skills modificadas por el usuario nunca se sobrescriben. La actualización solo sincroniza las partes nuevas y modificadas de las skills integradas.
AI pensando...Otras extensiones