Skip to main content
Glama

Alaya

DOI License: MIT Rust crates.io docs.rs npm MCP alaya MCP server GitHub stars GitHub Sponsors CI

El único motor de memoria con dinámicas de memoria basadas en la neurociencia —olvido de doble fuerza de Bjork, supresión inducida por la recuperación y coactivación hebbiana— en una biblioteca de Rust integrable sin dependencias.

Alaya (sánscrito: alaya-vijnana, "conciencia de almacén") es una biblioteca de Rust integrable. Un solo archivo SQLite. Sin servicios externos. Tu agente almacena conversaciones, recupera lo que importa y deja que el resto se desvanezca. El grafo se remodela con el uso, como la memoria biológica.

let alaya = Alaya::open("memory.db")?;
alaya.episodes().store(&episode)?;           // store
let results = alaya.knowledge().query(&query)?; // retrieve
alaya.lifecycle().consolidate(&provider)?;   // distill knowledge
alaya.lifecycle().transform()?;              // dedup, LTD, discover categories
alaya.lifecycle().forget()?;                 // decay what's stale
let cats = alaya.admin().categories(None)?;  // emergent ontology
alaya.admin().purge(PurgeFilter::Session("s1"))?; // cascade delete + tombstones

El problema

La mayoría de los agentes de IA tratan la memoria como archivos planos. OpenClaw escribe en MEMORY.md. Claudesidian escribe en Obsidian. Los sistemas creados manualmente escriben en JSON o Markdown. Funciona al principio.

Luego los archivos crecen. Las ventanas de contexto se llenan. El agente vuelca todo en el prompt y espera que el LLM encuentre lo que importa.

