que el debate principal no es sobre cuándo saldrá el próximo modelo mejor, sino sobre quién construirá el arnés adecuado a su alrededor. Un arnés es el andamiaje alrededor del modelo: el bucle del agente, las definiciones de herramientas, la gestión del contexto, la memoria, las indicaciones y los flujos de trabajo que convierten un LLM sin formato en un producto útil. El modelo es el motor, el arnés es todo lo que realmente lo hace conducir. Ejemplos de arneses son Cursor, Claude Desktop y otros.
Existe un debate en curso en el espacio de las herramientas de codificación de IA: ¿comprometerse con un arnés específico significa depender del proveedor? La memoria es el filo más agudo de esto. Si la memoria de su agente se encuentra dentro de un arnés cerrado o detrás de una API propietaria, en realidad no es suya y los costos de cambio se acumulan rápidamente. Pero no tiene por qué ser así.
La idea de esta publicación de blog es simple: mantener la capa de memoria fuera del arnés y dejar que cualquier arnés se conecte a ella.
En esta publicación, mostraré cómo se puede crear una única capa de memoria compartida que funcione en tres agentes de codificación diferentes (Claude Code, OpenAI’s Codex y Cursor) utilizando ganchos como mecanismo de integración y Neo4j como almacén persistente.
El código para la integración del enlace está disponible en GitHub.
Las herramientas MCP solo pueden llevarte hasta cierto punto con la memoria
Los servidores MCP (Model Context Protocol) son la respuesta ideal para brindar a los agentes acceso a sistemas externos. Y funcionan. Puede exponer una base de datos Neo4j como una herramienta MCP y dejar que el agente la consulte cuando lo decida.
Pero las herramientas MCP son iniciadas por agentes. El modelo debe decidir llamar a la herramienta y debe saber cuándo y por qué hacerlo. Eso significa:
El agente necesita “recordar para recordar”, debe decidir proactivamente almacenar algo que valga la pena recordar más adelante. No hay garantía de coherencia: una sesión puede registrar todo y la siguiente puede no registrar nada. Confías en el juicio del modelo sobre lo que es importante para la memoria, en tiempo real, mientras está ocupado haciendo otra cosa.
Lo que realmente desea es un registro pasivo y determinista, que es algo que captura cada evento de la sesión independientemente de lo que esté haciendo el modelo, sin consumir su contexto o atención.
Esto es exactamente lo que te dan los ganchos.
Introduzca ganchos
Los ganchos son comandos de shell que se activan automáticamente en eventos del ciclo de vida: cuando comienza una sesión, cuando el usuario envía un mensaje, antes y después de cada uso de la herramienta y cuando finaliza la sesión. El agente no decide llamarlos, se ejecutan programáticamente.
La idea clave es que los ganchos están notablemente estandarizados entre los proveedores. Claude Code, Codex, Cursor y otros admiten esencialmente los mismos eventos de ciclo de vida:
SessionStart para cuando comienza la sesión del agente UserPromptSubmit (o beforeSubmitPrompt en el cursor) para cuando el usuario envía un mensaje PreToolUse / PostToolUse para antes y después de cada llamada a la herramienta Detener para cuando finaliza la sesión
El enlace recibe una carga útil JSON en la entrada estándar con el ID de la sesión, el nombre del evento, los detalles de la herramienta y el mensaje del usuario. Y el enlace puede emitir JSON en la salida estándar para inyectar contexto adicional a la conversación. Mismo contrato, tres arneses/clientes.
También hay otros ganchos, como eventos de notificación, detención de subagente o ganchos precompactos, pero no los usaremos aquí.
Capa de memoria compartida
Ahora necesitamos un lugar donde conservar la memoria. Descargo de responsabilidad rápido: trabajo en Neo4j, por lo que lo usaremos en este ejemplo.
El modelo es sencillo. Cada sesión de agente es un nodo, conectado a una lista vinculada de nodos de eventos, uno por invocación de enlace. Los eventos se escriben según el evento del ciclo de vida que los desencadenó: SessionStart, UserPromptSubmit, PreToolUse, PostToolUse, Stop. Una sesión termina como una línea de tiempo ordenada de todo lo que sucedió durante esa ejecución.
Los cinco tipos de eventos se escriben en la tienda, lo que le brinda un seguimiento de auditoría completo de cada sesión en cada arnés. Dos de ellos son también puntos de inyección. SessionStart se activa antes de que el agente lea el mensaje del sistema, por lo que cualquier cosa que el gancho emita allí se antepone al mensaje del sistema. Así es como la memoria persistente a nivel de agente se abre paso en el contexto. UserPromptSubmit se activa justo antes de que se envíe el mensaje del usuario y todo lo que se emite allí se agrega al mensaje del usuario. Ese es el gancho para el contexto de nivel de cambio, como extraer recuerdos relevantes de lo que el usuario acaba de escribir.
Entonces, ¿qué pasa si iniciamos una nueva sesión en alguno de estos arneses con ganchos activos, por ejemplo Cursor?
Si inspeccionamos los resultados en el navegador Neo4j.
Una restricción importante: los ganchos van fuera de la sesión del modelo del arnés. No puede reutilizar el LLM con el que está hablando el agente. Si desea trabajar con LLM dentro de un gancho, debe realizar su propia llamada de modelo, lo que agrega latencia a cada evento que activa el agente. Es por eso que los ganchos aquí solo hacen dos cosas: registrar eventos e inyectar memorias precalculadas. Se mantienen rápidos y deterministas.
Fase de sueño
El trabajo de memoria real ocurre en una fase separada del sueño: extraer hechos de las sesiones, resumir lo sucedido, actualizar el gráfico. Este es solo un trabajo por lotes que se ejecuta cada pocas horas, lee los eventos acumulados desde la última ejecución y los vuelve a escribir en el almacén de memoria. En principio, podría iniciar una actualización de memoria de forma asincrónica cada vez que se detenga una sesión, pero eso parece demasiado; un lote periódico es más sencillo y funciona bien para esta demostración.
El trabajo soñado extrae todos los eventos desde la última marca de agua de la sesión, se los entrega a Claude junto con el almacén de memoria actual y le pide que escriba un pequeño conjunto de notas duraderas. Las notas en sí imitan una wiki de rebajas, la misma forma hacia la que Karpathy y otros han estado gravitando para la memoria personal de LLM y la misma forma que las habilidades de Anthropic ya usan: cada memoria es un archivo en una ruta semántica como perfil/role.md, herramientas/bash/common-flags.md, o proyecto/neo4j-skills.md, con texto YAML en la parte superior y prosa debajo. A Claude se le dice que combine en lugar de agregar, por lo que una ruta es un documento vivo, no un registro; Si nuevos eventos contradicen una nota anterior, la nota anterior se reescribe. El resultado es un árbol de archivos de rebajas pequeños e independientes que una sesión futura puede leer en frío, indistinguibles en forma de una habilidad, creados simplemente por la fase de sueño en lugar de hacerlo a mano.
Si lo ejecutamos en nuestro ejemplo, obtenemos las siguientes memorias creadas.
Y ahora, si abriera un arnés diferente, esta vez Claude Code Desktop con los ganchos activados, obtendría la siguiente respuesta.
Accediendo a la memoria
La última pieza del rompecabezas es permitir que el agente acceda a la capa de memoria. Como se mencionó, hay dos formas de inyectar información en el agente: ganchos y herramientas MCP.
Los enlaces son deterministas y se ejecutan al inicio de cada sesión para completar el indicador del sistema. Aquí es donde debe ir la información del perfil y las instrucciones sobre cómo utilizar la memoria de manera eficiente. También puede agregar contexto adicional cuando se activa un evento de envío de solicitud de usuario, pero es solo para agregar; no puede manipular otras partes del mensaje.
Las herramientas MCP, por otro lado, brindan al LLM acceso directo a la capa de memoria bajo demanda. En lugar de recibir contexto pasivamente al inicio, el agente puede buscar recuerdos relevantes, almacenar nueva información y actualizar o eliminar entradas existentes. Esencialmente, es CRUD básico sobre los archivos de rebajas resumidos almacenados en Neo4j.
Al final, creo que casi siempre necesitarás ambos. En este proyecto solo tenemos ganchos, no herramientas MCP, pero siempre puedes conectar el MCP oficial de Neo4j para permitir que el agente explore el gráfico.
Poniéndolo a funcionar
Algo interesante, la forma en que configuré los ganchos fue señalar al agente en cualquiera de los arneses y pedirle que instalara los ganchos, pero estoy seguro de que también hay mejores enfoques.
Resumen
Si no eres dueño de tu memoria, no eres dueño de tu agente. Hoy en día, cada arnés construye su propio jardín amurallado de contexto, preferencias e historial de sesiones. Cámbialos y empezarás desde cero. Ese no tiene por qué ser el caso.
Los ganchos rompen ese patrón. Le permiten escribir integraciones que se conectan a cualquier arnés desde el exterior y la interfaz es notablemente consistente. Claude Code, Codex y Cursor activan los mismos eventos de ciclo de vida: inicio de sesión, envío de solicitud, uso de herramientas, fin de sesión. El gancho recibe JSON en la entrada estándar, opcionalmente emite JSON en la salida estándar para inyectar contexto, y ese es el contrato completo. Debido a que los ganchos se ejecutan de manera determinista en cada evento, no consumen la atención del modelo ni dependen del agente para decidir qué vale la pena guardar. Los mismos dos scripts de Python manejan los tres clientes; Los envoltorios delgados que pasan una marca –client son el único pegamento por arnés.
La arquitectura tiene tres capas:
Hooks (en línea): registra pasivamente cada evento en Neo4j como una lista vinculada por sesión. Sin llamadas de modelo, sin costo de latencia, solo agrega. Fase de sueño (fuera de línea): un trabajo por lotes lee los eventos acumulados, le pide a Claude que los destile en recuerdos de rebajas duraderos y los escribe. Los recuerdos se organizan por temas y se fusionan en lugar de agregarse, para que permanezcan actualizados en lugar de crecer para siempre. Inyección (en línea): en el inicio de la siguiente sesión en cualquier arnés, las memorias de perfil se cargan en contexto. En cada mensaje de usuario, se buscan y agregan automáticamente recuerdos relevantes.
El resultado es una capa de memoria que se encuentra debajo de los tres arneses, funciona sin que ninguno de ellos sepa acerca de los demás y le pertenece completamente a usted. Puede cambiar de Cursor a Claude Code y Codex a mitad del proyecto y continuar exactamente donde lo dejó. La comprensión de su agente sobre quién es usted, en qué está trabajando y cómo prefiere trabajar lo sigue a usted, no a la herramienta.
El código está disponible aquí.
Ps: Todas las imágenes son creadas por el autor.