YourMemory

Memoria persistente para agentes de IA con decaimiento por curva de olvido de Ebbinghaus, recuperación híbrida BM25 + vectorial + grafo de conocimiento, razonamiento temporal y un panel de control local. 89.4% Recall@5 en LongMemEval.

Documentación

YourMemory

YourMemory

Tu IA tiene la memoria de un pez dorado. Ya no más.

Memoria persistente y automejorable para agentes de IA, basada en la ciencia de cómo recuerdan los humanos.

PyPI PyPI Downloads Python License: CC BY-NC 4.0 GitHub Stars

LoCoMo Recall@5 LongMemEval Recall@5 HotpotQA BOTH@5 MCP Native


▶ Prueba la demo interactiva en vivo · Sitio web · Benchmarks


El problema

Cada mañana tu agente de IA te trata como a un extraño. El mismo contexto reexplicado. Las mismas preferencias olvidadas. Cada sesión comienza desde cero.

La mayoría de las herramientas de "memoria" conectan una base de datos vectorial a un agente y lo llaman listo, pero eso es solo almacenamiento. Acumula casi duplicados hasta que la recuperación se ahoga en ruido. Un pez dorado con una pecera más grande.

YourMemory es diferente: memoria que funciona como un cerebro, no como una base de datos.

flowchart LR
    A["🧠 You tell your<br/>AI something"] --> B["Extract durable<br/>facts"]
    B --> C["Dedup + embed<br/>+ graph-link"]
    C --> D[("Memory<br/>store")]
    D -->|"related facts pile up"| E["✨ Consolidate<br/>N → 1 summary"]
    D -->|"stale + unused"| F["📉 Decay<br/>+ prune"]
    D -->|"new session"| G["♻️ Recall<br/>hybrid + graph"]
    E --> D
    G --> H["🤖 Your agent<br/>picks up where<br/>it left off"]
    style D fill:#0a2540,stroke:#19cdff,color:#fff
    style E fill:#0c2b3a,stroke:#5eead4,color:#fff
    style H fill:#0c2b3a,stroke:#19cdff,color:#fff

✨ Qué lo hace diferente

CaracterísticaQué hace
🧠ConsolidaciónCuando se acumulan suficientes hechos relacionados, se comprimen en un resumen limpio y los originales se archivan. La memoria se vuelve más nítida con el tiempo, no más abultada.
📉Decaimiento biológicoCada memoria envejece según una curva de olvido de Ebbinghaus. Los hechos obsoletos y no utilizados se desvanecen; los importantes y recordados con frecuencia persisten.
🔗Grafo de entidadesLas memorias se vinculan por personas, lugares y conceptos compartidos, de modo que la recuperación saca a la luz lo que olvidaste pedir.
♻️Sobrevive a los reinicios de contextoCuando la ventana de contexto se compacta, YourMemory devuelve el contexto de trabajo, sin necesidad de releer archivos para saber dónde estabas.
🔒Registro de auditoría a prueba de manipulacionesCada lectura/escritura/eliminación se registra en un libro mayor encadenado por hash. Altera un registro y la cadena se rompe.
👥Pools de memoria de equipoMemoria compartida basada en roles, para que los agentes de todo un equipo se basen en el mismo conocimiento institucional, manteniendo las memorias privadas como privadas.
🛡️Derechos de datos integradosExportación con un comando (derecho de acceso) y derecho al olvido (purga), además de controles alineados con SOC 2.
🔌Nativo MCP y local primeroFunciona con Claude, Cursor, Cline, Windsurf o cualquier cliente MCP. Se ejecuta completamente en tu máquina, sin clave API, nada sale de tu sistema.

Un comando para instalar. DuckDB por defecto (cero configuración), Postgres + pgvector para equipos.


Tabla de contenidos


🏆 Benchmarks

Tres conjuntos de datos externos. Cada número es reproducible de forma independiente: el código de benchmark vive en el repositorio. Metodología completa en BENCHMARKS.md.

LoCoMo-10: memoria conversacional de múltiples sesiones