El coste es medible. OpenClaw inyecta ~35,600 tokens de archivos de espacio de trabajo en cada mensaje, el 93.5% de los cuales es irrelevante (#9157). Los usuarios intensivos reportan $3,600/mes en costes de tokens. Herramientas comunitarias como QMD y memsearch reducen entre el 70% y el 96% de ese desperdicio al reemplazar la inyección de contexto completo con recuperación clasificada (Levine, 2026).

El problema de la estructura agrava el coste. MEMORY.md confunde decisiones, preferencias y conocimiento en una sola masa no estructurada. Los usuarios inventan de forma independiente archivos decision.md, instantáneas de working-context.md y arquitecturas de memoria de 12 capas para compensar. El lunes mencionas "Alice gestiona el equipo de autenticación". El miércoles preguntas "¿quién maneja los permisos de autenticación?". El agente recupera ambos recuerdos por similitud de texto pero no puede conectarlos (Chawla, 2026).

Cómo lo resuelve Alaya

Problema

Memoria basada en archivos

Alaya

Desperdicio de tokens

Inyección de contexto completo (~35K tokens/mensaje)

La recuperación clasificada devuelve solo las top-k memorias relevantes

Sin estructura

Todo en un archivo (los usuarios inventan soluciones decision.md)

Tres almacenes tipados: episodios, conocimiento, preferencias

Sin olvido

Los archivos crecen hasta que los curas manualmente

El decaimiento de doble fuerza de Bjork separa la fuerza de almacenamiento de la fuerza de recuperación; el olvido inducido por la recuperación (RIF) suprime activamente las memorias competidoras

Sin asociaciones

Archivos planos, sin enlaces entre memorias

Fortalecimiento de correcuperación hebbiana (LTP/LTD): las memorias recuperadas juntas fortalecen las conexiones; la activación por propagación encuentra asociaciones indirectas

Preferencias frágiles

Resumen escrito por el agente, deriva fácilmente

Las preferencias implícitas emergen de impresiones acumuladas vía vasana (perfumado), no requiere LLM; se cristalizan en un umbral

Requiere LLM

No puede funcionar sin uno

Degradación elegante en cada nivel. ¿Sin embeddings? Solo BM25. ¿Sin LLM? Los episodios se acumulan. Cada capacidad es opcional de forma independiente

Primeros pasos

Servidor MCP (recomendado para agentes)

La forma más rápida de añadir la memoria de Alaya a cualquier agente compatible con MCP (Claude Desktop, Claude Code, Cursor, Cline, etc.):

Vía npm (no se necesita cadena de herramientas de Rust)

Añadir a tu configuración de Claude Code (~/.claude/claude_code_config.json):

{
  "mcpServers": {
    "alaya": {
      "command": "npx",
      "args": ["-y", "alaya-mcp"]
    }
  }
}

O para Claude Desktop / otros clientes MCP (con auto-consolidación LLM opcional):

{
  "mcpServers": {
    "alaya": {
      "command": "npx",
      "args": ["-y", "alaya-mcp"],
      "env": {
        "ALAYA_LLM_API_KEY": "sk-...",
        "ALAYA_LLM_API_URL": "https://api.openai.com/v1/chat/completions",
        "ALAYA_LLM_MODEL": "gpt-4o-mini"
      }
    }
  }
}

Desde el código fuente (requiere Rust 1.75+)

git clone https://github.com/SecurityRonin/alaya.git
cd alaya
cargo build --release --features "mcp llm"

Luego añadir a tu configuración MCP:

{
  "mcpServers": {
    "alaya": {
      "command": "/path/to/alaya/target/release/alaya-mcp"
    }
  }
}

Las variables de entorno ALAYA_LLM_* son opcionales; sin ellas, el servidor funciona en modo prompt (recuerda al agente llamar a learn después de 10 episodios). Con una clave API y la característica llm, realiza la auto-consolidación.

Eso es todo. Tu agente ahora tiene 13 herramientas de memoria:

Herramienta

Qué hace

remember

Almacena un mensaje de conversación (sugiere consolidación después de 10 episodios)

recall

Busca en la memoria con recuperación híbrida (+ impulso de categoría)

learn

Enseña conocimiento extraído directamente: el agente extrae hechos y llama a esto

status

Estadísticas ricas de memoria: episodios, desglose de conocimiento, categorías, grafo, embeddings

preferences

Obtiene las preferencias de usuario aprendidas

knowledge

Obtiene hechos semánticos destilados (+ filtro de categoría)

maintain

Ejecuta limpieza de memoria (deduplicación, decaimiento)

purge

Elimina memorias por sesión, antigüedad o todas

categories

Lista categorías emergentes con filtro de estabilidad

neighbors

Vecinos del grafo mediante activación por propagación

node_category

A qué categoría pertenece un nodo

import_claude_mem

Importa observaciones de una base de datos claude-mem

import_claude_code

Importa historial de conversación de archivos JSONL de Claude Code

Consulta docs/mcp-quickstart.md para un tutorial completo con interacciones de ejemplo y el prompt del sistema recomendado.

Los datos se almacenan en ~/.alaya/memory.db (se puede sobrescribir con la variable de entorno ALAYA_DB). Un solo archivo SQLite, sin servicios externos.

Ejemplo de interacción — lo que ve tu agente al usar Alaya:

Agent: [calls remember(content="User prefers dark mode", role="user", session_id="s1")]
Alaya: Stored episode 1 in session 's1'

Agent: [calls recall(query="user preferences")]
Alaya: Found 1 memories:
  1. [user] (score: 0.847) User prefers dark mode

Agent: [calls status()]
Alaya: Memory Status:
  Episodes: 1 (1 this session, 1 unconsolidated)
  Knowledge: none
  Categories: 0
  Preferences: 0 crystallized, 0 impressions accumulating
  Graph: 0 links
  Embedding coverage: 0/1 nodes (0%)

Variables de entorno:

Variable

Predeterminado

Descripción

ALAYA_DB

~/.alaya/memory.db

Ruta a la base de datos SQLite

ALAYA_LLM_API_KEY

(ninguna)

Clave API para auto-consolidación (habilita ExtractionProvider). Requiere la característica llm.

ALAYA_LLM_API_URL

https://api.openai.com/v1/chat/completions

Endpoint de completado de chat compatible con OpenAI

ALAYA_LLM_MODEL

gpt-4o-mini

Nombre del modelo. Cualquier modelo pequeño/rápido funciona (GPT-4o-mini, Haiku, Gemini Flash, etc.)

Biblioteca de Rust

Para integrar Alaya directamente en una aplicación de Rust:

[dependencies]
alaya = "0.2.2"

Inicio rápido (Rust)

use alaya::{Alaya, NewEpisode, Role, EpisodeContext, Query, NoOpProvider};

// Open a persistent database (or use open_in_memory() for tests)
let alaya = Alaya::open("memory.db")?;

// Store a conversation episode
alaya.episodes().store(&NewEpisode {
    content: "I've been learning Rust for about six months now".into(),
    role: Role::User,
    session_id: "session-1".into(),
    timestamp: 1740000000,
    context: EpisodeContext::default(),
    embedding: None, // pass Some(vec![...]) if you have embeddings
})?;

// Query with hybrid retrieval (BM25 + vector + graph + RRF)
let results = alaya.knowledge().query(&Query::simple("Rust experience"))?;
for mem in &results {
    println!("[{:.2}] {}", mem.score, mem.content);
}

// Get crystallized preferences
let prefs = alaya.admin().preferences(Some("communication_style"))?;

// Run lifecycle (NoOpProvider works without an LLM)
alaya.lifecycle().consolidate(&NoOpProvider)?;
alaya.lifecycle().transform()?;
alaya.lifecycle().forget()?;

Ejecutar la demo

La demo recorre las once capacidades con salida anotada y sin dependencias externas:

git clone https://github.com/SecurityRonin/alaya.git
cd alaya
cargo run --example demo

Arquitectura

Alaya es una biblioteca, no un framework. Tu agente posee el bucle de conversación, el LLM y el modelo de embedding. Alaya posee la memoria.

Your Agent                          Alaya
─────────                           ─────

Via MCP (stdio):                    alaya-mcp binary
  remember(content, role, session)    ──▶ episodic store + graph links
  recall(query, boost_category?)      ──▶ BM25 + vector + graph → RRF → rerank
  learn(facts, session_id?)           ──▶ agent-driven knowledge extraction
  status()                            ──▶ rich stats (episodes, knowledge, graph, embeddings)
  preferences(domain?)                ──▶ crystallized behavioral patterns
  knowledge(type?, category?)         ──▶ consolidated semantic nodes
  maintain()                          ──▶ dedup + decay
  purge(scope)                        ──▶ selective or full deletion
  categories(min_stability?)          ──▶ emergent ontology with hierarchy
  neighbors(node, depth?)             ──▶ graph spreading activation
  node_category(node_id)              ──▶ category assignment lookup
  import_claude_mem(path?)            ──▶ import from claude-mem.db
  import_claude_code(path)            ──▶ import from Claude Code JSONL

Via Rust library:                   Alaya coordinator
  alaya.episodes().store(ep)           ──▶ episodic store + graph links
  alaya.knowledge().query(q)           ──▶ BM25 + vector + graph → RRF → rerank
  alaya.admin().preferences(domain?)   ──▶ crystallized behavioral patterns
  alaya.knowledge().filter(f?)         ──▶ consolidated semantic nodes
  alaya.admin().categories(min?)       ──▶ emergent ontology with hierarchy
  alaya.admin().subcategories(id)      ──▶ children of a parent category
  alaya.graph().neighbors(node, d)     ──▶ graph spreading activation
  alaya.admin().node_category(id)      ──▶ category assignment lookup
  alaya.set_embedding_provider(p)      ──▶ auto-embed in store + query
  alaya.set_extraction_provider(p)     ──▶ enable auto-consolidation
  alaya.lifecycle().consolidate(p)     ──▶ episodes → semantic knowledge
  alaya.knowledge().learn(nodes)       ──▶ provider-less knowledge injection
  alaya.lifecycle().auto_consolidate() ──▶ extract + learn (needs ExtractionProvider)
  alaya.lifecycle().perfume(i, p)      ──▶ impressions → preferences
  alaya.lifecycle().transform()        ──▶ dedup, LTD, prune, split categories
  alaya.lifecycle().forget()           ──▶ Bjork strength decay + archival
  alaya.admin().purge(scope)           ──▶ cascade deletion + tombstones

Tres almacenes

Almacén

Análogo

Propósito

Episódico

Hipocampo

Eventos de conversación crudos con contexto completo

Semántico

Neocórtex

Conocimiento destilado extraído mediante consolidación

Implícito

Alaya-vijnana

Preferencias y hábitos que emergen mediante el perfumado

Pipeline de recuperación

flowchart LR
    Q[Query] --> BM25[BM25 / FTS5]
    Q --> VEC[Vector / Cosine]
    Q --> GR[Graph Neighbors]

    BM25 --> RRF[Reciprocal Rank Fusion]
    VEC --> RRF
    GR --> RRF

    RRF --> RR[Context-Weighted Reranking]
    RR --> SA[Spreading Activation + Enrichment]
    SA --> RIF[Retrieval-Induced Forgetting]
    RIF --> OUT[Top 3-5 Results<br/>Episodes + Semantic + Preferences]

Procesos del ciclo de vida

Proceso

Inspiración

Qué hace

Consolidación

Teoría CLS (McClelland et al.)

Destila episodios en conocimiento semántico

Perfumado

Vasana (psicología budista Yogacara)

Acumula impresiones, cristaliza preferencias

Transformación

Asraya-paravrtti

Deduplica, decaimiento de enlaces LTD, poda, descubre categorías

Olvido

Bjork & Bjork (1992)

Decae la fuerza de recuperación, archiva nodos débiles

RIF

Anderson et al. (1994)

El olvido inducido por la recuperación suprime memorias competidoras

Ontología emergente

Vikalpa (construcción conceptual)

Categorías jerárquicas emergen del clustering; se dividen automáticamente cuando son demasiado amplias

Guía de integración

Implementación de ConsolidationProvider

El trait ConsolidationProvider conecta Alaya a tu LLM para la extracción de conocimiento:

use alaya::*;

struct MyProvider { /* your LLM client */ }

impl ConsolidationProvider for MyProvider {
    fn extract_knowledge(&self, episodes: &[Episode]) -> Result<Vec<NewSemanticNode>> {
        // Ask your LLM: "What facts/relationships can you extract?"
        todo!()
    }

    fn extract_impressions(&self, interaction: &Interaction) -> Result<Vec<NewImpression>> {
        // Ask your LLM: "What behavioral signals does this contain?"
        todo!()
    }

    fn detect_contradiction(&self, a: &SemanticNode, b: &SemanticNode) -> Result<bool> {
        // Ask your LLM: "Do these two facts contradict each other?"
        todo!()
    }
}

Usa NoOpProvider sin un LLM. Los episodios se acumulan y la recuperación BM25 funciona sin consolidación.

Implementación de ExtractionProvider (auto-consolidación)

El trait ExtractionProvider permite la extracción automática de conocimiento sin llamadas manuales a consolidate(). Cuando está configurado, el servidor MCP realiza la auto-consolidación después de 10 episodios no consolidados:

use alaya::*;

struct MyExtractor { /* your LLM client */ }

impl ExtractionProvider for MyExtractor {
    fn extract(&self, episodes: &[Episode]) -> Result<Vec<NewSemanticNode>> {
        // Ask your LLM: "Extract facts from these conversations"
        todo!()
    }
}

let mut alaya = Alaya::open("memory.db")?;
alaya.set_extraction_provider(Box::new(MyExtractor { /* ... */ }));

// Now auto_consolidate() works without a ConsolidationProvider
let report = alaya.lifecycle().auto_consolidate()?;

La bandera de característica llm proporciona un LlmExtractionProvider listo para usar que llama a cualquier API compatible con OpenAI:

use alaya::LlmExtractionProvider;

let provider = LlmExtractionProvider::builder()
    .api_key("sk-...")
    .model("gpt-4o-mini")      // default; any small model works
    .build()?;

Programación del ciclo de vida

Método

Cuándo llamar

Qué hace

consolidate()

Después de acumular 10+ episodios

Extrae conocimiento semántico de los episodios

perfume()

En cada interacción del usuario

Extrae impresiones conductuales, cristaliza preferencias

transform()

Diaria o semanalmente

Deduplica, decaimiento de enlaces LTD, poda enlaces débiles, descubre categorías

forget()

Diaria o semanalmente

Decae la fuerza de recuperación, archiva nodos verdaderamente olvidados

purge()

A petición del usuario

Elimina en cascada por sesión/antigüedad con seguimiento de lápidas

Referencia de API

impl Alaya {
    // Open / create
    pub fn open(path: impl AsRef<Path>) -> Result<Self>;
    pub fn open_in_memory() -> Result<Self>;

    // Providers (on coordinator)
    pub fn set_embedding_provider(&mut self, provider: Box<dyn EmbeddingProvider>);
    pub fn set_extraction_provider(&mut self, provider: Box<dyn ExtractionProvider>);

    // Sub-manager accessors
    pub fn episodes(&self) -> Episodes<'_>;
    pub fn knowledge(&self) -> Knowledge<'_>;
    pub fn lifecycle(&self) -> Lifecycle<'_>;
    pub fn graph(&self) -> Graph<'_>;
    pub fn admin(&self) -> Admin<'_>;
}

impl Episodes<'_> {
    pub fn store(&self, episode: &NewEpisode) -> Result<EpisodeId>;
    pub fn by_session(&self, session_id: &str) -> Result<Vec<Episode>>;
    pub fn unconsolidated(&self, limit: u32) -> Result<Vec<Episode>>;
}

