Bucle de aprendizaje y memoria
Responsabilidad
Esta es la diferencia central de Hermes frente a un agent corriente: un bucle cerrado de «cuanto más se usa, mejor funciona». Cada turno de conversación se destila en: ① evolución de habilidades — crea/reescribe habilidades a partir de la experiencia (agent/learning_mutations.py); ② memoria — recuperación por texto completo FTS5 + resúmenes LLM de conversaciones pasadas (memory_manager), con modelado dialéctico del usuario vía Honcho; ③ grafo de aprendizaje — organiza habilidades y memoria como nodos/aristas (agent/learning_graph.py); ④ revisión en segundo plano — background_review digiere el historial en un hilo y produce acciones de reescritura accionables. Las reescrituras de habilidades terminan reinyectándose en el sistema de habilidades para que los siguientes turnos las reutilicen.
Archivos clave
Nodos de habilidad y grafo de aprendizaje
@dataclass SkillNode:28-41— nodo de habilidadcarga de habilidades:77-125—_iter_skill_files/build_skill_nodes(escaneaskills/y construye nodos)aristas y estadísticas:156-193—build_edges/density_stats(relaciones entre habilidades)aristas memoria-habilidad:193-227—_memory_cards/_memory_skill_edges(relación entre memoria y habilidades)build_learning_graph:248-328— agrega y produce el grafo de aprendizaje completo_load_usage:84-97— estadísticas de uso (guía qué habilidades se usan más)
Reescritura de habilidades/memoria
node_detail:86-124— detalle de un nododelete_node:124-157— elimina habilidad o memoriaedit_node:157-200— edita contenido de habilidad o memoria_clear_skill_cache:200— limpia la caché tras reescribir (para que surta efecto el siguiente turno)localización de memoria:30-65—_memories_dir/_parse_memory_id/_locate_memory
Gestión de memoria
class MemoryManager:354— gestor de memoriainyección de herramientas memory provider:83-164—memory_provider_tools_enabled/inject_memory_provider_toolsbuild_memory_context_block:337-354— compone la memoria en un bloque de contexto que se inyecta en el promptsanitize_context:164-172— redacción del contexto (antes de indexar en FTS5)StreamingContextScrubber:172-337— redacción de la salida en streaming
Revisión en segundo plano
spawn_background_review_thread:956— lanza el hilo de revisión_run_review_in_thread:617— bucle principal dentro del hilo_digest_history:122-373— resume las últimas 24 entradas del historialsummarize_background_review_actions:373-590— agrega las acciones de revisiónbuild_memory_write_metadata:590-617— metadatos de escritura de memoria
Flujo de datos
- Al acabar cada turno, el bucle principal entrega una snapshot de los mensajes al hilo de revisión en segundo plano (
agent/background_review.py:956). _digest_history(agent/background_review.py:122) resume el historial reciente y produce acciones candidatas (crear/reescribir habilidad, escribir memoria).- La reescritura de habilidades se materializa vía
edit_node:157; el borrado, víadelete_node:124; tras escribir,_clear_skill_cache:200limpia la caché. - La escritura de memoria pasa por
MemoryManager:354: tras redactar (agent/memory_manager.py:164) se indexa en FTS5 y se comprime con un resumen LLM. - Al iniciar el siguiente turno,
build_memory_context_block(agent/memory_manager.py:337) inyecta la memoria relevante enbuild_turn_context:268; las habilidades se inyectan víaagent/skill_bundles.py. - El grafo de aprendizaje completo se agrega en
build_learning_graph:254, para que la UI/depuración muestre las relaciones entre habilidades y memoria.
Resumen
El bucle de aprendizaje convierte «conversación» en «activo»: la revisión en segundo plano destila experiencia en habilidades y memoria de forma imperceptible, y se inyectan automáticamente en el siguiente turno. Las cuatro piezas clave: learning_graph (grafo), learning_mutations (reescritura), memory_manager (recuperación + redacción + resumen), background_review (digestión asíncrona). Esta es la base mecánica del «crecer junto al usuario» de Hermes, y la diferencia fundamental frente a «una llamada LLM sin estado».