xychart-beta
    title "Recall@5 · LoCoMo-10 (higher is better)"
    x-axis ["Mem0", "Zep Cloud", "Supermemory", "YourMemory"]
    y-axis "Recall@5 percent" 0 --> 70
    bar [18, 28, 31, 59]

2× mejor recuperación que Zep Cloud en las 10 muestras. *Supermemory y Mem0 agotaron las cuotas del nivel gratuito a mitad del benchmark; las puntuaciones se calcularon sobre los 1.534 pares completos.

LongMemEval-S: 500 preguntas, ~53 sesiones de distracción cada una

El benchmark estándar más difícil para memoria a largo plazo. Cada pregunta está enterrada en ~53 sesiones.

MétricaPuntuación
Recall@5 (cualquier sesión dorada en el top-5)89,4%
Recall-all@5 (todas las sesiones doradas en el top-5)84,8%
nDCG@5 (calidad de ranking)87,4%

HotpotQA: 200 preguntas de múltiples saltos

SistemaBOTH_FOUND@5
YourMemory (vector + BM25 + grafo de entidades)71,5%
YourMemory (sin aristas de entidades)59,5%

Las aristas del grafo de entidades añaden +12 pp: atraviesan del Hecho 1 al Hecho 2 incluso cuando el Hecho 2 tiene baja similitud de embedding con la consulta.

Escrito: Construí decaimiento de memoria para agentes de IA usando la curva de olvido de Ebbinghaus


🚀 Inicio rápido

Python 3.11–3.14. Sin Docker, sin configuración de base de datos. Toda la memoria se almacena localmente en ~/.yourmemory/.

pip install yourmemory
yourmemory-register <your-token>
yourmemory-setup

Obtén tu token: visita yourmemoryai.xyz → ingresa tu correo → verifica con un código de 6 dígitos → copia tu token.

yourmemory-setup detecta y configura automáticamente Claude Code, Claude Desktop, Cursor, Windsurf y Cline, y luego pregunta qué backend usar:

  • DuckDB: cero configuración, un solo archivo local (predeterminado)
  • Postgres: compartido / producción; tú proporcionas un DATABASE_URL (necesita la extensión pgvector)

Opcional: extracción local más inteligente: YourMemory funciona de fábrica con heurísticas integradas. Para una extracción de hechos de mayor calidad y totalmente local, instala Ollama y yourmemory-setup descarga el modelo (qwen2.5:7b, ~4,7 GB) automáticamente. ¿Prefieres la nube? Configura YOURMEMORY_EXTRACT_BACKEND=anthropic.

O instala desde un binario: no se requiere Python

¿Prefieres no tocar pip? Toma el binario independiente para tu plataforma desde la última versión:

PlataformaRecurso
macOS (Apple Silicon)yourmemory-macos-arm64.tar.gz
macOS (Intel)yourmemory-macos-x86_64.tar.gz
Linux (x86-64)yourmemory-linux-x86_64.tar.gz
Windows (x86-64)yourmemory-windows-x86_64.exe.zip
# macOS / Linux — download, extract, run
tar -xzf yourmemory-macos-arm64.tar.gz
./yourmemory-macos-arm64 register <your-token>
./yourmemory-macos-arm64 setup
./yourmemory-macos-arm64            # start the server

Un solo ejecutable maneja todos los comandos: register, setup, ask "<question>", path y (sin argumentos) inicia el servidor.

Totalmente autocontenido y sin conexión: el binario incluye Python, cada dependencia y ambos modelos de ML (el modelo de embedding + spaCy). No se descarga nada en la primera ejecución. La contrapartida es el tamaño (~2 GB). Construye el tuyo con un solo comando: ./build-binary.sh — y los binarios de lanzamiento multiplataforma se producen automáticamente mediante el flujo de compilación.


🧠 Cómo funciona la memoria

YourMemory trata la memoria como un sistema vivo: crece, consolida, olvida y conecta, como lo hace un cerebro.

Consolidación — N → 1

La mayoría de las herramientas de memoria solo siguen creciendo. YourMemory observa grupos de hechos relacionados y, una vez que se acumulan suficientes, los comprime en un único resumen limpio, archivando los originales (nunca los elimina, así que nada se pierde).