impl Knowledge<'_> {
    pub fn query(&self, q: &Query) -> Result<Vec<ScoredMemory>>;
    pub fn learn(&self, nodes: Vec<NewSemanticNode>) -> Result<ConsolidationReport>;
    pub fn filter(&self, filter: Option<KnowledgeFilter>) -> Result<Vec<SemanticNode>>;
}

impl Lifecycle<'_> {
    pub fn consolidate(&self, provider: &dyn ConsolidationProvider) -> Result<ConsolidationReport>;
    pub fn auto_consolidate(&self) -> Result<ConsolidationReport>;
    pub fn transform(&self) -> Result<TransformationReport>;
    pub fn forget(&self) -> Result<ForgettingReport>;
    pub fn perfume(&self, interaction: &Interaction, provider: &dyn ConsolidationProvider) -> Result<PerfumingReport>;
    pub fn dream(&self, provider: &dyn ConsolidationProvider, interaction: Option<&Interaction>) -> Result<DreamReport>;
}

impl Admin<'_> {
    pub fn status(&self) -> Result<MemoryStatus>;
    pub fn purge(&self, filter: PurgeFilter) -> Result<PurgeReport>;
    pub fn preferences(&self, domain: Option<&str>) -> Result<Vec<Preference>>;
    pub fn categories(&self, min_stability: Option<f32>) -> Result<Vec<Category>>;
    pub fn subcategories(&self, parent_id: CategoryId) -> Result<Vec<Category>>;
    pub fn node_category(&self, node_id: NodeId) -> Result<Option<Category>>;
}

