Hermes Agent corre en local, elige qué herramienta ejecutar y devuelve una respuesta final en JSON. Lo monté en un fin de semana con Ollama y Qdrant sobre docker compose, y este post es el mapa real: qué piezas necesitas, dónde falla el modelo y por dónde empezar mañana. La gracia no está en el tamaño del modelo, sino en las herramientas que definas alrededor del agente de IA.
Cómo llama herramientas Hermes
A continuación, el esquema de funciones concreta el contrato del tool call que Hermes sigue para invocar funciones.
Esquema de funciones: el contrato del tool call
Hermes (de Nous Research, basado en Open Hermes 3) usa un formato propio para invocar funciones: el modelo emite un bloque <tools>...</tools>, tu código lo parsea, ejecuta la función correspondiente y devuelve el resultado como <tool_response>. El bucle se repite hasta que el modelo escribe una respuesta final en texto plano. La salida estructurada en JSON permite que cualquier pipeline de automatización la consuma sin parsear texto libre, lo que convierte al agente en infraestructura ejecutable y no en un chatbot. Una definición de herramienta en JSON Schema basta para que el modelo sepa cuándo invocar cuál:
Herramientas: funciones que el agente decide usar
Hermes define herramientas como funciones con nombre y esquema: el agente decide cuándo llamarlas a partir de la tarea y las devuelve al bucle como resultados más.
{
"name": "search_qdrant",
"description": "Busca documentos relevantes en Qdrant",
"parameters": {
"type": "object",
"properties": {
"query": {"type": "string"}
},
"required": ["query"]
}
}
De agente suelto a automatización
Un agente en local solo no hace nada; necesita disparadores que lo saquen del bucle interactivo, como estos tres.
Cron, webhooks y colas: los tres disparadores
Un agente en local solo no hace nada; necesita disparadores que lo saquen del bucle interactivo. Cron, webhooks, carpetas vigiladas o un bot de Telegram cubren la mayoría de casos: resumen diario de RSS, clasificación de correo, indexado de archivos nuevos, notificaciones de eventos. Cada uno es un job pequeño alrededor de una herramienta bien definida. La métrica que importa no es cuántos triggers sumes, sino cuántas tareas repetitivas has dejado de hacer a mano. Antes de añadir más triggers, conviene tener claros los límites que vas a heredar del modelo.
Cron, webhooks y carpetas vigiladas
Los disparadores convierten el agente en servicio: un cron le pasa el prompt, un webhook reacciona a eventos externos y una carpeta vigilada procesa ficheros al llegar.
Límites que conviene conocer
Los agentes locales heredan los límites del modelo y suman los del entorno de ejecución, y las cuantizaciones agresivas degradan la fiabilidad del tool call.
Cuantización y fiabilidad del tool call
Los agentes locales heredan los límites del modelo y suman los del entorno de ejecución. Las cuantizaciones agresivas degradan la fiabilidad del formato <tools>...</tools>, así que conviene probar el tool-calling con el cuantizado que vayas a desplegar, no con el modelo completo en GPU. Un test rápido: lanza el mismo prompt con Q4_K_M y con Q8_0, y compara cuántos tool-calls acertó a la primera. Ejecutar una herramienta es ejecutar código arbitrario, por lo que el agente debe correr con permisos mínimos, montajes de solo lectura y timeouts cortos. Los modelos compactos inventan argumentos cuando el esquema JSON no se valida server-side; un validador con retry resuelve la mayoría de los fallos. Loguear cada tool-call es barato y te ahorra horas cuando algo no encaja.
Cuantización, contexto y fiabilidad
Las cuantizaciones agresivas degradan la fiabilidad de las llamadas a herramientas: prueba el modelo con tus herramientas reales antes de dejar la automatización sola.
El stack base con docker compose
El mínimo viable son tres servicios que Docker Compose conecta en una red interna.
Tres servicios y una red interna
services:
ollama:
image: ollama/ollama:latest
volumes:
- ollama:/root/.ollama
ports:
- "11434:11434"
restart: unless-stopped
qdrant:
image: qdrant/qdrant:latest
volumes:
- qdrant:/qdrant/storage
ports:
- "6333:6333"
- "6334:6334"
restart: unless-stopped
hermes-agent:
build: ./agent
environment:
OLLAMA_HOST: http://ollama:11434
QDRANT_URL: http://qdrant:6333
depends_on:
- ollama
- qdrant
restart: unless-stopped
volumes:
ollama:
qdrant:
El mínimo viable son tres servicios con volúmenes compartidos: Ollama expone el modelo en el 11434, Qdrant guarda los embeddings en el 6333 y un tercer contenedor ejecuta el código del agente con el loop de herramientas. La red interna de Compose evita exponer puertos al host salvo los imprescindibles. El mismo patrón de servicios lo usamos en la guía de IA local en WordPress con Ollama y Qdrant.
GPU: el bloque reserve.yml
Si tienes GPU NVIDIA, añade este bloque al servicio del agente:
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
docker compose lo respeta desde Compose v2; sin él, el modelo cae a CPU y la latencia se multiplica.
El primer paso, este fin de semana
def run(prompt):
msgs = [{"role": "user", "content": prompt}]
while True:
out = ollama.chat(model="hermes3", messages=msgs)["message"]["content"]
tool = parse_tool_call(out)
if tool is None:
return out
msgs.append({"role": "tool", "content": execute(tool)})
Descargar el modelo y la primera herramienta
El modelo lo traes con docker compose exec ollama ollama pull hermes3. La primera herramienta suele ser la más aburrida, tipo listar archivos o buscar en Qdrant, porque valida que el formato de tool-calling funciona antes de tocar nada serio.
Con los tres servicios arriba, el trabajo real empieza en la definición de herramientas: dos o tres funciones concretas valen más que diez genéricas. Escribe el loop que conecta prompt, tool call y respuesta antes de tocar nada más.
El loop mínimo: prompt, tool call, respuesta
Para responder a esta pregunta, ten en cuenta que la cuantización marca el suelo de RAM y que conviene partir de una máquina amplia.
Preguntas frecuentes
Para responder a esta pregunta, ten en cuenta que la cuantización marca el suelo de RAM y que conviene partir de una máquina amplia.
¿Cuánta RAM necesito para correr Hermes 3 8B en local?
¿Cuánta RAM necesito para correr Hermes 3 8B en local? La cuantización marca el suelo: cada variante ocupa varios GB solo para los pesos, sin contar el contexto activo ni Qdrant. Para experimentar con tool-calling y memoria, mejor partir de una máquina con RAM amplia que de una laptop ajustada.
¿Qué modelo de arranque?
gemma3:4b o qwen3:4b con CPU moderada; sube a 7-8B si la RAM lo permite y la tarea exige razonamiento más largo.
¿Puede ver archivos y ejecutar comandos?
Sí, si las herramientas que le defines lo permiten: lectura de ficheros, ejecución de scripts y llamadas HTTP son los tres usos típicos.
¿Hace falta GPU?
¿Hace falta GPU? No es obligatoria. En CPU corre, pero la latencia se vuelve molesta cuando el historial crece. Una GPU dedicada con VRAM suficiente para el cuantizado que uses marca la diferencia; las tarjetas de gama media actuales dan margen de sobra para las variantes compactas.
¿Y para producción?
¿Y para producción? Empieza por Ollama local y, si la herramienta lo necesita, mueve el modelo a un servidor con vLLM o TGI. Qdrant admite modo cluster cuando el volumen de embeddings crece. Lo importante es que docker compose te permita migrar servicio a servicio sin reescribir el agente. Los costes reales de ese salto están desgranados en la guía de self-hosting: VPS, costes y hardware. Los números de ese salto están en la guía de self-hosting: VPS, costes y hardware.
¿Qué hago si el modelo inventa argumentos?
¿Qué hago si el modelo inventa argumentos? Valida el esquema JSON en el servidor antes de ejecutar la herramienta. Si falla, devuelve un mensaje de error claro al modelo y reintenta una vez; dos reintentos suelen bastar para que el modelo corrija el formato. Más de eso indica que el cuantizado es demasiado agresivo.
El valor de un agente no está en el modelo, sino en las herramientas que definas. Una sola herramienta bien hecha, ejecutada por un cron, ya te ahorra más que cambiar el LLM. El segundo paso natural es añadir memoria persistente con Qdrant para que el agente recuerde contexto entre sesiones, pero eso es otro post. Si quieres ver otras herramientas listas para envolver, mira el listado de herramientas. Mantener esa caja de herramientas en tu servidor es la vía que la comparativa entre IA local y SaaS pone en cifras. Y si el stack tiene que vivir encendido siempre, un VPS para tu agente evita depender del portátil. Mantener esas herramientas en tu servidor es la apuesta que la comparativa entre IA local y SaaS pone en cifras.