flowchart LR
    subgraph before [Related facts pile up]
        A1["Railway uses Nixpacks"]
        A2["Railway on Pro plan"]
        A3["Railway env vars hold<br/>the Postgres URL"]
        A4["Deploys on Railway<br/>with Postgres"]
    end
    before --> C{"cluster +<br/>LLM summarize"}
    C --> S["✨ Summary<br/>Deploys on Railway (Pro,<br/>Nixpacks) with Postgres<br/>via env vars"]
    C -.->|"archived, recoverable"| ARC[("archive")]
    style S fill:#0a2540,stroke:#5eead4,color:#fff
    style C fill:#0c2b3a,stroke:#19cdff,color:#fff

Ejemplo real de un almacén de producción: 444 memorias → 16 resúmenes — el mismo conocimiento, una fracción del ruido. La consolidación es impulsada por eventos (se activa cuando se acumulan memorias relacionadas), no un trabajo nocturno ciego.

Decaimiento: la curva de olvido

La fuerza de la memoria decae exponencialmente. La importancia y la frecuencia de recuperación ralentizan ese decaimiento:

effective_λ  = base_λ × (1 − importance × 0.8)
strength     = clamp(importance × e^(−effective_λ × active_days) × (1 + recall_count × 0.2), 0, 1)

active_days cuenta solo los días en que estuviste activo: las vacaciones no causan pérdida de memoria. Las memorias por debajo de la fuerza 0.05 se podan automáticamente. Cada categoría envejece a su propio ritmo:

CategoríaVida mediaMejor para
strategy~38 díasPatrones que funcionaron, decisiones arquitectónicas
fact~24 díasPreferencias, identidad, conocimiento estable
assumption~19 díasContexto inferido, creencias inciertas
failure~11 díasErrores, enfoques incorrectos, problemas específicos del entorno

Poda consciente de la cadena: una memoria decaída se mantiene viva si algún vecino del grafo sigue siendo fuerte: el contexto de soporte sobrevive incluso cuando rara vez se consulta directamente.

Recuperación híbrida: vector + BM25 + grafo

La recuperación se ejecuta en dos rondas para que aparezca tanto lo que pediste como lo que olvidaste pedir:

flowchart LR
    Q["query"] --> R1["Vector + BM25<br/>hybrid search"]
    R1 --> R2["Graph expansion<br/>(what you forgot to ask)"]
    R2 --> S["rank by<br/>similarity × strength"]
    S --> OUT["🎯 Ranked memories"]
    style OUT fill:#0a2540,stroke:#19cdff,color:#fff

Deduplicación consciente del sujeto se ejecuta antes de cada almacenamiento: incorpora el sujeto de cada oración para que "Sachit uses DuckDB" y "YourMemory uses DuckDB" permanezcan separados (entidades diferentes), mientras que "YourMemory uses DuckDB" y "YourMemory stores data in DuckDB" se fusionan (misma entidad). Sin listas de palabras codificadas; se generaliza a cualquier idioma.


🔒 Confianza y registro de auditoría

Las empresas no dejarán que una caja negra opaca almacene sus datos. Por eso, cada operación — lectura, escritura, actualización, eliminación, consolidación — se agrega a un registro de auditoría encadenado por hash y a prueba de manipulaciones.

flowchart LR
    E0["GENESIS"] --> E1
    subgraph E1 [Event 1]
        H1["row_hash =<br/>sha256(prev + data)"]
    end
    E1 --> E2
    subgraph E2 [Event 2]
        H2["row_hash =<br/>sha256(#1.hash + data)"]
    end
    E2 --> E3
    subgraph E3 [Event 3]
        H3["row_hash =<br/>sha256(#2.hash + data)"]
    end
    E3 --> V{"GET /audit/verify"}
    V -->|chain intact| OK["✅ verified"]
    V -->|any row altered| BAD["❌ chain breaks<br/>at that row"]
    style OK fill:#0a2540,stroke:#5eead4,color:#fff
    style BAD fill:#3a0c14,stroke:#fb7185,color:#fff