Principios de diseño

  1. La memoria es un proceso, no una base de datos. Cada recuperación cambia lo que se recuerda. El grafo se remodela con el uso.

  2. El olvido es una característica. El decaimiento de doble fuerza de Bjork separa la fuerza de almacenamiento de la fuerza de recuperación. El olvido inducido por la recuperación (RIF) suprime activamente las memorias competidoras. Ambos mejoran la calidad de la recuperación con el tiempo.

  3. Las preferencias emergen, no se declaran. Los patrones conductuales se cristalizan a partir de impresiones acumuladas vía vasana (perfumado), no requiere LLM.

  4. El agente posee la identidad. Alaya almacena semillas. El agente decide qué semillas importan y cómo presentarlas.

  5. Degradación elegante. ¿Sin embeddings? Solo BM25. ¿Sin LLM? Los episodios se acumulan. Cada característica funciona de forma independiente.

Fundamentos de investigación

Arquitectura basada en la neurociencia, la psicología budista y la recuperación de información. Para mapeos detallados, consulta docs/theoretical-foundations.md.

Neurociencia: LTP/LTD hebbiana (Hebb 1949, Bliss & Lomo 1973), Sistemas de Aprendizaje Complementarios (McClelland et al. 1995), activación por propagación (Collins & Loftus 1975), especificidad de codificación (Tulving & Thomson 1973), olvido de doble fuerza (Bjork & Bjork 1992), olvido inducido por la recuperación (Anderson et al. 1994), límites de la memoria de trabajo (Cowan 2001).