Cada fila registra la marca de tiempo, el actor (usuario + agente), la acción, la operación, la memoria objetivo, la fuente (http vs mcp) y el hash de la fila anterior. Cambia cualquier registro histórico y verify_chain() señala exactamente dónde se rompió la cadena.

GET  /audit            # browse the trail (filter by user / action / operation)
GET  /audit/verify     # cryptographically verify the chain is untampered
POST /audit/prune      # retention-based cleanup (90-day minimum, never lower)

El registro de auditoría es fail-open: nunca bloquea una operación de memoria — y los eventos de lectura/listado del bucle de renderizado del panel se excluyen, para que el rastro siga siendo señal, no ruido.


👥 Pools de memoria de equipo

Dale a los agentes de todo un equipo un cerebro compartido, sin filtrar el contexto privado de nadie. Las memorias son compartidas (visibles para el pool) o privadas (visibles solo para su propietario).

flowchart TB
    P(("🧠 Team Pool<br/>shared memory"))
    A["Alice's agent"] <-->|shared| P
    B["Bob's agent"] <-->|shared| P
    C["Carol's agent"] <-->|shared| P
    A -. private .-> AP["🔒 Alice-only"]
    B -. private .-> BP["🔒 Bob-only"]
    style P fill:#0a2540,stroke:#19cdff,color:#fff
    style AP fill:#0c1424,stroke:#5a6b80,color:#8294a8
    style BP fill:#0c1424,stroke:#5a6b80,color:#8294a8

El acceso basado en roles se aplica por agente: lo que aprende el agente de un ingeniero beneficia al equipo completo al instante; el contexto sensible permanece limitado a su propietario.

POST   /pools                          # create a pool
POST   /pools/{id}/members             # add a member (with role)
POST   /pools/{id}/memories            # contribute a shared memory
POST   /pools/{id}/retrieve            # recall across the pool

🛡️ Derechos de datos y cumplimiento

Porque la memoria que almacena datos reales necesita los controles para que se le confíen:

DerechoEndpointQué hace
Acceso (exportación DSAR)GET /users/{id}/exportExportación completa de todo lo almacenado para un usuario
Borrado (derecho al olvido)DELETE /users/{id}/memoriesPurga con un comando de las memorias de un usuario
PortabilidadPOST /users/{id}/importReimportar una exportación anterior
RecuperabilidadGET /users/{id}/archiveRecuperar los originales consolidados

Combinados con el registro de auditoría encadenado por hash y el piso de retención de 90 días, estos se asignan directamente a los controles documentados en SECURITY.md (alineado con SOC 2).


🎛️ Paneles

Dos interfaces de navegador integradas: sin configuración adicional, se inician automáticamente con el servidor.

Panel de memoria — http://localhost:3033/ui

Una vista completa de lectura/escritura con pestañas Memorias · Auditoría · Pools: barra de estadísticas (Fuerte / Desvaneciéndose / Cerca de poda), pestañas por agente, tarjetas de memoria con barras de fuerza en vivo, filtros de categoría, el registro de auditoría y gestión de pools.

Visualizador de grafos — http://localhost:3033/graph

Un mapa interactivo de fuerza dirigida de cómo se conectan las memorias: memoria raíz como nodo brillante, vecinos codificados por color según categoría, grosor de arista = fuerza de conexión. Arrastra, acerca y haz clic en cualquier nodo para ver el contenido completo.

http://localhost:3033/graph?memoryId=42&userId=alex&depth=2

🔧 Herramientas MCP

Tres herramientas, llamadas por tu IA automáticamente.

HerramientaCuándo la llama tu IAQué hace
recall_memory(query, current_path?)Inicio de cada tareaMuestra memorias clasificadas por similitud × fuerza de decaimiento; impulso espacial para memorias con coincidencia de ruta
store_memory(content, importance, category?, context_paths?)Después de aprender algo nuevoIncorpora, deduplica, almacena con decaimiento; etiqueta rutas de archivo/directorio opcionales
update_memory(id, new_content, importance)Cuando un hecho almacenado está desactualizadoReincorpora y reemplaza; registra el cambio en el registro de auditoría
# Store with spatial context
store_memory(
    "Alex prefers tabs over spaces in Python",
    importance=0.9, category="fact",
    context_paths=["/projects/backend"],
)