Psicología budista Yogacara: Alaya-vijnana (conciencia de almacén), bija (semillas), vasana (perfumado), asraya-paravrtti (transformación), vijnaptimatrata (memoria relativa a la perspectiva).

Recuperación de información: Fusión de rango recíproco (Cormack et al. 2009), BM25 vía FTS5, búsqueda vectorial de similitud de coseno.

Comparación con alternativas

graph LR
    AGENT["AI Agent"]

    subgraph SIMPLE["Simple"]
        FILE["File-Based<br/><i>MEMORY.md<br/>OpenClaw</i>"]
    end

    subgraph INTEGRATED["Integrated"]
        FW["Framework Memory<br/><i>LangChain · CrewAI<br/>Letta</i>"]
        CODE["Coding Agent<br/><i>Beads · Engram<br/>via MCP</i>"]
    end

    subgraph ENGINES["Memory Engines"]
        DED["Dedicated Systems<br/><i><b>Alaya</b> · Vestige<br/>mem0 · Zep</i>"]
    end

    subgraph INFRA["Infrastructure"]
        VDB["Vector DBs<br/><i>Pinecone · Chroma<br/>Weaviate</i>"]
    end

    RESEARCH["Research<br/><i>Generative Agents<br/>SYNAPSE · HippoRAG</i>"]

    AGENT <--> FILE
    AGENT <--> FW
    AGENT <--> CODE
    AGENT <--> DED
    DED -.->|storage| VDB
    FW -.->|storage| VDB
    RESEARCH -.->|ideas| DED
    RESEARCH -.->|ideas| FW

Alaya es un motor de memoria dedicado con dinámicas de memoria basadas en la neurociencia. Lo que lo diferencia de cualquier otro sistema: olvido de doble fuerza de Bjork (separando el almacenamiento de la fuerza de recuperación), olvido inducido por la recuperación (recuperar A suprime a los competidores B y C), fortalecimiento de correcuperación hebbiana (LTP/LTD) y emergencia de preferencias implícitas sin un LLM, todo en una sola biblioteca integrable de Rust + SQLite. Pares más cercanos: Vestige (Rust, FSRS-6, activación por propagación) y SYNAPSE (grafo episódico-semántico unificado, inhibición lateral).

Por qué Alaya sobre...

Alternativa

Qué hace bien

Qué añade Alaya

**

Install Server
A
security – no known vulnerabilities
A
license - permissive license
-
quality - not tested

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/SecurityRonin/alaya'

If you have feedback or need assistance with the MCP directory API, please join our Discord server