# Next session — spatial boost fires when working in that directory
recall_memory("Python formatting", current_path="/projects/backend")
# → {"content": "Alex prefers tabs over spaces in Python", "strength": 0.87}

⚡ Pregunta sin llamada LLM

El único sistema de memoria que puede responder preguntas sin hacer ninguna llamada API LLM:

yourmemory ask "what database does this project use"
# → YourMemory uses DuckDB locally and Postgres in production.

yourmemory ask "how do I fix a kubernetes deployment"
# → Not enough memory context to answer without an LLM.

Cuando la memoria es lo suficientemente fuerte, responde al instante: cero tokens, cero costo de nube, cero latencia. Cuando no lo es, declina limpiamente en lugar de alucinar. Tu consulta nunca sale de tu máquina.


🔀 Proxy API: memoria garantizada

Las herramientas MCP se llaman a discreción de la IA. El proxy API elimina esa incertidumbre: intercepta cada llamada LLM, inyecta memorias relevantes automáticamente y maneja store_memory / update_memory sin configuración de modelo. Inicia el servidor (yourmemory), luego apunta tu cliente a localhost:3033:

from anthropic import Anthropic

client = Anthropic(
    api_key="sk-ant-...",
    base_url="http://localhost:3033/proxy/anthropic",
    default_headers={"X-YourMemory-User": "alex"},  # per-user memory
)

# Memory is injected automatically — no other changes needed
response = client.messages.create(
    model="claude-opus-4-8",
    max_tokens=1024,
    messages=[{"role": "user", "content": "What database do I use?"}],
)

OpenAI funciona de manera idéntica mediante base_url="http://localhost:3033/proxy/openai".


🏗️ Arquitectura y Stack

flowchart LR
    C["Your AI client<br/>Claude · Cursor · any MCP"] <--> Y["🧠 YourMemory"]
    Y --> M[("Memory<br/>store")]
    Y --> A[("Audit<br/>ledger")]
    style Y fill:#0a2540,stroke:#19cdff,color:#fff
    style M fill:#0c1a2c,stroke:#5eead4,color:#fff
    style A fill:#0c1a2c,stroke:#5eead4,color:#fff
ComponenteRol
DuckDBAlmacén vectorial predeterminado: configuración cero, similitud coseno nativa
PostgreSQL + pgvectorOpcional: para equipos o grandes conjuntos de datos
NetworkXBackend de grafo predeterminado (~/.yourmemory/graph.pkl)
Neo4jBackend de grafo opcional
sentence-transformersEmbeddings locales (multi-qa-mpnet-base-dot-v1, 768 dimensiones)
spaCyPNL local para deduplicación y extracción de entidades
APSchedulerDecaimiento y poda automáticos

🩺 Solución de problemas

Las escrituras se cuelgan / agotan el tiempo (bloqueo de escritor único de DuckDB). Si el servidor MCP y el servidor HTTP se ejecutan a la vez, compiten por el bloqueo de escritura de DuckDB. Solución:

pkill -f yourmemory 2>/dev/null || true
rm -f ~/.yourmemory/memories.duckdb.wal ~/.yourmemory/memories.duckdb.lock 2>/dev/null || true
# restart your client

¿Ejecutas Claude Desktop (MCP) y Claude Code (hooks) simultáneamente? Usa SQLite en su lugar: maneja lectores/escritores concurrentes de forma limpia: DATABASE_URL=sqlite:///~/.yourmemory/memories.db


🤝 Contribuciones

Se aceptan PRs — consulta CONTRIBUTORS.md.

📚 Referencias de conjuntos de datos

📄 Licencia

Copyright 2026 Sachit Misra — Licenciado bajo CC-BY-NC-4.0.

Gratuito para uso personal, educación, investigación académica y proyectos de código abierto. El uso comercial requiere un acuerdo escrito por separado → mishrasachit1@gmail.com


Dale a tu IA una memoria que valga la pena conservar.
pip install yourmemory